Received: by 2002:a6b:500f:0:0:0:0:0 with SMTP id e15csp845693iob; Thu, 12 May 2022 06:02:21 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwaFOd7qEsJGKBlDTjXOoAckl4qB0fU6lT2SqHpqWU1MATDBnx+uSSOaBIpNJRdKY7ZCL4b X-Received: by 2002:a05:6402:42c3:b0:427:d0e6:77e4 with SMTP id i3-20020a05640242c300b00427d0e677e4mr34341533edc.49.1652360540850; Thu, 12 May 2022 06:02:20 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1652360540; cv=none; d=google.com; s=arc-20160816; b=B8FMiobR60GtjFWOaPxlwb5Fjpmg5NPP1NhFSGDv5ksJ4nQkMULLy23kltV8AmHEuI SuIgf2C5PYYMy7uv5R3xQP0CRRJJzH7IdezFtXu8MYDpwlnHhNd9Zm4YFicu1RTi7T0u TAScFct9ysnpd2N4i/e/qM94RDZvXopm60y0L19vHEtHyi2wjAbqrR/Vn50mpLQg8IDK Y0h86qh3E4nZNHLYZwmEdKr1V9waf58UXA69BEm/lMoAxiPciwYBIYRR88iRcqNfCz10 hlttJDXijVVKAUT/JlAa0nog4LmOytsNuzyXD0/S58855GgQ2zrBvE9w4vG5EzmOpXvC arXQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:cc:to:subject :message-id:date:from:in-reply-to:references:mime-version :dkim-signature; bh=vDxPRNJ47MRH72+7zGqfBM9QHNeqbDBoxMkpFljWCrs=; b=e9Hr7azFJmMiy5suX/RysGH1axtiQePk09UfQYva8v0On+lcl/41hSsjRifUEXCqLz Lq4zogSTU512JY6nn8A7F3WUrKiMHNEWfnw2COrsvdA1NydzP9+EPYQrXagaHS4Qsz2c /fDe+z4G3KgfQGe+mG6Vu9jdJrc9f3/4gsET+D14Bx+XsdcQPHzDSd4XPaOjOufcOj91 1Cb79+qiJzL/im7Ma1+k7FA1JQvv45lRO4mMN+0fWQwHpr7uHdITz/nXOXWKLvhIclpp EE0LfAh6seZYJfoOVGNoy4eO+HHVPDAsVzlVVTLkKOHkktIYq60hxVG+EiuDv/d+WTwd 9S5g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20210112 header.b=T8BHKRSY; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id hd33-20020a17090796a100b006f38a65b1c2si6384840ejc.848.2022.05.12.06.01.51; Thu, 12 May 2022 06:02:20 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20210112 header.b=T8BHKRSY; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1343976AbiELDXE (ORCPT + 99 others); Wed, 11 May 2022 23:23:04 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45708 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S238977AbiELDXC (ORCPT ); Wed, 11 May 2022 23:23:02 -0400 Received: from mail-lf1-x143.google.com (mail-lf1-x143.google.com [IPv6:2a00:1450:4864:20::143]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7424157140; Wed, 11 May 2022 20:22:57 -0700 (PDT) Received: by mail-lf1-x143.google.com with SMTP id bq30so6795718lfb.3; Wed, 11 May 2022 20:22:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=vDxPRNJ47MRH72+7zGqfBM9QHNeqbDBoxMkpFljWCrs=; b=T8BHKRSYIB6UI/eYY/8Qxf12CdDAjFFoO8zYHLFKzc+mSy4NMfGJC2b6J/LIC8W2XE Kq69Fs+Cbc6nyCDuK2215tVt5ob16Y/qVaSrJsdxFLOl/XtZ+6XIuaxBSc28MI3nHfeU GdEwjfhfho8k5KT6vPbP5HsMrobEIhdRQdl75m1Nqxix5LiZb1OXkMxENaQQu5RG5KUo w/8p42yvZ9WUOnz1OQi7VzVVVqkMz1lk5IKQ2f7m1bYcNUA4ahu00u7xGFeiT7aXdaXP kzWEJ9eWr9On/8CdafqLWKZaqF88acFUsUMMKQWsrm6Mb+/JnlhDaIrvSlST98qp1TMM K5cQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=vDxPRNJ47MRH72+7zGqfBM9QHNeqbDBoxMkpFljWCrs=; b=BM3Zl0WMwQxBIkzxlWW2DyXFaiGj1ga7k9GhQ6GgUTUHtl8AryB7hQZw+lSvnyjWhZ EN5OIN8OAicr6TTA32LcR+pIuCEdNYj3F2C3QYkT8x2l8PAGLwyreBlrrA2ZNb5I7tum xNmeCQF3vEP/xINIz6Q5tED/LoVpsI2Df/B5RIGblpFcw8eZULRqILmxaUKoRJd/oL9g 8wwdauNEXrtX01ZiAVFdjrwRjl7fPEbOvtgqy5sFDcvposWf5QFcasmEyvHpLdSUZFfW ReM13kpwm1vFZPM4bbYYydC8RA8vMrWssvStVCVK8eTb6j/0Uxy6KmDG1E7ODeh6qWpL fiIg== X-Gm-Message-State: AOAM533mjszhKA5Gr7SK9eU+6NdOxHoxyoS/2jWQMDIfAR8ZhZBbIVyc XrSipIl5rMJN+5jxAFtOig8kwice0beXyIPWsRY= X-Received: by 2002:a05:6512:16a2:b0:448:1fbb:8ca1 with SMTP id bu34-20020a05651216a200b004481fbb8ca1mr22116326lfb.125.1652325775668; Wed, 11 May 2022 20:22:55 -0700 (PDT) MIME-Version: 1.0 References: <20220428125610.66647-1-gengcixi@gmail.com> In-Reply-To: From: =?UTF-8?B?6ZmI5rC45b+X?= Date: Thu, 12 May 2022 11:22:44 +0800 Message-ID: Subject: Re: [PATCH v2] power: supply: Add enable the primary charger interface To: Baolin Wang Cc: Cixi Geng , Sebastian Reichel , Orson Zhai , Chunyan Zhang , Linux PM , LKML Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Baolin Wang =E4=BA=8E2022=E5=B9=B45=E6=9C=883=E6= =97=A5=E5=91=A8=E4=BA=8C 12:53=E5=86=99=E9=81=93=EF=BC=9A > > On Thu, Apr 28, 2022 at 8:56 PM Cixi Geng wrote: > > > > From: Chen Yongzhi > > > > In the case of charging multiple charging ICs,the primary > > charging IC often needs to be turned off in the fast > > charging stage, and only using the charger pump to charge, > > need to add a new power_supply_property attribute. > > I'm still confused why introducing a new > POWER_SUPPLY_PROP_CHARGE_ENABLED property to control the charging, but > you already controlled the charging by POWER_SUPPLY_PROP_STATUS? > Our purpose is to achieve two different stop charging states: POWER_SUPPLY_PROP_STATUS: The software status stops charging, and the hardware also stops charging=EF=BC=9B POWER_SUPPLY_PROP_CHARGE_ENABLED: The hardware is stopped charging, the software is still charging=EF=BC=9B Our don't want to change the charge_status switch due to the switching of charging and discharging of the charging IC in the charging scenario of multiple charging ICs, and let the upper layer perceive this switching > > > > Signed-off-by: Chen Yongzhi > > Reported-by: kernel test robot > > Link: https://lore.kernel.org/all/202204230206.9TgyhSb1-lkp@intel.com > > Signed-off-by: Cixi Geng > > --- > > drivers/power/supply/sc2731_charger.c | 52 +++++++++++++++++++++++++-- > > include/linux/power_supply.h | 1 + > > 2 files changed, 50 insertions(+), 3 deletions(-) > > > > diff --git a/drivers/power/supply/sc2731_charger.c b/drivers/power/supp= ly/sc2731_charger.c > > index 9ac17cf7a126..c15f9b75e6a8 100644 > > --- a/drivers/power/supply/sc2731_charger.c > > +++ b/drivers/power/supply/sc2731_charger.c > > @@ -1,5 +1,5 @@ > > // SPDX-License-Identifier: GPL-2.0 > > -// Copyright (C) 2018 Spreadtrum Communications Inc. > > +// Copyright (C) 2022 Spreadtrum Communications Inc. > > Do not add unrelated changes. > ok, do not change > > > > #include > > #include > > @@ -146,6 +146,24 @@ static int sc2731_charger_get_status(struct sc2731= _charger_info *info) > > return POWER_SUPPLY_STATUS_CHARGING; > > } > > > > +static int sc2731_charger_set_status(struct sc2731_charger_info *info,= int val) > > +{ > > + int ret =3D 0; > > + > > + if (!val && info->charging) { > > + sc2731_charger_stop_charge(info); > > + info->charging =3D false; > > + } else if (val && !info->charging) { > > + ret =3D sc2731_charger_start_charge(info); > > + if (ret) > > + dev_err(info->dev, "start charge failed\n"); > > Duplicate error information, since you already print errors in fix it > sc2731_charger_usb_set_property() > > > + else > > + info->charging =3D true; > > + } > > + > > + return ret; > > +} > > + > > static int sc2731_charger_get_current(struct sc2731_charger_info *info= , > > u32 *cur) > > { > > @@ -204,7 +222,7 @@ sc2731_charger_usb_set_property(struct power_supply= *psy, > > const union power_supply_propval *val) > > { > > struct sc2731_charger_info *info =3D power_supply_get_drvdata(p= sy); > > - int ret; > > + int ret =3D 0; > > > > mutex_lock(&info->lock); > > > > @@ -214,6 +232,12 @@ sc2731_charger_usb_set_property(struct power_suppl= y *psy, > > } > > > > switch (psp) { > > + case POWER_SUPPLY_PROP_STATUS: > > + ret =3D sc2731_charger_set_status(info, val->intval); > > + if (ret < 0) > > + dev_err(info->dev, "set charge status failed\n"= ); > > + break; > > + > > case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT: > > ret =3D sc2731_charger_set_current(info, val->intval / = 1000); > > if (ret < 0) > > @@ -227,6 +251,15 @@ sc2731_charger_usb_set_property(struct power_suppl= y *psy, > > dev_err(info->dev, "set input current limit fai= led\n"); > > break; > > > > + case POWER_SUPPLY_PROP_CHARGE_ENABLED: > > + if (val->intval =3D=3D true) { > > + ret =3D sc2731_charger_start_charge(info); > > + if (ret) > > + dev_err(info->dev, "start charge failed= \n"); > > + } else if (val->intval =3D=3D false) { > > + sc2731_charger_stop_charge(info); > > + } > > + break; > > default: > > ret =3D -EINVAL; > > } > > @@ -241,7 +274,7 @@ static int sc2731_charger_usb_get_property(struct p= ower_supply *psy, > > { > > struct sc2731_charger_info *info =3D power_supply_get_drvdata(p= sy); > > int ret =3D 0; > > - u32 cur; > > + u32 cur, enabled; > > > > mutex_lock(&info->lock); > > > > @@ -277,6 +310,16 @@ static int sc2731_charger_usb_get_property(struct = power_supply *psy, > > } > > break; > > > > + case POWER_SUPPLY_PROP_CHARGE_ENABLED: > > + ret =3D regmap_read(info->regmap, info->base + SC2731_C= HG_CFG0, &enabled); > > + if (ret) { > > + dev_err(info->dev, "get sc2731 charge enabled f= ailed\n"); > > + goto out; > > + } > > + > > + val->intval =3D enabled & SC2731_CHARGER_PD; > > + > > + break; > > default: > > ret =3D -EINVAL; > > } > > @@ -292,8 +335,10 @@ static int sc2731_charger_property_is_writeable(st= ruct power_supply *psy, > > int ret; > > > > switch (psp) { > > + case POWER_SUPPLY_PROP_STATUS: > > case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT: > > case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT: > > + case POWER_SUPPLY_PROP_CHARGE_ENABLED: > > ret =3D 1; > > break; > > > > @@ -308,6 +353,7 @@ static enum power_supply_property sc2731_usb_props[= ] =3D { > > POWER_SUPPLY_PROP_STATUS, > > POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT, > > POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT, > > + POWER_SUPPLY_PROP_CHARGE_ENABLED, > > }; > > > > static const struct power_supply_desc sc2731_charger_desc =3D { > > diff --git a/include/linux/power_supply.h b/include/linux/power_supply.= h > > index cb380c1d9459..1dfe194d8a5e 100644 > > --- a/include/linux/power_supply.h > > +++ b/include/linux/power_supply.h > > @@ -167,6 +167,7 @@ enum power_supply_property { > > POWER_SUPPLY_PROP_PRECHARGE_CURRENT, > > POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT, > > POWER_SUPPLY_PROP_CALIBRATE, > > + POWER_SUPPLY_PROP_CHARGE_ENABLED, > > POWER_SUPPLY_PROP_MANUFACTURE_YEAR, > > POWER_SUPPLY_PROP_MANUFACTURE_MONTH, > > POWER_SUPPLY_PROP_MANUFACTURE_DAY, > > -- > > 2.25.1 > > > > > -- > Baolin Wang