diff mbox series

ACPI: PM: Do not turn of unused power resources on the Toshiba Click Mini

Message ID 20230420110220.23168-1-hdegoede@redhat.com
State Accepted
Commit 9b04d99788cf475cbd277f30ec66230ccb7e99f4
Headers show
Series ACPI: PM: Do not turn of unused power resources on the Toshiba Click Mini | expand

Commit Message

Hans de Goede April 20, 2023, 11:02 a.m. UTC
The CPR3 power resource on the Toshiba Click Mini toggles a GPIO
which is called SISP (for SIS touchscreen power?) on/off.

This CPR3 power resource is not listed in any _PR? lists, let alone
in a _PR0 list for the SIS0817 touchscreen ACPI device which needs it.

Before commit a1224f34d72a ("ACPI: PM: Check states of power resources
during initialization") this was not an issue because since nothing
referenced the CPR3 power resource its state was always
ACPI_POWER_RESOURCE_STATE_UNKNOWN and power resources with this state
get ignored by acpi_turn_off_unused_power_resources().

This clearly is a bug in the DSDT of this device. Add a DMI quirk
to make acpi_turn_off_unused_power_resources() a no-op on this
model to fix the touchscreen no longer working since kernel 5.16 .

This quirk also causes 2 other power resources to not get turned
off, but the _OFF method on these already was a no-op, so this makes
no difference for the other 2 power resources.

Fixes: a1224f34d72a ("ACPI: PM: Check states of power resources during initialization")
Reported-by: Gé Koerkamp <ge.koerkamp@gmail.com>
Link: https://bugzilla.kernel.org/show_bug.cgi?id=216946
Link: https://lore.kernel.org/regressions/32a14a8a-9795-4c8c-7e00-da9012f548f8@leemhuis.info/
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
 drivers/acpi/power.c | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)

Comments

Rafael J. Wysocki April 27, 2023, 4:46 p.m. UTC | #1
On Thu, Apr 20, 2023 at 1:02 PM Hans de Goede <hdegoede@redhat.com> wrote:
>
> The CPR3 power resource on the Toshiba Click Mini toggles a GPIO
> which is called SISP (for SIS touchscreen power?) on/off.
>
> This CPR3 power resource is not listed in any _PR? lists, let alone
> in a _PR0 list for the SIS0817 touchscreen ACPI device which needs it.
>
> Before commit a1224f34d72a ("ACPI: PM: Check states of power resources
> during initialization") this was not an issue because since nothing
> referenced the CPR3 power resource its state was always
> ACPI_POWER_RESOURCE_STATE_UNKNOWN and power resources with this state
> get ignored by acpi_turn_off_unused_power_resources().
>
> This clearly is a bug in the DSDT of this device. Add a DMI quirk
> to make acpi_turn_off_unused_power_resources() a no-op on this
> model to fix the touchscreen no longer working since kernel 5.16 .
>
> This quirk also causes 2 other power resources to not get turned
> off, but the _OFF method on these already was a no-op, so this makes
> no difference for the other 2 power resources.
>
> Fixes: a1224f34d72a ("ACPI: PM: Check states of power resources during initialization")
> Reported-by: Gé Koerkamp <ge.koerkamp@gmail.com>
> Link: https://bugzilla.kernel.org/show_bug.cgi?id=216946
> Link: https://lore.kernel.org/regressions/32a14a8a-9795-4c8c-7e00-da9012f548f8@leemhuis.info/
> Signed-off-by: Hans de Goede <hdegoede@redhat.com>
> ---
>  drivers/acpi/power.c | 19 +++++++++++++++++++
>  1 file changed, 19 insertions(+)
>
> diff --git a/drivers/acpi/power.c b/drivers/acpi/power.c
> index 292cec3691cc..5dc792961ab8 100644
> --- a/drivers/acpi/power.c
> +++ b/drivers/acpi/power.c
> @@ -23,6 +23,7 @@
>
>  #define pr_fmt(fmt) "ACPI: PM: " fmt
>
> +#include <linux/dmi.h>
>  #include <linux/kernel.h>
>  #include <linux/module.h>
>  #include <linux/init.h>
> @@ -1022,6 +1023,21 @@ void acpi_resume_power_resources(void)
>  }
>  #endif
>
> +static const struct dmi_system_id dmi_leave_unused_power_resources_on[] = {
> +       {
> +               /*
> +                * The Toshiba Click Mini has a CPR3 power-resource which must
> +                * be on for the touchscreen to work, but which is not in any
> +                * _PR? lists. The other 2 affected power-resources are no-ops.
> +                */
> +               .matches = {
> +                       DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
> +                       DMI_MATCH(DMI_PRODUCT_NAME, "SATELLITE Click Mini L9W-B"),
> +               },
> +       },
> +       {}
> +};
> +
>  /**
>   * acpi_turn_off_unused_power_resources - Turn off power resources not in use.
>   */
> @@ -1029,6 +1045,9 @@ void acpi_turn_off_unused_power_resources(void)
>  {
>         struct acpi_power_resource *resource;
>
> +       if (dmi_check_system(dmi_leave_unused_power_resources_on))
> +               return;
> +
>         mutex_lock(&power_resource_list_lock);
>
>         list_for_each_entry_reverse(resource, &acpi_power_resource_list, list_node) {
> --

Applied as 6.4-rc material, thanks!
diff mbox series

Patch

diff --git a/drivers/acpi/power.c b/drivers/acpi/power.c
index 292cec3691cc..5dc792961ab8 100644
--- a/drivers/acpi/power.c
+++ b/drivers/acpi/power.c
@@ -23,6 +23,7 @@ 
 
 #define pr_fmt(fmt) "ACPI: PM: " fmt
 
+#include <linux/dmi.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/init.h>
@@ -1022,6 +1023,21 @@  void acpi_resume_power_resources(void)
 }
 #endif
 
+static const struct dmi_system_id dmi_leave_unused_power_resources_on[] = {
+	{
+		/*
+		 * The Toshiba Click Mini has a CPR3 power-resource which must
+		 * be on for the touchscreen to work, but which is not in any
+		 * _PR? lists. The other 2 affected power-resources are no-ops.
+		 */
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "SATELLITE Click Mini L9W-B"),
+		},
+	},
+	{}
+};
+
 /**
  * acpi_turn_off_unused_power_resources - Turn off power resources not in use.
  */
@@ -1029,6 +1045,9 @@  void acpi_turn_off_unused_power_resources(void)
 {
 	struct acpi_power_resource *resource;
 
+	if (dmi_check_system(dmi_leave_unused_power_resources_on))
+		return;
+
 	mutex_lock(&power_resource_list_lock);
 
 	list_for_each_entry_reverse(resource, &acpi_power_resource_list, list_node) {