platform-drivers-x86 for v7.0-2

Fixes and New HW Support
 
 - alienware-wmi-wmax: Add G-Mode support to m18 laptops
 
 - asus-armoury: Add support for FA401UM, G733QS, GX650RX
 
 - dell-wmi-sysman: Don't hex dump plaintext password data
 
 - hp-bioscfg: Support large number of enumeration attributes
 
 - hp-wmi: Add support for Omen 14-fb1xxx, 16-xd0xxx and 16-wf0xxx,
           Victus-d0xxx
 
 - int3472: Handle GPIO type 0x10 (DOVDD)
 
 - intel-hid:
   - Add Dell 14 & 16 Plus 2-in-1 to dmi_vgbs_allow_list
   - Enable 5-button array on ThinkPad X1 Fold 16 Gen 1
 
 - mellanox: mlxreg: Fix kernel-doc warnings
 
 - oxpec: Add support for OneXPlayer X1 Air, X1z, APEX, and Aokzoe A2 Pro
 
 - redmi-wmi: Add more Fn hotkey mappings
 
 - thinkpad_acpi: Fix errors reading battery thresholds
 
 - touchscreen_dmi: Add quirk for y-inverted Goodix touchscreen on SUPI S10
 
 - uniwill-laptop:
   - FN lock/super key lock attributes rename
   - Fix crash on unexpected battery event
   - A special key combination can alter FN lock status so mark it volatile
   - Handle FN lock event
 
 The following is an automated shortlog grouped by driver:
 
 alienware-wmi-wmax:
  -  Add G-Mode support to m18 laptops
 
 asus-armoury:
  -  add support for FA401UM
  -  add support for G733QS
  -  add support for GX650RX
 
 dell-wmi:
  -  Add audio/mic mute key codes
 
 dell-wmi-sysman:
  -  Don't hex dump plaintext password data
 
 hp-bioscfg:
  -  Support allocations of larger data
 
 hp-wmi:
  -  add Omen 14-fb1xxx (board 8E41) support
  -  Add Omen 16-wf0xxx fan and thermal support
  -  Add Omen 16-xd0xxx fan and thermal support
  -  Add Victus 16-d0xxx support
 
 int3472:
  -  Handle GPIO type 0x10 (DOVDD)
 
 intel-hid:
  -  Add Dell 14 Plus 2-in-1 to dmi_vgbs_allow_list
  -  Add Dell 16 Plus 2-in-1 to dmi_vgbs_allow_list
  -  Enable 5-button array on ThinkPad X1 Fold 16 Gen 1
 
 oxpec:
  -  Add support for Aokzoe A2 Pro
  -  Add support for OneXPlayer APEX
  -  Add support for OneXPlayer X1 Air
  -  Add support for OneXPlayer X1z
 
 platform_data/mlxreg: mlxreg.h:
  -  fix all kernel-doc warnings
 
 redmi-wmi:
  -  Add more hotkey mappings
 
 thinkpad_acpi:
  -  Fix errors reading battery thresholds
 
 touchscreen_dmi:
  -  Add quirk for y-inverted Goodix touchscreen on SUPI S10
 
 uniwill-laptop:
  -  Fix crash on unexpected battery event
  -  Handle FN lock event
  -  Mark FN lock status as being volatile
  -  Rename FN lock and super key lock attrs
 -----BEGIN PGP SIGNATURE-----
 
 iHUEABYIAB0WIQSCSUwRdwTNL2MhaBlZrE9hU+XOMQUCaarJlgAKCRBZrE9hU+XO
 MY05AQCR1izfLKgDn88+dlYyLvEaZ7CPTH+nhUddRxb/W5eF4wEAxgkiQaSMk7IV
 7GBLuoazK+XDgCK3J1Coq1BiU+JpWgM=
 =oUiT
 -----END PGP SIGNATURE-----

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

Pull x86 platform driver fixes from Ilpo Järvinen:

 - alienware-wmi-wmax: Add G-Mode support to m18 laptops

 - asus-armoury: Add support for FA401UM, G733QS, GX650RX

 - dell-wmi-sysman: Don't hex dump plaintext password data

 - hp-bioscfg: Support large number of enumeration attributes

 - hp-wmi: Add support for Omen 14-fb1xxx, 16-xd0xxx, 16-wf0xxx, and
   Victus-d0xxx

 - int3472: Handle GPIO type 0x10 (DOVDD)

 - intel-hid:
     - Add Dell 14 & 16 Plus 2-in-1 to dmi_vgbs_allow_list
     - Enable 5-button array on ThinkPad X1 Fold 16 Gen 1

 - mellanox: mlxreg: Fix kernel-doc warnings

 - oxpec: Add support for OneXPlayer X1 Air, X1z, APEX, and Aokzoe A2
   Pro

 - redmi-wmi: Add more Fn hotkey mappings

 - thinkpad_acpi: Fix errors reading battery thresholds

 - touchscreen_dmi: Add quirk for y-inverted Goodix touchscreen on SUPI
   S10

 - uniwill-laptop:
     - FN lock/super key lock attributes rename
     - Fix crash on unexpected battery event
     - A special key combination can alter FN lock status so mark it
       volatile
     - Handle FN lock event

