Merge branch 'fixes' of into for-next

The current set of DMI board IDs from the fixes branch is required to
reorder them in the for-next branch.
pull/1354/merge
Ilpo Järvinen 2025-12-01 11:53:59 +02:00
commit 594f9cce51
No known key found for this signature in database
GPG Key ID: 59AC4F6153E5CE31
23 changed files with 194 additions and 125 deletions

View File

@ -54,6 +54,7 @@ to matching WMI devices using a struct wmi_device_id table:
:: ::
static const struct wmi_device_id foo_id_table[] = { static const struct wmi_device_id foo_id_table[] = {
/* Only use uppercase letters! */
{ "936DA01F-9ABD-4D9D-80C7-02AF85C822A8", NULL }, { "936DA01F-9ABD-4D9D-80C7-02AF85C822A8", NULL },
{ } { }
}; };

View File

@ -3841,6 +3841,7 @@ F: drivers/hwmon/asus-ec-sensors.c
ASUS NOTEBOOKS AND EEEPC ACPI/WMI EXTRAS DRIVERS ASUS NOTEBOOKS AND EEEPC ACPI/WMI EXTRAS DRIVERS
M: Corentin Chary <corentin.chary@gmail.com> M: Corentin Chary <corentin.chary@gmail.com>
M: Luke D. Jones <luke@ljones.dev> M: Luke D. Jones <luke@ljones.dev>
M: Denis Benato <benato.denis96@gmail.com>
L: platform-driver-x86@vger.kernel.org L: platform-driver-x86@vger.kernel.org
S: Maintained S: Maintained
W: https://asus-linux.org/ W: https://asus-linux.org/
@ -12862,7 +12863,8 @@ F: tools/testing/selftests/sgx/*
K: \bSGX_ K: \bSGX_
INTEL SKYLAKE INT3472 ACPI DEVICE DRIVER INTEL SKYLAKE INT3472 ACPI DEVICE DRIVER
M: Daniel Scally <djrscally@gmail.com> M: Daniel Scally <dan.scally@ideasonboard.com>
M: Sakari Ailus <sakari.ailus@linux.intel.com>
S: Maintained S: Maintained
F: drivers/platform/x86/intel/int3472/ F: drivers/platform/x86/intel/int3472/
F: include/linux/platform_data/x86/int3472.h F: include/linux/platform_data/x86/int3472.h

View File

@ -124,6 +124,7 @@ static int t14s_ec_write(void *context, unsigned int reg,
if (ret < 0) if (ret < 0)
return ret; return ret;
fsleep(10000);
return 0; return 0;
} }
@ -161,6 +162,7 @@ static int t14s_ec_read(void *context, unsigned int reg,
out: out:
i2c_unlock_bus(client->adapter, I2C_LOCK_SEGMENT); i2c_unlock_bus(client->adapter, I2C_LOCK_SEGMENT);
fsleep(10000);
return ret; return ret;
} }
@ -195,6 +197,8 @@ static int t14s_ec_read_evt(struct t14s_ec *ec, u8 *val)
if (ret < 0) if (ret < 0)
goto out; goto out;
fsleep(10000);
ret = 0; ret = 0;
out: out:
@ -570,12 +574,6 @@ static int t14s_ec_probe(struct i2c_client *client)
return dev_err_probe(dev, PTR_ERR(ec->regmap), return dev_err_probe(dev, PTR_ERR(ec->regmap),
"Failed to init regmap\n"); "Failed to init regmap\n");
ret = devm_request_threaded_irq(dev, client->irq, NULL,
t14s_ec_irq_handler,
IRQF_ONESHOT, dev_name(dev), ec);
if (ret < 0)
return dev_err_probe(dev, ret, "Failed to get IRQ\n");
ret = t14s_leds_probe(ec); ret = t14s_leds_probe(ec);
if (ret < 0) if (ret < 0)
return ret; return ret;
@ -592,6 +590,12 @@ static int t14s_ec_probe(struct i2c_client *client)
if (ret < 0) if (ret < 0)
return ret; return ret;
ret = devm_request_threaded_irq(dev, client->irq, NULL,
t14s_ec_irq_handler,
IRQF_ONESHOT, dev_name(dev), ec);
if (ret < 0)
return dev_err_probe(dev, ret, "Failed to get IRQ\n");
/* /*
* Disable wakeup support by default, because the driver currently does * Disable wakeup support by default, because the driver currently does
* not support masking any events and the laptop should not wake up when * not support masking any events and the laptop should not wake up when

View File

@ -2015,6 +2015,7 @@ static int mlxbf_pmc_init_perftype_counter(struct device *dev, unsigned int blk_
if (pmc->block[blk_num].type == MLXBF_PMC_TYPE_CRSPACE) { if (pmc->block[blk_num].type == MLXBF_PMC_TYPE_CRSPACE) {
/* Program crspace counters to count clock cycles using "count_clock" sysfs */ /* Program crspace counters to count clock cycles using "count_clock" sysfs */
attr = &pmc->block[blk_num].attr_count_clock; attr = &pmc->block[blk_num].attr_count_clock;
sysfs_attr_init(&attr->dev_attr.attr);
attr->dev_attr.attr.mode = 0644; attr->dev_attr.attr.mode = 0644;
attr->dev_attr.show = mlxbf_pmc_count_clock_show; attr->dev_attr.show = mlxbf_pmc_count_clock_show;
attr->dev_attr.store = mlxbf_pmc_count_clock_store; attr->dev_attr.store = mlxbf_pmc_count_clock_store;

View File

@ -440,7 +440,7 @@ config WIRELESS_HOTKEY
depends on INPUT depends on INPUT
help help
This driver provides supports for the wireless buttons found on some AMD, This driver provides supports for the wireless buttons found on some AMD,
HP, & Xioami laptops. HP, & Xiaomi laptops.
On such systems the driver should load automatically (via ACPI alias). On such systems the driver should load automatically (via ACPI alias).
To compile this driver as a module, choose M here: the module will To compile this driver as a module, choose M here: the module will
@ -553,6 +553,7 @@ config MSI_WMI
config MSI_WMI_PLATFORM config MSI_WMI_PLATFORM
tristate "MSI WMI Platform features" tristate "MSI WMI Platform features"
depends on ACPI_WMI depends on ACPI_WMI
depends on DMI
depends on HWMON depends on HWMON
help help
Say Y here if you want to have support for WMI-based platform features Say Y here if you want to have support for WMI-based platform features

