From patchwork Mon Jan 25 18:29:10 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Azael Avalos X-Patchwork-Id: 8113911 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 B9AF09F440 for ; Mon, 25 Jan 2016 18:30:31 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id D015E2034E for ; Mon, 25 Jan 2016 18:30:30 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id CD8572034A for ; Mon, 25 Jan 2016 18:30:29 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S934089AbcAYSa3 (ORCPT ); Mon, 25 Jan 2016 13:30:29 -0500 Received: from mail-ob0-f193.google.com ([209.85.214.193]:33666 "EHLO mail-ob0-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757997AbcAYS33 (ORCPT ); Mon, 25 Jan 2016 13:29:29 -0500 Received: by mail-ob0-f193.google.com with SMTP id oj9so10183433obc.0; Mon, 25 Jan 2016 10:29:29 -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=JNr6rzGsiJEUJuMCUvGXqxlTcu5/tOfaxkozfEUlTtY=; b=ALGCM7FHtHIVEAhPz3IqbX5MA2921r+ptVmzqO81MWjpbGNxGhPakaqbV4A9ikbHMn mDRO4ukIaeDCB/vhxql6ua/+ARo0AGRjxVvyTmL+qMvC22ljq0N+rWRMO9YxcruEtK/I 2//fvhxr8PRDFH2cQmwRVm3v1cUW1Iz4ZaPc/8YLYz2qBOoKDo2dvBzwm8FuDQHLi+wz 1q+chScddNDkPMmcG2rT/ag8KGWRkZfbgXQFCFsbTd+NJXG8p9xKV5Z8A6CJbkmSdJYJ Z45o21Fsjf2k3VsWIyGuxCw1K8xx76MGba2KaedZXO/1TaMn4pKu4omdOQBNBqkXXD4X ZZNw== 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; bh=JNr6rzGsiJEUJuMCUvGXqxlTcu5/tOfaxkozfEUlTtY=; b=g/HCDPfA1Pp24NvuJjRrZxs2bZn9BTraJYz7qiIwKMowSvU+k9nq8iSEE4SWc04N2C s9QUSR8+trKCDGQIlE0QDH9hYshytgu8anxfK40X9TzI2EDRsQoAeuqGPmbH9dmckm/O FWVffvHmna/w0uUxz+r9anmLBGOlsEPhjC/RmVwakS8jK/tqT64veBnqeMGaDkyLkoqq ydt//OJBM9oWOhFe5D1eVCqLH/7kOozK9fDBJpRZCcio+OvsO/QiQTTdj/k3tKh5s0SG Ms53jq3jmxsEtXNyE6aHz6DUeoR2p36ni1C+OW4lL1roVx5Tbgun/kMuf2bTLEgkwK8e UbGA== X-Gm-Message-State: AG10YORo4ZQp5KL5Wtr9xcbNyXY6d8d+esM3iWjOeD7mO/FPUuMUjpeu6qPbQTlv1RFOxw== X-Received: by 10.182.79.200 with SMTP id l8mr15255016obx.18.1453746568719; Mon, 25 Jan 2016 10:29:28 -0800 (PST) Received: from Shakuras.scurra.org ([148.210.108.137]) by smtp.gmail.com with ESMTPSA id w6sm11023833obx.9.2016.01.25.10.29.27 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 25 Jan 2016 10:29:27 -0800 (PST) From: Azael Avalos To: Darren Hart , platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Azael Avalos Subject: [PATCH 1/3] toshiba_acpi: Add support for cooling method feature Date: Mon, 25 Jan 2016 11:29:10 -0700 Message-Id: <1453746551-17496-2-git-send-email-coproscefalo@gmail.com> X-Mailer: git-send-email 2.7.0 In-Reply-To: <1453746551-17496-1-git-send-email-coproscefalo@gmail.com> References: <1453746551-17496-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=-6.8 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=ham 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 This patch adds support to query and set the "Cooling Method" feature, which basically changes how the system fan behaves, depending on the supported cooling methods. Depending on the laptop model, these are the (so far...) available cooling methods: - Maximum Performance - Performance - Battery Optimized Signed-off-by: Azael Avalos --- drivers/platform/x86/toshiba_acpi.c | 54 +++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/drivers/platform/x86/toshiba_acpi.c b/drivers/platform/x86/toshiba_acpi.c index 7383307..c6f92ec 100644 --- a/drivers/platform/x86/toshiba_acpi.c +++ b/drivers/platform/x86/toshiba_acpi.c @@ -117,6 +117,7 @@ MODULE_LICENSE("GPL"); #define HCI_LCD_BRIGHTNESS 0x002a #define HCI_WIRELESS 0x0056 #define HCI_ACCELEROMETER 0x006d +#define HCI_COOLING_METHOD 0x007f #define HCI_KBD_ILLUMINATION 0x0095 #define HCI_ECO_MODE 0x0097 #define HCI_ACCELEROMETER2 0x00a6 @@ -186,6 +187,7 @@ struct toshiba_acpi_dev { int usbsc_bat_level; int usbsc_mode_base; int hotkey_event_type; + int max_cooling_method; unsigned int illumination_supported:1; unsigned int video_supported:1; @@ -205,6 +207,7 @@ struct toshiba_acpi_dev { unsigned int panel_power_on_supported:1; unsigned int usb_three_supported:1; unsigned int wwan_supported:1; + unsigned int cooling_method_supported:1; unsigned int sysfs_created:1; unsigned int special_functions; @@ -1194,6 +1197,53 @@ static int toshiba_wwan_set(struct toshiba_acpi_dev *dev, u32 state) return out[0] == TOS_SUCCESS ? 0 : -EIO; } +/* Cooling Method */ +static void toshiba_cooling_method_available(struct toshiba_acpi_dev *dev) +{ + u32 in[TCI_WORDS] = { HCI_GET, HCI_COOLING_METHOD, 0, 0, 0, 0 }; + u32 out[TCI_WORDS]; + acpi_status status; + + dev->cooling_method_supported = 0; + dev->max_cooling_method = 0; + + status = tci_raw(dev, in, out); + if (ACPI_FAILURE(status)) + pr_err("ACPI call to get Cooling Method failed\n"); + + if (out[0] != TOS_SUCCESS && out[0] != TOS_SUCCESS2) + return; + + dev->cooling_method_supported = 1; + dev->max_cooling_method = out[3]; +} + +static int toshiba_cooling_method_get(struct toshiba_acpi_dev *dev, u32 *state) +{ + u32 result = hci_read(dev, HCI_COOLING_METHOD, state); + + if (result == TOS_FAILURE) + pr_err("ACPI call to get Cooling Method failed\n"); + + if (result == TOS_NOT_SUPPORTED) + return -ENODEV; + + return (result == TOS_SUCCESS || result == TOS_SUCCESS2) ? 0 : -EIO; +} + +static int toshiba_cooling_method_set(struct toshiba_acpi_dev *dev, u32 state) +{ + u32 result = hci_write(dev, HCI_COOLING_METHOD, state); + + if (result == TOS_FAILURE) + pr_err("ACPI call to get Cooling Method failed\n"); + + if (result == TOS_NOT_SUPPORTED) + return -ENODEV; + + return (result == TOS_SUCCESS || result == TOS_SUCCESS2) ? 0 : -EIO; +} + /* Transflective Backlight */ static int get_tr_backlight_status(struct toshiba_acpi_dev *dev, u32 *status) { @@ -2779,6 +2829,8 @@ static void print_supported_features(struct toshiba_acpi_dev *dev) pr_cont(" usb3"); if (dev->wwan_supported) pr_cont(" wwan"); + if (dev->cooling_method_supported) + pr_cont(" cooling-method"); pr_cont("\n"); } @@ -2963,6 +3015,8 @@ static int toshiba_acpi_add(struct acpi_device *acpi_dev) if (dev->wwan_supported) toshiba_acpi_setup_wwan_rfkill(dev); + toshiba_cooling_method_available(dev); + print_supported_features(dev); ret = sysfs_create_group(&dev->acpi_dev->dev.kobj,