Commit 4c2cd91b authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'platform-drivers-x86-v7.1-3' of...

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

Pull x86 platform driver fixes from Ilpo Järvinen:

 - asus-nb-wmi:
    - Use existing keyboard quirk for ASUS Zenbook Duo UX8407AA

 - hp-wmi:
    - Add support for Victus 16-r0xxx (8BC2)

 - intel/vsec_tpmi:
    - Move debugfs register before creating devices
    - Prevent fault during unbind

 - lenovo-wmi-*:
    - Fix memory leak in lwmi_dev_evaluate_int()
    - Balance IDA id allocation and free
    - Balance component bind and unbind
    - Prevent sending uninitialized WMI arguments to the device
    - Decouple lenovo-wmi-gamezone and lenovo-wmi-other to simplify
      module dependency graph
    - Limit adding attributes to supported devices

 - samsung-galaxybook:
    - Handle kbd backlight, mic mute and camera block hotkeys

* tag 'platform-drivers-x86-v7.1-3' of git://git.kernel.org/pub/scm/linux/kernel/git/pdx86/platform-drivers-x86:
  platform/x86: asus-nb-wmi: add DMI quirk for ASUS Zenbook Duo UX8407AA
  platform/x86: lenovo-wmi-other: Limit adding attributes to supported devices
  platform/x86: lenovo-wmi-other: Add Attribute ID helper functions
  platform/x86: lenovo-wmi-helpers: Move gamezone enums to wmi-helpers
  platform/x86: lenovo: Decouple lenovo-wmi-gamezone and lenovo-wmi-other
  platform/x86: lenovo-wmi-other: Fix tunable_attr_01 struct members
  platform/x86: lenovo-wmi-other: Zero initialize WMI arguments
  platform/x86: lenovo-wmi-other: Balance component bind and unbind
  platform/x86: lenovo-wmi-other: Balance IDA id allocation and free
  platform/x86: lenovo-wmi-helpers: Fix memory leak in lwmi_dev_evaluate_int()
  platform/x86: hp-wmi: Add support for Victus 16-r0xxx (8BC2)
  platform/x86/intel/tpmi/plr: Prevent fault during unbind
  platform/x86: intel: Add notifiers support
  platform/x86: intel: Move debugfs register before creating devices
  platform/x86: samsung-galaxybook: Handle ACPI hotkey notifications
  platform/x86: samsung-galaxybook: Refactor camera lens cover input device