View File

@ -121,6 +121,7 @@ MODULE_ALIAS("wmi:676AA15E-6A47-4D9F-A2CC-1E6D18D14026");
enum acer_wmi_event_ids { enum acer_wmi_event_ids {
WMID_HOTKEY_EVENT = 0x1, WMID_HOTKEY_EVENT = 0x1,
WMID_BACKLIGHT_EVENT = 0x4,
WMID_ACCEL_OR_KBD_DOCK_EVENT = 0x5, WMID_ACCEL_OR_KBD_DOCK_EVENT = 0x5,
WMID_GAMING_TURBO_KEY_EVENT = 0x7, WMID_GAMING_TURBO_KEY_EVENT = 0x7,
WMID_AC_EVENT = 0x8, WMID_AC_EVENT = 0x8,
@ -2512,6 +2513,9 @@ static void acer_wmi_notify(union acpi_object *obj, void *context)
sparse_keymap_report_event(acer_wmi_input_dev, scancode, 1, true); sparse_keymap_report_event(acer_wmi_input_dev, scancode, 1, true);
} }
break; break;
case WMID_BACKLIGHT_EVENT:
/* Already handled by acpi-video */
break;
case WMID_ACCEL_OR_KBD_DOCK_EVENT: case WMID_ACCEL_OR_KBD_DOCK_EVENT:
acer_gsensor_event(); acer_gsensor_event();
acer_kbd_dock_event(&return_value); acer_kbd_dock_event(&return_value);

View File

@ -122,6 +122,14 @@ static const struct dmi_system_id fwbug_list[] = {
DMI_MATCH(DMI_PRODUCT_NAME, "21A1"), DMI_MATCH(DMI_PRODUCT_NAME, "21A1"),
} }
}, },
{
.ident = "ROG Xbox Ally RC73YA",
.driver_data = &quirk_spurious_8042,
.matches = {
DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK COMPUTER INC."),
DMI_MATCH(DMI_BOARD_NAME, "RC73YA"),
}
},
/* https://bugzilla.kernel.org/show_bug.cgi?id=218024 */ /* https://bugzilla.kernel.org/show_bug.cgi?id=218024 */
{ {
.ident = "V14 G4 AMN", .ident = "V14 G4 AMN",
@ -204,6 +212,23 @@ static const struct dmi_system_id fwbug_list[] = {
DMI_MATCH(DMI_PRODUCT_NAME, "82ND"), DMI_MATCH(DMI_PRODUCT_NAME, "82ND"),
} }
}, },
/* https://gitlab.freedesktop.org/drm/amd/-/issues/4618 */
{
.ident = "Lenovo Legion Go 2",
.driver_data = &quirk_s2idle_bug,
.matches = {
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
DMI_MATCH(DMI_PRODUCT_NAME, "83N0"),
}
},
{
.ident = "Lenovo Legion Go 2",
.driver_data = &quirk_s2idle_bug,
.matches = {
DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
DMI_MATCH(DMI_PRODUCT_NAME, "83N1"),
}
},
/* https://gitlab.freedesktop.org/drm/amd/-/issues/2684 */ /* https://gitlab.freedesktop.org/drm/amd/-/issues/2684 */
{ {
.ident = "HP Laptop 15s-eq2xxx", .ident = "HP Laptop 15s-eq2xxx",

View File

@ -106,6 +106,7 @@ static void amd_pmc_get_ip_info(struct amd_pmc_dev *dev)
switch (dev->cpu_id) { switch (dev->cpu_id) {
case AMD_CPU_ID_PCO: case AMD_CPU_ID_PCO:
case AMD_CPU_ID_RN: case AMD_CPU_ID_RN:
case AMD_CPU_ID_VG:
case AMD_CPU_ID_YC: case AMD_CPU_ID_YC:
case AMD_CPU_ID_CB: case AMD_CPU_ID_CB:
dev->num_ips = 12; dev->num_ips = 12;
@ -517,6 +518,7 @@ static int amd_pmc_get_os_hint(struct amd_pmc_dev *dev)
case AMD_CPU_ID_PCO: case AMD_CPU_ID_PCO:
return MSG_OS_HINT_PCO; return MSG_OS_HINT_PCO;
case AMD_CPU_ID_RN: case AMD_CPU_ID_RN:
case AMD_CPU_ID_VG:
case AMD_CPU_ID_YC: case AMD_CPU_ID_YC:
case AMD_CPU_ID_CB: case AMD_CPU_ID_CB:
case AMD_CPU_ID_PS: case AMD_CPU_ID_PS:
@ -717,6 +719,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, AMD_CPU_ID_SHP) }, { PCI_DEVICE(PCI_VENDOR_ID_AMD, AMD_CPU_ID_SHP) },
{ PCI_DEVICE(PCI_VENDOR_ID_AMD, AMD_CPU_ID_VG) },
{ 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) }, { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_1AH_M60H_ROOT) },
{ } { }

View File

@ -156,6 +156,7 @@ void amd_mp2_stb_deinit(struct amd_pmc_dev *dev);
#define AMD_CPU_ID_RN 0x1630 #define AMD_CPU_ID_RN 0x1630
#define AMD_CPU_ID_PCO AMD_CPU_ID_RV #define AMD_CPU_ID_PCO AMD_CPU_ID_RV
#define AMD_CPU_ID_CZN AMD_CPU_ID_RN #define AMD_CPU_ID_CZN AMD_CPU_ID_RN
#define AMD_CPU_ID_VG 0x1645
#define AMD_CPU_ID_YC 0x14B5 #define AMD_CPU_ID_YC 0x14B5
#define AMD_CPU_ID_CB 0x14D8 #define AMD_CPU_ID_CB 0x14D8
#define AMD_CPU_ID_PS 0x14E8 #define AMD_CPU_ID_PS 0x14E8

