Message ID | 20210404143831.25173-1-hdegoede@redhat.com (mailing list archive) |
---|---|
State | Superseded, archived |
Headers | show |
Series | platform/x86: intel-hid: Fix spurious wakeups caused by tablet-mode events during suspend | expand |
Hi Hans, > Some devices send (duplicate) tablet-mode events when moved around even > though the mode has not changed; and they do this even when suspended. > > Change the tablet-mode event handling when priv->wakeup_mode is set to > update the switch state in case it changed and then return immediately > (without calling pm_wakeup_hard_event()) to avoid spurious wakeups. > > BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=212537 > Fixes: 537b0dd4729e ("platform/x86: intel-hid: Add support for > SW_TABLET_MODE") > Signed-off-by: Hans de Goede <hdegoede@redhat.com> > --- > drivers/platform/x86/intel-hid.c | 16 +++++++++------- > 1 file changed, 9 insertions(+), 7 deletions(-) > > diff --git a/drivers/platform/x86/intel-hid.c > b/drivers/platform/x86/intel-hid.c > index 57cc92891a57..078648a9201b 100644 > --- a/drivers/platform/x86/intel-hid.c > +++ b/drivers/platform/x86/intel-hid.c > @@ -483,11 +483,16 @@ static void notify_handler(acpi_handle handle, > u32 event, void *context) > goto wakeup; > > /* > - * Switch events will wake the device and report the > new switch > - * position to the input subsystem. > + * Some devices send (duplicate) tablet-mode events > when moved > + * around even though the mode has not changed; and > they do this > + * even when suspended. > + * Update the switch state in case it changed and then > return > + * without waking up to avoid spurious wakeups. > */ > - if (priv->switches && (event == 0xcc || event == 0xcd)) > - goto wakeup; > + if (event == 0xcc || event == 0xcd) { > + report_tablet_mode_event(priv->switches, > event); > + return; > + } > > /* Wake up on 5-button array events only. */ > if (event == 0xc0 || !priv->array) > @@ -501,9 +506,6 @@ static void notify_handler(acpi_handle handle, u32 > event, void *context) > wakeup: > pm_wakeup_hard_event(&device->dev); > > - if (report_tablet_mode_event(priv->switches, event)) > - return; > - > return; > } > No regression noted on HP Spectre x360 15-df0xxx. Reviewed-by: Elia Devito <eliadevito@gmail.com> Regards, Elia
Hi, On 4/4/21 5:50 PM, Elia Devito wrote: > Hi Hans, >> Some devices send (duplicate) tablet-mode events when moved around even >> though the mode has not changed; and they do this even when suspended. >> >> Change the tablet-mode event handling when priv->wakeup_mode is set to >> update the switch state in case it changed and then return immediately >> (without calling pm_wakeup_hard_event()) to avoid spurious wakeups. >> >> BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=212537 >> Fixes: 537b0dd4729e ("platform/x86: intel-hid: Add support for >> SW_TABLET_MODE") >> Signed-off-by: Hans de Goede <hdegoede@redhat.com> >> --- >> drivers/platform/x86/intel-hid.c | 16 +++++++++------- >> 1 file changed, 9 insertions(+), 7 deletions(-) >> >> diff --git a/drivers/platform/x86/intel-hid.c >> b/drivers/platform/x86/intel-hid.c >> index 57cc92891a57..078648a9201b 100644 >> --- a/drivers/platform/x86/intel-hid.c >> +++ b/drivers/platform/x86/intel-hid.c >> @@ -483,11 +483,16 @@ static void notify_handler(acpi_handle handle, >> u32 event, void *context) >> goto wakeup; >> >> /* >> - * Switch events will wake the device and report the >> new switch >> - * position to the input subsystem. >> + * Some devices send (duplicate) tablet-mode events >> when moved >> + * around even though the mode has not changed; and >> they do this >> + * even when suspended. >> + * Update the switch state in case it changed and then >> return >> + * without waking up to avoid spurious wakeups. >> */ >> - if (priv->switches && (event == 0xcc || event == 0xcd)) >> - goto wakeup; >> + if (event == 0xcc || event == 0xcd) { >> + report_tablet_mode_event(priv->switches, >> event); >> + return; >> + } >> >> /* Wake up on 5-button array events only. */ >> if (event == 0xc0 || !priv->array) >> @@ -501,9 +506,6 @@ static void notify_handler(acpi_handle handle, u32 >> event, void *context) >> wakeup: >> pm_wakeup_hard_event(&device->dev); >> >> - if (report_tablet_mode_event(priv->switches, event)) >> - return; >> - >> return; >> } >> > > No regression noted on HP Spectre x360 15-df0xxx. > > Reviewed-by: Elia Devito <eliadevito@gmail.com> Thank you for the testing and the review. I'll push this out to the for-next and fixes branches. Regards, Hans
diff --git a/drivers/platform/x86/intel-hid.c b/drivers/platform/x86/intel-hid.c index 57cc92891a57..078648a9201b 100644 --- a/drivers/platform/x86/intel-hid.c +++ b/drivers/platform/x86/intel-hid.c @@ -483,11 +483,16 @@ static void notify_handler(acpi_handle handle, u32 event, void *context) goto wakeup; /* - * Switch events will wake the device and report the new switch - * position to the input subsystem. + * Some devices send (duplicate) tablet-mode events when moved + * around even though the mode has not changed; and they do this + * even when suspended. + * Update the switch state in case it changed and then return + * without waking up to avoid spurious wakeups. */ - if (priv->switches && (event == 0xcc || event == 0xcd)) - goto wakeup; + if (event == 0xcc || event == 0xcd) { + report_tablet_mode_event(priv->switches, event); + return; + } /* Wake up on 5-button array events only. */ if (event == 0xc0 || !priv->array) @@ -501,9 +506,6 @@ static void notify_handler(acpi_handle handle, u32 event, void *context) wakeup: pm_wakeup_hard_event(&device->dev); - if (report_tablet_mode_event(priv->switches, event)) - return; - return; }
Some devices send (duplicate) tablet-mode events when moved around even though the mode has not changed; and they do this even when suspended. Change the tablet-mode event handling when priv->wakeup_mode is set to update the switch state in case it changed and then return immediately (without calling pm_wakeup_hard_event()) to avoid spurious wakeups. BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=212537 Fixes: 537b0dd4729e ("platform/x86: intel-hid: Add support for SW_TABLET_MODE") Signed-off-by: Hans de Goede <hdegoede@redhat.com> --- drivers/platform/x86/intel-hid.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-)