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 |
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 --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) {
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(+)