View File

@ -89,6 +89,14 @@ static struct awcc_quirks generic_quirks = {
static struct awcc_quirks empty_quirks; static struct awcc_quirks empty_quirks;
static const struct dmi_system_id awcc_dmi_table[] __initconst = { static const struct dmi_system_id awcc_dmi_table[] __initconst = {
{
.ident = "Alienware 16 Aurora",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "Alienware"),
DMI_MATCH(DMI_PRODUCT_NAME, "Alienware 16 Aurora"),
},
.driver_data = &g_series_quirks,
},
{ {
.ident = "Alienware Area-51m", .ident = "Alienware Area-51m",
.matches = { .matches = {
@ -98,26 +106,18 @@ static const struct dmi_system_id awcc_dmi_table[] __initconst = {
.driver_data = &generic_quirks, .driver_data = &generic_quirks,
}, },
{ {
.ident = "Alienware Area-51m R2", .ident = "Alienware m15",
.matches = { .matches = {
DMI_MATCH(DMI_SYS_VENDOR, "Alienware"), DMI_MATCH(DMI_SYS_VENDOR, "Alienware"),
DMI_MATCH(DMI_PRODUCT_NAME, "Alienware Area-51m R2"), DMI_MATCH(DMI_PRODUCT_NAME, "Alienware m15"),
}, },
.driver_data = &generic_quirks, .driver_data = &generic_quirks,
}, },
{ {
.ident = "Alienware m15 R5", .ident = "Alienware m16 R1 AMD",
.matches = { .matches = {
DMI_MATCH(DMI_SYS_VENDOR, "Alienware"), DMI_MATCH(DMI_SYS_VENDOR, "Alienware"),
DMI_MATCH(DMI_PRODUCT_NAME, "Alienware m15 R5"), DMI_MATCH(DMI_PRODUCT_NAME, "Alienware m16 R1 AMD"),
},
.driver_data = &generic_quirks,
},
{
.ident = "Alienware m15 R7",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "Alienware"),
DMI_MATCH(DMI_PRODUCT_NAME, "Alienware m15 R7"),
}, },
.driver_data = &generic_quirks, .driver_data = &generic_quirks,
}, },
@ -129,14 +129,6 @@ static const struct dmi_system_id awcc_dmi_table[] __initconst = {
}, },
.driver_data = &g_series_quirks, .driver_data = &g_series_quirks,
}, },
{
.ident = "Alienware m16 R1 AMD",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "Alienware"),
DMI_MATCH(DMI_PRODUCT_NAME, "Alienware m16 R1 AMD"),
},
.driver_data = &generic_quirks,
},
{ {
.ident = "Alienware m16 R2", .ident = "Alienware m16 R2",
.matches = { .matches = {
@ -146,106 +138,66 @@ static const struct dmi_system_id awcc_dmi_table[] __initconst = {
.driver_data = &generic_quirks, .driver_data = &generic_quirks,
}, },
{ {
.ident = "Alienware m17 R5", .ident = "Alienware m17",
.matches = { .matches = {
DMI_MATCH(DMI_SYS_VENDOR, "Alienware"), DMI_MATCH(DMI_SYS_VENDOR, "Alienware"),
DMI_MATCH(DMI_PRODUCT_NAME, "Alienware m17 R5 AMD"), DMI_MATCH(DMI_PRODUCT_NAME, "Alienware m17"),
}, },
.driver_data = &generic_quirks, .driver_data = &generic_quirks,
}, },
{ {
.ident = "Alienware m18 R2", .ident = "Alienware m18",
.matches = { .matches = {
DMI_MATCH(DMI_SYS_VENDOR, "Alienware"), DMI_MATCH(DMI_SYS_VENDOR, "Alienware"),
DMI_MATCH(DMI_PRODUCT_NAME, "Alienware m18 R2"), DMI_MATCH(DMI_PRODUCT_NAME, "Alienware m18"),
}, },
.driver_data = &generic_quirks, .driver_data = &generic_quirks,
}, },
{ {
.ident = "Alienware x15 R1", .ident = "Alienware x15",
.matches = { .matches = {
DMI_MATCH(DMI_SYS_VENDOR, "Alienware"), DMI_MATCH(DMI_SYS_VENDOR, "Alienware"),
DMI_MATCH(DMI_PRODUCT_NAME, "Alienware x15 R1"), DMI_MATCH(DMI_PRODUCT_NAME, "Alienware x15"),
}, },
.driver_data = &generic_quirks, .driver_data = &generic_quirks,
}, },
{ {
.ident = "Alienware x15 R2", .ident = "Alienware x17",
.matches = { .matches = {
DMI_MATCH(DMI_SYS_VENDOR, "Alienware"), DMI_MATCH(DMI_SYS_VENDOR, "Alienware"),
DMI_MATCH(DMI_PRODUCT_NAME, "Alienware x15 R2"), DMI_MATCH(DMI_PRODUCT_NAME, "Alienware x17"),
}, },
.driver_data = &generic_quirks, .driver_data = &generic_quirks,
}, },
{ {
.ident = "Alienware x17 R2", .ident = "Dell Inc. G15",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "Alienware"),
DMI_MATCH(DMI_PRODUCT_NAME, "Alienware x17 R2"),
},
.driver_data = &generic_quirks,
},
{
.ident = "Dell Inc. G15 5510",
.matches = { .matches = {
DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
DMI_MATCH(DMI_PRODUCT_NAME, "Dell G15 5510"), DMI_MATCH(DMI_PRODUCT_NAME, "Dell G15"),
}, },
.driver_data = &g_series_quirks, .driver_data = &g_series_quirks,
}, },
{ {
.ident = "Dell Inc. G15 5511", .ident = "Dell Inc. G16",
.matches = { .matches = {
DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
DMI_MATCH(DMI_PRODUCT_NAME, "Dell G15 5511"), DMI_MATCH(DMI_PRODUCT_NAME, "Dell G16"),
}, },
.driver_data = &g_series_quirks, .driver_data = &g_series_quirks,
}, },
{ {
.ident = "Dell Inc. G15 5515", .ident = "Dell Inc. G3",
.matches = { .matches = {
DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
DMI_MATCH(DMI_PRODUCT_NAME, "Dell G15 5515"), DMI_MATCH(DMI_PRODUCT_NAME, "G3"),
}, },
.driver_data = &g_series_quirks, .driver_data = &g_series_quirks,
}, },
{ {
.ident = "Dell Inc. G16 7630", .ident = "Dell Inc. G5",
.matches = { .matches = {
DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
DMI_MATCH(DMI_PRODUCT_NAME, "Dell G16 7630"), DMI_MATCH(DMI_PRODUCT_NAME, "G5"),
},
.driver_data = &g_series_quirks,
},
{
.ident = "Dell Inc. G3 3500",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
DMI_MATCH(DMI_PRODUCT_NAME, "G3 3500"),
},
.driver_data = &g_series_quirks,
},
{
.ident = "Dell Inc. G3 3590",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
DMI_MATCH(DMI_PRODUCT_NAME, "G3 3590"),
},
.driver_data = &g_series_quirks,
},
{
.ident = "Dell Inc. G5 5500",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
DMI_MATCH(DMI_PRODUCT_NAME, "G5 5500"),
},
.driver_data = &g_series_quirks,
},
{
.ident = "Dell Inc. G5 5505",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
DMI_MATCH(DMI_PRODUCT_NAME, "G5 5505"),
}, },
.driver_data = &g_series_quirks, .driver_data = &g_series_quirks,
}, },
@ -1629,7 +1581,7 @@ static int wmax_wmi_probe(struct wmi_device *wdev, const void *context)
static int wmax_wmi_suspend(struct device *dev) static int wmax_wmi_suspend(struct device *dev)
{ {
if (awcc->hwmon) if (awcc && awcc->hwmon)
awcc_hwmon_suspend(dev); awcc_hwmon_suspend(dev);
return 0; return 0;
@ -1637,7 +1589,7 @@ static int wmax_wmi_suspend(struct device *dev)
static int wmax_wmi_resume(struct device *dev) static int wmax_wmi_resume(struct device *dev)
{ {
if (awcc->hwmon) if (awcc && awcc->hwmon)
awcc_hwmon_resume(dev); awcc_hwmon_resume(dev);
return 0; return 0;

View File

@ -365,6 +365,13 @@ static const struct key_entry dell_wmi_keymap_type_0012[] = {
/* Backlight brightness change event */ /* Backlight brightness change event */
{ KE_IGNORE, 0x0003, { KEY_RESERVED } }, { KE_IGNORE, 0x0003, { KEY_RESERVED } },
/*
* Electronic privacy screen toggled, extended data gives state,
* separate entries for on/off see handling in dell_wmi_process_key().
*/
{ KE_KEY, 0x000c, { KEY_EPRIVACY_SCREEN_OFF } },
{ KE_KEY, 0x000c, { KEY_EPRIVACY_SCREEN_ON } },
/* Ultra-performance mode switch request */ /* Ultra-performance mode switch request */
{ KE_IGNORE, 0x000d, { KEY_RESERVED } }, { KE_IGNORE, 0x000d, { KEY_RESERVED } },
@ -435,6 +442,11 @@ static int dell_wmi_process_key(struct wmi_device *wdev, int type, int code, u16
"Dell tablet mode switch", "Dell tablet mode switch",
SW_TABLET_MODE, !buffer[0]); SW_TABLET_MODE, !buffer[0]);
return 1; return 1;
} else if (type == 0x0012 && code == 0x000c && remaining > 0) {
/* Eprivacy toggle, switch to "on" key entry for on events */
if (buffer[0] == 2)
key++;
used = 1;
} else if (type == 0x0012 && code == 0x000d && remaining > 0) { } else if (type == 0x0012 && code == 0x000d && remaining > 0) {
value = (buffer[2] == 2); value = (buffer[2] == 2);
used = 1; used = 1;

View File

@ -92,9 +92,11 @@ static const char * const victus_thermal_profile_boards[] = {
"8A25" "8A25"
}; };
/* DMI Board names of Victus 16-r1000 and Victus 16-s1000 laptops */ /* DMI Board names of Victus 16-r and Victus 16-s laptops */
static const char * const victus_s_thermal_profile_boards[] = { static const char * const victus_s_thermal_profile_boards[] = {
"8C99", "8C9C" "8BBE", "8BD4", "8BD5",
"8C78", "8C99", "8C9C",
"8D41",
}; };
enum hp_wmi_radio { enum hp_wmi_radio {

View File

@ -81,6 +81,10 @@ static const struct key_entry huawei_wmi_keymap[] = {
{ KE_KEY, 0x289, { KEY_WLAN } }, { KE_KEY, 0x289, { KEY_WLAN } },
// Huawei |M| key // Huawei |M| key
{ KE_KEY, 0x28a, { KEY_CONFIG } }, { KE_KEY, 0x28a, { KEY_CONFIG } },
// HONOR YOYO key
{ KE_KEY, 0x28b, { KEY_NOTIFICATION_CENTER } },
// HONOR print screen
{ KE_KEY, 0x28e, { KEY_PRINT } },
// Keyboard backlit // Keyboard backlit
{ KE_IGNORE, 0x293, { KEY_KBDILLUMTOGGLE } }, { KE_IGNORE, 0x293, { KEY_KBDILLUMTOGGLE } },
{ KE_IGNORE, 0x294, { KEY_KBDILLUMUP } }, { KE_IGNORE, 0x294, { KEY_KBDILLUMUP } },

View File

@ -55,6 +55,7 @@ static const struct acpi_device_id intel_hid_ids[] = {
{ "INTC10CB" }, { "INTC10CB" },
{ "INTC10CC" }, { "INTC10CC" },
{ "INTC10F1" }, { "INTC10F1" },
{ "INTC10F2" },
{ } { }
}; };
MODULE_DEVICE_TABLE(acpi, intel_hid_ids); MODULE_DEVICE_TABLE(acpi, intel_hid_ids);

View File

@ -245,15 +245,12 @@ int skl_int3472_register_regulator(struct int3472_discrete_device *int3472,
if (IS_ERR(regulator->rdev)) if (IS_ERR(regulator->rdev))
return PTR_ERR(regulator->rdev); return PTR_ERR(regulator->rdev);
int3472->regulators[int3472->n_regulator_gpios].ena_gpio = gpio;
int3472->n_regulator_gpios++; int3472->n_regulator_gpios++;
return 0; return 0;
} }
void skl_int3472_unregister_regulator(struct int3472_discrete_device *int3472) void skl_int3472_unregister_regulator(struct int3472_discrete_device *int3472)
{ {
for (int i = 0; i < int3472->n_regulator_gpios; i++) { for (int i = 0; i < int3472->n_regulator_gpios; i++)
regulator_unregister(int3472->regulators[i].rdev); regulator_unregister(int3472->regulators[i].rdev);
gpiod_put(int3472->regulators[i].ena_gpio);
}
} }

View File

@ -250,7 +250,7 @@ static int intel_punit_ipc_probe(struct platform_device *pdev)
} else { } else {
ret = devm_request_irq(&pdev->dev, irq, intel_punit_ioc, ret = devm_request_irq(&pdev->dev, irq, intel_punit_ioc,
IRQF_NO_SUSPEND, "intel_punit_ipc", IRQF_NO_SUSPEND, "intel_punit_ipc",
&punit_ipcdev); punit_ipcdev);
if (ret) { if (ret) {
dev_err(&pdev->dev, "Failed to request irq: %d\n", irq); dev_err(&pdev->dev, "Failed to request irq: %d\n", irq);
return ret; return ret;

View File

@ -108,11 +108,11 @@ static int isst_if_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
ret = pci_read_config_dword(pdev, 0xD0, &mmio_base); ret = pci_read_config_dword(pdev, 0xD0, &mmio_base);
if (ret) if (ret)
return ret; return pcibios_err_to_errno(ret);
ret = pci_read_config_dword(pdev, 0xFC, &pcu_base); ret = pci_read_config_dword(pdev, 0xFC, &pcu_base);
if (ret) if (ret)
return ret; return pcibios_err_to_errno(ret);
pcu_base &= GENMASK(10, 0); pcu_base &= GENMASK(10, 0);
base_addr = (u64)mmio_base << 23 | (u64) pcu_base << 12; base_addr = (u64)mmio_base << 23 | (u64) pcu_base << 12;

View File

@ -40,7 +40,7 @@
* @agent_type_mask: Bit mask of all hardware agents for this domain * @agent_type_mask: Bit mask of all hardware agents for this domain
* @uncore_attr_group: Attribute group storage * @uncore_attr_group: Attribute group storage
* @max_freq_khz_kobj_attr: Storage for kobject attribute max_freq_khz * @max_freq_khz_kobj_attr: Storage for kobject attribute max_freq_khz
* @mix_freq_khz_kobj_attr: Storage for kobject attribute min_freq_khz * @min_freq_khz_kobj_attr: Storage for kobject attribute min_freq_khz
* @initial_max_freq_khz_kobj_attr: Storage for kobject attribute initial_max_freq_khz * @initial_max_freq_khz_kobj_attr: Storage for kobject attribute initial_max_freq_khz
* @initial_min_freq_khz_kobj_attr: Storage for kobject attribute initial_min_freq_khz * @initial_min_freq_khz_kobj_attr: Storage for kobject attribute initial_min_freq_khz
* @current_freq_khz_kobj_attr: Storage for kobject attribute current_freq_khz * @current_freq_khz_kobj_attr: Storage for kobject attribute current_freq_khz
@ -48,13 +48,14 @@
* @fabric_cluster_id_kobj_attr: Storage for kobject attribute fabric_cluster_id * @fabric_cluster_id_kobj_attr: Storage for kobject attribute fabric_cluster_id
* @package_id_kobj_attr: Storage for kobject attribute package_id * @package_id_kobj_attr: Storage for kobject attribute package_id
* @elc_low_threshold_percent_kobj_attr: * @elc_low_threshold_percent_kobj_attr:
Storage for kobject attribute elc_low_threshold_percent * Storage for kobject attribute elc_low_threshold_percent
* @elc_high_threshold_percent_kobj_attr: * @elc_high_threshold_percent_kobj_attr:
Storage for kobject attribute elc_high_threshold_percent * Storage for kobject attribute elc_high_threshold_percent
* @elc_high_threshold_enable_kobj_attr: * @elc_high_threshold_enable_kobj_attr:
Storage for kobject attribute elc_high_threshold_enable * Storage for kobject attribute elc_high_threshold_enable
* @elc_floor_freq_khz_kobj_attr: Storage for kobject attribute elc_floor_freq_khz * @elc_floor_freq_khz_kobj_attr: Storage for kobject attribute elc_floor_freq_khz
* @agent_types_kobj_attr: Storage for kobject attribute agent_type * @agent_types_kobj_attr: Storage for kobject attribute agent_type
* @die_id_kobj_attr: Attribute storage for die_id information
* @uncore_attrs: Attribute storage for group creation * @uncore_attrs: Attribute storage for group creation
* *
* This structure is used to encapsulate all data related to uncore sysfs * This structure is used to encapsulate all data related to uncore sysfs

View File

@ -256,6 +256,10 @@ static const struct x86_cpu_id intel_uncore_cpu_ids[] = {
X86_MATCH_VFM(INTEL_ARROWLAKE, NULL), X86_MATCH_VFM(INTEL_ARROWLAKE, NULL),
X86_MATCH_VFM(INTEL_ARROWLAKE_H, NULL), X86_MATCH_VFM(INTEL_ARROWLAKE_H, NULL),
X86_MATCH_VFM(INTEL_LUNARLAKE_M, NULL), X86_MATCH_VFM(INTEL_LUNARLAKE_M, NULL),
X86_MATCH_VFM(INTEL_PANTHERLAKE_L, NULL),
X86_MATCH_VFM(INTEL_WILDCATLAKE_L, NULL),
X86_MATCH_VFM(INTEL_NOVALAKE, NULL),
X86_MATCH_VFM(INTEL_NOVALAKE_L, NULL),
{} {}
}; };
MODULE_DEVICE_TABLE(x86cpu, intel_uncore_cpu_ids); MODULE_DEVICE_TABLE(x86cpu, intel_uncore_cpu_ids);

View File

@ -14,6 +14,7 @@
#include <linux/debugfs.h> #include <linux/debugfs.h>
#include <linux/device.h> #include <linux/device.h>
#include <linux/device/driver.h> #include <linux/device/driver.h>
#include <linux/dmi.h>
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/hwmon.h> #include <linux/hwmon.h>
#include <linux/kernel.h> #include <linux/kernel.h>
@ -28,7 +29,7 @@
#define DRIVER_NAME "msi-wmi-platform" #define DRIVER_NAME "msi-wmi-platform"
#define MSI_PLATFORM_GUID "ABBC0F6E-8EA1-11d1-00A0-C90629100000" #define MSI_PLATFORM_GUID "ABBC0F6E-8EA1-11D1-00A0-C90629100000"
#define MSI_WMI_PLATFORM_INTERFACE_VERSION 2 #define MSI_WMI_PLATFORM_INTERFACE_VERSION 2
@ -448,7 +449,45 @@ static struct wmi_driver msi_wmi_platform_driver = {
.probe = msi_wmi_platform_probe, .probe = msi_wmi_platform_probe,
.no_singleton = true, .no_singleton = true,
}; };
module_wmi_driver(msi_wmi_platform_driver);
/*
* MSI reused the WMI GUID from the WMI-ACPI sample code provided by Microsoft,
* so other manufacturers might use it as well for their WMI-ACPI implementations.
*/
static const struct dmi_system_id msi_wmi_platform_whitelist[] __initconst = {
{
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "MICRO-STAR INT"),
},
},
{
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "Micro-Star International"),
},
},
{ }
};
static int __init msi_wmi_platform_module_init(void)
{
if (!dmi_check_system(msi_wmi_platform_whitelist)) {
if (!force)
return -ENODEV;
pr_warn("Ignoring DMI whitelist\n");
}
return wmi_driver_register(&msi_wmi_platform_driver);
}
static void __exit msi_wmi_platform_module_exit(void)
{
wmi_driver_unregister(&msi_wmi_platform_driver);
}
module_init(msi_wmi_platform_module_init);
module_exit(msi_wmi_platform_module_exit);
MODULE_AUTHOR("Armin Wolf <W_Armin@gmx.de>"); MODULE_AUTHOR("Armin Wolf <W_Armin@gmx.de>");
MODULE_DESCRIPTION("MSI WMI platform features"); MODULE_DESCRIPTION("MSI WMI platform features");

