Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5a010c73 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'platform-drivers-x86-v4.6-1' of...

Merge tag 'platform-drivers-x86-v4.6-1' of git://git.infradead.org/users/dvhart/linux-platform-drivers-x86

Pull x86 platform driver updates from Darren Hart:
 "Significant refactoring of Dell laptop drivers, modularizing the
  smbios code.  Multiple new platforms added for ideapad, asus, dell,
  and alienware using existing quirks.  A few fixes and cleanups.

  hp-wmi:
   - Remove GPS rfkill support via pre-2009 interface
   - fix unregister order in hp_wmi_rfkill_setup() once again

  ideapad-laptop:
   - Add ideapad Y700 (15) to the no_hw_rfkill DMI list

  fujitsu-laptop:
   - Support radio toggle button

  intel-hid:
   - allocate correct amount of memory for private struct

  platform/x86:
   - Make intel_scu_ipc explicitly non-modular

  intel_pmc_ipc:
   - Avoid pending IPC1 command during legacy suspend
   - Fix GCR register base address and length

  asus-nb-wmi:
   - add wapf=4 quirk for ASUS X75VD

  intel_telemetry_pltdrv:
   - Change verbosity control bits

  dell-rbtn:
   - Add a comment about the XPS 13 9350

  dell-wmi, dell-laptop:
   - depends DMI

  dell-wmi:
   - support Dell Inspiron M5110
   - properly process Dell Instant Launch hotkey
   - enable receiving WMI events on Dell Vostro V131
   - Support new hotkeys on the XPS 13 9350 (Skylake)
   - Clean up hotkey table size check
   - Stop storing pointers to DMI tables

  dell-laptop:
   - move dell_smi_error() to dell-smbios
   - use dell_smbios_find_token() instead of find_token_location()
   - use dell_smbios_find_token() instead of find_token_id()
   - extract SMBIOS-related code to a separate module

  dell-smbios:
   - rename dell_smi_error() to dell_smbios_error()
   - make da_tokens static
   - remove find_token_{id,location}()
   - implement new function for finding DMI table 0xDA tokens
   - make the SMBIOS buffer static
   - return the SMBIOS buffer from dell_smbios_get_buffer()
   - don't return an SMBIOS buffer from dell_smbios_send_request()
   - don't pass an SMBIOS buffer to dell_smbios_send_request()
   - rename dell_send_request() to dell_smbios_send_request()
   - rename release_buffer() to dell_smbios_release_buffer()
   - rename clear_buffer() to dell_smbios_clear_buffer()
   - rename get_buffer() to dell_smbios_get_buffer()

  dell-led:
   - use dell_smbios_send_request() for performing SMBIOS calls
   - use dell_smbios_find_token() for finding mic DMI tokens

  toshiba_acpi:
   - Add a module parameter to disable hotkeys registration
   - Add sysfs entries for the Cooling Method feature
   - Add support for cooling method feature

  Documentation/ABI:
   - Update sysfs-driver-toshiba_acpi file

  thinkpad_acpi:
   - Remove ambiguous logging for "Unsupported brightness interface"

  alienware-wmi:
   - whitespace improvements
   - Add support for two new systems: ASM200 and ASM201.
   - Add support for deep sleep control.
   - Add initial support for alienware graphics amplifier.
   - Add support for new platform: X51-R3
   - Clean up whitespace for ASM100 platform"

* tag 'platform-drivers-x86-v4.6-1' of git://git.infradead.org/users/dvhart/linux-platform-drivers-x86: (47 commits)
  hp-wmi: Remove GPS rfkill support via pre-2009 interface
  hp-wmi: fix unregister order in hp_wmi_rfkill_setup() once again
  dell-wmi: support Dell Inspiron M5110
  dell-wmi: properly process Dell Instant Launch hotkey
  dell-wmi: enable receiving WMI events on Dell Vostro V131
  dell-smbios: rename dell_smi_error() to dell_smbios_error()
  dell-laptop: move dell_smi_error() to dell-smbios
  ideapad-laptop: Add ideapad Y700 (15) to the no_hw_rfkill DMI list
  fujitsu-laptop: Support radio toggle button
  intel-hid: allocate correct amount of memory for private struct
  platform/x86: Make intel_scu_ipc explicitly non-modular
  intel_pmc_ipc: Avoid pending IPC1 command during legacy suspend
  intel_pmc_ipc: Fix GCR register base address and length
  asus-nb-wmi: add wapf=4 quirk for ASUS X75VD
  intel_telemetry_pltdrv: Change verbosity control bits
  dell-rbtn: Add a comment about the XPS 13 9350
  dell-wmi: Support new hotkeys on the XPS 13 9350 (Skylake)
  dell-wmi: Clean up hotkey table size check
  dell-wmi, dell-laptop: depends DMI
  dell-wmi: Stop storing pointers to DMI tables
  ...