* tag 'platform-drivers-x86-v7.0-2' of git://git.kernel.org/pub/scm/linux/kernel/git/pdx86/platform-drivers-x86: (27 commits)
  platform/x86: dell-wmi-sysman: Don't hex dump plaintext password data
  platform_data/mlxreg: mlxreg.h: fix all kernel-doc warnings
  platform/x86: asus-armoury: add support for FA401UM
  platform/x86: asus-armoury: add support for GX650RX
  platform/x86: hp-bioscfg: Support allocations of larger data
  platform/x86: oxpec: Add support for Aokzoe A2 Pro
  platform/x86: oxpec: Add support for OneXPlayer X1 Air
  platform/x86: oxpec: Add support for OneXPlayer X1z
  platform/x86: oxpec: Add support for OneXPlayer APEX
  platform/x86: uniwill-laptop: Handle FN lock event
  platform/x86: uniwill-laptop: Mark FN lock status as being volatile
  platform/x86: uniwill-laptop: Fix crash on unexpected battery event
  platform/x86: uniwill-laptop: Rename FN lock and super key lock attrs
  platform/x86: redmi-wmi: Add more hotkey mappings
  platform/x86: alienware-wmi-wmax: Add G-Mode support to m18 laptops
  platform/x86: hp-wmi: add Omen 14-fb1xxx (board 8E41) support
  platform/x86: dell-wmi: Add audio/mic mute key codes
  platform/x86: hp-wmi: Add Victus 16-d0xxx support
  platform/x86: intel-hid: Enable 5-button array on ThinkPad X1 Fold 16 Gen 1
  platform/x86: int3472: Handle GPIO type 0x10 (DOVDD)
  ...
This commit is contained in:
Linus Torvalds 2026-03-06 09:48:50 -08:00
commit 54de8b835b
18 changed files with 294 additions and 63 deletions

View file

@ -1,4 +1,4 @@
What: /sys/bus/platform/devices/INOU0000:XX/fn_lock_toggle_enable
What: /sys/bus/platform/devices/INOU0000:XX/fn_lock
Date: November 2025
KernelVersion: 6.19
Contact: Armin Wolf <W_Armin@gmx.de>
@ -8,15 +8,15 @@ Description:
Reading this file returns the current enable status of the FN lock functionality.
What: /sys/bus/platform/devices/INOU0000:XX/super_key_toggle_enable
What: /sys/bus/platform/devices/INOU0000:XX/super_key_enable
Date: November 2025
KernelVersion: 6.19
Contact: Armin Wolf <W_Armin@gmx.de>
Description:
Allows userspace applications to enable/disable the super key functionality
of the integrated keyboard by writing "1"/"0" into this file.
Allows userspace applications to enable/disable the super key of the integrated
keyboard by writing "1"/"0" into this file.
Reading this file returns the current enable status of the super key functionality.
Reading this file returns the current enable status of the super key.
What: /sys/bus/platform/devices/INOU0000:XX/touchpad_toggle_enable
Date: November 2025

View file

@ -24,7 +24,7 @@ Keyboard settings
The ``uniwill-laptop`` driver allows the user to enable/disable:
- the FN and super key lock functionality of the integrated keyboard
- the FN lock and super key of the integrated keyboard
- the touchpad toggle functionality of the integrated touchpad
See Documentation/ABI/testing/sysfs-driver-uniwill-laptop for details.

View file

