From patchwork Thu Nov 19 15:49:24 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Azael Avalos X-Patchwork-Id: 7658511 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 79E429F2EC for ; Thu, 19 Nov 2015 15:51:08 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 8D469202E5 for ; Thu, 19 Nov 2015 15:51:07 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 8A9B32052A for ; Thu, 19 Nov 2015 15:51:06 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1758858AbbKSPui (ORCPT ); Thu, 19 Nov 2015 10:50:38 -0500 Received: from mail-ob0-f170.google.com ([209.85.214.170]:34959 "EHLO mail-ob0-f170.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1030277AbbKSPtc (ORCPT ); Thu, 19 Nov 2015 10:49:32 -0500 Received: by obbnk6 with SMTP id nk6so63056956obb.2; Thu, 19 Nov 2015 07:49:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=u6wKaWUyz7kIsBamO2QhXkgTR3ocR6+cSxRX+fUwZyk=; b=P7oEhUOu0Ow3xN3QLAM7B/ezfkiGeKhslfw7HzgtLEKYjgzWZdbfesJAmeUM/rq181 NDE7iFWa8yjBjswxYcPXtZaoVB6k4W2r5yOeFj5J2V3kLGl+OWVXP0bwivBNEYHq0nMu w4nUd0bLQAVOUOgq8aXaXlNk7qVfKsX+h9Qql3GFt3EqHlVXArV8pZYa1WjgcnoggzuB I5jsbAPqXveyssSOk7v0YeuXmIAv7Eqv31JLEdGlcIgjF4/T9F5F713Lu/z3YLtU8Iv2 3tSu3mxqIjrFvvqp+h+J15GW3bvA4cgbZP/OfIeoLeMf/8w/Kqkrfzf3Y3DY9AbhBg04 A5Zg== X-Received: by 10.182.176.102 with SMTP id ch6mr5144072obc.31.1447948171945; Thu, 19 Nov 2015 07:49:31 -0800 (PST) Received: from Shakuras.scurra.org ([148.210.109.74]) by smtp.gmail.com with ESMTPSA id a123sm3525756oig.2.2015.11.19.07.49.30 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 19 Nov 2015 07:49:30 -0800 (PST) From: Azael Avalos To: Darren Hart , platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Fabian Koester , Azael Avalos Subject: [PATCH v2 1/2] toshiba_acpi: Add support for WWAN devices Date: Thu, 19 Nov 2015 08:49:24 -0700 Message-Id: <1447948165-2343-2-git-send-email-coproscefalo@gmail.com> X-Mailer: git-send-email 2.6.3 In-Reply-To: <1447948165-2343-1-git-send-email-coproscefalo@gmail.com> References: <1447948165-2343-1-git-send-email-coproscefalo@gmail.com> 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=-7.3 required=5.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, 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 Toshiba laptops with WWAN devices installed cannot use the device unless it is attached and powered, similar to how Toshiba Bluetooth devices work. This patch adds support to WWAN devices, introducing three functions, one to query the overall status of the wireless devices (RFKill, WLAN, BT, WWAN), the second queries WWAN support, and finally the third (de)activates the device. Signed-off-by: Fabian Koester Signed-off-by: Azael Avalos --- drivers/platform/x86/toshiba_acpi.c | 92 +++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) diff --git a/drivers/platform/x86/toshiba_acpi.c b/drivers/platform/x86/toshiba_acpi.c index c013029..60d1ad9 100644 --- a/drivers/platform/x86/toshiba_acpi.c +++ b/drivers/platform/x86/toshiba_acpi.c @@ -114,6 +114,7 @@ MODULE_LICENSE("GPL"); #define HCI_VIDEO_OUT 0x001c #define HCI_HOTKEY_EVENT 0x001e #define HCI_LCD_BRIGHTNESS 0x002a +#define HCI_WIRELESS 0x0056 #define HCI_ACCELEROMETER 0x006d #define HCI_KBD_ILLUMINATION 0x0095 #define HCI_ECO_MODE 0x0097 @@ -148,6 +149,10 @@ MODULE_LICENSE("GPL"); #define SCI_KBD_MODE_ON 0x8 #define SCI_KBD_MODE_OFF 0x10 #define SCI_KBD_TIME_MAX 0x3c001a +#define HCI_WIRELESS_STATUS 0x1 +#define HCI_WIRELESS_WWAN 0x3 +#define HCI_WIRELESS_WWAN_STATUS 0x2000 +#define HCI_WIRELESS_WWAN_POWER 0x4000 #define SCI_USB_CHARGE_MODE_MASK 0xff #define SCI_USB_CHARGE_DISABLED 0x00 #define SCI_USB_CHARGE_ALTERNATE 0x09 @@ -197,12 +202,14 @@ struct toshiba_acpi_dev { unsigned int kbd_function_keys_supported:1; unsigned int panel_power_on_supported:1; unsigned int usb_three_supported:1; + unsigned int wwan_supported:1; unsigned int sysfs_created:1; unsigned int special_functions; bool kbd_led_registered; bool illumination_led_registered; bool eco_led_registered; + bool killswitch; }; static struct toshiba_acpi_dev *toshiba_acpi; @@ -1085,6 +1092,87 @@ static int toshiba_hotkey_event_type_get(struct toshiba_acpi_dev *dev, return -EIO; } +/* Wireless status (RFKill, WLAN, BT, WWAN) */ +static int toshiba_wireless_status(struct toshiba_acpi_dev *dev) +{ + u32 in[TCI_WORDS] = { HCI_GET, HCI_WIRELESS, 0, 0, 0, 0 }; + u32 out[TCI_WORDS]; + acpi_status status; + + in[3] = HCI_WIRELESS_STATUS; + status = tci_raw(dev, in, out); + if (ACPI_FAILURE(status)) { + pr_err("ACPI call to get Wireless status failed\n"); + } else if (out[0] == TOS_NOT_SUPPORTED) { + return -ENODEV; + } else if (out[0] == TOS_SUCCESS) { + dev->killswitch = + (out[2] & HCI_WIRELESS_STATUS) ? true : false; + return 0; + } + + return -EIO; +} + +/* WWAN */ +static void toshiba_wwan_available(struct toshiba_acpi_dev *dev) +{ + u32 in[TCI_WORDS] = { HCI_GET, HCI_WIRELESS, 0, 0, 0, 0 }; + u32 out[TCI_WORDS]; + acpi_status status; + + dev->wwan_supported = 0; + + /* + * WWAN support can be queried by setting the in[3] value to + * HCI_WIRELESS_WWAN (0x03). + * + * If supported, out[0] contains TOS_SUCCESS and out[2] contains + * HCI_WIRELESS_WWAN_STATUS (0x2000). + * + * If not supported, out[0] contains TOS_INPUT_DATA_ERROR (0x8300) + * or TOS_NOT_SUPPORTED (0x8000). + */ + in[3] = HCI_WIRELESS_WWAN; + status = tci_raw(dev, in, out); + if (ACPI_FAILURE(status)) + pr_err("ACPI call to get WWAN status failed\n"); + else if (out[0] == TOS_SUCCESS && out[2] == HCI_WIRELESS_WWAN_STATUS) + dev->wwan_supported = 1; +} + +static int toshiba_wwan_set(struct toshiba_acpi_dev *dev, u32 state) +{ + u32 in[TCI_WORDS] = { HCI_SET, HCI_WIRELESS, state, 0, 0, 0 }; + u32 out[TCI_WORDS]; + acpi_status status; + + in[3] = HCI_WIRELESS_WWAN_STATUS; + status = tci_raw(dev, in, out); + if (ACPI_FAILURE(status)) { + pr_err("ACPI call to set WWAN status failed\n"); + return -EIO; + } else if (out[0] == TOS_NOT_SUPPORTED) { + return -ENODEV; + } else if (out[0] != TOS_SUCCESS) { + return -EIO; + } + + /* + * Some devices only need to call HCI_WIRELESS_WWAN_STATUS to + * (de)activate the device, but some others need the + * HCI_WIRELESS_WWAN_POWER call as well. + */ + in[3] = HCI_WIRELESS_WWAN_POWER; + status = tci_raw(dev, in, out); + if (ACPI_FAILURE(status)) + pr_err("ACPI call to set WWAN power failed\n"); + else if (out[0] == TOS_NOT_SUPPORTED) + return -ENODEV; + + return out[0] == TOS_SUCCESS ? 0 : -EIO; +} + /* Transflective Backlight */ static int get_tr_backlight_status(struct toshiba_acpi_dev *dev, u32 *status) { @@ -2561,6 +2649,8 @@ static void print_supported_features(struct toshiba_acpi_dev *dev) pr_cont(" panel-power-on"); if (dev->usb_three_supported) pr_cont(" usb3"); + if (dev->wwan_supported) + pr_cont(" wwan"); pr_cont("\n"); } @@ -2736,6 +2826,8 @@ static int toshiba_acpi_add(struct acpi_device *acpi_dev) ret = get_fan_status(dev, &dummy); dev->fan_supported = !ret; + toshiba_wwan_available(dev); + print_supported_features(dev); ret = sysfs_create_group(&dev->acpi_dev->dev.kobj,