parents b615d3d4 fffcad87
Loading
Loading
Loading
Loading
+16 −0
Original line number Diff line number Diff line
@@ -179,3 +179,19 @@ Description: This file controls the USB 3 functionality, valid values are:
		Note that toggling this value requires a reboot for changes to
		take effect.
Users:		KToshiba

What:		/sys/devices/LNXSYSTM:00/LNXSYBUS:00/TOS{1900,620{0,7,8}}:00/cooling_method
Date:		2016
KernelVersion:	4.6
Contact:	Azael Avalos <coproscefalo@gmail.com>
Description:	This file controls the Cooling Method feature.
		Reading this file prints two values, the first is the actual cooling method
		and the second is the maximum cooling method supported.
		When the maximum cooling method is ONE, valid values are:
			* 0 -> Maximum Performance
			* 1 -> Battery Optimized
		When the maximum cooling method is TWO, valid values are:
			* 0 -> Maximum Performance
			* 1 -> Performance
			* 2 -> Battery Optimized
Users:		KToshiba
+1 −0
Original line number Diff line number Diff line
@@ -443,6 +443,7 @@ config LEDS_DELL_NETBOOKS
	tristate "External LED on Dell Business Netbooks"
	depends on LEDS_CLASS
	depends on X86 && ACPI_WMI
	depends on DELL_SMBIOS
	help
	  This adds support for the Latitude 2100 and similar
	  notebooks that have an external LED.
+14 −112
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
#include <linux/module.h>
#include <linux/dmi.h>
#include <linux/dell-led.h>
#include "../platform/x86/dell-smbios.h"

MODULE_AUTHOR("Louis Davis/Jim Dailey");
MODULE_DESCRIPTION("Dell LED Control Driver");
@@ -42,120 +43,32 @@ MODULE_ALIAS("wmi:" DELL_LED_BIOS_GUID);
#define CMD_LED_OFF	17
#define CMD_LED_BLINK	18

struct app_wmi_args {
	u16 class;
	u16 selector;
	u32 arg1;
	u32 arg2;
	u32 arg3;
	u32 arg4;
	u32 res1;
	u32 res2;
	u32 res3;
	u32 res4;
	char dummy[92];
};

#define GLOBAL_MIC_MUTE_ENABLE	0x364
#define GLOBAL_MIC_MUTE_DISABLE	0x365

struct dell_bios_data_token {
	u16 tokenid;
	u16 location;
	u16 value;
};

struct __attribute__ ((__packed__)) dell_bios_calling_interface {
	struct	dmi_header header;
	u16	cmd_io_addr;
	u8	cmd_io_code;
	u32	supported_cmds;
	struct	dell_bios_data_token damap[];
};

static struct dell_bios_data_token dell_mic_tokens[2];

static int dell_wmi_perform_query(struct app_wmi_args *args)
{
	struct app_wmi_args *bios_return;
	union acpi_object *obj;
	struct acpi_buffer input;
	struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL };
	acpi_status status;
	u32 rc = -EINVAL;

	input.length = 128;
	input.pointer = args;

	status = wmi_evaluate_method(DELL_APP_GUID, 0, 1, &input, &output);
	if (!ACPI_SUCCESS(status))
		goto err_out0;

	obj = output.pointer;
	if (!obj)
		goto err_out0;

	if (obj->type != ACPI_TYPE_BUFFER)
		goto err_out1;

	bios_return = (struct app_wmi_args *)obj->buffer.pointer;
	rc = bios_return->res1;
	if (rc)
		goto err_out1;

	memcpy(args, bios_return, sizeof(struct app_wmi_args));
	rc = 0;

 err_out1:
	kfree(obj);
 err_out0:
	return rc;
}

