Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751055AbcCXEB7 (ORCPT ); Thu, 24 Mar 2016 00:01:59 -0400 Received: from mail-vk0-f50.google.com ([209.85.213.50]:36743 "EHLO mail-vk0-f50.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750755AbcCXEB5 (ORCPT ); Thu, 24 Mar 2016 00:01:57 -0400 MIME-Version: 1.0 In-Reply-To: <1458726794-48298-1-git-send-email-yh.huang@mediatek.com> References: <1458726794-48298-1-git-send-email-yh.huang@mediatek.com> From: Daniel Kurtz Date: Thu, 24 Mar 2016 12:01:36 +0800 X-Google-Sender-Auth: q_R8H88NC7OiFhmPNGaSONERdtI Message-ID: Subject: Re: [PATCH] sbs-battery: fix power status when battery is dry To: YH Huang Cc: Sebastian Reichel , Dmitry Eremin-Solenikov , David Woodhouse , Matthias Brugger , linux-pm@vger.kernel.org, "linux-kernel@vger.kernel.org" , "linux-arm-kernel@lists.infradead.org" , "moderated list:ARM/Mediatek SoC support" Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2678 Lines: 66 Hi YH, On Wed, Mar 23, 2016 at 5:53 PM, YH Huang wrote: > When the battery is dry and BATTERY_FULL_DISCHARGED is set, > we should check BATTERY_DISCHARGING to decide the power status. > If BATTERY_DISCHARGING is set, the power status is not charging. > Or the power status should be charging. > > Signed-off-by: YH Huang > --- > drivers/power/sbs-battery.c | 22 ++++++++++++---------- > 1 file changed, 12 insertions(+), 10 deletions(-) > > diff --git a/drivers/power/sbs-battery.c b/drivers/power/sbs-battery.c > index d6226d6..d86db0e 100644 > --- a/drivers/power/sbs-battery.c > +++ b/drivers/power/sbs-battery.c > @@ -382,11 +382,12 @@ static int sbs_get_battery_property(struct i2c_client *client, > > if (ret & BATTERY_FULL_CHARGED) > val->intval = POWER_SUPPLY_STATUS_FULL; > - else if (ret & BATTERY_FULL_DISCHARGED) > - val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING; > - else if (ret & BATTERY_DISCHARGING) > - val->intval = POWER_SUPPLY_STATUS_DISCHARGING; > - else > + else if (ret & BATTERY_DISCHARGING) { > + if (ret & BATTERY_FULL_DISCHARGED) > + val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING; > + else > + val->intval = POWER_SUPPLY_STATUS_DISCHARGING; > + } else I think (BATTERY_DISCHARGING && BATTERY_FULL_DISCHARGED) is still POWER_SUPPLY_STATUS_DISCHARGING. So, let's just report what the battery says and do: else if (ret & BATTERY_DISCHARGING) val->intval = POWER_SUPPLY_STATUS_DISCHARGING; > val->intval = POWER_SUPPLY_STATUS_CHARGING; > > if (chip->poll_time == 0) > @@ -702,11 +703,12 @@ static void sbs_delayed_work(struct work_struct *work) > > if (ret & BATTERY_FULL_CHARGED) > ret = POWER_SUPPLY_STATUS_FULL; > - else if (ret & BATTERY_FULL_DISCHARGED) > - ret = POWER_SUPPLY_STATUS_NOT_CHARGING; > - else if (ret & BATTERY_DISCHARGING) > - ret = POWER_SUPPLY_STATUS_DISCHARGING; > - else > + else if (ret & BATTERY_DISCHARGING) { > + if (ret & BATTERY_FULL_DISCHARGED) > + ret = POWER_SUPPLY_STATUS_NOT_CHARGING; > + else > + ret = POWER_SUPPLY_STATUS_DISCHARGING; > + } else > ret = POWER_SUPPLY_STATUS_CHARGING; > > if (chip->last_state != ret) { > -- > 1.7.9.5 >