View File

@ -100,7 +100,6 @@ struct int3472_gpio_regulator {
struct regulator_consumer_supply supply_map[GPIO_REGULATOR_SUPPLY_MAP_COUNT * 2]; struct regulator_consumer_supply supply_map[GPIO_REGULATOR_SUPPLY_MAP_COUNT * 2];
char supply_name_upper[GPIO_SUPPLY_NAME_LENGTH]; char supply_name_upper[GPIO_SUPPLY_NAME_LENGTH];
char regulator_name[GPIO_REGULATOR_NAME_LENGTH]; char regulator_name[GPIO_REGULATOR_NAME_LENGTH];
struct gpio_desc *ena_gpio;
struct regulator_dev *rdev; struct regulator_dev *rdev;
struct regulator_desc rdesc; struct regulator_desc rdesc;
}; };

View File

@ -631,6 +631,18 @@
#define KEY_BRIGHTNESS_MIN 0x250 /* Set Brightness to Minimum */ #define KEY_BRIGHTNESS_MIN 0x250 /* Set Brightness to Minimum */
#define KEY_BRIGHTNESS_MAX 0x251 /* Set Brightness to Maximum */ #define KEY_BRIGHTNESS_MAX 0x251 /* Set Brightness to Maximum */
/*
* Keycodes for hotkeys toggling the electronic privacy screen found on some
* laptops on/off. Note when the embedded-controller turns on/off the eprivacy
* screen itself then the state should be reported through drm connecter props:
* https://www.kernel.org/doc/html/latest/gpu/drm-kms.html#standard-connector-properties
* Except when implementing the drm connecter properties API is not possible
* because e.g. the firmware does not allow querying the presence and/or status
* of the eprivacy screen at boot.
*/
#define KEY_EPRIVACY_SCREEN_ON 0x252
#define KEY_EPRIVACY_SCREEN_OFF 0x253
#define KEY_KBDINPUTASSIST_PREV 0x260 #define KEY_KBDINPUTASSIST_PREV 0x260
#define KEY_KBDINPUTASSIST_NEXT 0x261 #define KEY_KBDINPUTASSIST_NEXT 0x261
#define KEY_KBDINPUTASSIST_PREVGROUP 0x262 #define KEY_KBDINPUTASSIST_PREVGROUP 0x262

