From patchwork Thu Aug 25 07:19:52 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wenyou Yang X-Patchwork-Id: 9298843 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 6DF49607F0 for ; Thu, 25 Aug 2016 07:29:39 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 61919291E1 for ; Thu, 25 Aug 2016 07:29:39 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 5671E291FD; Thu, 25 Aug 2016 07:29:39 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.2 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_MED autolearn=unavailable version=3.3.1 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id B94A0291E1 for ; Thu, 25 Aug 2016 07:29:38 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.85_2 #1 (Red Hat Linux)) id 1bcp4z-0000ib-Ij; Thu, 25 Aug 2016 07:28:01 +0000 Received: from merlin.infradead.org ([2001:4978:20e::2]) by bombadil.infradead.org with esmtps (Exim 4.85_2 #1 (Red Hat Linux)) id 1bcp0r-0005BI-NQ for linux-arm-kernel@bombadil.infradead.org; Thu, 25 Aug 2016 07:23:45 +0000 Received: from eusmtp01.atmel.com ([212.144.249.242]) by merlin.infradead.org with esmtps (Exim 4.85_2 #1 (Red Hat Linux)) id 1bcp0p-0003Yu-73 for linux-arm-kernel@lists.infradead.org; Thu, 25 Aug 2016 07:23:44 +0000 Received: from apsmtp01.atmel.com (10.168.254.31) by eusmtp01.atmel.com (10.145.145.30) with Microsoft SMTP Server id 14.3.235.1; Thu, 25 Aug 2016 09:23:13 +0200 Received: from shaarm01.corp.atmel.com (10.168.254.13) by apsmtp01.atmel.com (10.168.254.31) with Microsoft SMTP Server id 14.3.235.1; Thu, 25 Aug 2016 15:29:54 +0800 From: Wenyou Yang To: Sebastian Reichel , Dmitry Eremin-Solenikov , David Woodhouse , Rob Herring , Pawel Moll , Mark Brown , Ian Campbell , "Kumar Gala" , Lee Jones , Nicolas Ferre , Alexandre Belloni Subject: [PATCH v8 04/11] power: act8945a_charger: Improve Date: Thu, 25 Aug 2016 15:19:52 +0800 Message-ID: <1472109599-21915-5-git-send-email-wenyou.yang@atmel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1472109599-21915-1-git-send-email-wenyou.yang@atmel.com> References: <1472109599-21915-1-git-send-email-wenyou.yang@atmel.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20160825_032343_523948_0B49F866 X-CRM114-Status: GOOD ( 15.71 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: devicetree@vger.kernel.org, linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org, Wenyou Yang , Fengguang Wu , linux-arm-kernel@lists.infradead.org Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Virus-Scanned: ClamAV using ClamSMTP When get the property, first check the charger state machine, then check the status bit to decide what value is assigned to the corresponding property. Retain the SUSCHG bit of REG 0x71 when configure the timers to avoid losting the charger suspending info after boot. Signed-off-by: Wenyou Yang Signed-off-by: Fengguang Wu --- Changes in v8: None Changes in v7: - Add a prompt information if the charger suspended. Changes in v6: None Changes in v5: None Changes in v4: None Changes in v3: - Remove unneeded semicolon to fix semicolon.cocci warning. Changes in v2: - Add missing ret declaration. drivers/power/supply/act8945a_charger.c | 86 +++++++++++++++++++++++++++------ 1 file changed, 70 insertions(+), 16 deletions(-) diff --git a/drivers/power/supply/act8945a_charger.c b/drivers/power/supply/act8945a_charger.c index af00668..a6bbaff 100644 --- a/drivers/power/supply/act8945a_charger.c +++ b/drivers/power/supply/act8945a_charger.c @@ -94,16 +94,24 @@ static int act8945a_get_charger_state(struct regmap *regmap, int *val) state &= APCH_STATE_CSTATE; state >>= APCH_STATE_CSTATE_SHIFT; - if (state == APCH_STATE_CSTATE_EOC) { + switch (state) { + case APCH_STATE_CSTATE_PRE: + case APCH_STATE_CSTATE_FAST: + *val = POWER_SUPPLY_STATUS_CHARGING; + break; + case APCH_STATE_CSTATE_EOC: if (status & APCH_STATUS_CHGDAT) *val = POWER_SUPPLY_STATUS_FULL; else + *val = POWER_SUPPLY_STATUS_CHARGING; + break; + case APCH_STATE_CSTATE_DISABLED: + default: + if (!(status & APCH_STATUS_INDAT)) + *val = POWER_SUPPLY_STATUS_DISCHARGING; + else *val = POWER_SUPPLY_STATUS_NOT_CHARGING; - } else if ((state == APCH_STATE_CSTATE_FAST) || - (state == APCH_STATE_CSTATE_PRE)) { - *val = POWER_SUPPLY_STATUS_CHARGING; - } else { - *val = POWER_SUPPLY_STATUS_NOT_CHARGING; + break; } return 0; @@ -112,7 +120,11 @@ static int act8945a_get_charger_state(struct regmap *regmap, int *val) static int act8945a_get_charge_type(struct regmap *regmap, int *val) { int ret; - unsigned int state; + unsigned int status, state; + + ret = regmap_read(regmap, ACT8945A_APCH_STATUS, &status); + if (ret < 0) + return ret; ret = regmap_read(regmap, ACT8945A_APCH_STATE, &state); if (ret < 0) @@ -129,9 +141,15 @@ static int act8945a_get_charge_type(struct regmap *regmap, int *val) *val = POWER_SUPPLY_CHARGE_TYPE_FAST; break; case APCH_STATE_CSTATE_EOC: + *val = POWER_SUPPLY_CHARGE_TYPE_NONE; + break; case APCH_STATE_CSTATE_DISABLED: default: - *val = POWER_SUPPLY_CHARGE_TYPE_NONE; + if (!(status & APCH_STATUS_INDAT)) + *val = POWER_SUPPLY_CHARGE_TYPE_NONE; + else + *val = POWER_SUPPLY_CHARGE_TYPE_UNKNOWN; + break; } return 0; @@ -140,20 +158,45 @@ static int act8945a_get_charge_type(struct regmap *regmap, int *val) static int act8945a_get_battery_health(struct regmap *regmap, int *val) { int ret; - unsigned int status; + unsigned int status, state, config; ret = regmap_read(regmap, ACT8945A_APCH_STATUS, &status); if (ret < 0) return ret; - if (!(status & APCH_STATUS_TEMPDAT)) - *val = POWER_SUPPLY_HEALTH_OVERHEAT; - else if (!(status & APCH_STATUS_INDAT)) - *val = POWER_SUPPLY_HEALTH_OVERVOLTAGE; - else if (status & APCH_STATUS_TIMRDAT) - *val = POWER_SUPPLY_HEALTH_SAFETY_TIMER_EXPIRE; - else + ret = regmap_read(regmap, ACT8945A_APCH_CFG, &config); + if (ret < 0) + return ret; + + ret = regmap_read(regmap, ACT8945A_APCH_STATE, &state); + if (ret < 0) + return ret; + + state &= APCH_STATE_CSTATE; + state >>= APCH_STATE_CSTATE_SHIFT; + + switch (state) { + case APCH_STATE_CSTATE_DISABLED: + if (config & APCH_CFG_SUSCHG) { + *val = POWER_SUPPLY_HEALTH_UNKNOWN; + } else if (status & APCH_STATUS_INDAT) { + if (!(status & APCH_STATUS_TEMPDAT)) + *val = POWER_SUPPLY_HEALTH_OVERHEAT; + else if (status & APCH_STATUS_TIMRDAT) + *val = POWER_SUPPLY_HEALTH_SAFETY_TIMER_EXPIRE; + else + *val = POWER_SUPPLY_HEALTH_OVERVOLTAGE; + } else { + *val = POWER_SUPPLY_HEALTH_GOOD; + } + break; + case APCH_STATE_CSTATE_PRE: + case APCH_STATE_CSTATE_FAST: + case APCH_STATE_CSTATE_EOC: + default: *val = POWER_SUPPLY_HEALTH_GOOD; + break; + } return 0; } @@ -224,7 +267,9 @@ static int act8945a_charger_config(struct device *dev, u32 pre_time_out; u32 input_voltage_threshold; int chglev_pin; + int ret; + unsigned int tmp; unsigned int value = 0; if (!np) { @@ -232,6 +277,15 @@ static int act8945a_charger_config(struct device *dev, return -EINVAL; } + ret = regmap_read(regmap, ACT8945A_APCH_CFG, &tmp); + if (ret) + return ret; + + if (tmp & APCH_CFG_SUSCHG) { + value |= APCH_CFG_SUSCHG; + dev_info(dev, "have been suspended\n"); + } + chglev_pin = of_get_named_gpio_flags(np, "active-semi,chglev-gpios", 0, &flags);