parents fd6b5661 2997606d
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -544,6 +544,15 @@ static const struct dmi_system_id asus_quirks[] = {
		},
		.driver_data = &quirk_asus_zenbook_duo_kbd,
	},
	{
		.callback = dmi_matched,
		.ident = "ASUS Zenbook Duo UX8407AA",
		.matches = {
			DMI_MATCH(DMI_SYS_VENDOR, "ASUS"),
			DMI_MATCH(DMI_PRODUCT_NAME, "Zenbook Duo UX8407AA"),
		},
		.driver_data = &quirk_asus_zenbook_duo_kbd,
	},
	{
		.callback = dmi_matched,
		.ident = "ASUS ROG Z13",
+4 −0
Original line number Diff line number Diff line
@@ -205,6 +205,10 @@ static const struct dmi_system_id victus_s_thermal_profile_boards[] __initconst
		.matches = { DMI_MATCH(DMI_BOARD_NAME, "8BBE") },
		.driver_data = (void *)&victus_s_thermal_params,
	},
	{
		.matches = { DMI_MATCH(DMI_BOARD_NAME, "8BC2") },
		.driver_data = (void *)&omen_v1_thermal_params,
	},
	{
		.matches = { DMI_MATCH(DMI_BOARD_NAME, "8BCA") },
		.driver_data = (void *)&omen_v1_thermal_params,
+43 −2
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@
#include <linux/module.h>
#include <linux/mod_devicetable.h>
#include <linux/mutex.h>
#include <linux/notifier.h>
#include <linux/seq_file.h>
#include <linux/sprintf.h>
#include <linux/types.h>
@@ -60,6 +61,8 @@ struct tpmi_plr {
	struct tpmi_plr_die *die_info;
	int num_dies;
	struct auxiliary_device *auxdev;
	struct notifier_block nb;
	struct mutex lock;	/* Protect access to dbgfs_dir */
};

static const char * const plr_coarse_reasons[] = {
@@ -255,6 +258,30 @@ static ssize_t plr_status_write(struct file *filp, const char __user *ubuf,
}
DEFINE_SHOW_STORE_ATTRIBUTE(plr_status);

static int intel_plr_notify(struct notifier_block *self, unsigned long action, void *data)
{
	struct tpmi_plr *plr = container_of(self, struct tpmi_plr, nb);

	if (action == TPMI_CORE_EXIT) {
		guard(mutex)(&plr->lock);
		plr->dbgfs_dir = NULL;
	}

	return NOTIFY_DONE;
}

static int intel_plr_register_notifier(struct notifier_block *nb)
{
	nb->notifier_call = intel_plr_notify;
	nb->priority = 0;
	return tpmi_register_notifier(nb);
}

static void intel_plr_unregister_notifier(struct notifier_block *nb)
{
	tpmi_unregister_notifier(nb);
}

static int intel_plr_probe(struct auxiliary_device *auxdev, const struct auxiliary_device_id *id)
{
	struct oobmsm_plat_info *plat_info;
@@ -282,10 +309,18 @@ static int intel_plr_probe(struct auxiliary_device *auxdev, const struct auxilia
	if (!plr)
		return -ENOMEM;

	err = devm_mutex_init(&auxdev->dev, &plr->lock);
	if (err)
		return err;

	intel_plr_register_notifier(&plr->nb);

	plr->die_info = devm_kcalloc(&auxdev->dev, num_resources, sizeof(*plr->die_info),
				     GFP_KERNEL);
	if (!plr->die_info)
		return -ENOMEM;
	if (!plr->die_info) {
		err = -ENOMEM;
		goto err_notify;
	}

	plr->num_dies = num_resources;
	plr->dbgfs_dir = debugfs_create_dir("plr", dentry);
@@ -326,6 +361,9 @@ static int intel_plr_probe(struct auxiliary_device *auxdev, const struct auxilia

err:
	debugfs_remove_recursive(plr->dbgfs_dir);
err_notify:
	intel_plr_unregister_notifier(&plr->nb);

	return err;
}

@@ -333,6 +371,9 @@ static void intel_plr_remove(struct auxiliary_device *auxdev)
{
	struct tpmi_plr *plr = auxiliary_get_drvdata(auxdev);

	intel_plr_unregister_notifier(&plr->nb);

	guard(mutex)(&plr->lock);
	debugfs_remove_recursive(plr->dbgfs_dir);
}

+25 −4
Original line number Diff line number Diff line
@@ -56,6 +56,7 @@
#include <linux/io.h>
#include <linux/iopoll.h>
#include <linux/module.h>
#include <linux/notifier.h>
#include <linux/pci.h>
#include <linux/security.h>
#include <linux/sizes.h>
@@ -188,6 +189,20 @@ struct tpmi_feature_state {
/* Used during auxbus device creation */
static DEFINE_IDA(intel_vsec_tpmi_ida);

static BLOCKING_NOTIFIER_HEAD(tpmi_notify_list);

int tpmi_register_notifier(struct notifier_block *nb)
{
	return blocking_notifier_chain_register(&tpmi_notify_list, nb);
}
EXPORT_SYMBOL_NS_GPL(tpmi_register_notifier, "INTEL_TPMI");

int tpmi_unregister_notifier(struct notifier_block *nb)
{
	return blocking_notifier_chain_unregister(&tpmi_notify_list, nb);
}
EXPORT_SYMBOL_NS_GPL(tpmi_unregister_notifier, "INTEL_TPMI");

struct oobmsm_plat_info *tpmi_get_platform_data(struct auxiliary_device *auxdev)
{
	struct intel_vsec_device *vsec_dev = auxdev_to_ivdev(auxdev);
@@ -817,10 +832,6 @@ static int intel_vsec_tpmi_init(struct auxiliary_device *auxdev)

	auxiliary_set_drvdata(auxdev, tpmi_info);

	ret = tpmi_create_devices(tpmi_info);
	if (ret)
		return ret;

	/*
	 * Allow debugfs when security policy allows. Everything this debugfs
	 * interface provides, can also be done via /dev/mem access. If
@@ -830,6 +841,14 @@ static int intel_vsec_tpmi_init(struct auxiliary_device *auxdev)
	if (!security_locked_down(LOCKDOWN_DEV_MEM) && capable(CAP_SYS_RAWIO))
		tpmi_dbgfs_register(tpmi_info);

	ret = tpmi_create_devices(tpmi_info);
	if (ret) {
		debugfs_remove_recursive(tpmi_info->dbgfs_dir);
		return ret;
	}

	blocking_notifier_call_chain(&tpmi_notify_list, TPMI_CORE_INIT, auxdev);

	return 0;
}

@@ -843,6 +862,8 @@ static void tpmi_remove(struct auxiliary_device *auxdev)
{
	struct intel_tpmi_info *tpmi_info = auxiliary_get_drvdata(auxdev);

	blocking_notifier_call_chain(&tpmi_notify_list, TPMI_CORE_EXIT, auxdev);

	debugfs_remove_recursive(tpmi_info->dbgfs_dir);
}

+0 −1
Original line number Diff line number Diff line
@@ -252,7 +252,6 @@ config LENOVO_WMI_GAMEZONE
	select ACPI_PLATFORM_PROFILE
	select LENOVO_WMI_EVENTS
	select LENOVO_WMI_HELPERS
	select LENOVO_WMI_TUNING
	help
	  Say Y here if you have a WMI aware Lenovo Legion device and would like to use the
	  platform-profile firmware interface to manage power usage.
Loading