View File

@ -52,7 +52,7 @@ struct isst_if_cpu_map {
/** /**
* struct isst_if_cpu_maps - structure for CPU map IOCTL * struct isst_if_cpu_maps - structure for CPU map IOCTL
* @cmd_count: Number of CPU mapping command in cpu_map[] * @cmd_count: Number of CPU mapping command in cpu_map[]
* @cpu_map[]: Holds one or more CPU map data structure * @cpu_map: Holds one or more CPU map data structure
* *
* This structure used with ioctl ISST_IF_GET_PHY_ID to send * This structure used with ioctl ISST_IF_GET_PHY_ID to send
* one or more CPU mapping commands. Here IOCTL return value indicates * one or more CPU mapping commands. Here IOCTL return value indicates
@ -82,8 +82,8 @@ struct isst_if_io_reg {
/** /**
* struct isst_if_io_regs - structure for IO register commands * struct isst_if_io_regs - structure for IO register commands
* @cmd_count: Number of io reg commands in io_reg[] * @req_count: Number of io reg commands in io_reg[]
* @io_reg[]: Holds one or more io_reg command structure * @io_reg: Holds one or more io_reg command structure
* *
* This structure used with ioctl ISST_IF_IO_CMD to send * This structure used with ioctl ISST_IF_IO_CMD to send
* one or more read/write commands to PUNIT. Here IOCTL return value * one or more read/write commands to PUNIT. Here IOCTL return value
@ -120,7 +120,7 @@ struct isst_if_mbox_cmd {
/** /**
* struct isst_if_mbox_cmds - structure for mailbox commands * struct isst_if_mbox_cmds - structure for mailbox commands
* @cmd_count: Number of mailbox commands in mbox_cmd[] * @cmd_count: Number of mailbox commands in mbox_cmd[]
* @mbox_cmd[]: Holds one or more mbox commands * @mbox_cmd: Holds one or more mbox commands
* *
* This structure used with ioctl ISST_IF_MBOX_COMMAND to send * This structure used with ioctl ISST_IF_MBOX_COMMAND to send
* one or more mailbox commands to PUNIT. Here IOCTL return value * one or more mailbox commands to PUNIT. Here IOCTL return value
@ -152,7 +152,7 @@ struct isst_if_msr_cmd {
/** /**
* struct isst_if_msr_cmds - structure for msr commands * struct isst_if_msr_cmds - structure for msr commands
* @cmd_count: Number of mailbox commands in msr_cmd[] * @cmd_count: Number of mailbox commands in msr_cmd[]
* @msr_cmd[]: Holds one or more msr commands * @msr_cmd: Holds one or more msr commands
* *
* This structure used with ioctl ISST_IF_MSR_COMMAND to send * This structure used with ioctl ISST_IF_MSR_COMMAND to send
* one or more MSR commands. IOCTL return value indicates number of * one or more MSR commands. IOCTL return value indicates number of
@ -167,8 +167,9 @@ struct isst_if_msr_cmds {
* struct isst_core_power - Structure to get/set core_power feature * struct isst_core_power - Structure to get/set core_power feature
* @get_set: 0: Get, 1: Set * @get_set: 0: Get, 1: Set
* @socket_id: Socket/package id * @socket_id: Socket/package id
* @power_domain: Power Domain id * @power_domain_id: Power Domain id
* @enable: Feature enable status * @enable: Feature enable status
* @supported: Power domain supports SST_CP interface
* @priority_type: Priority type for the feature (ordered/proportional) * @priority_type: Priority type for the feature (ordered/proportional)
* *
* Structure to get/set core_power feature state using IOCTL * Structure to get/set core_power feature state using IOCTL
@ -187,11 +188,11 @@ struct isst_core_power {
* struct isst_clos_param - Structure to get/set clos praram * struct isst_clos_param - Structure to get/set clos praram
* @get_set: 0: Get, 1: Set * @get_set: 0: Get, 1: Set
* @socket_id: Socket/package id * @socket_id: Socket/package id
* @power_domain: Power Domain id * @power_domain_id: Power Domain id
* clos: Clos ID for the parameters * @clos: Clos ID for the parameters
* min_freq_mhz: Minimum frequency in MHz * @min_freq_mhz: Minimum frequency in MHz
* max_freq_mhz: Maximum frequency in MHz * @max_freq_mhz: Maximum frequency in MHz
* prop_prio: Proportional priority from 0-15 * @prop_prio: Proportional priority from 0-15
* *
* Structure to get/set per clos property using IOCTL * Structure to get/set per clos property using IOCTL
* ISST_IF_CLOS_PARAM. * ISST_IF_CLOS_PARAM.
@ -209,7 +210,7 @@ struct isst_clos_param {
/** /**
* struct isst_if_clos_assoc - Structure to assign clos to a CPU * struct isst_if_clos_assoc - Structure to assign clos to a CPU
* @socket_id: Socket/package id * @socket_id: Socket/package id
* @power_domain: Power Domain id * @power_domain_id: Power Domain id
* @logical_cpu: CPU number * @logical_cpu: CPU number
* @clos: Clos ID to assign to the logical CPU * @clos: Clos ID to assign to the logical CPU
* *
@ -228,6 +229,7 @@ struct isst_if_clos_assoc {
* @get_set: Request is for get or set * @get_set: Request is for get or set
* @punit_cpu_map: Set to 1 if the CPU number is punit numbering not * @punit_cpu_map: Set to 1 if the CPU number is punit numbering not
* Linux CPU number * Linux CPU number
* @assoc_info: CLOS data for this CPU
* *
* Structure used to get/set associate CPUs to clos using IOCTL * Structure used to get/set associate CPUs to clos using IOCTL
* ISST_IF_CLOS_ASSOC. * ISST_IF_CLOS_ASSOC.
@ -257,7 +259,7 @@ struct isst_tpmi_instance_count {
/** /**
* struct isst_perf_level_info - Structure to get information on SST-PP levels * struct isst_perf_level_info - Structure to get information on SST-PP levels
* @socket_id: Socket/package id * @socket_id: Socket/package id
* @power_domain: Power Domain id * @power_domain_id: Power Domain id
* @logical_cpu: CPU number * @logical_cpu: CPU number
* @clos: Clos ID to assign to the logical CPU * @clos: Clos ID to assign to the logical CPU
* @max_level: Maximum performance level supported by the platform * @max_level: Maximum performance level supported by the platform
@ -267,8 +269,8 @@ struct isst_tpmi_instance_count {
* @feature_state: SST-BF and SST-TF (enabled/disabled) status at current level * @feature_state: SST-BF and SST-TF (enabled/disabled) status at current level
* @locked: SST-PP performance level change is locked/unlocked * @locked: SST-PP performance level change is locked/unlocked
* @enabled: SST-PP feature is enabled or not * @enabled: SST-PP feature is enabled or not
* @sst-tf_support: SST-TF support status at this level * @sst_tf_support: SST-TF support status at this level
* @sst-bf_support: SST-BF support status at this level * @sst_bf_support: SST-BF support status at this level
* *
* Structure to get SST-PP details using IOCTL ISST_IF_PERF_LEVELS. * Structure to get SST-PP details using IOCTL ISST_IF_PERF_LEVELS.
*/ */
@ -289,7 +291,7 @@ struct isst_perf_level_info {
/** /**
* struct isst_perf_level_control - Structure to set SST-PP level * struct isst_perf_level_control - Structure to set SST-PP level
* @socket_id: Socket/package id * @socket_id: Socket/package id
* @power_domain: Power Domain id * @power_domain_id: Power Domain id
* @level: level to set * @level: level to set
* *
* Structure used change SST-PP level using IOCTL ISST_IF_PERF_SET_LEVEL. * Structure used change SST-PP level using IOCTL ISST_IF_PERF_SET_LEVEL.
@ -303,7 +305,7 @@ struct isst_perf_level_control {
/** /**
* struct isst_perf_feature_control - Structure to activate SST-BF/SST-TF * struct isst_perf_feature_control - Structure to activate SST-BF/SST-TF
* @socket_id: Socket/package id * @socket_id: Socket/package id
* @power_domain: Power Domain id * @power_domain_id: Power Domain id
* @feature: bit 0 = SST-BF state, bit 1 = SST-TF state * @feature: bit 0 = SST-BF state, bit 1 = SST-TF state
* *
* Structure used to enable SST-BF/SST-TF using IOCTL ISST_IF_PERF_SET_FEATURE. * Structure used to enable SST-BF/SST-TF using IOCTL ISST_IF_PERF_SET_FEATURE.
@ -320,7 +322,7 @@ struct isst_perf_feature_control {
/** /**
* struct isst_perf_level_data_info - Structure to get SST-PP level details * struct isst_perf_level_data_info - Structure to get SST-PP level details
* @socket_id: Socket/package id * @socket_id: Socket/package id
* @power_domain: Power Domain id * @power_domain_id: Power Domain id
* @level: SST-PP level for which caller wants to get information * @level: SST-PP level for which caller wants to get information
* @tdp_ratio: TDP Ratio * @tdp_ratio: TDP Ratio
* @base_freq_mhz: Base frequency in MHz * @base_freq_mhz: Base frequency in MHz
@ -341,8 +343,8 @@ struct isst_perf_feature_control {
* @pm_fabric_freq_mhz: Fabric (Uncore) minimum frequency * @pm_fabric_freq_mhz: Fabric (Uncore) minimum frequency
* @max_buckets: Maximum trl buckets * @max_buckets: Maximum trl buckets
* @max_trl_levels: Maximum trl levels * @max_trl_levels: Maximum trl levels
* @bucket_core_counts[TRL_MAX_BUCKETS]: Number of cores per bucket * @bucket_core_counts: Number of cores per bucket
* @trl_freq_mhz[TRL_MAX_LEVELS][TRL_MAX_BUCKETS]: maximum frequency * @trl_freq_mhz: maximum frequency
* for a bucket and trl level * for a bucket and trl level
* *
* Structure used to get information on frequencies and TDP for a SST-PP * Structure used to get information on frequencies and TDP for a SST-PP
@ -402,7 +404,7 @@ struct isst_perf_level_fabric_info {
/** /**
* struct isst_perf_level_cpu_mask - Structure to get SST-PP level CPU mask * struct isst_perf_level_cpu_mask - Structure to get SST-PP level CPU mask
* @socket_id: Socket/package id * @socket_id: Socket/package id
* @power_domain: Power Domain id * @power_domain_id: Power Domain id
* @level: SST-PP level for which caller wants to get information * @level: SST-PP level for which caller wants to get information
* @punit_cpu_map: Set to 1 if the CPU number is punit numbering not * @punit_cpu_map: Set to 1 if the CPU number is punit numbering not
* Linux CPU number. If 0 CPU buffer is copied to user space * Linux CPU number. If 0 CPU buffer is copied to user space
@ -430,7 +432,7 @@ struct isst_perf_level_cpu_mask {
/** /**
* struct isst_base_freq_info - Structure to get SST-BF frequencies * struct isst_base_freq_info - Structure to get SST-BF frequencies
* @socket_id: Socket/package id * @socket_id: Socket/package id
* @power_domain: Power Domain id * @power_domain_id: Power Domain id
* @level: SST-PP level for which caller wants to get information * @level: SST-PP level for which caller wants to get information
* @high_base_freq_mhz: High priority CPU base frequency * @high_base_freq_mhz: High priority CPU base frequency
* @low_base_freq_mhz: Low priority CPU base frequency * @low_base_freq_mhz: Low priority CPU base frequency
@ -453,9 +455,11 @@ struct isst_base_freq_info {
/** /**
* struct isst_turbo_freq_info - Structure to get SST-TF frequencies * struct isst_turbo_freq_info - Structure to get SST-TF frequencies
* @socket_id: Socket/package id * @socket_id: Socket/package id
* @power_domain: Power Domain id * @power_domain_id: Power Domain id
* @level: SST-PP level for which caller wants to get information * @level: SST-PP level for which caller wants to get information
* @max_clip_freqs: Maximum number of low priority core clipping frequencies * @max_clip_freqs: Maximum number of low priority core clipping frequencies
* @max_buckets: Maximum trl buckets
* @max_trl_levels: Maximum trl levels
* @lp_clip_freq_mhz: Clip frequencies per trl level * @lp_clip_freq_mhz: Clip frequencies per trl level
* @bucket_core_counts: Maximum number of cores for a bucket * @bucket_core_counts: Maximum number of cores for a bucket
* @trl_freq_mhz: Frequencies per trl level for each bucket * @trl_freq_mhz: Frequencies per trl level for each bucket