@@ -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,
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@mocean-labs.com> --- -- To unsubscribe from this list: send the line "unsubscribe linux-input" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html