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=-19.0 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI, MENTIONS_GIT_HOSTING,SPF_HELO_NONE,SPF_PASS autolearn=unavailable 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 C0723C433DB for ; Thu, 24 Dec 2020 09:57:28 +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 6CBAE2251F for ; Thu, 24 Dec 2020 09:57:28 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 6CBAE2251F Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=kernel.org 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:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References:Message-ID: Subject:To:From:Date:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=9eb0wwDkTqxtOs1gLnOHT25vPMqzem0Ojly/glPvQmc=; b=qOrcRNdhXFPp3HdzuwvK4CZxh vM+jMecZ5XrfXCg7yCJg7HguhsWEY9aHnBYbEwTdtGn+6AYJu6gOT8vkJ3u/6aajiaklG1FvIHixn /dRDFkz1HUasCeWnnMzr0xBWP5ZrBDu3/3KwDA6h7Mh1jiJMgwRAqdZH2mVl0+VdB/HFn2NuuajTU trpnN+w+MIuJYbqINwwvyLmRCqWQV2kaSlEgVoC+TpHTKFiT/UupjkGRMopfxvzCZP6b6K9W5G9Vk GDzJODHlfeu8yyZS979M2UeO1hziHJ0cO2fc7Bg8PRl4I7gDVKvF0pBS7yhJgGo6TyZ4SiDdgdsti 6PTnjfjrA==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1ksNLq-0006XL-EI; Thu, 24 Dec 2020 09:56:06 +0000 Received: from mail-wm1-f44.google.com ([209.85.128.44]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1ksNLm-0006Ww-TF for linux-arm-kernel@lists.infradead.org; Thu, 24 Dec 2020 09:56:03 +0000 Received: by mail-wm1-f44.google.com with SMTP id r4so1204764wmh.5 for ; Thu, 24 Dec 2020 01:56:02 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to; bh=IQ47tmkeP0DrGeHawifdFzRAR5VdAIvwAYy3NMH+MDY=; b=YBL5TpobxkwNlNX5MbWDYGuwdJQ9DSXg6V3MW4S5Uc76lE/reAmaeo8w9KxMnOSeVJ Ma62xU/c6qjbPjOyCqk+Zo3JUNJn5TWhdMp3FxLTNOR0B4PHEEShkFG29Z7I3NOYs5SE VoFgMwOUoHudzeDB40A+kMQQhXW4h74h4Q6RhOKsbh4VJIcXoTG8tbxqlRVvhG+N66FX o1+WbtZzL2GZhZg9JEWORdGPoDIE0ENB+7ftvfsD42QzMSVsFfN/6MIy9YSDBirxg/dv Nq5uZW2br9Ln1UyHYVwTW7JeMzIA7fa6NdF9ScfsLqufRVRqhUVr6adu23dLnoQyPW3P RwRg== X-Gm-Message-State: AOAM533ohXyWKnsNnFVWnDX+jYfIne7VPsXWHSAy6jWbThwn2NpgzwXL 7i440AVcWG0Z6pE6iIrfF9U= X-Google-Smtp-Source: ABdhPJxmf6qw/SurLPa7171mcvsx/MR/mZ+Arr9m4C0y3Ps2Ov2COD95YRQIZEk7GrnB2r+2GuGxWg== X-Received: by 2002:a1c:a5d8:: with SMTP id o207mr3727438wme.30.1608803761556; Thu, 24 Dec 2020 01:56:01 -0800 (PST) Received: from kozik-lap (adsl-84-226-167-205.adslplus.ch. [84.226.167.205]) by smtp.googlemail.com with ESMTPSA id x18sm44965801wrg.55.2020.12.24.01.56.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 24 Dec 2020 01:56:00 -0800 (PST) Date: Thu, 24 Dec 2020 10:55:59 +0100 From: Krzysztof Kozlowski To: Timon Baetz Subject: Re: [PATCH v4 4/7] power: supply: max8997_charger: Set CHARGER current limit Message-ID: <20201224095559.GB10937@kozik-lap> References: <20201223134221.804943-1-timon.baetz@protonmail.com> <20201223134221.804943-4-timon.baetz@protonmail.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20201223134221.804943-4-timon.baetz@protonmail.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20201224_045602_983587_76206FBD X-CRM114-Status: GOOD ( 27.66 ) 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: , Cc: devicetree@vger.kernel.org, linux-samsung-soc@vger.kernel.org, linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org, Mark Brown , Liam Girdwood , Rob Herring , Sebastian Reichel , Chanwoo Choi , MyungJoo Ham , ~postmarketos/upstreaming@lists.sr.ht, Lee Jones , linux-arm-kernel@lists.infradead.org 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 On Wed, Dec 23, 2020 at 01:43:05PM +0000, Timon Baetz wrote: > Register for extcon notification and set charging current depending on > the detected cable type. Current values are taken from vendor kernel, > where most charger types end up setting 650mA [0]. > > Also enable and disable the CHARGER regulator based on extcon events. > > [0] https://github.com/krzk/linux-vendor-backup/blob/samsung/galaxy-s2-epic-4g-touch-sph-d710-exynos4210-dump/drivers/misc/max8997-muic.c#L1675-L1678 > > Signed-off-by: Timon Baetz > --- > drivers/power/supply/max8997_charger.c | 89 ++++++++++++++++++++++++++ > 1 file changed, 89 insertions(+) > > diff --git a/drivers/power/supply/max8997_charger.c b/drivers/power/supply/max8997_charger.c > index 1947af25879a..e8532e2af451 100644 > --- a/drivers/power/supply/max8997_charger.c > +++ b/drivers/power/supply/max8997_charger.c > @@ -6,12 +6,14 @@ > // MyungJoo Ham > > #include > +#include > #include > #include > #include > #include > #include > #include > +#include > > /* MAX8997_REG_STATUS4 */ > #define DCINOK_SHIFT 1 > @@ -31,6 +33,10 @@ struct charger_data { > struct device *dev; > struct max8997_dev *iodev; > struct power_supply *battery; > + struct regulator *reg; > + struct extcon_dev *edev; > + struct notifier_block extcon_nb; > + struct work_struct extcon_work; > }; > > static enum power_supply_property max8997_battery_props[] = { > @@ -88,6 +94,67 @@ 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); > + struct extcon_dev *edev = charger->edev; > + int current_limit; > + > + 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) { > + int 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); > + return; > + } > + ret = regulator_enable(charger->reg); > + if (ret) > + dev_err(charger->dev, "failed to enable regulator: %d\n", ret); > + } else { > + int 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, > @@ -170,6 +237,28 @@ static int max8997_battery_probe(struct platform_device *pdev) > return PTR_ERR(charger->battery); > } > > + charger->reg = devm_regulator_get(&pdev->dev, "charger"); Since you do not use get_optional, you will always get a dummy regulator. In case of error, you should either print it or entirely fail the probe. Silently continuing makes it difficult to spot errors. Since the driver could operate in case of extcon/regulator error, just dev_err() so failure will be spotted with dmesg. It will complain on older DTBs because you are introducing incompatible change, but that's expected. Just correct all other in-tree DTS. Best regards, Krzysztof > + charger->edev = extcon_get_edev_by_phandle(&pdev->dev, 0); > + if (PTR_ERR(charger->reg) == -EPROBE_DEFER || > + PTR_ERR(charger->edev) == -EPROBE_DEFER) > + return -EPROBE_DEFER; > + > + if (!IS_ERR(charger->reg) && !IS_ERR(charger->edev)) { > + 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_nb.notifier_call = max8997_battery_extcon_evt; > + ret = devm_extcon_register_notifier_all(&pdev->dev, charger->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