static void __init find_micmute_tokens(const struct dmi_header *dm, void *dummy)
{
	struct dell_bios_calling_interface *calling_interface;
	struct dell_bios_data_token *token;
	int token_size = sizeof(struct dell_bios_data_token);
	int i = 0;

	if (dm->type == 0xda && dm->length > 17) {
		calling_interface = container_of(dm,
				struct dell_bios_calling_interface, header);

		token = &calling_interface->damap[i];
		while (token->tokenid != 0xffff) {
			if (token->tokenid == GLOBAL_MIC_MUTE_DISABLE)
				memcpy(&dell_mic_tokens[0], token, token_size);
			else if (token->tokenid == GLOBAL_MIC_MUTE_ENABLE)
				memcpy(&dell_mic_tokens[1], token, token_size);

			i++;
			token = &calling_interface->damap[i];
		}
	}
}

static int dell_micmute_led_set(int state)
{
	struct app_wmi_args args;
	struct dell_bios_data_token *token;
	struct calling_interface_buffer *buffer;
	struct calling_interface_token *token;

	if (!wmi_has_guid(DELL_APP_GUID))
		return -ENODEV;

	if (state == 0 || state == 1)
		token = &dell_mic_tokens[state];
	if (state == 0)
		token = dell_smbios_find_token(GLOBAL_MIC_MUTE_DISABLE);
	else if (state == 1)
		token = dell_smbios_find_token(GLOBAL_MIC_MUTE_ENABLE);
	else
		return -EINVAL;

	memset(&args, 0, sizeof(struct app_wmi_args));

	args.class = 1;
	args.arg1 = token->location;
	args.arg2 = token->value;
	if (!token)
		return -ENODEV;

	dell_wmi_perform_query(&args);
	buffer = dell_smbios_get_buffer();
	buffer->input[0] = token->location;
	buffer->input[1] = token->value;
	dell_smbios_send_request(1, 0);
	dell_smbios_release_buffer();

	return state;
}
@@ -177,14 +90,6 @@ int dell_app_wmi_led_set(int whichled, int on)
}
EXPORT_SYMBOL_GPL(dell_app_wmi_led_set);

static int __init dell_micmute_led_init(void)
{
	memset(dell_mic_tokens, 0, sizeof(struct dell_bios_data_token) * 2);
	dmi_walk(find_micmute_tokens, NULL);

	return 0;
}

struct bios_args {
	unsigned char length;
	unsigned char result_code;
@@ -330,9 +235,6 @@ static int __init dell_led_init(void)
	if (!wmi_has_guid(DELL_LED_BIOS_GUID) && !wmi_has_guid(DELL_APP_GUID))
		return -ENODEV;

	if (wmi_has_guid(DELL_APP_GUID))
		error = dell_micmute_led_init();

	if (wmi_has_guid(DELL_LED_BIOS_GUID)) {
		error = led_off();
		if (error != 0)
+14 −1
Original line number Diff line number Diff line
@@ -91,10 +91,21 @@ config ASUS_LAPTOP

	  If you have an ACPI-compatible ASUS laptop, say Y or M here.

config DELL_SMBIOS
	tristate "Dell SMBIOS Support"
	depends on DCDBAS
	default n
	---help---
	This module provides common functions for kernel modules using
	Dell SMBIOS.

	If you have a Dell laptop, say Y or M here.

config DELL_LAPTOP
	tristate "Dell Laptop Extras"
	depends on X86
	depends on DCDBAS
	depends on DELL_SMBIOS
	depends on DMI
	depends on BACKLIGHT_CLASS_DEVICE
	depends on ACPI_VIDEO || ACPI_VIDEO = n
	depends on RFKILL || RFKILL = n
@@ -110,8 +121,10 @@ config DELL_LAPTOP
config DELL_WMI
	tristate "Dell WMI extras"
	depends on ACPI_WMI
	depends on DMI
	depends on INPUT
	depends on ACPI_VIDEO || ACPI_VIDEO = n
	depends on DELL_SMBIOS
	select INPUT_SPARSEKMAP
	---help---
	  Say Y here if you want to support WMI-based hotkeys on Dell laptops.
+1 −0
Original line number Diff line number Diff line
@@ -11,6 +11,7 @@ obj-$(CONFIG_EEEPC_WMI) += eeepc-wmi.o
obj-$(CONFIG_MSI_LAPTOP)	+= msi-laptop.o
obj-$(CONFIG_ACPI_CMPC)		+= classmate-laptop.o
obj-$(CONFIG_COMPAL_LAPTOP)	+= compal-laptop.o
obj-$(CONFIG_DELL_SMBIOS)	+= dell-smbios.o
obj-$(CONFIG_DELL_LAPTOP)	+= dell-laptop.o
obj-$(CONFIG_DELL_WMI)		+= dell-wmi.o
obj-$(CONFIG_DELL_WMI_AIO)	+= dell-wmi-aio.o
Loading