@ -346,6 +346,35 @@ struct power_data {
* _def is not required and will be assumed to be default == max if missing.
*/
static const struct dmi_system_id power_limits[] = {
{
.matches = {
DMI_MATCH(DMI_BOARD_NAME, "FA401UM"),
},
.driver_data = &(struct power_data) {
.ac_data = &(struct power_limits) {
.ppt_pl1_spl_min = 15,
.ppt_pl1_spl_max = 80,
.ppt_pl2_sppt_min = 35,
.ppt_pl2_sppt_max = 80,
.ppt_pl3_fppt_min = 35,
.ppt_pl3_fppt_max = 80,
.nv_dynamic_boost_min = 5,
.nv_dynamic_boost_max = 15,
.nv_temp_target_min = 75,
.nv_temp_target_max = 87,
},
.dc_data = &(struct power_limits) {
.ppt_pl1_spl_min = 25,
.ppt_pl1_spl_max = 35,
.ppt_pl2_sppt_min = 31,
.ppt_pl2_sppt_max = 44,
.ppt_pl3_fppt_min = 45,
.ppt_pl3_fppt_max = 65,
.nv_temp_target_min = 75,
.nv_temp_target_max = 87,
},
},
},
{
.matches = {
DMI_MATCH(DMI_BOARD_NAME, "FA401UV"),
@ -1457,6 +1486,38 @@ static const struct dmi_system_id power_limits[] = {
},
},
},
{
.matches = {
DMI_MATCH(DMI_BOARD_NAME, "GX650RX"),
},
.driver_data = &(struct power_data) {
.ac_data = &(struct power_limits) {
.ppt_pl1_spl_min = 28,
.ppt_pl1_spl_def = 70,
.ppt_pl1_spl_max = 90,
.ppt_pl2_sppt_min = 28,
.ppt_pl2_sppt_def = 70,
.ppt_pl2_sppt_max = 100,
.ppt_pl3_fppt_min = 28,
.ppt_pl3_fppt_def = 110,
.ppt_pl3_fppt_max = 125,
.nv_dynamic_boost_min = 5,
.nv_dynamic_boost_max = 25,
.nv_temp_target_min = 76,
.nv_temp_target_max = 87,
},
.dc_data = &(struct power_limits) {
.ppt_pl1_spl_min = 28,
.ppt_pl1_spl_max = 50,
.ppt_pl2_sppt_min = 28,
.ppt_pl2_sppt_max = 50,
.ppt_pl3_fppt_min = 28,
.ppt_pl3_fppt_max = 65,
.nv_temp_target_min = 76,
.nv_temp_target_max = 87,
},
},
},
{
.matches = {
DMI_MATCH(DMI_BOARD_NAME, "G513I"),
@ -1708,6 +1769,20 @@ static const struct dmi_system_id power_limits[] = {
.requires_fan_curve = true,
},
},
{
.matches = {
DMI_MATCH(DMI_BOARD_NAME, "G733QS"),
},
.driver_data = &(struct power_data) {
.ac_data = &(struct power_limits) {
.ppt_pl1_spl_min = 15,
.ppt_pl1_spl_max = 80,
.ppt_pl2_sppt_min = 15,
.ppt_pl2_sppt_max = 80,
},
.requires_fan_curve = false,
},
},
{
.matches = {
DMI_MATCH(DMI_BOARD_NAME, "G814J"),

View file

@ -175,7 +175,7 @@ static const struct dmi_system_id awcc_dmi_table[] __initconst = {
DMI_MATCH(DMI_SYS_VENDOR, "Alienware"),
DMI_MATCH(DMI_PRODUCT_NAME, "Alienware m18"),
},
.driver_data = &generic_quirks,
.driver_data = &g_series_quirks,
},
{
.ident = "Alienware x15",

View file

@ -80,6 +80,12 @@ static const struct dmi_system_id dell_wmi_smbios_list[] __initconst = {
static const struct key_entry dell_wmi_keymap_type_0000[] = {
{ KE_IGNORE, 0x003a, { KEY_CAPSLOCK } },
/* Audio mute toggle */
{ KE_KEY, 0x0109, { KEY_MUTE } },
/* Mic mute toggle */
{ KE_KEY, 0x0150, { KEY_MICMUTE } },
/* Meta key lock */
{ KE_IGNORE, 0xe000, { KEY_RIGHTMETA } },

View file

@ -93,7 +93,6 @@ int set_new_password(const char *password_type, const char *new)
if (ret < 0)
goto out;
print_hex_dump_bytes("set new password data: ", DUMP_PREFIX_NONE, buffer, buffer_size);
ret = call_password_interface(wmi_priv.password_attr_wdev, buffer, buffer_size);
/* on success copy the new password to current password */
if (!ret)

View file

@ -94,8 +94,11 @@ int hp_alloc_enumeration_data(void)
bioscfg_drv.enumeration_instances_count =
hp_get_instance_count(HP_WMI_BIOS_ENUMERATION_GUID);
bioscfg_drv.enumeration_data = kzalloc_objs(*bioscfg_drv.enumeration_data,
bioscfg_drv.enumeration_instances_count);
if (!bioscfg_drv.enumeration_instances_count)
return -EINVAL;
bioscfg_drv.enumeration_data = kvcalloc(bioscfg_drv.enumeration_instances_count,
sizeof(*bioscfg_drv.enumeration_data), GFP_KERNEL);
if (!bioscfg_drv.enumeration_data) {
bioscfg_drv.enumeration_instances_count = 0;
return -ENOMEM;
@ -444,6 +447,6 @@ void hp_exit_enumeration_attributes(void)
}
bioscfg_drv.enumeration_instances_count = 0;
kfree(bioscfg_drv.enumeration_data);
kvfree(bioscfg_drv.enumeration_data);
bioscfg_drv.enumeration_data = NULL;
}

View file

@ -146,6 +146,7 @@ static const char * const omen_thermal_profile_boards[] = {
"8900", "8901", "8902", "8912", "8917", "8918", "8949", "894A", "89EB",
"8A15", "8A42",
"8BAD",
"8E41",
};
/* DMI Board names of Omen laptops that are specifically set to be thermal
@ -166,17 +167,26 @@ static const char * const omen_timed_thermal_profile_boards[] = {
"8BAD",
};
/* DMI Board names of Victus 16-d1xxx laptops */
/* DMI Board names of Victus 16-d laptops */
static const char * const victus_thermal_profile_boards[] = {
"88F8",
"8A25",
};
/* DMI Board names of Victus 16-r and Victus 16-s laptops */
static const struct dmi_system_id victus_s_thermal_profile_boards[] __initconst = {
{
.matches = { DMI_MATCH(DMI_BOARD_NAME, "8BAB") },
.driver_data = (void *)&omen_v1_thermal_params,
},
{
.matches = { DMI_MATCH(DMI_BOARD_NAME, "8BBE") },
.driver_data = (void *)&victus_s_thermal_params,
},
{
.matches = { DMI_MATCH(DMI_BOARD_NAME, "8BCD") },
.driver_data = (void *)&omen_v1_thermal_params,
},
{
.matches = { DMI_MATCH(DMI_BOARD_NAME, "8BD4") },
.driver_data = (void *)&victus_s_thermal_params,

View file

@ -135,6 +135,13 @@ static const struct dmi_system_id button_array_table[] = {
DMI_MATCH(DMI_PRODUCT_FAMILY, "ThinkPad X1 Tablet Gen 2"),
},
},
{
.ident = "Lenovo ThinkPad X1 Fold 16 Gen 1",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
DMI_MATCH(DMI_PRODUCT_FAMILY, "ThinkPad X1 Fold 16 Gen 1"),
},
},
{
.ident = "Microsoft Surface Go 3",
.matches = {
@ -189,6 +196,18 @@ static const struct dmi_system_id dmi_vgbs_allow_list[] = {
DMI_MATCH(DMI_PRODUCT_NAME, "Dell Pro Rugged 12 Tablet RA02260"),
},
},
{
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
DMI_MATCH(DMI_PRODUCT_NAME, "Dell 14 Plus 2-in-1 DB04250"),
},
},
{
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
DMI_MATCH(DMI_PRODUCT_NAME, "Dell 16 Plus 2-in-1 DB06250"),
},
},
{ }
};

View file

@ -223,6 +223,10 @@ static void int3472_get_con_id_and_polarity(struct int3472_discrete_device *int3
*con_id = "avdd";
*gpio_flags = GPIO_ACTIVE_HIGH;
break;
case INT3472_GPIO_TYPE_DOVDD:
*con_id = "dovdd";
*gpio_flags = GPIO_ACTIVE_HIGH;
break;
case INT3472_GPIO_TYPE_HANDSHAKE:
*con_id = "dvdd";
*gpio_flags = GPIO_ACTIVE_HIGH;
@ -251,6 +255,7 @@ static void int3472_get_con_id_and_polarity(struct int3472_discrete_device *int3
* 0x0b Power enable
* 0x0c Clock enable
* 0x0d Privacy LED
* 0x10 DOVDD (digital I/O voltage)
* 0x13 Hotplug detect
*
* There are some known platform specific quirks where that does not quite
@ -332,6 +337,7 @@ static int skl_int3472_handle_gpio_resources(struct acpi_resource *ares,
case INT3472_GPIO_TYPE_CLK_ENABLE:
case INT3472_GPIO_TYPE_PRIVACY_LED:
case INT3472_GPIO_TYPE_POWER_ENABLE:
case INT3472_GPIO_TYPE_DOVDD:
case INT3472_GPIO_TYPE_HANDSHAKE:
gpio = skl_int3472_gpiod_get_from_temp_lookup(int3472, agpio, con_id, gpio_flags);
if (IS_ERR(gpio)) {
@ -356,6 +362,7 @@ static int skl_int3472_handle_gpio_resources(struct acpi_resource *ares,
case INT3472_GPIO_TYPE_POWER_ENABLE:
second_sensor = int3472->quirks.avdd_second_sensor;
fallthrough;
case INT3472_GPIO_TYPE_DOVDD:
case INT3472_GPIO_TYPE_HANDSHAKE:
ret = skl_int3472_register_regulator(int3472, gpio, enable_time_us,
con_id, second_sensor);

View file

@ -9525,14 +9525,16 @@ static int tpacpi_battery_get(int what, int battery, int *ret)
{
switch (what) {
case THRESHOLD_START:
if ACPI_FAILURE(tpacpi_battery_acpi_eval(GET_START, ret, battery))
if (!battery_info.batteries[battery].start_support ||
ACPI_FAILURE(tpacpi_battery_acpi_eval(GET_START, ret, battery)))
return -ENODEV;
/* The value is in the low 8 bits of the response */
*ret = *ret & 0xFF;
return 0;
case THRESHOLD_STOP:
if ACPI_FAILURE(tpacpi_battery_acpi_eval(GET_STOP, ret, battery))
if (!battery_info.batteries[battery].stop_support ||
ACPI_FAILURE(tpacpi_battery_acpi_eval(GET_STOP, ret, battery)))
return -ENODEV;
/* Value is in lower 8 bits */
*ret = *ret & 0xFF;

View file

@ -11,7 +11,7 @@
*
* Copyright (C) 2022 Joaquín I. Aramendía <samsagax@gmail.com>
* Copyright (C) 2024 Derek J. Clark <derekjohn.clark@gmail.com>
* Copyright (C) 2025 Antheas Kapenekakis <lkml@antheas.dev>
* Copyright (C) 2025-2026 Antheas Kapenekakis <lkml@antheas.dev>
*/
#include <linux/acpi.h>
@ -114,6 +114,13 @@ static const struct dmi_system_id dmi_table[] = {
},
.driver_data = (void *)aok_zoe_a1,
},
{
.matches = {
DMI_MATCH(DMI_BOARD_VENDOR, "AOKZOE"),
DMI_EXACT_MATCH(DMI_BOARD_NAME, "AOKZOE A2 Pro"),
},
.driver_data = (void *)aok_zoe_a1,
},
{
.matches = {
DMI_MATCH(DMI_BOARD_VENDOR, "AOKZOE"),
@ -142,6 +149,13 @@ static const struct dmi_system_id dmi_table[] = {
},
.driver_data = (void *)oxp_2,
},
{
.matches = {
DMI_MATCH(DMI_BOARD_VENDOR, "ONE-NETBOOK"),
DMI_EXACT_MATCH(DMI_BOARD_NAME, "ONEXPLAYER APEX"),
},
.driver_data = (void *)oxp_fly,
},
{
.matches = {
DMI_MATCH(DMI_BOARD_VENDOR, "ONE-NETBOOK"),
@ -212,6 +226,13 @@ static const struct dmi_system_id dmi_table[] = {
},
.driver_data = (void *)oxp_mini_amd_pro,
},
{
.matches = {
DMI_MATCH(DMI_BOARD_VENDOR, "ONE-NETBOOK"),
DMI_EXACT_MATCH(DMI_BOARD_NAME, "ONEXPLAYER X1z"),
},
.driver_data = (void *)oxp_x1,
},
{
.matches = {
DMI_MATCH(DMI_BOARD_VENDOR, "ONE-NETBOOK"),
@ -226,6 +247,13 @@ static const struct dmi_system_id dmi_table[] = {
},
.driver_data = (void *)oxp_x1,
},
{
.matches = {
DMI_MATCH(DMI_BOARD_VENDOR, "ONE-NETBOOK"),
DMI_EXACT_MATCH(DMI_BOARD_NAME, "ONEXPLAYER X1Air"),
},
.driver_data = (void *)oxp_x1,
},
{
.matches = {
DMI_MATCH(DMI_BOARD_VENDOR, "ONE-NETBOOK"),

View file

@ -20,7 +20,10 @@
static const struct key_entry redmi_wmi_keymap[] = {
{KE_KEY, 0x00000201, {KEY_SELECTIVE_SCREENSHOT}},
{KE_KEY, 0x00000301, {KEY_ALL_APPLICATIONS}},
{KE_KEY, 0x00001b01, {KEY_SETUP}},
{KE_KEY, 0x00001b01, {KEY_CONFIG}},
{KE_KEY, 0x00011b01, {KEY_CONFIG}},
{KE_KEY, 0x00010101, {KEY_SWITCHVIDEOMODE}},
{KE_KEY, 0x00001a01, {KEY_REFRESH_RATE_TOGGLE}},
/* AI button has code for each position */
{KE_KEY, 0x00011801, {KEY_ASSISTANT}},
@ -32,6 +35,26 @@ static const struct key_entry redmi_wmi_keymap[] = {
{KE_IGNORE, 0x00050501, {}},
{KE_IGNORE, 0x000a0501, {}},
/* Xiaomi G Command Center */
{KE_KEY, 0x00010a01, {KEY_VENDOR}},
/* OEM preset power mode */
{KE_IGNORE, 0x00011601, {}},
{KE_IGNORE, 0x00021601, {}},
{KE_IGNORE, 0x00031601, {}},
{KE_IGNORE, 0x00041601, {}},
/* Fn Lock state */
{KE_IGNORE, 0x00000701, {}},
{KE_IGNORE, 0x00010701, {}},
/* Fn+`/1/2/3/4 */
{KE_KEY, 0x00011101, {KEY_F13}},
{KE_KEY, 0x00011201, {KEY_F14}},
{KE_KEY, 0x00011301, {KEY_F15}},
{KE_KEY, 0x00011401, {KEY_F16}},
{KE_KEY, 0x00011501, {KEY_F17}},
{KE_END}
};

View file

@ -410,6 +410,16 @@ static const struct ts_dmi_data gdix1002_upside_down_data = {
.properties = gdix1001_upside_down_props,
};
static const struct property_entry gdix1001_y_inverted_props[] = {
PROPERTY_ENTRY_BOOL("touchscreen-inverted-y"),
{ }
};
static const struct ts_dmi_data gdix1001_y_inverted_data = {
.acpi_name = "GDIX1001",
.properties = gdix1001_y_inverted_props,
};
static const struct property_entry gp_electronic_t701_props[] = {
PROPERTY_ENTRY_U32("touchscreen-size-x", 960),
PROPERTY_ENTRY_U32("touchscreen-size-y", 640),
@ -1658,6 +1668,14 @@ const struct dmi_system_id touchscreen_dmi_table[] = {
DMI_MATCH(DMI_PRODUCT_SKU, "PN20170413488"),
},
},
{
/* SUPI S10 */
.driver_data = (void *)&gdix1001_y_inverted_data,
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "SUPI"),
DMI_MATCH(DMI_PRODUCT_NAME, "S10"),
},
},
{
/* Techbite Arc 11.6 */
.driver_data = (void *)&techbite_arc_11_6_data,

View file

@ -314,8 +314,8 @@
#define LED_CHANNELS 3
#define LED_MAX_BRIGHTNESS 200
#define UNIWILL_FEATURE_FN_LOCK_TOGGLE BIT(0)
#define UNIWILL_FEATURE_SUPER_KEY_TOGGLE BIT(1)
#define UNIWILL_FEATURE_FN_LOCK BIT(0)
#define UNIWILL_FEATURE_SUPER_KEY BIT(1)
#define UNIWILL_FEATURE_TOUCHPAD_TOGGLE BIT(2)
#define UNIWILL_FEATURE_LIGHTBAR BIT(3)
#define UNIWILL_FEATURE_BATTERY BIT(4)
@ -330,6 +330,7 @@ struct uniwill_data {
struct acpi_battery_hook hook;
unsigned int last_charge_ctrl;
struct mutex battery_lock; /* Protects the list of currently registered batteries */
unsigned int last_status;
unsigned int last_switch_status;
struct mutex super_key_lock; /* Protects the toggling of the super key lock state */
struct list_head batteries;
@ -377,11 +378,15 @@ static const struct key_entry uniwill_keymap[] = {
{ KE_IGNORE, UNIWILL_OSD_CAPSLOCK, { KEY_CAPSLOCK }},
{ KE_IGNORE, UNIWILL_OSD_NUMLOCK, { KEY_NUMLOCK }},
/* Reported when the user locks/unlocks the super key */
{ KE_IGNORE, UNIWILL_OSD_SUPER_KEY_LOCK_ENABLE, { KEY_UNKNOWN }},
{ KE_IGNORE, UNIWILL_OSD_SUPER_KEY_LOCK_DISABLE, { KEY_UNKNOWN }},
/*
* Reported when the user enables/disables the super key.
* Those events might even be reported when the change was done
* using the sysfs attribute!
*/
{ KE_IGNORE, UNIWILL_OSD_SUPER_KEY_DISABLE, { KEY_UNKNOWN }},
{ KE_IGNORE, UNIWILL_OSD_SUPER_KEY_ENABLE, { KEY_UNKNOWN }},
/* Optional, might not be reported by all devices */
{ KE_IGNORE, UNIWILL_OSD_SUPER_KEY_LOCK_CHANGED, { KEY_UNKNOWN }},
{ KE_IGNORE, UNIWILL_OSD_SUPER_KEY_STATE_CHANGED, { KEY_UNKNOWN }},
/* Reported in manual mode when toggling the airplane mode status */
{ KE_KEY, UNIWILL_OSD_RFKILL, { KEY_RFKILL }},
@ -401,9 +406,6 @@ static const struct key_entry uniwill_keymap[] = {
/* Reported when the user wants to toggle the mute status */
{ KE_IGNORE, UNIWILL_OSD_MUTE, { KEY_MUTE }},
/* Reported when the user locks/unlocks the Fn key */
{ KE_IGNORE, UNIWILL_OSD_FN_LOCK, { KEY_FN_ESC }},
/* Reported when the user wants to toggle the brightness of the keyboard */
{ KE_KEY, UNIWILL_OSD_KBDILLUMTOGGLE, { KEY_KBDILLUMTOGGLE }},
{ KE_KEY, UNIWILL_OSD_KB_LED_LEVEL0, { KEY_KBDILLUMTOGGLE }},
@ -576,6 +578,7 @@ static bool uniwill_volatile_reg(struct device *dev, unsigned int reg)
case EC_ADDR_SECOND_FAN_RPM_1:
case EC_ADDR_SECOND_FAN_RPM_2:
case EC_ADDR_BAT_ALERT:
case EC_ADDR_BIOS_OEM:
case EC_ADDR_PWM_1:
case EC_ADDR_PWM_2:
case EC_ADDR_TRIGGER:
@ -600,8 +603,8 @@ static const struct regmap_config uniwill_ec_config = {
.use_single_write = true,
};
static ssize_t fn_lock_toggle_enable_store(struct device *dev, struct device_attribute *attr,
const char *buf, size_t count)
static ssize_t fn_lock_store(struct device *dev, struct device_attribute *attr, const char *buf,
size_t count)
{
struct uniwill_data *data = dev_get_drvdata(dev);
unsigned int value;
@ -624,8 +627,7 @@ static ssize_t fn_lock_toggle_enable_store(struct device *dev, struct device_att
return count;
}
static ssize_t fn_lock_toggle_enable_show(struct device *dev, struct device_attribute *attr,
char *buf)
static ssize_t fn_lock_show(struct device *dev, struct device_attribute *attr, char *buf)
{
struct uniwill_data *data = dev_get_drvdata(dev);
unsigned int value;
@ -638,9 +640,9 @@ static ssize_t fn_lock_toggle_enable_show(struct device *dev, struct device_attr
return sysfs_emit(buf, "%d\n", !!(value & FN_LOCK_STATUS));
}
static DEVICE_ATTR_RW(fn_lock_toggle_enable);
static DEVICE_ATTR_RW(fn_lock);
static ssize_t super_key_toggle_enable_store(struct device *dev, struct device_attribute *attr,
static ssize_t super_key_enable_store(struct device *dev, struct device_attribute *attr,
const char *buf, size_t count)
{
struct uniwill_data *data = dev_get_drvdata(dev);
@ -673,8 +675,7 @@ static ssize_t super_key_toggle_enable_store(struct device *dev, struct device_a
return count;
}
static ssize_t super_key_toggle_enable_show(struct device *dev, struct device_attribute *attr,
char *buf)
static ssize_t super_key_enable_show(struct device *dev, struct device_attribute *attr, char *buf)
{
struct uniwill_data *data = dev_get_drvdata(dev);
unsigned int value;
@ -687,7 +688,7 @@ static ssize_t super_key_toggle_enable_show(struct device *dev, struct device_at
return sysfs_emit(buf, "%d\n", !(value & SUPER_KEY_LOCK_STATUS));
}
static DEVICE_ATTR_RW(super_key_toggle_enable);
static DEVICE_ATTR_RW(super_key_enable);
static ssize_t touchpad_toggle_enable_store(struct device *dev, struct device_attribute *attr,
const char *buf, size_t count)
@ -881,8 +882,8 @@ static int uniwill_nvidia_ctgp_init(struct uniwill_data *data)
static struct attribute *uniwill_attrs[] = {
/* Keyboard-related */
&dev_attr_fn_lock_toggle_enable.attr,
&dev_attr_super_key_toggle_enable.attr,
&dev_attr_fn_lock.attr,
&dev_attr_super_key_enable.attr,
&dev_attr_touchpad_toggle_enable.attr,
/* Lightbar-related */
&dev_attr_rainbow_animation.attr,
@ -897,13 +898,13 @@ static umode_t uniwill_attr_is_visible(struct kobject *kobj, struct attribute *a
struct device *dev = kobj_to_dev(kobj);
struct uniwill_data *data = dev_get_drvdata(dev);
if (attr == &dev_attr_fn_lock_toggle_enable.attr) {
if (uniwill_device_supports(data, UNIWILL_FEATURE_FN_LOCK_TOGGLE))
if (attr == &dev_attr_fn_lock.attr) {
if (uniwill_device_supports(data, UNIWILL_FEATURE_FN_LOCK))
return attr->mode;
}
if (attr == &dev_attr_super_key_toggle_enable.attr) {
if (uniwill_device_supports(data, UNIWILL_FEATURE_SUPER_KEY_TOGGLE))
if (attr == &dev_attr_super_key_enable.attr) {
if (uniwill_device_supports(data, UNIWILL_FEATURE_SUPER_KEY))
return attr->mode;
}
@ -1357,6 +1358,9 @@ static int uniwill_notifier_call(struct notifier_block *nb, unsigned long action
switch (action) {
case UNIWILL_OSD_BATTERY_ALERT:
if (!uniwill_device_supports(data, UNIWILL_FEATURE_BATTERY))
return NOTIFY_DONE;
mutex_lock(&data->battery_lock);
list_for_each_entry(entry, &data->batteries, head) {
power_supply_changed(entry->battery);
@ -1369,6 +1373,13 @@ static int uniwill_notifier_call(struct notifier_block *nb, unsigned long action
* gets implemented.
*/
return NOTIFY_OK;
case UNIWILL_OSD_FN_LOCK:
if (!uniwill_device_supports(data, UNIWILL_FEATURE_FN_LOCK))
return NOTIFY_DONE;
sysfs_notify(&data->dev->kobj, NULL, "fn_lock");
return NOTIFY_OK;
default:
mutex_lock(&data->input_lock);
@ -1503,9 +1514,21 @@ static void uniwill_shutdown(struct platform_device *pdev)
regmap_clear_bits(data->regmap, EC_ADDR_AP_OEM, ENABLE_MANUAL_CTRL);
}
static int uniwill_suspend_keyboard(struct uniwill_data *data)
static int uniwill_suspend_fn_lock(struct uniwill_data *data)
{
if (!uniwill_device_supports(data, UNIWILL_FEATURE_SUPER_KEY_TOGGLE))
if (!uniwill_device_supports(data, UNIWILL_FEATURE_FN_LOCK))
return 0;
/*
* The EC_ADDR_BIOS_OEM is marked as volatile, so we have to restore it
* ourselves.
*/
return regmap_read(data->regmap, EC_ADDR_BIOS_OEM, &data->last_status);
}
static int uniwill_suspend_super_key(struct uniwill_data *data)
{
if (!uniwill_device_supports(data, UNIWILL_FEATURE_SUPER_KEY))
return 0;
/*
@ -1542,7 +1565,11 @@ static int uniwill_suspend(struct device *dev)
struct uniwill_data *data = dev_get_drvdata(dev);
int ret;
ret = uniwill_suspend_keyboard(data);
ret = uniwill_suspend_fn_lock(data);
if (ret < 0)
return ret;
ret = uniwill_suspend_super_key(data);
if (ret < 0)
return ret;
@ -1560,12 +1587,21 @@ static int uniwill_suspend(struct device *dev)
return 0;
}
static int uniwill_resume_keyboard(struct uniwill_data *data)
static int uniwill_resume_fn_lock(struct uniwill_data *data)
{
if (!uniwill_device_supports(data, UNIWILL_FEATURE_FN_LOCK))
return 0;
return regmap_update_bits(data->regmap, EC_ADDR_BIOS_OEM, FN_LOCK_STATUS,
data->last_status);
}
static int uniwill_resume_super_key(struct uniwill_data *data)
{
unsigned int value;
int ret;
if (!uniwill_device_supports(data, UNIWILL_FEATURE_SUPER_KEY_TOGGLE))
if (!uniwill_device_supports(data, UNIWILL_FEATURE_SUPER_KEY))
return 0;
ret = regmap_read(data->regmap, EC_ADDR_SWITCH_STATUS, &value);
@ -1608,7 +1644,11 @@ static int uniwill_resume(struct device *dev)
if (ret < 0)
return ret;
ret = uniwill_resume_keyboard(data);
ret = uniwill_resume_fn_lock(data);
if (ret < 0)
return ret;
ret = uniwill_resume_super_key(data);
if (ret < 0)
return ret;
@ -1643,16 +1683,16 @@ static struct platform_driver uniwill_driver = {
};
static struct uniwill_device_descriptor lapac71h_descriptor __initdata = {
.features = UNIWILL_FEATURE_FN_LOCK_TOGGLE |
UNIWILL_FEATURE_SUPER_KEY_TOGGLE |
.features = UNIWILL_FEATURE_FN_LOCK |
UNIWILL_FEATURE_SUPER_KEY |
UNIWILL_FEATURE_TOUCHPAD_TOGGLE |
UNIWILL_FEATURE_BATTERY |
UNIWILL_FEATURE_HWMON,
};
static struct uniwill_device_descriptor lapkc71f_descriptor __initdata = {
.features = UNIWILL_FEATURE_FN_LOCK_TOGGLE |
UNIWILL_FEATURE_SUPER_KEY_TOGGLE |
.features = UNIWILL_FEATURE_FN_LOCK |
UNIWILL_FEATURE_SUPER_KEY |
UNIWILL_FEATURE_TOUCHPAD_TOGGLE |
UNIWILL_FEATURE_LIGHTBAR |
UNIWILL_FEATURE_BATTERY |

View file

@ -64,8 +64,8 @@
#define UNIWILL_OSD_KB_LED_LEVEL3 0x3E
#define UNIWILL_OSD_KB_LED_LEVEL4 0x3F
#define UNIWILL_OSD_SUPER_KEY_LOCK_ENABLE 0x40
#define UNIWILL_OSD_SUPER_KEY_LOCK_DISABLE 0x41
#define UNIWILL_OSD_SUPER_KEY_DISABLE 0x40
#define UNIWILL_OSD_SUPER_KEY_ENABLE 0x41
#define UNIWILL_OSD_MENU_JP 0x42
@ -74,7 +74,7 @@
#define UNIWILL_OSD_RFKILL 0xA4
#define UNIWILL_OSD_SUPER_KEY_LOCK_CHANGED 0xA5
#define UNIWILL_OSD_SUPER_KEY_STATE_CHANGED 0xA5
#define UNIWILL_OSD_LIGHTBAR_STATE_CHANGED 0xA6

View file

@ -13,9 +13,9 @@
/**
* enum mlxreg_wdt_type - type of HW watchdog
*
* TYPE1 HW watchdog implementation exist in old systems.
* All new systems have TYPE2 HW watchdog.
* TYPE3 HW watchdog can exist on all systems with new CPLD.
* @MLX_WDT_TYPE1: HW watchdog implementation in old systems.
* @MLX_WDT_TYPE2: All new systems have TYPE2 HW watchdog.
* @MLX_WDT_TYPE3: HW watchdog that can exist on all systems with new CPLD.
* TYPE3 is selected by WD capability bit.
*/
enum mlxreg_wdt_type {
@ -35,7 +35,7 @@ enum mlxreg_wdt_type {
* @MLXREG_HOTPLUG_LC_SYNCED: entry for line card synchronization events, coming
* after hardware-firmware synchronization handshake;
* @MLXREG_HOTPLUG_LC_READY: entry for line card ready events, indicating line card
PHYs ready / unready state;
* PHYs ready / unready state;
* @MLXREG_HOTPLUG_LC_ACTIVE: entry for line card active events, indicating firmware
* availability / unavailability for the ports on line card;
* @MLXREG_HOTPLUG_LC_THERMAL: entry for line card thermal shutdown events, positive
@ -123,8 +123,8 @@ struct mlxreg_hotplug_device {
* @reg_pwr: attribute power register;
* @reg_ena: attribute enable register;
* @mode: access mode;
* @np - pointer to node platform associated with attribute;
* @hpdev - hotplug device data;
* @np: pointer to node platform associated with attribute;
* @hpdev: hotplug device data;
* @notifier: pointer to event notifier block;
* @health_cntr: dynamic device health indication counter;
* @attached: true if device has been attached after good health indication;

View file

@ -26,6 +26,7 @@
#define INT3472_GPIO_TYPE_POWER_ENABLE 0x0b
#define INT3472_GPIO_TYPE_CLK_ENABLE 0x0c
#define INT3472_GPIO_TYPE_PRIVACY_LED 0x0d
#define INT3472_GPIO_TYPE_DOVDD 0x10
#define INT3472_GPIO_TYPE_HANDSHAKE 0x12
#define INT3472_GPIO_TYPE_HOTPLUG_DETECT 0x13
@ -33,8 +34,8 @@
#define INT3472_MAX_SENSOR_GPIOS 3
#define INT3472_MAX_REGULATORS 3
/* E.g. "avdd\0" */
#define GPIO_SUPPLY_NAME_LENGTH 5
/* E.g. "dovdd\0" */
#define GPIO_SUPPLY_NAME_LENGTH 6
/* 12 chars for acpi_dev_name() + "-", e.g. "ABCD1234:00-" */
#define GPIO_REGULATOR_NAME_LENGTH (12 + GPIO_SUPPLY_NAME_LENGTH)
/* lower- and upper-case mapping */