diff options
-rw-r--r-- | drivers/input/touchscreen/ti_am335x_tsc.c | 12 |
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 | ||
57 | static unsigned int titsc_readl(struct titsc *ts, unsigned int reg) | 58 | static 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 | ||
202 | static void titsc_read_coordinates(struct titsc *ts_dev, | 204 | static 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; |