From 7fb9db4270711a434a8dd322ad1e3a6e7f798b91 Mon Sep 17 00:00:00 2001 From: Russ Dill Date: Thu, 28 Mar 2013 10:18:01 -0700 Subject: [PATCH] IIO: ti_adc: Handle overrun before threshold event If an overrun occurs, the threshold event is meaningless, handle the overrun event first. Signed-off-by: Russ Dill --- drivers/staging/iio/adc/ti_adc.c | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/drivers/staging/iio/adc/ti_adc.c b/drivers/staging/iio/adc/ti_adc.c index 2821243..7dd2f27 100644 --- a/drivers/staging/iio/adc/ti_adc.c +++ b/drivers/staging/iio/adc/ti_adc.c @@ -152,7 +152,19 @@ static irqreturn_t tiadc_irq(int irq, void *private) unsigned int status, config; status = adc_readl(adc_dev, TSCADC_REG_IRQSTATUS); - if (status & TSCADC_IRQENB_FIFO1THRES) { + if (status & TSCADC_IRQENB_FIFO1OVRRUN) { + config = adc_readl(adc_dev, TSCADC_REG_CTRL); + config &= ~(TSCADC_CNTRLREG_TSCSSENB); + adc_writel(adc_dev, TSCADC_REG_CTRL, config); + + adc_writel(adc_dev, TSCADC_REG_IRQSTATUS, + TSCADC_IRQENB_FIFO1OVRRUN | + TSCADC_IRQENB_FIFO1UNDRFLW); + + adc_writel(adc_dev, TSCADC_REG_CTRL, + (config | TSCADC_CNTRLREG_TSCSSENB)); + return IRQ_HANDLED; + } else if (status & TSCADC_IRQENB_FIFO1THRES) { adc_writel(adc_dev, TSCADC_REG_IRQCLR, TSCADC_IRQENB_FIFO1THRES); @@ -165,19 +177,6 @@ static irqreturn_t tiadc_irq(int irq, void *private) adc_writel(adc_dev, TSCADC_REG_IRQSTATUS, TSCADC_IRQENB_FIFO1THRES); return IRQ_HANDLED; - } else if ((status & TSCADC_IRQENB_FIFO1OVRRUN) || - (status & TSCADC_IRQENB_FIFO1UNDRFLW)) { - config = adc_readl(adc_dev, TSCADC_REG_CTRL); - config &= ~(TSCADC_CNTRLREG_TSCSSENB); - adc_writel(adc_dev, TSCADC_REG_CTRL, config); - - adc_writel(adc_dev, TSCADC_REG_IRQSTATUS, - TSCADC_IRQENB_FIFO1OVRRUN | - TSCADC_IRQENB_FIFO1UNDRFLW); - - adc_writel(adc_dev, TSCADC_REG_CTRL, - (config | TSCADC_CNTRLREG_TSCSSENB)); - return IRQ_HANDLED; } else { return IRQ_NONE; } -- 1.9.1