Commit cf0d7ea3 authored by Michał Kępień's avatar Michał Kępień Committed by Darren Hart

dell-led: use dell_smbios_find_token() for finding mic DMI tokens

With the advent of dell_smbios_find_token(), dell-led does not need to
perform any DMI walking on its own, but it can rather ask dell-smbios to
look up the DMI tokens it needs for changing the state of the microphone
LED.
Signed-off-by: default avatarMichał Kępień <kernel@kempniu.pl>
Reviewed-by: default avatarPali Rohár <pali.rohar@gmail.com>
Acked-by: default avatarJacek Anaszewski <j.anaszewski@samsung.com>
Signed-off-by: default avatarDarren Hart <dvhart@linux.intel.com>
parent b7bca2d7
...@@ -443,6 +443,7 @@ config LEDS_DELL_NETBOOKS ...@@ -443,6 +443,7 @@ config LEDS_DELL_NETBOOKS
tristate "External LED on Dell Business Netbooks" tristate "External LED on Dell Business Netbooks"
depends on LEDS_CLASS depends on LEDS_CLASS
depends on X86 && ACPI_WMI depends on X86 && ACPI_WMI
depends on DELL_SMBIOS
help help
This adds support for the Latitude 2100 and similar This adds support for the Latitude 2100 and similar
notebooks that have an external LED. notebooks that have an external LED.
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/dmi.h> #include <linux/dmi.h>
#include <linux/dell-led.h> #include <linux/dell-led.h>
#include "../platform/x86/dell-smbios.h"
MODULE_AUTHOR("Louis Davis/Jim Dailey"); MODULE_AUTHOR("Louis Davis/Jim Dailey");
MODULE_DESCRIPTION("Dell LED Control Driver"); MODULE_DESCRIPTION("Dell LED Control Driver");
...@@ -59,22 +60,6 @@ struct app_wmi_args { ...@@ -59,22 +60,6 @@ struct app_wmi_args {
#define GLOBAL_MIC_MUTE_ENABLE 0x364 #define GLOBAL_MIC_MUTE_ENABLE 0x364
#define GLOBAL_MIC_MUTE_DISABLE 0x365 #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) static int dell_wmi_perform_query(struct app_wmi_args *args)
{ {
struct app_wmi_args *bios_return; struct app_wmi_args *bios_return;
...@@ -112,43 +97,24 @@ static int dell_wmi_perform_query(struct app_wmi_args *args) ...@@ -112,43 +97,24 @@ static int dell_wmi_perform_query(struct app_wmi_args *args)
return rc; 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) static int dell_micmute_led_set(int state)
{ {
struct calling_interface_token *token;
struct app_wmi_args args; struct app_wmi_args args;
struct dell_bios_data_token *token;
if (!wmi_has_guid(DELL_APP_GUID)) if (!wmi_has_guid(DELL_APP_GUID))
return -ENODEV; return -ENODEV;
if (state == 0 || state == 1) if (state == 0)
token = &dell_mic_tokens[state]; token = dell_smbios_find_token(GLOBAL_MIC_MUTE_DISABLE);
else if (state == 1)
token = dell_smbios_find_token(GLOBAL_MIC_MUTE_ENABLE);
else else
return -EINVAL; return -EINVAL;
if (!token)
return -ENODEV;
memset(&args, 0, sizeof(struct app_wmi_args)); memset(&args, 0, sizeof(struct app_wmi_args));
args.class = 1; args.class = 1;
...@@ -177,14 +143,6 @@ int dell_app_wmi_led_set(int whichled, int on) ...@@ -177,14 +143,6 @@ int dell_app_wmi_led_set(int whichled, int on)
} }
EXPORT_SYMBOL_GPL(dell_app_wmi_led_set); 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 { struct bios_args {
unsigned char length; unsigned char length;
unsigned char result_code; unsigned char result_code;
...@@ -330,9 +288,6 @@ static int __init dell_led_init(void) ...@@ -330,9 +288,6 @@ static int __init dell_led_init(void)
if (!wmi_has_guid(DELL_LED_BIOS_GUID) && !wmi_has_guid(DELL_APP_GUID)) if (!wmi_has_guid(DELL_LED_BIOS_GUID) && !wmi_has_guid(DELL_APP_GUID))
return -ENODEV; return -ENODEV;
if (wmi_has_guid(DELL_APP_GUID))
error = dell_micmute_led_init();
if (wmi_has_guid(DELL_LED_BIOS_GUID)) { if (wmi_has_guid(DELL_LED_BIOS_GUID)) {
error = led_off(); error = led_off();
if (error != 0) if (error != 0)
......
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