Message ID | 1452607380-20861-14-git-send-email-kernel@kempniu.pl (mailing list archive) |
---|---|
State | Changes Requested, archived |
Headers | show |
Hi Micha?, Thanks for the patches. They should probably be merged through linux-platform-drivers-x86.git. Feel free to add my Acked-by: Jacek Anaszewski <j.anaszewski@samsung.com> to 13/14 and 14/14. Best Regards, Jacek Anaszewski On 01/12/2016 03:02 PM, Micha? K?pie? wrote: > 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: Micha? K?pie? <kernel@kempniu.pl> > --- > drivers/leds/Kconfig | 1 + > drivers/leds/dell-led.c | 63 +++++++---------------------------------------- > 2 files changed, 10 insertions(+), 54 deletions(-) > > diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig > index b1ab8bd..171810c 100644 > --- a/drivers/leds/Kconfig > +++ b/drivers/leds/Kconfig > @@ -441,6 +441,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. > diff --git a/drivers/leds/dell-led.c b/drivers/leds/dell-led.c > index c36acaf..bfa7511 100644 > --- a/drivers/leds/dell-led.c > +++ b/drivers/leds/dell-led.c > @@ -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"); > @@ -59,22 +60,6 @@ struct app_wmi_args { > #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; > @@ -112,43 +97,24 @@ static int dell_wmi_perform_query(struct app_wmi_args *args) > 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 calling_interface_token *token; > struct app_wmi_args args; > - struct dell_bios_data_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; > > + if (!token) > + return -ENODEV; > + > memset(&args, 0, sizeof(struct app_wmi_args)); > > args.class = 1; > @@ -177,14 +143,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 +288,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) > -- To unsubscribe from this list: send the line "unsubscribe platform-driver-x86" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
> Thanks for the patches. > They should probably be merged through linux-platform-drivers-x86.git. > > Feel free to add my > > Acked-by: Jacek Anaszewski <j.anaszewski@samsung.com> > > to 13/14 and 14/14. Thanks for reviewing. I will soon post a v2 of this series. Given that the only difference between v1 and v2 for dell-led will be a subtle difference in API use, I'll allow myself to use your Acked-by for the last two patches when I post v2. Please let me know if that's inappropriate.
On 01/21/2016 04:00 PM, Micha? K?pie? wrote: >> Thanks for the patches. >> They should probably be merged through linux-platform-drivers-x86.git. >> >> Feel free to add my >> >> Acked-by: Jacek Anaszewski <j.anaszewski@samsung.com> >> >> to 13/14 and 14/14. > > Thanks for reviewing. I will soon post a v2 of this series. Given that > the only difference between v1 and v2 for dell-led will be a subtle > difference in API use, I'll allow myself to use your Acked-by for the > last two patches when I post v2. Please let me know if that's > inappropriate. > Yes, feel free to carry my acks.
diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig index b1ab8bd..171810c 100644 --- a/drivers/leds/Kconfig +++ b/drivers/leds/Kconfig @@ -441,6 +441,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. diff --git a/drivers/leds/dell-led.c b/drivers/leds/dell-led.c index c36acaf..bfa7511 100644 --- a/drivers/leds/dell-led.c +++ b/drivers/leds/dell-led.c @@ -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"); @@ -59,22 +60,6 @@ struct app_wmi_args { #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; @@ -112,43 +97,24 @@ static int dell_wmi_perform_query(struct app_wmi_args *args) 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 calling_interface_token *token; struct app_wmi_args args; - struct dell_bios_data_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; + if (!token) + return -ENODEV; + memset(&args, 0, sizeof(struct app_wmi_args)); args.class = 1; @@ -177,14 +143,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 +288,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)
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: Micha? K?pie? <kernel@kempniu.pl> --- drivers/leds/Kconfig | 1 + drivers/leds/dell-led.c | 63 +++++++---------------------------------------- 2 files changed, 10 insertions(+), 54 deletions(-)