This patch ignores IRQ:s provoked when reading values from the controller, when the get_pendown_state callback is not implement. If this interrupt is not ignored the driver ends up polling the device, since the driver provokes new interrupts while reading values. Signed-off-by: Richard Röjfors <richard.rojfors@xxxxxxxxxxxxxxx> --- diff --git a/drivers/input/touchscreen/tsc2007.c b/drivers/input/touchscreen/tsc2007.c index 4c51cb4..e594479 100644 --- a/drivers/input/touchscreen/tsc2007.c +++ b/drivers/input/touchscreen/tsc2007.c @@ -77,6 +77,7 @@ struct tsc2007 { u16 x_plate_ohms; bool pendown; + bool ignore_next_irq; int irq; int (*get_pendown_state)(void); @@ -228,14 +229,35 @@ static void tsc2007_work(struct work_struct *work) if (ts->pendown) schedule_delayed_work(&ts->work, msecs_to_jiffies(TS_POLL_PERIOD)); - else + else { + /* if we don't have the get pen down state callback we + * ignore the next IRQ because it is provoked when we checked + * the touch pressure. + * If the user really touches the screen we will get a new + * interrupt anyway so it is safe to ignore it + * + * This is basically implementing this part of the manual: + * "In both cases previously listed, it is recommended that + * whenever the host writes to the TSC2007, the master + * processor masks the interrupt associated to PENIRQ. + * This masking prevents false triggering of interrupts when + * the PENIRQ line is disabled in the cases previously listed." + */ + if (!ts->get_pendown_state) + ts->ignore_next_irq = true; enable_irq(ts->irq); + } } static irqreturn_t tsc2007_irq(int irq, void *handle) { struct tsc2007 *ts = handle; + if (ts->ignore_next_irq) { + ts->ignore_next_irq = false; + return IRQ_HANDLED; + } + if (!ts->get_pendown_state || likely(ts->get_pendown_state())) { disable_irq_nosync(ts->irq); schedule_delayed_work(&ts->work, -- To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html