From: Hans de Goede <hdegoede@redhat.com>
To: Kai-Heng Feng <kai.heng.feng@canonical.com>,
ilpo.jarvinen@linux.intel.com, gregkh@linuxfoundation.org,
jorge.lopez2@hp.com
Cc: acelan.kao@canonical.com, platform-driver-x86@vger.kernel.org,
linux-kernel@vger.kernel.org, linux-usb@vger.kernel.org
Subject: Re: [PATCH v3] platform/x86/hp: Avoid spurious wakeup on HP ProOne 440
Date: Fri, 6 Sep 2024 09:35:45 +0200 [thread overview]
Message-ID: <3e12ef27-30e4-4b5a-acd6-5d3023a82941@redhat.com> (raw)
In-Reply-To: <20240906053047.459036-1-kai.heng.feng@canonical.com>
Hi,
On 9/6/24 7:30 AM, Kai-Heng Feng wrote:
> The HP ProOne 440 has a power saving design that when the display is
> off, it also cuts the USB touchscreen device's power off.
>
> This can cause system early wakeup because cutting the power off the
> touchscreen device creates a disconnect event and prevent the system
> from suspending:
> [ 445.814574] hub 2-0:1.0: hub_suspend
> [ 445.814652] usb usb2: bus suspend, wakeup 0
> [ 445.824629] xhci_hcd 0000:00:14.0: Port change event, 1-11, id 11, portsc: 0x202a0
> [ 445.824639] xhci_hcd 0000:00:14.0: resume root hub
> [ 445.824651] xhci_hcd 0000:00:14.0: handle_port_status: starting usb1 port polling.
> [ 445.844039] xhci_hcd 0000:00:14.0: PM: pci_pm_suspend(): hcd_pci_suspend+0x0/0x20 returns -16
> [ 445.844058] xhci_hcd 0000:00:14.0: PM: dpm_run_callback(): pci_pm_suspend+0x0/0x1c0 returns -16
> [ 445.844072] xhci_hcd 0000:00:14.0: PM: failed to suspend async: error -16
> [ 446.276101] PM: Some devices failed to suspend, or early wake event detected
>
> So add a quirk to make sure the following is happening:
> 1. Let the i915 driver suspend first, to ensure the display is off so
> system also cuts the USB touchscreen's power.
> 2. Wait a while to let the USB disconnect event fire and get handled.
> 3. Since the disconnect event already happened, the xhci's suspend
> routine won't be interrupted anymore.
>
> Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
Thanks, patch looks good to me:
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
Ilpo, do you plan to do another fixes pull-request for 6.11,
or shall I add this to for-next to target 6.12-rc1 ?
Either way works for me. If you plan to do another fixes
pull-request, note that I plan to post a v2 of the panasonic
patches this Monday.
Regards,
Hans
> ---
> v3:
> - Use dev_dbg() instead of dev_info().
>
> v2:
> - Remove the part that searching for the touchscreen device.
> - Wording.
>
> drivers/platform/x86/hp/hp-wmi.c | 59 +++++++++++++++++++++++++++++++-
> 1 file changed, 58 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/platform/x86/hp/hp-wmi.c b/drivers/platform/x86/hp/hp-wmi.c
> index 876e0a97cee1..92cb02b50dfc 100644
> --- a/drivers/platform/x86/hp/hp-wmi.c
> +++ b/drivers/platform/x86/hp/hp-wmi.c
> @@ -30,6 +30,8 @@
> #include <linux/rfkill.h>
> #include <linux/string.h>
> #include <linux/dmi.h>
> +#include <linux/delay.h>
> +#include <linux/pci.h>
>
> MODULE_AUTHOR("Matthew Garrett <mjg59@srcf.ucam.org>");
> MODULE_DESCRIPTION("HP laptop WMI driver");
> @@ -1708,6 +1710,14 @@ static void __exit hp_wmi_bios_remove(struct platform_device *device)
> platform_profile_remove();
> }
>
> +static int hp_wmi_suspend_handler(struct device *device)
> +{
> + /* Let the xhci have time to handle disconnect event */
> + msleep(200);
> +
> + return 0;
> +}
> +
> static int hp_wmi_resume_handler(struct device *device)
> {
> /*
> @@ -1745,7 +1755,7 @@ static int hp_wmi_resume_handler(struct device *device)
> return 0;
> }
>
> -static const struct dev_pm_ops hp_wmi_pm_ops = {
> +static struct dev_pm_ops hp_wmi_pm_ops = {
> .resume = hp_wmi_resume_handler,
> .restore = hp_wmi_resume_handler,
> };
> @@ -1871,6 +1881,51 @@ static int hp_wmi_hwmon_init(void)
> return 0;
> }
>
> +static int lg_usb_touchscreen_quirk(const struct dmi_system_id *id)
> +{
> + struct pci_dev *vga, *xhci;
> + struct device_link *vga_link, *xhci_link;
> +
> + vga = pci_get_class(PCI_CLASS_DISPLAY_VGA << 8, NULL);
> +
> + xhci = pci_get_class(PCI_CLASS_SERIAL_USB_XHCI, NULL);
> +
> + if (vga && xhci) {
> + xhci_link = device_link_add(&hp_wmi_platform_dev->dev, &xhci->dev,
> + DL_FLAG_STATELESS);
> + if (xhci_link)
> + dev_dbg(&hp_wmi_platform_dev->dev, "Suspend before %s\n",
> + pci_name(xhci));
> + else
> + return 1;
> +
> + vga_link = device_link_add(&vga->dev, &hp_wmi_platform_dev->dev,
> + DL_FLAG_STATELESS);
> + if (vga_link)
> + dev_dbg(&hp_wmi_platform_dev->dev, "Suspend after %s\n",
> + pci_name(vga));
> + else {
> + device_link_del(xhci_link);
> + return 1;
> + }
> + }
> +
> + hp_wmi_pm_ops.suspend = hp_wmi_suspend_handler;
> +
> + return 1;
> +}
> +
> +static const struct dmi_system_id hp_wmi_quirk_table[] = {
> + {
> + .callback = lg_usb_touchscreen_quirk,
> + .matches = {
> + DMI_MATCH(DMI_SYS_VENDOR, "HP"),
> + DMI_MATCH(DMI_PRODUCT_NAME, "HP ProOne 440 23.8 inch G9 All-in-One Desktop PC"),
> + },
> + },
> + {}
> +};
> +
> static int __init hp_wmi_init(void)
> {
> int event_capable = wmi_has_guid(HPWMI_EVENT_GUID);
> @@ -1909,6 +1964,8 @@ static int __init hp_wmi_init(void)
> goto err_unregister_device;
> }
>
> + dmi_check_system(hp_wmi_quirk_table);
> +
> return 0;
>
> err_unregister_device:
next prev parent reply other threads:[~2024-09-06 7:35 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-09-06 5:30 [PATCH v3] platform/x86/hp: Avoid spurious wakeup on HP ProOne 440 Kai-Heng Feng
2024-09-06 7:35 ` Hans de Goede [this message]
2024-09-06 18:39 ` Ilpo Järvinen
2024-09-06 19:40 ` Hans de Goede
2024-09-06 14:22 ` Alan Stern
2024-09-09 3:05 ` Kai-Heng Feng
2024-09-09 14:38 ` Alan Stern
2024-09-10 3:33 ` Kai-Heng Feng
2024-09-10 13:13 ` Alan Stern
2024-09-12 6:28 ` Kai-Heng Feng
2024-09-12 15:06 ` Alan Stern
2024-10-05 14:25 ` Hans de Goede
2024-10-07 4:22 ` Kai-Heng Feng
2024-10-07 14:53 ` Mario Limonciello
2024-10-21 13:04 ` Hans de Goede
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=3e12ef27-30e4-4b5a-acd6-5d3023a82941@redhat.com \
--to=hdegoede@redhat.com \
--cc=acelan.kao@canonical.com \
--cc=gregkh@linuxfoundation.org \
--cc=ilpo.jarvinen@linux.intel.com \
--cc=jorge.lopez2@hp.com \
--cc=kai.heng.feng@canonical.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-usb@vger.kernel.org \
--cc=platform-driver-x86@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox