From patchwork Fri Jan 22 14:27:27 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?b?TWljaGHFgiBLxJlwaWXFhA==?= X-Patchwork-Id: 8090631 Return-Path: X-Original-To: patchwork-platform-driver-x86@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 25EAF9F859 for ; Fri, 22 Jan 2016 14:31:04 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 1557220395 for ; Fri, 22 Jan 2016 14:31:03 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 103E220434 for ; Fri, 22 Jan 2016 14:31:02 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754205AbcAVO2i (ORCPT ); Fri, 22 Jan 2016 09:28:38 -0500 Received: from mail-lb0-f196.google.com ([209.85.217.196]:36522 "EHLO mail-lb0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754136AbcAVO2B (ORCPT ); Fri, 22 Jan 2016 09:28:01 -0500 Received: by mail-lb0-f196.google.com with SMTP id ad5so3153785lbc.3 for ; Fri, 22 Jan 2016 06:28:00 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kempniu.pl; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-type:content-transfer-encoding; bh=fjn1sv/tt1YpW2bm8DsIUfJ3Sw3nkbD68Sd0Lt1EzwA=; b=WbtgzmOiJXgbJFEVCPVfCiYiRZ11l2qYTXuMTuSLNZUF1IYpR1DYfgYMJwPx1oouIq AQARHAz5V5z5n/+Zrw1drPNjmBKPL9oX/xy8C9z32cC2WyrBnc9pJsJJl6cfyBRjxPae NMjoFPm8yhsQ1RCZD038Y+qG5ukx1CEnkUWRI= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-type:content-transfer-encoding; bh=fjn1sv/tt1YpW2bm8DsIUfJ3Sw3nkbD68Sd0Lt1EzwA=; b=jtEsK3u5mU61z6eS3P7RDRiN1JgpOMoJJqOtcYBkvM8Qj6cAzYSA820cTacIYJVRAG qSuPdbBomioAKUokU6drZHV3athI0cqud2oLGNpm7iiNy6gKq48F+pqjOzwSEq1zfSRQ UF3AYjg633QS8H+VitBA6rxCJ49NEBLWQDwC+qifLSSovswD/5R+hmfNgG+rUpdL0k1w Ru4gf1IQi8XlkC8cOJnG4ZB7ZzzZFeGtEPrZFgr1xWf49HGJ5fUQp57smhlMbZHhMqCw F9NtABrpj6Qjh9xm8GZsFx0qVl2Pl6eIbviCGO6ClLelNWvAHevIDHWRmJGmUhdqzWmC Y4VA== X-Gm-Message-State: AG10YOTsE6mX9Xl1rpKHCeYnDSI1nXHS5uYBCrzWScnIKqAmaKoAO4M+vPEAx9LVFH/26Q== X-Received: by 10.112.12.2 with SMTP id u2mr1352297lbb.145.1453472879557; Fri, 22 Jan 2016 06:27:59 -0800 (PST) Received: from eudyptula.hq.kempniu.pl. (eudyptula.hq.kempniu.pl. [2001:6a0:200:83b0::fd5a]) by smtp.googlemail.com with ESMTPSA id o82sm912027lfo.47.2016.01.22.06.27.58 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 22 Jan 2016 06:27:58 -0800 (PST) From: =?UTF-8?q?Micha=C5=82=20K=C4=99pie=C5=84?= To: Darren Hart , Matthew Garrett , =?UTF-8?q?Pali=20Roh=C3=A1r?= , Richard Purdie , Jacek Anaszewski Cc: platform-driver-x86@vger.kernel.org, linux-leds@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 15/16] dell-led: use dell_smbios_find_token() for finding mic DMI tokens Date: Fri, 22 Jan 2016 15:27:27 +0100 Message-Id: <1453472848-3118-16-git-send-email-kernel@kempniu.pl> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1453472848-3118-1-git-send-email-kernel@kempniu.pl> References: <1453472848-3118-1-git-send-email-kernel@kempniu.pl> MIME-Version: 1.0 Sender: platform-driver-x86-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: platform-driver-x86@vger.kernel.org X-Spam-Status: No, score=-6.8 required=5.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI,RP_MATCHES_RCVD,T_DKIM_INVALID,UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP 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? Acked-by: Jacek Anaszewski --- 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 7f940c2..4351cbe 100644 --- a/drivers/leds/Kconfig +++ b/drivers/leds/Kconfig @@ -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. 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 #include #include +#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)