Commit eb5e56d1 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'platform-drivers-x86-v6.11-2' of...

Merge tag 'platform-drivers-x86-v6.11-2' of git://git.kernel.org/pub/scm/linux/kernel/git/pdx86/platform-drivers-x86

Pull x86 platform driver fixes from Ilpo Järvinen:
 "Fixes:

   - Fix ACPI notifier racing with itself (intel-vbtn)

   - Initialize local variable to cover a timeout corner case
     (intel/ifs)

   - WMI docs spelling

  New device IDs:

   - amd/{pmc,pmf}: AMD 1Ah model 60h series.

   - amd/pmf: SPS quirk support for ASUS ROG Ally X"

* tag 'platform-drivers-x86-v6.11-2' of git://git.kernel.org/pub/scm/linux/kernel/git/pdx86/platform-drivers-x86:
  platform/x86/intel/ifs: Initialize union ifs_status to zero
  platform/x86: msi-wmi-platform: Fix spelling mistakes
  platform/x86/amd/pmf: Add new ACPI ID AMDI0107
  platform/x86/amd/pmc: Send OS_HINT command for new AMD platform
  platform/x86/amd: pmf: Add quirk for ROG Ally X
  platform/x86: intel-vbtn: Protect ACPI notify handler against recursion
parents b446a2da 3114f77e
...@@ -130,12 +130,12 @@ data using the `bmfdec <https://github.com/pali/bmfdec>`_ utility: ...@@ -130,12 +130,12 @@ data using the `bmfdec <https://github.com/pali/bmfdec>`_ utility:
Due to a peculiarity in how Windows handles the ``CreateByteField()`` ACPI operator (errors only Due to a peculiarity in how Windows handles the ``CreateByteField()`` ACPI operator (errors only
happen when a invalid byte field is ultimately accessed), all methods require a 32 byte input happen when a invalid byte field is ultimately accessed), all methods require a 32 byte input
buffer, even if the Binay MOF says otherwise. buffer, even if the Binary MOF says otherwise.
The input buffer contains a single byte to select the subfeature to be accessed and 31 bytes of The input buffer contains a single byte to select the subfeature to be accessed and 31 bytes of
input data, the meaning of which depends on the subfeature being accessed. input data, the meaning of which depends on the subfeature being accessed.
The output buffer contains a singe byte which signals success or failure (``0x00`` on failure) The output buffer contains a single byte which signals success or failure (``0x00`` on failure)
and 31 bytes of output data, the meaning if which depends on the subfeature being accessed. and 31 bytes of output data, the meaning if which depends on the subfeature being accessed.
WMI method Get_EC() WMI method Get_EC()
...@@ -147,7 +147,7 @@ data contains a flag byte and a 28 byte controller firmware version string. ...@@ -147,7 +147,7 @@ data contains a flag byte and a 28 byte controller firmware version string.
The first 4 bits of the flag byte contain the minor version of the embedded controller interface, The first 4 bits of the flag byte contain the minor version of the embedded controller interface,
with the next 2 bits containing the major version of the embedded controller interface. with the next 2 bits containing the major version of the embedded controller interface.
The 7th bit signals if the embedded controller page chaged (exact meaning is unknown), and the The 7th bit signals if the embedded controller page changed (exact meaning is unknown), and the
last bit signals if the platform is a Tigerlake platform. last bit signals if the platform is a Tigerlake platform.
The MSI software seems to only use this interface when the last bit is set. The MSI software seems to only use this interface when the last bit is set.
......
...@@ -764,6 +764,7 @@ static int amd_pmc_get_os_hint(struct amd_pmc_dev *dev) ...@@ -764,6 +764,7 @@ static int amd_pmc_get_os_hint(struct amd_pmc_dev *dev)
case AMD_CPU_ID_CB: case AMD_CPU_ID_CB:
case AMD_CPU_ID_PS: case AMD_CPU_ID_PS:
case PCI_DEVICE_ID_AMD_1AH_M20H_ROOT: case PCI_DEVICE_ID_AMD_1AH_M20H_ROOT:
case PCI_DEVICE_ID_AMD_1AH_M60H_ROOT:
return MSG_OS_HINT_RN; return MSG_OS_HINT_RN;
} }
return -EINVAL; return -EINVAL;
...@@ -967,6 +968,7 @@ static const struct pci_device_id pmc_pci_ids[] = { ...@@ -967,6 +968,7 @@ static const struct pci_device_id pmc_pci_ids[] = {
{ PCI_DEVICE(PCI_VENDOR_ID_AMD, AMD_CPU_ID_RV) }, { PCI_DEVICE(PCI_VENDOR_ID_AMD, AMD_CPU_ID_RV) },
{ PCI_DEVICE(PCI_VENDOR_ID_AMD, AMD_CPU_ID_SP) }, { PCI_DEVICE(PCI_VENDOR_ID_AMD, AMD_CPU_ID_SP) },
{ PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_1AH_M20H_ROOT) }, { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_1AH_M20H_ROOT) },
{ PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_1AH_M60H_ROOT) },
{ } { }
}; };
......
...@@ -67,6 +67,7 @@ void amd_mp2_stb_deinit(struct amd_pmc_dev *dev); ...@@ -67,6 +67,7 @@ void amd_mp2_stb_deinit(struct amd_pmc_dev *dev);
#define AMD_CPU_ID_PS 0x14E8 #define AMD_CPU_ID_PS 0x14E8
#define AMD_CPU_ID_SP 0x14A4 #define AMD_CPU_ID_SP 0x14A4
#define PCI_DEVICE_ID_AMD_1AH_M20H_ROOT 0x1507 #define PCI_DEVICE_ID_AMD_1AH_M20H_ROOT 0x1507
#define PCI_DEVICE_ID_AMD_1AH_M60H_ROOT 0x1122
#define PCI_DEVICE_ID_AMD_MP2_STB 0x172c #define PCI_DEVICE_ID_AMD_MP2_STB 0x172c
#endif /* PMC_H */ #endif /* PMC_H */
...@@ -41,6 +41,7 @@ ...@@ -41,6 +41,7 @@
#define AMD_CPU_ID_RMB 0x14b5 #define AMD_CPU_ID_RMB 0x14b5
#define AMD_CPU_ID_PS 0x14e8 #define AMD_CPU_ID_PS 0x14e8
#define PCI_DEVICE_ID_AMD_1AH_M20H_ROOT 0x1507 #define PCI_DEVICE_ID_AMD_1AH_M20H_ROOT 0x1507
#define PCI_DEVICE_ID_AMD_1AH_M60H_ROOT 0x1122
#define PMF_MSG_DELAY_MIN_US 50 #define PMF_MSG_DELAY_MIN_US 50
#define RESPONSE_REGISTER_LOOP_MAX 20000 #define RESPONSE_REGISTER_LOOP_MAX 20000
...@@ -249,6 +250,7 @@ static const struct pci_device_id pmf_pci_ids[] = { ...@@ -249,6 +250,7 @@ static const struct pci_device_id pmf_pci_ids[] = {
{ PCI_DEVICE(PCI_VENDOR_ID_AMD, AMD_CPU_ID_RMB) }, { PCI_DEVICE(PCI_VENDOR_ID_AMD, AMD_CPU_ID_RMB) },
{ PCI_DEVICE(PCI_VENDOR_ID_AMD, AMD_CPU_ID_PS) }, { PCI_DEVICE(PCI_VENDOR_ID_AMD, AMD_CPU_ID_PS) },
{ PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_1AH_M20H_ROOT) }, { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_1AH_M20H_ROOT) },
{ PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_1AH_M60H_ROOT) },
{ } { }
}; };
...@@ -382,6 +384,7 @@ static const struct acpi_device_id amd_pmf_acpi_ids[] = { ...@@ -382,6 +384,7 @@ static const struct acpi_device_id amd_pmf_acpi_ids[] = {
{"AMDI0102", 0}, {"AMDI0102", 0},
{"AMDI0103", 0}, {"AMDI0103", 0},
{"AMDI0105", 0}, {"AMDI0105", 0},
{"AMDI0107", 0},
{ } { }
}; };
MODULE_DEVICE_TABLE(acpi, amd_pmf_acpi_ids); MODULE_DEVICE_TABLE(acpi, amd_pmf_acpi_ids);
......
...@@ -29,6 +29,14 @@ static const struct dmi_system_id fwbug_list[] = { ...@@ -29,6 +29,14 @@ static const struct dmi_system_id fwbug_list[] = {
}, },
.driver_data = &quirk_no_sps_bug, .driver_data = &quirk_no_sps_bug,
}, },
{
.ident = "ROG Ally X",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
DMI_MATCH(DMI_PRODUCT_NAME, "RC72LA"),
},
.driver_data = &quirk_no_sps_bug,
},
{} {}
}; };
...@@ -48,4 +56,3 @@ void amd_pmf_quirks_init(struct amd_pmf_dev *dev) ...@@ -48,4 +56,3 @@ void amd_pmf_quirks_init(struct amd_pmf_dev *dev)
dmi_id->ident); dmi_id->ident);
} }
} }
...@@ -221,8 +221,8 @@ static int doscan(void *data) ...@@ -221,8 +221,8 @@ static int doscan(void *data)
*/ */
static void ifs_test_core(int cpu, struct device *dev) static void ifs_test_core(int cpu, struct device *dev)
{ {
union ifs_status status = {};
union ifs_scan activate; union ifs_scan activate;
union ifs_status status;
unsigned long timeout; unsigned long timeout;
struct ifs_data *ifsd; struct ifs_data *ifsd;
int to_start, to_stop; int to_start, to_stop;
......
...@@ -7,11 +7,13 @@ ...@@ -7,11 +7,13 @@
*/ */
#include <linux/acpi.h> #include <linux/acpi.h>
#include <linux/cleanup.h>
#include <linux/dmi.h> #include <linux/dmi.h>
#include <linux/input.h> #include <linux/input.h>
#include <linux/input/sparse-keymap.h> #include <linux/input/sparse-keymap.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/mutex.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/suspend.h> #include <linux/suspend.h>
#include "../dual_accel_detect.h" #include "../dual_accel_detect.h"
...@@ -66,6 +68,7 @@ static const struct key_entry intel_vbtn_switchmap[] = { ...@@ -66,6 +68,7 @@ static const struct key_entry intel_vbtn_switchmap[] = {
}; };
struct intel_vbtn_priv { struct intel_vbtn_priv {
struct mutex mutex; /* Avoid notify_handler() racing with itself */
struct input_dev *buttons_dev; struct input_dev *buttons_dev;
struct input_dev *switches_dev; struct input_dev *switches_dev;
bool dual_accel; bool dual_accel;
...@@ -155,6 +158,8 @@ static void notify_handler(acpi_handle handle, u32 event, void *context) ...@@ -155,6 +158,8 @@ static void notify_handler(acpi_handle handle, u32 event, void *context)
bool autorelease; bool autorelease;
int ret; int ret;
guard(mutex)(&priv->mutex);
if ((ke = sparse_keymap_entry_from_scancode(priv->buttons_dev, event))) { if ((ke = sparse_keymap_entry_from_scancode(priv->buttons_dev, event))) {
if (!priv->has_buttons) { if (!priv->has_buttons) {
dev_warn(&device->dev, "Warning: received 0x%02x button event on a device without buttons, please report this.\n", dev_warn(&device->dev, "Warning: received 0x%02x button event on a device without buttons, please report this.\n",
...@@ -290,6 +295,10 @@ static int intel_vbtn_probe(struct platform_device *device) ...@@ -290,6 +295,10 @@ static int intel_vbtn_probe(struct platform_device *device)
return -ENOMEM; return -ENOMEM;
dev_set_drvdata(&device->dev, priv); dev_set_drvdata(&device->dev, priv);
err = devm_mutex_init(&device->dev, &priv->mutex);
if (err)
return err;
priv->dual_accel = dual_accel; priv->dual_accel = dual_accel;
priv->has_buttons = has_buttons; priv->has_buttons = has_buttons;
priv->has_switches = has_switches; priv->has_switches = has_switches;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment