From patchwork Tue Jul 25 08:00:01 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "\(Exiting\) Baolin Wang" X-Patchwork-Id: 108629 Delivered-To: patch@linaro.org Received: by 10.140.101.44 with SMTP id t41csp275383qge; Tue, 25 Jul 2017 01:01:23 -0700 (PDT) X-Received: by 10.84.213.137 with SMTP id g9mr20288754pli.325.1500969683801; Tue, 25 Jul 2017 01:01:23 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1500969683; cv=none; d=google.com; s=arc-20160816; b=ANzhMWOsZDHgccco3ZKOP8g3s8ZKF4TkQf6i96VOu8d4WZ2GgcezU9b4rWN4fQMEBr hVxPpFIZOACXruWHdhQdclchKWz8K3yIU9+EvvQC5de4ib2p4BZvfciXLfTde8RYT3GZ etbCvdnvn2w8l4UFI9GKitkOrA+sphR+bDy6hLt+0Z1NBG1HTldaAL5iPS89nJM0khDG ikjIP027N48qK4iPcoe6FMGfcko1HptegfR+4KuctQJ0/Jk/znCLpuvbQmmKGJRVPNpM h5hPzhoszp1GLYDCrBqnzLrzgS6r3d4V/uiUsocU/FA9vs5lEmnq4cUhB4j5+N3CKoEO 7GnA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:references :in-reply-to:message-id:date:subject:cc:to:from:dkim-signature :arc-authentication-results; bh=Sw87FkuL27wdbLmso3Soqs7eMshnvvznDawsOVd1vfI=; b=pjHX109PCMVU8xfQRz8H558YAgL+vyz66ueBFQLLA51F2zE85lADJGJfvWNu531Npi c6NdLyWqLeVpu8/t6/sinZzIOC0DSKihIRUWFtrx3bKkQwc7evkubWb2Hpz8nY8ap54w No+PDa3UGtJMkUhGHFzGkfvdbop30Nml14XstKF/yiVA9YxxNPLNrtsV3kfrLYHOLXII dBXueYcBTZj9etGsNo1S7Vp6VTCm/JT5mkdLrz8OCFboKR75ilmFtydTs41W4NZWgsW3 nbMC6F53ln0i1NrUQe84BrSJTuTMETj/K17FmWBbNxP55XJZlxw1dffUj6sFS1n/uo3Q PW9A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.b=eyTFQDCg; 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=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id s11si7978424pgo.561.2017.07.25.01.01.23; Tue, 25 Jul 2017 01:01:23 -0700 (PDT) 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=@linaro.org header.b=eyTFQDCg; 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=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751599AbdGYIBV (ORCPT + 26 others); Tue, 25 Jul 2017 04:01:21 -0400 Received: from mail-pg0-f49.google.com ([74.125.83.49]:38590 "EHLO mail-pg0-f49.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751527AbdGYIBA (ORCPT ); Tue, 25 Jul 2017 04:01:00 -0400 Received: by mail-pg0-f49.google.com with SMTP id k190so1736544pgk.5 for ; Tue, 25 Jul 2017 01:01:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :in-reply-to:references; bh=Sw87FkuL27wdbLmso3Soqs7eMshnvvznDawsOVd1vfI=; b=eyTFQDCgzL4ddozAb1v4XOe3uU1GBb7bfK8uH26zxdbjxHjCa2bEK/EHmoOK9SRJ3q E/y/CltZFaA5Hz96dJoiXqwE6hnZoU4Z28H5DDmu8NHw2ZYk7ksR6I2Bi+tNjH7uqzIG nY6jbzatY0nU2ewuC4qYMoLpHGZnrlZVzdyOQ= 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:in-reply-to :references:in-reply-to:references; bh=Sw87FkuL27wdbLmso3Soqs7eMshnvvznDawsOVd1vfI=; b=NLONprAvMiyjHvwu6JzqAGaQtyFa6n2tABcB+DO2VMzqW/uEFJzSNWyRzcfhWcaS7G jpLuf9pVgHIaeCMO7vpvA9Hnl2GGDCCrGMDHcZ3IVBkfHClf+DgjArzANflSjdgL8mlP 2dySBMeqDeJfT9O8t30A67JDoDX+4FTPHrAjLSVK2Ea2B5Lif99F3OvPMSPkyOBht0RT 5PHXNTjO0is+O8mlf5BDXLvDD1hjd+CaaMCkIKjDkgpsQbdFSQ6rYlsdzdpbxnRaiOED FQwxEtS770onUQ6hCabqTBgA6j2oaR4UcvHYqLNUiksnC8Dm3jeZcFWJCtfHbI3B1YKr Jr1A== X-Gm-Message-State: AIVw110Rx51obPA1YNv9mFi+T+ZdQhKZw6cNHRrOg5/CGrfrBXsY/AGe ur0ffK2GEfxaNm2l X-Received: by 10.99.114.25 with SMTP id n25mr18549289pgc.290.1500969660124; Tue, 25 Jul 2017 01:01:00 -0700 (PDT) Received: from baolinwangubtpc.spreadtrum.com ([117.18.48.82]) by smtp.gmail.com with ESMTPSA id w66sm25242538pfi.63.2017.07.25.01.00.54 (version=TLS1 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 25 Jul 2017 01:00:59 -0700 (PDT) From: Baolin Wang To: balbi@kernel.org, gregkh@linuxfoundation.org, sre@kernel.org, lee.jones@linaro.org, robh+dt@kernel.org, mark.rutland@arm.com Cc: jun.li@nxp.com, peter.chen@freescale.com, broonie@kernel.org, john.stultz@linaro.org, neilb@suse.com, patches@opensource.wolfsonmicro.com, baolin.wang@linaro.org, linux-pm@vger.kernel.org, linux-usb@vger.kernel.org, device-mainlining@lists.linuxfoundation.org, linux-kernel@vger.kernel.org, devicetree@vger.kernel.org Subject: [PATCH v3 3/3] power: wm831x_power: Support USB charger current limit management Date: Tue, 25 Jul 2017 16:00:01 +0800 Message-Id: X-Mailer: git-send-email 1.7.9.5 In-Reply-To: References: In-Reply-To: References: Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Integrate with the newly added USB charger interface to limit the current we draw from the USB input based on the input device configuration identified by the USB stack, allowing us to charge more quickly from high current inputs without drawing more current than specified from others. Signed-off-by: Mark Brown Signed-off-by: Baolin Wang --- Documentation/devicetree/bindings/mfd/wm831x.txt | 1 + drivers/power/supply/wm831x_power.c | 58 ++++++++++++++++++++++ 2 files changed, 59 insertions(+) -- 1.7.9.5 diff --git a/Documentation/devicetree/bindings/mfd/wm831x.txt b/Documentation/devicetree/bindings/mfd/wm831x.txt index 9f8b743..4e3bc07 100644 --- a/Documentation/devicetree/bindings/mfd/wm831x.txt +++ b/Documentation/devicetree/bindings/mfd/wm831x.txt @@ -31,6 +31,7 @@ Required properties: ../interrupt-controller/interrupts.txt Optional sub-nodes: + - usb-phy : Contains a phandle to the USB PHY. - regulators : Contains sub-nodes for each of the regulators supplied by the device. The regulators are bound using their names listed below: diff --git a/drivers/power/supply/wm831x_power.c b/drivers/power/supply/wm831x_power.c index 7082301..d3948ab 100644 --- a/drivers/power/supply/wm831x_power.c +++ b/drivers/power/supply/wm831x_power.c @@ -13,6 +13,7 @@ #include #include #include +#include #include #include @@ -31,6 +32,8 @@ struct wm831x_power { char usb_name[20]; char battery_name[20]; bool have_battery; + struct usb_phy *usb_phy; + struct notifier_block usb_notify; }; static int wm831x_power_check_online(struct wm831x *wm831x, int supply, @@ -125,6 +128,43 @@ static int wm831x_usb_get_prop(struct power_supply *psy, POWER_SUPPLY_PROP_VOLTAGE_NOW, }; +/* In milliamps */ +static const unsigned int wm831x_usb_limits[] = { + 0, + 2, + 100, + 500, + 900, + 1500, + 1800, + 550, +}; + +static int wm831x_usb_limit_change(struct notifier_block *nb, + unsigned long limit, void *data) +{ + struct wm831x_power *wm831x_power = container_of(nb, + struct wm831x_power, + usb_notify); + unsigned int i, best; + + /* Find the highest supported limit */ + best = 0; + for (i = 0; i < ARRAY_SIZE(wm831x_usb_limits); i++) { + if (limit >= wm831x_usb_limits[i] && + wm831x_usb_limits[best] < wm831x_usb_limits[i]) + best = i; + } + + dev_dbg(wm831x_power->wm831x->dev, + "Limiting USB current to %umA", wm831x_usb_limits[best]); + + wm831x_set_bits(wm831x_power->wm831x, WM831X_POWER_STATE, + WM831X_USB_ILIM_MASK, best); + + return 0; +} + /********************************************************************* * Battery properties *********************************************************************/ @@ -607,6 +647,19 @@ static int wm831x_power_probe(struct platform_device *pdev) } } + power->usb_phy = devm_usb_get_phy_by_phandle(&pdev->dev, + "usb-phy", 0); + if (!IS_ERR(power->usb_phy)) { + power->usb_notify.notifier_call = wm831x_usb_limit_change; + ret = usb_register_notifier(power->usb_phy, + &power->usb_notify); + if (ret) { + dev_err(&pdev->dev, "Failed to register notifier: %d\n", + ret); + goto err_bat_irq; + } + } + return ret; err_bat_irq: @@ -637,6 +690,11 @@ static int wm831x_power_remove(struct platform_device *pdev) struct wm831x *wm831x = wm831x_power->wm831x; int irq, i; + if (!IS_ERR(wm831x_power->usb_phy)) { + usb_unregister_notifier(wm831x_power->usb_phy, + &wm831x_power->usb_notify); + } + for (i = 0; i < ARRAY_SIZE(wm831x_bat_irqs); i++) { irq = wm831x_irq(wm831x, platform_get_irq_byname(pdev,