| From foo@baz Mon Apr 9 17:09:24 CEST 2018 |
| From: Hans de Goede <hdegoede@redhat.com> |
| Date: Fri, 12 Jan 2018 00:36:48 -0800 |
| Subject: Input: goodix - disable IRQs while suspended |
| |
| From: Hans de Goede <hdegoede@redhat.com> |
| |
| |
| [ Upstream commit faec44b6838312484d63e82286087cf2d5ebb891 ] |
| |
| We should not try to do any i2c transfers before the controller is |
| resumed (which happens before our resume method gets called). |
| |
| So we need to disable our IRQ while suspended to enforce this. The |
| code paths for devices with GPIOs for the int and reset pins already |
| disable the IRQ the through goodix_free_irq(). |
| |
| This commit also disables the IRQ while suspended for devices without |
| GPIOs for the int and reset pins. |
| |
| This fixes the i2c bus sometimes getting stuck after a suspend/resume |
| causing the touchscreen to sometimes not work after a suspend/resume. |
| This has been tested on a GPD pocked device. |
| |
| BugLink: https://github.com/nexus511/gpd-ubuntu-packages/issues/10 |
| BugLink: https://www.reddit.com/r/GPDPocket/comments/7niut2/fix_for_broken_touch_after_resume_all_linux/ |
| Tested-by: Hans de Goede <hdegoede@redhat.com> |
| Signed-off-by: Hans de Goede <hdegoede@redhat.com> |
| Reviewed-by: Bastien Nocera <hadess@hadess.net> |
| Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/input/touchscreen/goodix.c | 8 ++++++-- |
| 1 file changed, 6 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/input/touchscreen/goodix.c |
| +++ b/drivers/input/touchscreen/goodix.c |
| @@ -778,8 +778,10 @@ static int __maybe_unused goodix_suspend |
| int error; |
| |
| /* We need gpio pins to suspend/resume */ |
| - if (!ts->gpiod_int || !ts->gpiod_rst) |
| + if (!ts->gpiod_int || !ts->gpiod_rst) { |
| + disable_irq(client->irq); |
| return 0; |
| + } |
| |
| wait_for_completion(&ts->firmware_loading_complete); |
| |
| @@ -819,8 +821,10 @@ static int __maybe_unused goodix_resume( |
| struct goodix_ts_data *ts = i2c_get_clientdata(client); |
| int error; |
| |
| - if (!ts->gpiod_int || !ts->gpiod_rst) |
| + if (!ts->gpiod_int || !ts->gpiod_rst) { |
| + enable_irq(client->irq); |
| return 0; |
| + } |
| |
| /* |
| * Exit sleep mode by outputting HIGH level to INT pin |