Received: by 2002:ac0:aed5:0:0:0:0:0 with SMTP id t21csp693702imb; Fri, 1 Mar 2019 11:23:07 -0800 (PST) X-Google-Smtp-Source: APXvYqxlMyZsKapl+ds6zgoWcSzl7dQxDZEgRehpt87xu1qFMjUgpfnQH2Bci59N9uEaGyrHTg54 X-Received: by 2002:a62:f598:: with SMTP id b24mr7177976pfm.72.1551468187730; Fri, 01 Mar 2019 11:23:07 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1551468187; cv=none; d=google.com; s=arc-20160816; b=NxEC2wvosTQAslr6UtpATuN5b+fa1ieWV8UiLrPPN8tjY3KV8HKji1GIT8lz+gK32H K4eg/WdIo+4JnG3Z0XWGYT0zzL17T3cnaG08gQEbd3Yz9LSMD6bO284z5h84H5ML721D wDrYtEopaoyqT4WQA9na4uC2oqU/KpOytl+TIcEpEevO1fKWEteBnAiUf+B8w92is8LH WXLOASr5Jpqdg8Fwi0uRNSC9HA8wlpL91rcLRGMZ2oRAhQJtRpH7T586rwA2CpmakBrD jcNy5c9JbRpTm+CGpaqXwnvsGI70Jhj82X/zIizpalMFqWNQU7c18zUiDlsTBqVU/MYv Y/KA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from:dkim-signature; bh=S79167DBCzeBBU0K9mw+kQpp+sBB2POydyaY9xJwTiM=; b=Y7doYjYKs8opkaT+9QRa5CMixY/DCJqtpiec+Hn70TwEpe0xFx84ZXHjNRI7bASW7n zHKAfmWsPghwY5KasW8uU/OetQP3siouDozEr/cVqih0wnM39/beikmi+24nWGJflNCQ o4kdkAAtV3JU207pGj6ThFkzMNsD68XaCsLMnpLDW/p7HNvs6xO/49crsBxME68x8VqS p9g55Uhvr6wLNrfspi6Zo2ez0w8OWDz6v/gtJmP+A4ZuIwK5Su3MKbtZa29EyNN8f2HH v1SCoJdBK1BrVv9ycapf5BKLLqRsXDcVfyTjuoHqY+wz4GJwVNAttzm6nUVznUviDMAY NjEg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@chromium.org header.s=google header.b=WbDjzi5n; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=chromium.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 43si21505670plb.299.2019.03.01.11.22.52; Fri, 01 Mar 2019 11:23:07 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@chromium.org header.s=google header.b=WbDjzi5n; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=chromium.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726366AbfCATWE (ORCPT + 99 others); Fri, 1 Mar 2019 14:22:04 -0500 Received: from mail-pf1-f196.google.com ([209.85.210.196]:44329 "EHLO mail-pf1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725290AbfCATWE (ORCPT ); Fri, 1 Mar 2019 14:22:04 -0500 Received: by mail-pf1-f196.google.com with SMTP id a3so11840565pff.11 for ; Fri, 01 Mar 2019 11:22:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=S79167DBCzeBBU0K9mw+kQpp+sBB2POydyaY9xJwTiM=; b=WbDjzi5nBUOqoA4+ggK1JsEZhNZ7OmJFErNBXKmoUVlzmBq+G65DGhXXZ64398ylpH c3+KAPnGSmd92Vl01mfl1VJ5qJAYo0vGlZWOijpxVjAuG0OSbAbGrpc/II2ZZ2/YMbWH 52eheXbQzs8Q9q8pgcaRAe0gP/EayGgxITTao= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=S79167DBCzeBBU0K9mw+kQpp+sBB2POydyaY9xJwTiM=; b=e/8MqDg1D7lsPenEPXfhtL6Ar9WVpQQq8pTzcVvMXrGoVcQ0CY9/DcDvRuA7VqS00m pURY+fpFAPnE4Lv94fyQU4QvdzlV4o5s9BUg4eZdKXXPH7fHb98iVzYzbrul8PNtmQMY 80pzYot+a2NexnSs7J4qfyA/1bWHJwGvraI+5ChU+0vYbxYXhwIyIPb2IkzYUqaGKKW6 8s7RJUD8927AjbFiJFdkgCK8DcJjRlvUSAG1PY22Q6S3GG5dFNHfDH4iHCdN6vZby7md 6PzNXz3OGdq2nWBszTyw4lmw9OmJ1Z/6C1X4dlZ9CBmoWD7Pk9B6Ni/CkRoJZUqMuiaH ofAQ== X-Gm-Message-State: APjAAAUKy5zBU9QXCvG3/uEZ9vZFMENDnRr5NzTgbQodjBcTfAzA1AtV LDj94Qmbg82pKfze3TzxuCjSlfVGKNA= X-Received: by 2002:a63:6841:: with SMTP id d62mr6403790pgc.133.1551468123033; Fri, 01 Mar 2019 11:22:03 -0800 (PST) Received: from ravisadineni0.mtv.corp.google.com ([2620:15c:202:1:98d2:1663:78dd:3593]) by smtp.gmail.com with ESMTPSA id l64sm13136130pfj.179.2019.03.01.11.22.02 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 01 Mar 2019 11:22:02 -0800 (PST) From: RaviChandra Sadineni To: ravisadineni@chromium.org Cc: Benson Leung , Enric Balletbo i Serra , Guenter Roeck , linux-kernel@vger.kernel.org, tbroch@google.com, dnojiri@google.com Subject: [PATCH] cros_ec: Expose sysfile to force battery cut-off on shutdown. Date: Fri, 1 Mar 2019 11:21:56 -0800 Message-Id: <20190301192156.253010-1-ravisadineni@chromium.org> X-Mailer: git-send-email 2.20.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On chromebooks, power_manager daemon normally shutsdown(S5) the device when the battery charge falls below 4% threshold. ChromeOS EC then normally spends an hour in S5 before hibernating. If the battery charge falls below critical threshold in the mean time, EC does a battery cutoff instead of hibernating. On some chromebooks, S5 is optimal enough resulting in EC hibernating without battery cut-off. This results in battery deep-discharging. This is a bad user experience as battery has to trickle charge before booting when the A.C is plugged in the next time. This patch exposes a sysfs file for an userland daemon to suggest EC if it has to do a battery cut-off instead of hibernating when the system enters S5 next time. Signed-off-by: RaviChandra Sadineni --- drivers/platform/chrome/cros_ec_sysfs.c | 34 +++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/drivers/platform/chrome/cros_ec_sysfs.c b/drivers/platform/chrome/cros_ec_sysfs.c index f34a50121064..151c7c143941 100644 --- a/drivers/platform/chrome/cros_ec_sysfs.c +++ b/drivers/platform/chrome/cros_ec_sysfs.c @@ -322,14 +322,48 @@ static ssize_t kb_wake_angle_store(struct device *dev, return count; } +/* Battery cut-off control */ +static ssize_t cutoff_battery_at_shutdown_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct ec_params_battery_cutoff *param; + struct cros_ec_command *msg; + int ret; + struct cros_ec_dev *ec = container_of( + dev, struct cros_ec_dev, class_dev); + uint8_t cutoff_battery; + + if (kstrtou8(buf, 10, &cutoff_battery) || (cutoff_battery != 1)) + return -EINVAL; + + msg = kmalloc(sizeof(*msg) + EC_HOST_PARAM_SIZE, GFP_KERNEL); + if (!msg) + return -ENOMEM; + + param = (struct ec_params_battery_cutoff *)msg->data; + msg->command = EC_CMD_BATTERY_CUT_OFF + ec->cmd_offset; + msg->version = 1; + param->flags = EC_BATTERY_CUTOFF_FLAG_AT_SHUTDOWN; + msg->outsize = sizeof(*param); + msg->insize = 0; + ret = cros_ec_cmd_xfer_status(ec->ec_dev, msg); + kfree(msg); + if (ret < 0) + return ret; + return count; +} + /* Module initialization */ static DEVICE_ATTR_RW(reboot); static DEVICE_ATTR_RO(version); static DEVICE_ATTR_RO(flashinfo); static DEVICE_ATTR_RW(kb_wake_angle); +static DEVICE_ATTR_WO(cutoff_battery_at_shutdown); static struct attribute *__ec_attrs[] = { + &dev_attr_cutoff_battery_at_shutdown.attr, &dev_attr_kb_wake_angle.attr, &dev_attr_reboot.attr, &dev_attr_version.attr, -- 2.20.1