Merge tag 'acpi-6.4-rc1-2' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael...
authorLinus Torvalds <torvalds@linux-foundation.org>
Wed, 3 May 2023 18:49:57 +0000 (11:49 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 3 May 2023 18:49:57 +0000 (11:49 -0700)
Pull more ACPI updates from Rafael Wysocki:
 "These add two ACPI-related quirks and extend support for Apple device
  properties supplied via ACPI _DSM.

  Specifics:

   - Do not turn off unused power resources during initialization on the
     Toshiba Click Mini (Hans de Goede)

   - Support strings in device properties supplied by ACPI _DSM on Apple
     platforms (Hector Martin)

   - Add an ACPI device ID quirk for Lenovo Yoga Tablet 2 (Marius Hoch)"

* tag 'acpi-6.4-rc1-2' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm:
  ACPI: property: Support strings in Apple _DSM props
  ACPI: x86: utils: Remove Lenovo Yoga Tablet 2's MAGN0001
  ACPI: PM: Do not turn of unused power resources on the Toshiba Click Mini

drivers/acpi/power.c
drivers/acpi/x86/apple.c
drivers/acpi/x86/utils.c

index 23507d2..c2c7013 100644 (file)
@@ -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) {
index 8812ecd..45d0f16 100644 (file)
@@ -71,13 +71,16 @@ void acpi_extract_apple_properties(struct acpi_device *adev)
 
                if ( key->type != ACPI_TYPE_STRING ||
                    (val->type != ACPI_TYPE_INTEGER &&
-                    val->type != ACPI_TYPE_BUFFER))
+                    val->type != ACPI_TYPE_BUFFER &&
+                    val->type != ACPI_TYPE_STRING))
                        continue; /* skip invalid properties */
 
                __set_bit(i, valid);
                newsize += key->string.length + 1;
                if ( val->type == ACPI_TYPE_BUFFER)
                        newsize += val->buffer.length;
+               else if (val->type == ACPI_TYPE_STRING)
+                       newsize += val->string.length + 1;
        }
 
        numvalid = bitmap_weight(valid, numprops);
@@ -119,6 +122,12 @@ void acpi_extract_apple_properties(struct acpi_device *adev)
                newprops[v].type = val->type;
                if (val->type == ACPI_TYPE_INTEGER) {
                        newprops[v].integer.value = val->integer.value;
+               } else if (val->type == ACPI_TYPE_STRING) {
+                       newprops[v].string.length = val->string.length;
+                       newprops[v].string.pointer = free_space;
+                       memcpy(free_space, val->string.pointer,
+                              val->string.length);
+                       free_space += val->string.length + 1;
                } else {
                        newprops[v].buffer.length = val->buffer.length;
                        newprops[v].buffer.pointer = free_space;
index ba420a2..9c2d6f3 100644 (file)
@@ -143,6 +143,16 @@ static const struct override_status_id override_status_ids[] = {
                DMI_EXACT_MATCH(DMI_BOARD_SERIAL, "Default string"),
                DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Default string"),
              }),
+
+       /*
+        * The LSM303D on the Lenovo Yoga Tablet 2 series is present
+        * as both ACCL0001 and MAGN0001. As we can only ever register an
+        * i2c client for one of them, ignore MAGN0001.
+        */
+       NOT_PRESENT_ENTRY_HID("MAGN0001", "1", ATOM_SILVERMONT, {
+               DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+               DMI_MATCH(DMI_PRODUCT_FAMILY, "YOGATablet2"),
+             }),
 };
 
 bool acpi_device_override_status(struct acpi_device *adev, unsigned long long *status)