| From 4ca352cb3f4272763a5aedd8526d9e3e11f27371 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 2 Oct 2019 14:00:21 -0700 |
| Subject: Input: atmel_mxt_ts - disable IRQ across suspend |
| |
| From: Evan Green <evgreen@chromium.org> |
| |
| [ Upstream commit 463fa44eec2fef50d111ed0199cf593235065c04 ] |
| |
| Across suspend and resume, we are seeing error messages like the following: |
| |
| atmel_mxt_ts i2c-PRP0001:00: __mxt_read_reg: i2c transfer failed (-121) |
| atmel_mxt_ts i2c-PRP0001:00: Failed to read T44 and T5 (-121) |
| |
| This occurs because the driver leaves its IRQ enabled. Upon resume, there |
| is an IRQ pending, but the interrupt is serviced before both the driver and |
| the underlying I2C bus have been resumed. This causes EREMOTEIO errors. |
| |
| Disable the IRQ in suspend, and re-enable it on resume. If there are cases |
| where the driver enters suspend with interrupts disabled, that's a bug we |
| should fix separately. |
| |
| Signed-off-by: Evan Green <evgreen@chromium.org> |
| Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/input/touchscreen/atmel_mxt_ts.c | 4 ++++ |
| 1 file changed, 4 insertions(+) |
| |
| diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c |
| index a7ace07e179e..e8f98de60df3 100644 |
| --- a/drivers/input/touchscreen/atmel_mxt_ts.c |
| +++ b/drivers/input/touchscreen/atmel_mxt_ts.c |
| @@ -3162,6 +3162,8 @@ static int __maybe_unused mxt_suspend(struct device *dev) |
| |
| mutex_unlock(&input_dev->mutex); |
| |
| + disable_irq(data->irq); |
| + |
| return 0; |
| } |
| |
| @@ -3174,6 +3176,8 @@ static int __maybe_unused mxt_resume(struct device *dev) |
| if (!input_dev) |
| return 0; |
| |
| + enable_irq(data->irq); |
| + |
| mutex_lock(&input_dev->mutex); |
| |
| if (input_dev->users) |
| -- |
| 2.20.1 |
| |