Pull x86 platform drivers fixes from Ilpo Järvinen: - dell-wmi-sysman: Avoid buffer overflow in current_password_store() - fujitsu-laptop: Support Lifebook S2110 hotkeys - intel/pmc: Fix Arrow Lake U/H NPU PCI ID - think-lmi: Fix attribute name usage for non-compliant items - thinkpad_acpi: Ignore battery threshold change event notification * tag 'platform-drivers-x86-v6.15-6' of git://git.kernel.org/pub/scm/linux/kernel/git/pdx86/platform-drivers-x86: platform/x86/intel/pmc: Fix Arrow Lake U/H NPU PCI ID platform/x86: think-lmi: Fix attribute name usage for non-compliant items platform/x86: thinkpad_acpi: Ignore battery threshold change event notification platform/x86: dell-wmi-sysman: Avoid buffer overflow in current_password_store() platform/x86: fujitsu-laptop: Support Lifebook S2110 hotkeys
Unified · Split
| @@ -45,7 +45,7 @@ static ssize_t current_password_store(struct kobject *kobj, · 44 unmodified lines | ||
| 45 | 45 | int length; |
| 46 | 46 | |
| 47 | 47 | length = strlen(buf); |
| 48 | − if (buf[length-1] == '\n') | |
| 48 | + if (length && buf[length - 1] == '\n') | |
| 49 | 49 | length--; |
| 50 | 50 | |
| 51 | 51 | /* firmware does verifiation of min/max password length, |
| @@ -17,13 +17,13 @@ · 16 unmodified lines | ||
| 17 | 17 | /* |
| 18 | 18 | * fujitsu-laptop.c - Fujitsu laptop support, providing access to additional |
| 19 | 19 | * features made available on a range of Fujitsu laptops including the |
| 20 | − * P2xxx/P5xxx/S6xxx/S7xxx series. | |
| 20 | + * P2xxx/P5xxx/S2xxx/S6xxx/S7xxx series. | |
| 21 | 21 | * |
| 22 | 22 | * This driver implements a vendor-specific backlight control interface for |
| 23 | 23 | * Fujitsu laptops and provides support for hotkeys present on certain Fujitsu |
| 24 | 24 | * laptops. |
| 25 | 25 | * |
| 26 | − * This driver has been tested on a Fujitsu Lifebook S6410, S7020 and | |
| 26 | + * This driver has been tested on a Fujitsu Lifebook S2110, S6410, S7020 and | |
| 27 | 27 | * P8010. It should work on most P-series and S-series Lifebooks, but |
| 28 | 28 | * YMMV. |
| 29 | 29 | * |
| @@ -107,7 +107,11 @@ · 77 unmodified lines | ||
| 107 | 107 | #define KEY2_CODE 0x411 |
| 108 | 108 | #define KEY3_CODE 0x412 |
| 109 | 109 | #define KEY4_CODE 0x413 |
| 110 | −#define KEY5_CODE 0x420 | |
| 110 | +#define KEY5_CODE 0x414 | |
| 111 | +#define KEY6_CODE 0x415 | |
| 112 | +#define KEY7_CODE 0x416 | |
| 113 | +#define KEY8_CODE 0x417 | |
| 114 | +#define KEY9_CODE 0x420 | |
| 111 | 115 | |
| 112 | 116 | /* Hotkey ringbuffer limits */ |
| 113 | 117 | #define MAX_HOTKEY_RINGBUFFER_SIZE 100 |
| @@ -560,7 +564,7 @@ static const struct key_entry keymap_default[] = { · 446 unmodified lines | ||
| 560 | 564 | { KE_KEY, KEY2_CODE, { KEY_PROG2 } }, |
| 561 | 565 | { KE_KEY, KEY3_CODE, { KEY_PROG3 } }, |
| 562 | 566 | { KE_KEY, KEY4_CODE, { KEY_PROG4 } }, |
| 563 | − { KE_KEY, KEY5_CODE, { KEY_RFKILL } }, | |
| 567 | + { KE_KEY, KEY9_CODE, { KEY_RFKILL } }, | |
| 564 | 568 | /* Soft keys read from status flags */ |
| 565 | 569 | { KE_KEY, FLAG_RFKILL, { KEY_RFKILL } }, |
| 566 | 570 | { KE_KEY, FLAG_TOUCHPAD_TOGGLE, { KEY_TOUCHPAD_TOGGLE } }, |
| @@ -584,6 +588,18 @@ static const struct key_entry keymap_p8010[] = { · 17 unmodified lines | ||
| 584 | 588 | { KE_END, 0 } |
| 585 | 589 | }; |
| 586 | 590 | |
| 591 | +static const struct key_entry keymap_s2110[] = { | |
| 592 | + { KE_KEY, KEY1_CODE, { KEY_PROG1 } }, /* "A" */ | |
| 593 | + { KE_KEY, KEY2_CODE, { KEY_PROG2 } }, /* "B" */ | |
| 594 | + { KE_KEY, KEY3_CODE, { KEY_WWW } }, /* "Internet" */ | |
| 595 | + { KE_KEY, KEY4_CODE, { KEY_EMAIL } }, /* "E-mail" */ | |
| 596 | + { KE_KEY, KEY5_CODE, { KEY_STOPCD } }, | |
| 597 | + { KE_KEY, KEY6_CODE, { KEY_PLAYPAUSE } }, | |
| 598 | + { KE_KEY, KEY7_CODE, { KEY_PREVIOUSSONG } }, | |
| 599 | + { KE_KEY, KEY8_CODE, { KEY_NEXTSONG } }, | |
| 600 | + { KE_END, 0 } | |
| 601 | +}; | |
| 602 | + | |
| 587 | 603 | static const struct key_entry *keymap = keymap_default; |
| 588 | 604 | |
| 589 | 605 | static int fujitsu_laptop_dmi_keymap_override(const struct dmi_system_id *id) |
| @@ -621,6 +637,15 @@ static const struct dmi_system_id fujitsu_laptop_dmi_table[] = { · 31 unmodified lines | ||
| 621 | 637 | }, |
| 622 | 638 | .driver_data = (void *)keymap_p8010 |
| 623 | 639 | }, |
| 640 | + { | |
| 641 | + .callback = fujitsu_laptop_dmi_keymap_override, | |
| 642 | + .ident = "Fujitsu LifeBook S2110", | |
| 643 | + .matches = { | |
| 644 | + DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), | |
| 645 | + DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK S2110"), | |
| 646 | + }, | |
| 647 | + .driver_data = (void *)keymap_s2110 | |
| 648 | + }, | |
| 624 | 649 | {} |
| 625 | 650 | }; |
| 626 | 651 | |
| @@ -681,6 +681,7 @@ static struct pmc_info arl_pmc_info_list[] = { · 680 unmodified lines | ||
| 681 | 681 | |
| 682 | 682 | #define ARL_NPU_PCI_DEV 0xad1d |
| 683 | 683 | #define ARL_GNA_PCI_DEV 0xae4c |
| 684 | +#define ARL_H_NPU_PCI_DEV 0x7d1d | |
| 684 | 685 | #define ARL_H_GNA_PCI_DEV 0x774c |
| 685 | 686 | /* |
| 686 | 687 | * Set power state of select devices that do not have drivers to D3 |
| @@ -694,7 +695,7 @@ static void arl_d3_fixup(void) · 7 unmodified lines | ||
| 694 | 695 | |
| 695 | 696 | static void arl_h_d3_fixup(void) |
| 696 | 697 | { |
| 697 | − pmc_core_set_device_d3(ARL_NPU_PCI_DEV); | |
| 698 | + pmc_core_set_device_d3(ARL_H_NPU_PCI_DEV); | |
| 698 | 699 | pmc_core_set_device_d3(ARL_H_GNA_PCI_DEV); |
| 699 | 700 | } |
| 700 | 701 | |
| @@ -1061,8 +1061,8 @@ static ssize_t current_value_store(struct kobject *kobj, · 1060 unmodified lines | ||
| 1061 | 1061 | ret = -EINVAL; |
| 1062 | 1062 | goto out; |
| 1063 | 1063 | } |
| 1064 | − set_str = kasprintf(GFP_KERNEL, "%s,%s,%s", setting->display_name, | |
| 1065 | − new_setting, tlmi_priv.pwd_admin->signature); | |
| 1064 | + set_str = kasprintf(GFP_KERNEL, "%s,%s,%s", setting->name, | |
| 1065 | + new_setting, tlmi_priv.pwd_admin->signature); | |
| 1066 | 1066 | if (!set_str) { |
| 1067 | 1067 | ret = -ENOMEM; |
| 1068 | 1068 | goto out; |
| @@ -1092,7 +1092,7 @@ static ssize_t current_value_store(struct kobject *kobj, · 23 unmodified lines | ||
| 1092 | 1092 | goto out; |
| 1093 | 1093 | } |
| 1094 | 1094 | |
| 1095 | − set_str = kasprintf(GFP_KERNEL, "%s,%s;", setting->display_name, | |
| 1095 | + set_str = kasprintf(GFP_KERNEL, "%s,%s;", setting->name, | |
| 1096 | 1096 | new_setting); |
| 1097 | 1097 | if (!set_str) { |
| 1098 | 1098 | ret = -ENOMEM; |
| @@ -1120,11 +1120,11 @@ static ssize_t current_value_store(struct kobject *kobj, · 21 unmodified lines | ||
| 1120 | 1120 | } |
| 1121 | 1121 | |
| 1122 | 1122 | if (auth_str) |
| 1123 | − set_str = kasprintf(GFP_KERNEL, "%s,%s,%s", setting->display_name, | |
| 1124 | − new_setting, auth_str); | |
| 1123 | + set_str = kasprintf(GFP_KERNEL, "%s,%s,%s", setting->name, | |
| 1124 | + new_setting, auth_str); | |
| 1125 | 1125 | else |
| 1126 | − set_str = kasprintf(GFP_KERNEL, "%s,%s;", setting->display_name, | |
| 1127 | − new_setting); | |
| 1126 | + set_str = kasprintf(GFP_KERNEL, "%s,%s;", setting->name, | |
| 1127 | + new_setting); | |
| 1128 | 1128 | if (!set_str) { |
| 1129 | 1129 | ret = -ENOMEM; |
| 1130 | 1130 | goto out; |
| @@ -1629,9 +1629,6 @@ static int tlmi_analyze(struct wmi_device *wdev) · 498 unmodified lines | ||
| 1629 | 1629 | continue; |
| 1630 | 1630 | } |
| 1631 | 1631 | |
| 1632 | − /* It is not allowed to have '/' for file name. Convert it into '\'. */ | |
| 1633 | − strreplace(item, '/', '\\'); | |
| 1634 | − | |
| 1635 | 1632 | /* Remove the value part */ |
| 1636 | 1633 | strreplace(item, ',', '\0'); |
| 1637 | 1634 | |
| @@ -1644,11 +1641,16 @@ static int tlmi_analyze(struct wmi_device *wdev) · 6 unmodified lines | ||
| 1644 | 1641 | } |
| 1645 | 1642 | setting->wdev = wdev; |
| 1646 | 1643 | setting->index = i; |
| 1644 | + | |
| 1645 | + strscpy(setting->name, item); | |
| 1646 | + /* It is not allowed to have '/' for file name. Convert it into '\'. */ | |
| 1647 | + strreplace(item, '/', '\\'); | |
| 1647 | 1648 | strscpy(setting->display_name, item); |
| 1649 | + | |
| 1648 | 1650 | /* If BIOS selections supported, load those */ |
| 1649 | 1651 | if (tlmi_priv.can_get_bios_selections) { |
| 1650 | − ret = tlmi_get_bios_selections(setting->display_name, | |
| 1651 | − &setting->possible_values); | |
| 1652 | + ret = tlmi_get_bios_selections(setting->name, | |
| 1653 | + &setting->possible_values); | |
| 1652 | 1654 | if (ret || !setting->possible_values) |
| 1653 | 1655 | pr_info("Error retrieving possible values for %d : %s\n", |
| 1654 | 1656 | i, setting->display_name); |
| @@ -90,6 +90,7 @@ struct tlmi_attr_setting { · 89 unmodified lines | ||
| 90 | 90 | struct kobject kobj; |
| 91 | 91 | struct wmi_device *wdev; |
| 92 | 92 | int index; |
| 93 | + char name[TLMI_SETTINGS_MAXLEN]; | |
| 93 | 94 | char display_name[TLMI_SETTINGS_MAXLEN]; |
| 94 | 95 | char *possible_values; |
| 95 | 96 | }; |
| @@ -231,6 +231,7 @@ enum tpacpi_hkey_event_t { · 230 unmodified lines | ||
| 231 | 231 | /* Thermal events */ |
| 232 | 232 | TP_HKEY_EV_ALARM_BAT_HOT = 0x6011, /* battery too hot */ |
| 233 | 233 | TP_HKEY_EV_ALARM_BAT_XHOT = 0x6012, /* battery critically hot */ |
| 234 | + TP_HKEY_EV_ALARM_BAT_LIM_CHANGE = 0x6013, /* battery charge limit changed*/ | |
| 234 | 235 | TP_HKEY_EV_ALARM_SENSOR_HOT = 0x6021, /* sensor too hot */ |
| 235 | 236 | TP_HKEY_EV_ALARM_SENSOR_XHOT = 0x6022, /* sensor critically hot */ |
| 236 | 237 | TP_HKEY_EV_THM_TABLE_CHANGED = 0x6030, /* windows; thermal table changed */ |
| @@ -3777,6 +3778,10 @@ static bool hotkey_notify_6xxx(const u32 hkey, bool *send_acpi_ev) · 3540 unmodified lines | ||
| 3777 | 3778 | pr_alert("THERMAL EMERGENCY: battery is extremely hot!\n"); |
| 3778 | 3779 | /* recommended action: immediate sleep/hibernate */ |
| 3779 | 3780 | break; |
| 3781 | + case TP_HKEY_EV_ALARM_BAT_LIM_CHANGE: | |
| 3782 | + pr_debug("Battery Info: battery charge threshold changed\n"); | |
| 3783 | + /* User changed charging threshold. No action needed */ | |
| 3784 | + return true; | |
| 3780 | 3785 | case TP_HKEY_EV_ALARM_SENSOR_HOT: |
| 3781 | 3786 | pr_crit("THERMAL ALARM: a sensor reports something is too hot!\n"); |
| 3782 | 3787 | /* recommended action: warn user through gui, that */ |