Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1469904

[PATCH v8 04/11] power: act8945a_charger: Improve

From Wenyou Yang <wenyou.yang@atmel.com>
Newsgroups linux.kernel
Subject [PATCH v8 04/11] power: act8945a_charger: Improve
Date 2016-08-25 09:30 +0200
Message-ID <s9XgS-6iK-39@gated-at.bofh.it> (permalink)
References <s9XgR-6iK-5@gated-at.bofh.it>
Organization linux.* mail to news gateway

Show all headers | View raw


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 <wenyou.yang@atmel.com>
Signed-off-by: Fengguang Wu <fengguang.wu@intel.com>
---

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);
 
-- 
2.7.4

Back to linux.kernel | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread


Thread

[PATCH v8 00/11] power: act8945a_charger: Improvements Wenyou Yang <wenyou.yang@atmel.com> - 2016-08-25 09:30 +0200
  [PATCH v8 03/11] power: act8945a_charger: Remove "battery_temperature" Wenyou Yang <wenyou.yang@atmel.com> - 2016-08-25 09:30 +0200
    Re: [PATCH v8 03/11] power: act8945a_charger: Remove  "battery_temperature" Sebastian Reichel <sre@kernel.org> - 2016-08-31 16:50 +0200
  [PATCH v8 02/11] power: act8945a_charger: Achieve properties from its node Wenyou Yang <wenyou.yang@atmel.com> - 2016-08-25 09:30 +0200
    Re: [PATCH v8 02/11] power: act8945a_charger: Achieve properties  from its node Sebastian Reichel <sre@kernel.org> - 2016-08-31 16:50 +0200
  [PATCH v8 05/11] power: act8945a_charger: Add status change update support Wenyou Yang <wenyou.yang@atmel.com> - 2016-08-25 09:30 +0200
    Re: [PATCH v8 05/11] power: act8945a_charger: Add status change  update support Sebastian Reichel <sre@kernel.org> - 2016-08-31 16:50 +0200
  [PATCH v8 04/11] power: act8945a_charger: Improve Wenyou Yang <wenyou.yang@atmel.com> - 2016-08-25 09:30 +0200
    Re: [PATCH v8 04/11] power: act8945a_charger: Improve Sebastian Reichel <sre@kernel.org> - 2016-08-31 16:50 +0200
  [PATCH v8 06/11] power: act8945a_charger: Fix the power supply type Wenyou Yang <wenyou.yang@atmel.com> - 2016-08-25 09:30 +0200
    Re: [PATCH v8 06/11] power: act8945a_charger: Fix the power supply  type Sebastian Reichel <sre@kernel.org> - 2016-08-31 16:50 +0200
  [PATCH v8 08/11] power: act8945a_charger: Add max current property Wenyou Yang <wenyou.yang@atmel.com> - 2016-08-25 09:30 +0200
    Re: [PATCH v8 08/11] power: act8945a_charger: Add max current  property Sebastian Reichel <sre@kernel.org> - 2016-08-31 17:00 +0200
  [PATCH v8 07/11] power: act8945a_charger: Add capacity level property Wenyou Yang <wenyou.yang@atmel.com> - 2016-08-25 09:30 +0200
    Re: [PATCH v8 07/11] power: act8945a_charger: Add capacity level  property Sebastian Reichel <sre@kernel.org> - 2016-08-31 17:00 +0200
  [PATCH v8 09/11] doc: bindings: mfd: act8945a: Update the example Wenyou Yang <wenyou.yang@atmel.com> - 2016-08-25 09:50 +0200
    Re: [PATCH v8 09/11] doc: bindings: mfd: act8945a: Update the example Rob Herring <robh@kernel.org> - 2016-08-30 22:00 +0200
    Re: [PATCH v8 09/11] doc: bindings: mfd: act8945a: Update the example Sebastian Reichel <sre@kernel.org> - 2016-08-31 17:00 +0200
  [PATCH v8 10/11] doc: bindings: power: act8945a-charger: Update properties. Wenyou Yang <wenyou.yang@atmel.com> - 2016-08-25 09:50 +0200
    Re: [PATCH v8 10/11] doc: bindings: power: act8945a-charger: Update  properties. Sebastian Reichel <sre@kernel.org> - 2016-08-31 16:50 +0200
  [PATCH v8 11/11] ARM: at91/dt: sama5d2_xplained: Add act8945a-charger node. Wenyou Yang <wenyou.yang@atmel.com> - 2016-08-25 09:50 +0200
  Re: [PATCH v8 00/11] power: act8945a_charger: Improvements Mark Brown <broonie@kernel.org> - 2016-08-25 11:50 +0200

csiph-web