From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-10.7 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6AE21C6369E for ; Wed, 2 Dec 2020 21:08:50 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id F193120709 for ; Wed, 2 Dec 2020 21:08:49 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org F193120709 Authentication-Results: mail.kernel.org; dmarc=fail (p=quarantine dis=none) header.from=protonmail.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:Reply-To:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To:Message-ID: Subject:From:To:Date:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=Siaifxc9YaoahNR1REH15lTHDs6JwDacJOwnPPuzDRQ=; b=fnLFPSJqCjGhM3EI1NTgIdGSME QBwmNkzlP9AsXxtH0B5RwKAiMp5EtG4Z1aNtM8a6iRK7ODmma85E/QsAf9HeVPBRD8uWpVxG4MOnt yQSWXEiH04YBNSCLVA9ds/7j4fhbXIoppd26wQWvqr4rVVNfGochU7eiD3+BlsyBbDF+OTctosBq0 yA893KiI4885iSx+AwrrALSpx+vb3Xr9o6uH/8YClGDOjOS+aIZUN4bs0sRdXT1EJlC1ycAPeyPbH ySowdDsPcGboTmULTZVNP+21uhVMkI/ldCJnmuDLfT7CCIdd4Xhcsu2JYeS9eukRN5JNuy/USTWT1 x7eEQ/bw==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1kkZLZ-0004gf-Md; Wed, 02 Dec 2020 21:07:33 +0000 Received: from mail1.protonmail.ch ([185.70.40.18]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1kkZLW-0004e7-BC for linux-arm-kernel@lists.infradead.org; Wed, 02 Dec 2020 21:07:31 +0000 Date: Wed, 02 Dec 2020 21:07:19 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=protonmail.com; s=protonmail; t=1606943247; bh=I5SKn72zxNLuAPxHXL8MBix5xnhTqEl1NdpeqJ8Fo7U=; h=Date:To:From:Cc:Reply-To:Subject:In-Reply-To:References:From; b=w52idPCvgPLyvLjhVxtahNHBhCZDZvpUNdmQWXjjzZQD5W5EUcKk/fFeiqshv2t/B NortxYpGn9NudNr86gAWiknF21gsKZKr6Iobu6f8f0PQmbl89OkLJX0EtEQC2P/OgR a83ZMQgYE7f5/h5JO1goAtYk8CBsSPtit0+KVdho= To: Sebastian Reichel From: Timon Baetz Subject: [PATCH 2/3] power: supply: max8997_charger: Set CHARGER current limit Message-ID: <20201202203516.43053-2-timon.baetz@protonmail.com> In-Reply-To: <20201202203516.43053-1-timon.baetz@protonmail.com> References: <20201202203516.43053-1-timon.baetz@protonmail.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20201202_160730_696449_DFF95440 X-CRM114-Status: GOOD ( 14.63 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: Timon Baetz Cc: devicetree@vger.kernel.org, linux-samsung-soc@vger.kernel.org, Kukjin Kim , linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org, Krzysztof Kozlowski , Timon Baetz , Chanwoo Choi , Rob Herring , MyungJoo Ham , linux-arm-kernel@lists.infradead.org, ~postmarketos/upstreaming@lists.sr.ht Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Register for extcon notification and set charging current depending on the detected cable type. Current values are taken from i9100 kernel fork. Enable and disable the CHARGER regulator based on extcon events and remove regulator-always-on from the device tree. Signed-off-by: Timon Baetz --- arch/arm/boot/dts/exynos4210-i9100.dts | 1 - drivers/power/supply/max8997_charger.c | 92 ++++++++++++++++++++++++++ 2 files changed, 92 insertions(+), 1 deletion(-) diff --git a/arch/arm/boot/dts/exynos4210-i9100.dts b/arch/arm/boot/dts/exynos4210-i9100.dts index 6d0c04d77a39..9f8d927e0d21 100644 --- a/arch/arm/boot/dts/exynos4210-i9100.dts +++ b/arch/arm/boot/dts/exynos4210-i9100.dts @@ -560,7 +560,6 @@ charger_reg: CHARGER { regulator-name = "CHARGER"; regulator-min-microamp = <60000>; regulator-max-microamp = <2580000>; - regulator-always-on; }; chargercv_reg: CHARGER_CV { diff --git a/drivers/power/supply/max8997_charger.c b/drivers/power/supply/max8997_charger.c index 1947af25879a..26cd271576ec 100644 --- a/drivers/power/supply/max8997_charger.c +++ b/drivers/power/supply/max8997_charger.c @@ -6,6 +6,7 @@ // MyungJoo Ham #include +#include #include #include #include @@ -31,6 +32,12 @@ struct charger_data { struct device *dev; struct max8997_dev *iodev; struct power_supply *battery; + struct regulator *reg; + struct { + struct extcon_dev *edev; + struct notifier_block nb; + struct work_struct work; + } extcon; }; static enum power_supply_property max8997_battery_props[] = { @@ -88,6 +95,63 @@ static int max8997_battery_get_property(struct power_supply *psy, return 0; } +static void max8997_battery_extcon_evt_stop_work(void *data) +{ + struct charger_data *charger = data; + + cancel_work_sync(&charger->extcon.work); +} + +static void max8997_battery_extcon_evt_worker(struct work_struct *work) +{ + struct charger_data *charger = + container_of(work, struct charger_data, extcon.work); + int ret, current_limit; + struct extcon_dev *edev = charger->extcon.edev; + + if (extcon_get_state(edev, EXTCON_CHG_USB_SDP) > 0) { + dev_dbg(charger->dev, "USB SDP charger is connected\n"); + current_limit = 450000; + } else if (extcon_get_state(edev, EXTCON_CHG_USB_DCP) > 0) { + dev_dbg(charger->dev, "USB DCP charger is connected\n"); + current_limit = 650000; + } else if (extcon_get_state(edev, EXTCON_CHG_USB_FAST) > 0) { + dev_dbg(charger->dev, "USB FAST charger is connected\n"); + current_limit = 650000; + } else if (extcon_get_state(edev, EXTCON_CHG_USB_SLOW) > 0) { + dev_dbg(charger->dev, "USB SLOW charger is connected\n"); + current_limit = 650000; + } else if (extcon_get_state(edev, EXTCON_CHG_USB_CDP) > 0) { + dev_dbg(charger->dev, "USB CDP charger is connected\n"); + current_limit = 650000; + } else { + dev_dbg(charger->dev, "USB charger is diconnected\n"); + current_limit = -1; + } + + if (current_limit > 0) { + ret = regulator_set_current_limit(charger->reg, current_limit, current_limit); + if (ret) + dev_err(charger->dev, "failed to set current limit: %d\n", ret); + ret = regulator_enable(charger->reg); + if (ret) + dev_err(charger->dev, "failed to enable regulator: %d\n", ret); + } else { + ret = regulator_disable(charger->reg); + if (ret) + dev_err(charger->dev, "failed to disable regulator: %d\n", ret); + } +} + +static int max8997_battery_extcon_evt(struct notifier_block *nb, + unsigned long event, void *param) +{ + struct charger_data *charger = + container_of(nb, struct charger_data, extcon.nb); + schedule_work(&charger->extcon.work); + return NOTIFY_OK; +} + static const struct power_supply_desc max8997_battery_desc = { .name = "max8997_pmic", .type = POWER_SUPPLY_TYPE_BATTERY, @@ -104,6 +168,7 @@ static int max8997_battery_probe(struct platform_device *pdev) struct i2c_client *i2c = iodev->i2c; struct max8997_platform_data *pdata = iodev->pdata; struct power_supply_config psy_cfg = {}; + struct extcon_dev *edev; if (!pdata) { dev_err(&pdev->dev, "No platform data supplied.\n"); @@ -151,6 +216,12 @@ static int max8997_battery_probe(struct platform_device *pdev) return ret; } + edev = extcon_get_extcon_dev("max8997-muic"); + if (edev == NULL) { + dev_info(&pdev->dev, "extcon is not ready, probe deferred\n"); + return -EPROBE_DEFER; + } + charger = devm_kzalloc(&pdev->dev, sizeof(*charger), GFP_KERNEL); if (!charger) return -ENOMEM; @@ -170,6 +241,27 @@ static int max8997_battery_probe(struct platform_device *pdev) return PTR_ERR(charger->battery); } + charger->reg = regulator_get(&pdev->dev, "CHARGER"); + if (IS_ERR(charger->reg)) { + dev_err(&pdev->dev, "couldn't get CHARGER regulator\n"); + return PTR_ERR(charger->reg); + } + + INIT_WORK(&charger->extcon.work, max8997_battery_extcon_evt_worker); + ret = devm_add_action(&pdev->dev, max8997_battery_extcon_evt_stop_work, charger); + if (ret) { + dev_err(&pdev->dev, "failed to add extcon evt stop action: %d\n", ret); + return ret; + } + charger->extcon.edev = edev; + charger->extcon.nb.notifier_call = max8997_battery_extcon_evt; + ret = devm_extcon_register_notifier_all(&pdev->dev, charger->extcon.edev, + &charger->extcon.nb); + if (ret) { + dev_err(&pdev->dev, "failed to register extcon notifier\n"); + return ret; + }; + return 0; } -- 2.25.1 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel