Commit dfe49536 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'platform-drivers-x86-v5.14-2' of...

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

Pull x86 platform driver fixes from Hans de Goede:
 "A set of bug-fixes and new hardware ids.

  Highlights:

   - amd-pmc fixes

   - think-lmi fixes

   - various new hardware-ids"

* tag 'platform-drivers-x86-v5.14-2' of git://git.kernel.org/pub/scm/linux/kernel/git/pdx86/platform-drivers-x86:
  platform/x86: gigabyte-wmi: add support for B550 Aorus Elite V2
  platform/x86: intel-hid: add Alder Lake ACPI device ID
  platform/x86: think-lmi: Fix possible mem-leaks on tlmi_analyze() error-exit
  platform/x86: think-lmi: Split kobject_init() and kobject_add() calls
  platform/x86: think-lmi: Move pending_reboot_attr to the attributes sysfs dir
  platform/x86: amd-pmc: Fix undefined reference to __udivdi3
  platform/x86: amd-pmc: Fix missing unlock on error in amd_pmc_send_cmd()
  platform/x86: wireless-hotkey: remove hardcoded "hp" from the error message
  platform/x86: amd-pmc: Use return code on suspend
  platform/x86: amd-pmc: Add new acpi id for future PMC controllers
  platform/x86: amd-pmc: Add support for ACPI ID AMDI0006
  platform/x86: amd-pmc: Add support for logging s0ix counters
  platform/x86: amd-pmc: Add support for logging SMU metrics
  platform/x86: amd-pmc: call dump registers only once
  platform/x86: amd-pmc: Fix SMU firmware reporting mechanism
  platform/x86: amd-pmc: Fix command completion code
  platform/x86: think-lmi: Add pending_reboot support
parents 25905f60 2b2c66f6
This diff is collapsed.
...@@ -141,6 +141,7 @@ static u8 gigabyte_wmi_detect_sensor_usability(struct wmi_device *wdev) ...@@ -141,6 +141,7 @@ static u8 gigabyte_wmi_detect_sensor_usability(struct wmi_device *wdev)
static const struct dmi_system_id gigabyte_wmi_known_working_platforms[] = { static const struct dmi_system_id gigabyte_wmi_known_working_platforms[] = {
DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME("B550 AORUS ELITE"), DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME("B550 AORUS ELITE"),
DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME("B550 AORUS ELITE V2"),
DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME("B550 GAMING X V2"), DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME("B550 GAMING X V2"),
DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME("B550M AORUS PRO-P"), DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME("B550M AORUS PRO-P"),
DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME("B550M DS3H"), DMI_EXACT_MATCH_GIGABYTE_BOARD_NAME("B550M DS3H"),
......
...@@ -25,6 +25,7 @@ static const struct acpi_device_id intel_hid_ids[] = { ...@@ -25,6 +25,7 @@ static const struct acpi_device_id intel_hid_ids[] = {
{"INT33D5", 0}, {"INT33D5", 0},
{"INTC1051", 0}, {"INTC1051", 0},
{"INTC1054", 0}, {"INTC1054", 0},
{"INTC1070", 0},
{"", 0}, {"", 0},
}; };
MODULE_DEVICE_TABLE(acpi, intel_hid_ids); MODULE_DEVICE_TABLE(acpi, intel_hid_ids);
......
...@@ -571,6 +571,11 @@ static ssize_t current_value_store(struct kobject *kobj, ...@@ -571,6 +571,11 @@ static ssize_t current_value_store(struct kobject *kobj,
else else
ret = tlmi_save_bios_settings(""); ret = tlmi_save_bios_settings("");
if (!ret && !tlmi_priv.pending_changes) {
tlmi_priv.pending_changes = true;
/* let userland know it may need to check reboot pending again */
kobject_uevent(&tlmi_priv.class_dev->kobj, KOBJ_CHANGE);
}
out: out:
kfree(auth_str); kfree(auth_str);
kfree(set_str); kfree(set_str);
...@@ -647,6 +652,14 @@ static struct kobj_type tlmi_pwd_setting_ktype = { ...@@ -647,6 +652,14 @@ static struct kobj_type tlmi_pwd_setting_ktype = {
.sysfs_ops = &tlmi_kobj_sysfs_ops, .sysfs_ops = &tlmi_kobj_sysfs_ops,
}; };
static ssize_t pending_reboot_show(struct kobject *kobj, struct kobj_attribute *attr,
char *buf)
{
return sprintf(buf, "%d\n", tlmi_priv.pending_changes);
}
static struct kobj_attribute pending_reboot = __ATTR_RO(pending_reboot);
/* ---- Initialisation --------------------------------------------------------- */ /* ---- Initialisation --------------------------------------------------------- */
static void tlmi_release_attr(void) static void tlmi_release_attr(void)
{ {
...@@ -659,6 +672,7 @@ static void tlmi_release_attr(void) ...@@ -659,6 +672,7 @@ static void tlmi_release_attr(void)
kobject_put(&tlmi_priv.setting[i]->kobj); kobject_put(&tlmi_priv.setting[i]->kobj);
} }
} }
sysfs_remove_file(&tlmi_priv.attribute_kset->kobj, &pending_reboot.attr);
kset_unregister(tlmi_priv.attribute_kset); kset_unregister(tlmi_priv.attribute_kset);
/* Authentication structures */ /* Authentication structures */
...@@ -709,8 +723,8 @@ static int tlmi_sysfs_init(void) ...@@ -709,8 +723,8 @@ static int tlmi_sysfs_init(void)
/* Build attribute */ /* Build attribute */
tlmi_priv.setting[i]->kobj.kset = tlmi_priv.attribute_kset; tlmi_priv.setting[i]->kobj.kset = tlmi_priv.attribute_kset;
ret = kobject_init_and_add(&tlmi_priv.setting[i]->kobj, &tlmi_attr_setting_ktype, ret = kobject_add(&tlmi_priv.setting[i]->kobj, NULL,
NULL, "%s", tlmi_priv.setting[i]->display_name); "%s", tlmi_priv.setting[i]->display_name);
if (ret) if (ret)
goto fail_create_attr; goto fail_create_attr;
...@@ -719,6 +733,10 @@ static int tlmi_sysfs_init(void) ...@@ -719,6 +733,10 @@ static int tlmi_sysfs_init(void)
goto fail_create_attr; goto fail_create_attr;
} }
ret = sysfs_create_file(&tlmi_priv.attribute_kset->kobj, &pending_reboot.attr);
if (ret)
goto fail_create_attr;
/* Create authentication entries */ /* Create authentication entries */
tlmi_priv.authentication_kset = kset_create_and_add("authentication", NULL, tlmi_priv.authentication_kset = kset_create_and_add("authentication", NULL,
&tlmi_priv.class_dev->kobj); &tlmi_priv.class_dev->kobj);
...@@ -727,8 +745,7 @@ static int tlmi_sysfs_init(void) ...@@ -727,8 +745,7 @@ static int tlmi_sysfs_init(void)
goto fail_create_attr; goto fail_create_attr;
} }
tlmi_priv.pwd_admin->kobj.kset = tlmi_priv.authentication_kset; tlmi_priv.pwd_admin->kobj.kset = tlmi_priv.authentication_kset;
ret = kobject_init_and_add(&tlmi_priv.pwd_admin->kobj, &tlmi_pwd_setting_ktype, ret = kobject_add(&tlmi_priv.pwd_admin->kobj, NULL, "%s", "Admin");
NULL, "%s", "Admin");
if (ret) if (ret)
goto fail_create_attr; goto fail_create_attr;
...@@ -737,8 +754,7 @@ static int tlmi_sysfs_init(void) ...@@ -737,8 +754,7 @@ static int tlmi_sysfs_init(void)
goto fail_create_attr; goto fail_create_attr;
tlmi_priv.pwd_power->kobj.kset = tlmi_priv.authentication_kset; tlmi_priv.pwd_power->kobj.kset = tlmi_priv.authentication_kset;
ret = kobject_init_and_add(&tlmi_priv.pwd_power->kobj, &tlmi_pwd_setting_ktype, ret = kobject_add(&tlmi_priv.pwd_power->kobj, NULL, "%s", "System");
NULL, "%s", "System");
if (ret) if (ret)
goto fail_create_attr; goto fail_create_attr;
...@@ -818,6 +834,7 @@ static int tlmi_analyze(void) ...@@ -818,6 +834,7 @@ static int tlmi_analyze(void)
pr_info("Error retrieving possible values for %d : %s\n", pr_info("Error retrieving possible values for %d : %s\n",
i, setting->display_name); i, setting->display_name);
} }
kobject_init(&setting->kobj, &tlmi_attr_setting_ktype);
tlmi_priv.setting[i] = setting; tlmi_priv.setting[i] = setting;
tlmi_priv.settings_count++; tlmi_priv.settings_count++;
kfree(item); kfree(item);
...@@ -844,10 +861,12 @@ static int tlmi_analyze(void) ...@@ -844,10 +861,12 @@ static int tlmi_analyze(void)
if (pwdcfg.password_state & TLMI_PAP_PWD) if (pwdcfg.password_state & TLMI_PAP_PWD)
tlmi_priv.pwd_admin->valid = true; tlmi_priv.pwd_admin->valid = true;
kobject_init(&tlmi_priv.pwd_admin->kobj, &tlmi_pwd_setting_ktype);
tlmi_priv.pwd_power = kzalloc(sizeof(struct tlmi_pwd_setting), GFP_KERNEL); tlmi_priv.pwd_power = kzalloc(sizeof(struct tlmi_pwd_setting), GFP_KERNEL);
if (!tlmi_priv.pwd_power) { if (!tlmi_priv.pwd_power) {
ret = -ENOMEM; ret = -ENOMEM;
goto fail_clear_attr; goto fail_free_pwd_admin;
} }
strscpy(tlmi_priv.pwd_power->kbdlang, "us", TLMI_LANG_MAXLEN); strscpy(tlmi_priv.pwd_power->kbdlang, "us", TLMI_LANG_MAXLEN);
tlmi_priv.pwd_power->encoding = TLMI_ENCODING_ASCII; tlmi_priv.pwd_power->encoding = TLMI_ENCODING_ASCII;
...@@ -859,11 +878,19 @@ static int tlmi_analyze(void) ...@@ -859,11 +878,19 @@ static int tlmi_analyze(void)
if (pwdcfg.password_state & TLMI_POP_PWD) if (pwdcfg.password_state & TLMI_POP_PWD)
tlmi_priv.pwd_power->valid = true; tlmi_priv.pwd_power->valid = true;
kobject_init(&tlmi_priv.pwd_power->kobj, &tlmi_pwd_setting_ktype);
return 0; return 0;
fail_free_pwd_admin:
kfree(tlmi_priv.pwd_admin);
fail_clear_attr: fail_clear_attr:
for (i = 0; i < TLMI_SETTINGS_COUNT; ++i) for (i = 0; i < TLMI_SETTINGS_COUNT; ++i) {
kfree(tlmi_priv.setting[i]); if (tlmi_priv.setting[i]) {
kfree(tlmi_priv.setting[i]->possible_values);
kfree(tlmi_priv.setting[i]);
}
}
return ret; return ret;
} }
......
...@@ -60,6 +60,7 @@ struct think_lmi { ...@@ -60,6 +60,7 @@ struct think_lmi {
bool can_get_bios_selections; bool can_get_bios_selections;
bool can_set_bios_password; bool can_set_bios_password;
bool can_get_password_settings; bool can_get_password_settings;
bool pending_changes;
struct tlmi_attr_setting *setting[TLMI_SETTINGS_COUNT]; struct tlmi_attr_setting *setting[TLMI_SETTINGS_COUNT];
struct device *class_dev; struct device *class_dev;
......
...@@ -78,7 +78,7 @@ static int wl_add(struct acpi_device *device) ...@@ -78,7 +78,7 @@ static int wl_add(struct acpi_device *device)
err = wireless_input_setup(); err = wireless_input_setup();
if (err) if (err)
pr_err("Failed to setup hp wireless hotkeys\n"); pr_err("Failed to setup wireless hotkeys\n");
return err; return err;
} }
......
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