aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/input/touchscreen
diff options
context:
space:
mode:
authorZubair Lutfullah <zubair.lutfullah@gmail.com>2013-09-19 02:24:00 -0400
committerJonathan Cameron <jic23@kernel.org>2013-09-21 06:47:09 -0400
commitbaee539915e9e89bdebb369229bc0684c86feac2 (patch)
tree8de81886f89d873dcc96bc584e38c689dafd4090 /drivers/input/touchscreen
parent42877236160baaa785cfdcb281a653a012c82a2b (diff)
input: ti_am335x_tsc: Enable shared IRQ for TSC
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@gmail.com> Acked-by: Dmitry Torokhov <dmitry.torokhov@gmail.com> Signed-off-by: Jonathan Cameron <jic23@kernel.org>
Diffstat (limited to 'drivers/input/touchscreen')
-rw-r--r--drivers/input/touchscreen/ti_am335x_tsc.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/drivers/input/touchscreen/ti_am335x_tsc.c b/drivers/input/touchscreen/ti_am335x_tsc.c
index e1c5300cacfc..24e625c0b531 100644
--- a/drivers/input/touchscreen/ti_am335x_tsc.c
+++ b/drivers/input/touchscreen/ti_am335x_tsc.c
@@ -52,6 +52,7 @@ struct titsc {
52 u32 config_inp[4]; 52 u32 config_inp[4];
53 u32 bit_xp, bit_xn, bit_yp, bit_yn; 53 u32 bit_xp, bit_xn, bit_yp, bit_yn;
54 u32 inp_xp, inp_xn, inp_yp, inp_yn; 54 u32 inp_xp, inp_xn, inp_yp, inp_yn;
55 u32 step_mask;
55}; 56};
56 57
57static unsigned int titsc_readl(struct titsc *ts, unsigned int reg) 58static unsigned int titsc_readl(struct titsc *ts, unsigned int reg)
@@ -196,7 +197,8 @@ static void titsc_step_config(struct titsc *ts_dev)
196 197
197 /* The steps1 … end and bit 0 for TS_Charge */ 198 /* The steps1 … end and bit 0 for TS_Charge */
198 stepenable = (1 << (end_step + 2)) - 1; 199 stepenable = (1 << (end_step + 2)) - 1;
199 am335x_tsc_se_set(ts_dev->mfd_tscadc, stepenable); 200 ts_dev->step_mask = stepenable;
201 am335x_tsc_se_set(ts_dev->mfd_tscadc, ts_dev->step_mask);
200} 202}
201 203
202static void titsc_read_coordinates(struct titsc *ts_dev, 204static void titsc_read_coordinates(struct titsc *ts_dev,
@@ -260,6 +262,10 @@ static irqreturn_t titsc_irq(int irq, void *dev)
260 unsigned int fsm; 262 unsigned int fsm;
261 263
262 status = titsc_readl(ts_dev, REG_IRQSTATUS); 264 status = titsc_readl(ts_dev, REG_IRQSTATUS);
265 /*
266 * ADC and touchscreen share the IRQ line.
267 * FIFO1 interrupts are used by ADC. Handle FIFO0 IRQs here only
268 */
263 if (status & IRQENB_FIFO0THRES) { 269 if (status & IRQENB_FIFO0THRES) {
264 270
265 titsc_read_coordinates(ts_dev, &x, &y, &z1, &z2); 271 titsc_read_coordinates(ts_dev, &x, &y, &z1, &z2);
@@ -316,7 +322,7 @@ static irqreturn_t titsc_irq(int irq, void *dev)
316 322
317 if (irqclr) { 323 if (irqclr) {
318 titsc_writel(ts_dev, REG_IRQSTATUS, irqclr); 324 titsc_writel(ts_dev, REG_IRQSTATUS, irqclr);
319 am335x_tsc_se_update(ts_dev->mfd_tscadc); 325 am335x_tsc_se_set(ts_dev->mfd_tscadc, ts_dev->step_mask);
320 return IRQ_HANDLED; 326 return IRQ_HANDLED;
321 } 327 }
322 return IRQ_NONE; 328 return IRQ_NONE;
@@ -389,7 +395,7 @@ static int titsc_probe(struct platform_device *pdev)
389 } 395 }
390 396
391 err = request_irq(ts_dev->irq, titsc_irq, 397 err = request_irq(ts_dev->irq, titsc_irq,
392 0, pdev->dev.driver->name, ts_dev); 398 IRQF_SHARED, pdev->dev.driver->name, ts_dev);
393 if (err) { 399 if (err) {
394 dev_err(&pdev->dev, "failed to allocate irq.\n"); 400 dev_err(&pdev->dev, "failed to allocate irq.\n");
395 goto err_free_mem; 401 goto err_free_mem;