On 09/01/13 12:17, Zubair Lutfullah wrote: > Enable shared IRQ to allow ADC to share IRQ line from > parent MFD core. Only FIFO0 IRQs are for TSC and handled > on the TSC side. > > Step mask would be updated from cached variable only previously. > In rare cases when both TSC and ADC are used, the cached > variable gets mixed up. > The step mask is written with the required mask every time. > > Rachna Patil (TI) laid ground work for shared IRQ. > > Signed-off-by: Zubair Lutfullah <zubair.lutfullah@xxxxxxxxx> Whilst I would have prefered an mfd under these drivers and elegant handling of the interrupts, I guess if this works it is at least not terribly invasive. However, this does need an Ack from Dmitry before I can take it (or for Dmitry to take it himself?) > --- > drivers/input/touchscreen/ti_am335x_tsc.c | 12 +++++++++--- > 1 file changed, 9 insertions(+), 3 deletions(-) > > diff --git a/drivers/input/touchscreen/ti_am335x_tsc.c b/drivers/input/touchscreen/ti_am335x_tsc.c > index e1c5300..24e625c 100644 > --- a/drivers/input/touchscreen/ti_am335x_tsc.c > +++ b/drivers/input/touchscreen/ti_am335x_tsc.c > @@ -52,6 +52,7 @@ struct titsc { > u32 config_inp[4]; > u32 bit_xp, bit_xn, bit_yp, bit_yn; > u32 inp_xp, inp_xn, inp_yp, inp_yn; > + u32 step_mask; > }; > > static unsigned int titsc_readl(struct titsc *ts, unsigned int reg) > @@ -196,7 +197,8 @@ static void titsc_step_config(struct titsc *ts_dev) > > /* The steps1 … end and bit 0 for TS_Charge */ > stepenable = (1 << (end_step + 2)) - 1; > - am335x_tsc_se_set(ts_dev->mfd_tscadc, stepenable); > + ts_dev->step_mask = stepenable; > + am335x_tsc_se_set(ts_dev->mfd_tscadc, ts_dev->step_mask); > } > > static void titsc_read_coordinates(struct titsc *ts_dev, > @@ -260,6 +262,10 @@ static irqreturn_t titsc_irq(int irq, void *dev) > unsigned int fsm; > > status = titsc_readl(ts_dev, REG_IRQSTATUS); > + /* > + * ADC and touchscreen share the IRQ line. > + * FIFO1 interrupts are used by ADC. Handle FIFO0 IRQs here only > + */ > if (status & IRQENB_FIFO0THRES) { > > titsc_read_coordinates(ts_dev, &x, &y, &z1, &z2); > @@ -316,7 +322,7 @@ static irqreturn_t titsc_irq(int irq, void *dev) > > if (irqclr) { > titsc_writel(ts_dev, REG_IRQSTATUS, irqclr); > - am335x_tsc_se_update(ts_dev->mfd_tscadc); > + am335x_tsc_se_set(ts_dev->mfd_tscadc, ts_dev->step_mask); > return IRQ_HANDLED; > } > return IRQ_NONE; > @@ -389,7 +395,7 @@ static int titsc_probe(struct platform_device *pdev) > } > > err = request_irq(ts_dev->irq, titsc_irq, > - 0, pdev->dev.driver->name, ts_dev); > + IRQF_SHARED, pdev->dev.driver->name, ts_dev); > if (err) { > dev_err(&pdev->dev, "failed to allocate irq.\n"); > goto err_free_mem; > -- To unsubscribe from this list: send the line "unsubscribe linux-iio" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html