]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - drivers/input/touchscreen/ti_am335x_tsc.c
Merge 3.12-rc6 into staging-next.
[karo-tx-linux.git] / drivers / input / touchscreen / ti_am335x_tsc.c
index e1c5300cacfc2044f83175dccffd864a8bd01fbc..24e625c0b5314217accaee7886f2d05e2652901d 100644 (file)
@@ -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;