diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2024-07-17 17:05:21 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2024-07-17 17:05:21 -0700 | 
| commit | a5cb6b2bbff9cdd32aab635ad464a1ee299a63bd (patch) | |
| tree | 67803af2631c8e015db8f466e906ff04617ec6dd /drivers/platform/x86/wmi.c | |
| parent | e2f710f97f3544df08ebe608c8157536e0ffb494 (diff) | |
| parent | d8b17a364ec48239fccb65efe74bb485e79e6743 (diff) | |
Merge tag 'platform-drivers-x86-v6.11-1' of git://git.kernel.org/pub/scm/linux/kernel/git/pdx86/platform-drivers-x86
Pull x86 platform driver updates from Ilpo Järvinen:
 - amd/pmf: Report system state changes using existing input events
 - asus-wmi: Zenbook 2023 camera LED disable support and fix TUF laptop
   keyboard RGB LED sysfs interface
 - dell-pc: Fan modes / platform profile support
 - hp-wmi: Fix platform profile switching on Omen/Victus laptops
 - intel/ISST: Use only TPMI interface when TPMI and legacy interfaces
   are available
 - intel/pmc: LTR restore support to pair with LTR ignore
 - intel/tpmi: Performance Limit Reasons (PLR) and APIC <-> Punit CPU
   numbering mapping support
 - WMI: driver override support and docs improvements
 - lenovo-yoga-c630: Support for EC (platform/arm64)
 - platform/arm64: Fix build with COMPILE_TEST (broke after addition of
   C630)
 - tools: Intel Speed Select Turbo Ratio Limit fix
 - Miscellaneous cleanups / refactoring / improvements
* tag 'platform-drivers-x86-v6.11-1' of git://git.kernel.org/pub/scm/linux/kernel/git/pdx86/platform-drivers-x86: (65 commits)
  platform/x86: asus-wmi: fix TUF laptop RGB variant
  platform/x86/intel/tpmi/plr: Fix output in plr_print_bits()
  Docs/admin-guide: Remove pmf leftover reference from the index
  platform/x86: ideapad-laptop: use cleanup.h
  platform/x86: hp-wmi: Fix implementation of the platform_profile_omen_get function
  platform: arm64: EC_LENOVO_YOGA_C630 should depend on ARCH_QCOM
  platform: arm64: EC_ACER_ASPIRE1 should depend on ARCH_QCOM
  platform/x86/amd/pmf: Remove update system state document
  platform/x86/amd/pmf: Use existing input event codes to update system states
  platform/x86: hp-wmi: Fix platform profile option switch bug on Omen and Victus laptops
  platform/x86:intel/pmc: Add support to undo ltr_ignore
  platform/x86:intel/pmc: Use the Elvis operator
  platform/x86:intel/pmc: Use DEFINE_SHOW_STORE_ATTRIBUTE macro
  platform/x86:intel/pmc: Remove unneeded min_t check
  platform/x86:intel/pmc: Add support to show ltr_ignore value
  platform/x86:intel/pmc: Move pmc assignment closer to first usage
  platform/x86:intel/pmc: Convert index variables to be unsigned
  platform/x86:intel/pmc: Simplify mutex usage with cleanup helpers
  platform/x86:intel/pmc: Use the return value of pmc_core_send_msg
  tools/power/x86/intel-speed-select: v1.20 release
  ...
Diffstat (limited to 'drivers/platform/x86/wmi.c')
| -rw-r--r-- | drivers/platform/x86/wmi.c | 33 | 
1 files changed, 33 insertions, 0 deletions
diff --git a/drivers/platform/x86/wmi.c b/drivers/platform/x86/wmi.c index d21f3fa25823..6bfae28b962a 100644 --- a/drivers/platform/x86/wmi.c +++ b/drivers/platform/x86/wmi.c @@ -772,11 +772,39 @@ static ssize_t expensive_show(struct device *dev,  }  static DEVICE_ATTR_RO(expensive); +static ssize_t driver_override_show(struct device *dev, struct device_attribute *attr, +				    char *buf) +{ +	struct wmi_device *wdev = to_wmi_device(dev); +	ssize_t ret; + +	device_lock(dev); +	ret = sysfs_emit(buf, "%s\n", wdev->driver_override); +	device_unlock(dev); + +	return ret; +} + +static ssize_t driver_override_store(struct device *dev, struct device_attribute *attr, +				     const char *buf, size_t count) +{ +	struct wmi_device *wdev = to_wmi_device(dev); +	int ret; + +	ret = driver_set_override(dev, &wdev->driver_override, buf, count); +	if (ret < 0) +		return ret; + +	return count; +} +static DEVICE_ATTR_RW(driver_override); +  static struct attribute *wmi_attrs[] = {  	&dev_attr_modalias.attr,  	&dev_attr_guid.attr,  	&dev_attr_instance_count.attr,  	&dev_attr_expensive.attr, +	&dev_attr_driver_override.attr,  	NULL  };  ATTRIBUTE_GROUPS(wmi); @@ -845,6 +873,7 @@ static void wmi_dev_release(struct device *dev)  {  	struct wmi_block *wblock = dev_to_wblock(dev); +	kfree(wblock->dev.driver_override);  	kfree(wblock);  } @@ -854,6 +883,10 @@ static int wmi_dev_match(struct device *dev, struct device_driver *driver)  	struct wmi_block *wblock = dev_to_wblock(dev);  	const struct wmi_device_id *id = wmi_driver->id_table; +	/* When driver_override is set, only bind to the matching driver */ +	if (wblock->dev.driver_override) +		return !strcmp(wblock->dev.driver_override, driver->name); +  	if (id == NULL)  		return 0;  | 
