diff options
Diffstat (limited to '0007-v4-platform-x86-asus-wmi-ROG-Ally-increase-wait-time.patch')
-rw-r--r-- | 0007-v4-platform-x86-asus-wmi-ROG-Ally-increase-wait-time.patch | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/0007-v4-platform-x86-asus-wmi-ROG-Ally-increase-wait-time.patch b/0007-v4-platform-x86-asus-wmi-ROG-Ally-increase-wait-time.patch new file mode 100644 index 000000000000..684263d500c6 --- /dev/null +++ b/0007-v4-platform-x86-asus-wmi-ROG-Ally-increase-wait-time.patch @@ -0,0 +1,73 @@ +From: "Luke D. Jones" <luke@ljones.dev> +To: hdegoede@redhat.com +Cc: corentin.chary@gmail.com, ilpo.jarvinen@linux.intel.com, + platform-driver-x86@vger.kernel.org, + linux-kernel@vger.kernel.org, "Luke D. Jones" <luke@ljones.dev> +Subject: [PATCH v4 7/9] platform/x86: asus-wmi: ROG Ally increase wait time, allow MCU powersave +Date: Thu, 4 Apr 2024 13:16:50 +1300 [thread overview] +Message-ID: <20240404001652.86207-8-luke@ljones.dev> (raw) +In-Reply-To: <20240404001652.86207-1-luke@ljones.dev> + +The previous work to allow the MCU to be resumed correctly after sleep +and resume tried to take the shortest possible time. However as work +continues in various other parts of the s2idle subsystems it has shown +that it wasn't entirely reliable. + +If the MCU disable/enable call is done correctly the MCU fully removes +its USB endpoints, and this shows as a full USB device reconnection on +resume. When we tried to short this as much as possible sometimes the +MCU doesn't get to complete what it needs to do before going to low-power +and this affected the reconnection. + +Through trial it is found that the minimum time required is approx 1200ms +to allow a proper disconnect and disable, and the same amount of time on +resume is required to prevent a rapid disconnect/reconnect happening on +seemingly random occasions. To be safe the time is now 1500ms for msleep. + +Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com> +Signed-off-by: Luke D. Jones <luke@ljones.dev> +--- + drivers/platform/x86/asus-wmi.c | 12 ++---------- + 1 file changed, 2 insertions(+), 10 deletions(-) + +diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c +index 976e26c82f80..ab98f91e573c 100644 +--- a/drivers/platform/x86/asus-wmi.c ++++ b/drivers/platform/x86/asus-wmi.c +@@ -140,7 +140,7 @@ module_param(fnlock_default, bool, 0444); + /* Controls the power state of the USB0 hub on ROG Ally which input is on */ + #define ASUS_USB0_PWR_EC0_CSEE "\\_SB.PCI0.SBRG.EC0.CSEE" + /* 300ms so far seems to produce a reliable result on AC and battery */ +-#define ASUS_USB0_PWR_EC0_CSEE_WAIT 300 ++#define ASUS_USB0_PWR_EC0_CSEE_WAIT 1500 + + static const char * const ashs_ids[] = { "ATK4001", "ATK4002", NULL }; + +@@ -4829,6 +4829,7 @@ static int asus_hotk_resume_early(struct device *device) + struct asus_wmi *asus = dev_get_drvdata(device); + + if (asus->ally_mcu_usb_switch) { ++ /* sleep required to prevent USB0 being yanked then reappearing rapidly */ + if (ACPI_FAILURE(acpi_execute_simple_method(NULL, ASUS_USB0_PWR_EC0_CSEE, 0xB8))) + dev_err(device, "ROG Ally MCU failed to connect USB dev\n"); + else +@@ -4840,17 +4841,8 @@ static int asus_hotk_resume_early(struct device *device) + static int asus_hotk_prepare(struct device *device) + { + struct asus_wmi *asus = dev_get_drvdata(device); +- int result, err; + + if (asus->ally_mcu_usb_switch) { +- /* When powersave is enabled it causes many issues with resume of USB hub */ +- result = asus_wmi_get_devstate_simple(asus, ASUS_WMI_DEVID_MCU_POWERSAVE); +- if (result == 1) { +- dev_warn(device, "MCU powersave enabled, disabling to prevent resume issues"); +- err = asus_wmi_set_devstate(ASUS_WMI_DEVID_MCU_POWERSAVE, 0, &result); +- if (err || result != 1) +- dev_err(device, "Failed to set MCU powersave mode: %d\n", err); +- } + /* sleep required to ensure USB0 is disabled before sleep continues */ + if (ACPI_FAILURE(acpi_execute_simple_method(NULL, ASUS_USB0_PWR_EC0_CSEE, 0xB7))) + dev_err(device, "ROG Ally MCU failed to disconnect USB dev\n"); +-- +2.44.0 |