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


Groups > linux.kernel > #1463575 > unrolled thread

[PATCH v5 0/7] power: act8945a_charger: Improvements

Started byWenyou Yang <wenyou.yang@atmel.com>
First post2016-08-16 11:20 +0200
Last post2016-08-17 14:00 +0200
Articles 9 — 2 participants

Back to article view | Back to linux.kernel


Contents

  [PATCH v5 0/7] power: act8945a_charger: Improvements Wenyou Yang <wenyou.yang@atmel.com> - 2016-08-16 11:20 +0200
    [PATCH v5 5/7] power: act8945a_charger: Add capacity level property Wenyou Yang <wenyou.yang@atmel.com> - 2016-08-16 11:20 +0200
      Re: [PATCH v5 5/7] power: act8945a_charger: Add capacity level  property Sebastian Reichel <sre@kernel.org> - 2016-08-17 13:50 +0200
    [PATCH v5 3/7] power: act8945a_charger: Add status change update support Wenyou Yang <wenyou.yang@atmel.com> - 2016-08-16 11:20 +0200
      Re: [PATCH v5 3/7] power: act8945a_charger: Add status change update  support Sebastian Reichel <sre@kernel.org> - 2016-08-17 13:50 +0200
    [PATCH v5 4/7] power: act8945a_charger: Fix the power supply type Wenyou Yang <wenyou.yang@atmel.com> - 2016-08-16 11:20 +0200
    [PATCH v5 7/7] doc: bindings: act8945a-charger: Update properties Wenyou Yang <wenyou.yang@atmel.com> - 2016-08-16 11:30 +0200
    [PATCH v5 6/7] power: act8945a_charger: Add max current property Wenyou Yang <wenyou.yang@atmel.com> - 2016-08-16 11:30 +0200
      Re: [PATCH v5 6/7] power: act8945a_charger: Add max current property Sebastian Reichel <sre@kernel.org> - 2016-08-17 14:00 +0200

#1463575 — [PATCH v5 0/7] power: act8945a_charger: Improvements

FromWenyou Yang <wenyou.yang@atmel.com>
Date2016-08-16 11:20 +0200
Subject[PATCH v5 0/7] power: act8945a_charger: Improvements
Message-ID<s6IHo-1dz-9@gated-at.bofh.it>
This patch series is to improve the implementation of act8945a-charger
driver, such as improve the way to check the status, fix the power
supply type property, add the status change update, and add more
properties: capacity level property and max current property.

Changes in v5:
 - Add Acked-by tag.

Changes in v4:
 - Use "interrupts" property, instead of "active-semi,lbo-gpios"
   for irq.
 - Change devname of devm_request_irq() from "lbo-detect" to
   "act8945a, lbo-detect".
 - Fix wrong gpio assignment for chglev_pin.
 - Update the doc/binding for using "interrupts" property.

Changes in v3:
 - Remove unneeded semicolon to fix semicolon.cocci warning.

Changes in v2:
 - Add missing ret declaration.

Wenyou Yang (7):
  power: act8945a_charger: Remove "battery_temperature"
  power: act8945a_charger: Improve
  power: act8945a_charger: Add status change update support
  power: act8945a_charger: Fix the power supply type
  power: act8945a_charger: Add capacity level property
  power: act8945a_charger: Add max current property
  doc: bindings: act8945a-charger: Update properties

 .../bindings/power/supply/act8945a-charger.txt     |  16 +-
 drivers/power/supply/act8945a_charger.c            | 373 ++++++++++++++++++---
 2 files changed, 348 insertions(+), 41 deletions(-)

-- 
2.7.4

[toc] | [next] | [standalone]


#1463576 — [PATCH v5 5/7] power: act8945a_charger: Add capacity level property

FromWenyou Yang <wenyou.yang@atmel.com>
Date2016-08-16 11:20 +0200
Subject[PATCH v5 5/7] power: act8945a_charger: Add capacity level property
Message-ID<s6IHo-1dz-15@gated-at.bofh.it>
In reply to#1463575
Add the power supply capacity level property, it corresponds to
POWER_SUPPLY_CAPACITY_LEVEL_*.

It also utilizes the precision voltage detector function module
to catch the low battery voltage.

Signed-off-by: Wenyou Yang <wenyou.yang@atmel.com>
---

Changes in v5: None
Changes in v4:
 - Change devname of devm_request_irq() from "lbo-detect" to
   "act8945a, lbo-detect".

Changes in v3: None
Changes in v2: None

 drivers/power/supply/act8945a_charger.c | 78 +++++++++++++++++++++++++++++++++
 1 file changed, 78 insertions(+)

diff --git a/drivers/power/supply/act8945a_charger.c b/drivers/power/supply/act8945a_charger.c
index a3d89be..2321796 100644
--- a/drivers/power/supply/act8945a_charger.c
+++ b/drivers/power/supply/act8945a_charger.c
@@ -83,6 +83,7 @@ struct act8945a_charger {
 	struct work_struct work;
 
 	bool init_done;
+	int lbo_pin;
 };
 
 static int act8945a_get_charger_state(struct regmap *regmap, int *val)
@@ -208,11 +209,70 @@ static int act8945a_get_battery_health(struct regmap *regmap, int *val)
 	return 0;
 }
 
+static int act8945a_get_capacity_level(struct act8945a_charger *charger,
+				       struct regmap *regmap, int *val)
+{
+	int ret;
+	unsigned int status, state, config;
+	int lbo_level = 1;
+
+	if (gpio_is_valid(charger->lbo_pin))
+		lbo_level = gpio_get_value(charger->lbo_pin);
+
+	ret = regmap_read(regmap, ACT8945A_APCH_STATUS, &status);
+	if (ret < 0)
+		return ret;
+
+	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_PRE:
+		*val = POWER_SUPPLY_CAPACITY_LEVEL_LOW;
+		break;
+	case APCH_STATE_CSTATE_FAST:
+		if (lbo_level)
+			*val = POWER_SUPPLY_CAPACITY_LEVEL_HIGH;
+		else
+			*val = POWER_SUPPLY_CAPACITY_LEVEL_LOW;
+		break;
+	case APCH_STATE_CSTATE_EOC:
+		if (status & APCH_STATUS_CHGDAT)
+			*val = POWER_SUPPLY_CAPACITY_LEVEL_FULL;
+		else
+			*val = POWER_SUPPLY_CAPACITY_LEVEL_NORMAL;
+		break;
+	case APCH_STATE_CSTATE_DISABLED:
+	default:
+		if (config & APCH_CFG_SUSCHG) {
+			*val = POWER_SUPPLY_CAPACITY_LEVEL_UNKNOWN;
+		} else {
+			*val = POWER_SUPPLY_CAPACITY_LEVEL_NORMAL;
+			if (!(status & APCH_STATUS_INDAT)) {
+				if (!lbo_level)
+					*val = POWER_SUPPLY_CAPACITY_LEVEL_CRITICAL;
+			}
+		}
+		break;
+	}
+
+	return 0;
+}
+
 static enum power_supply_property act8945a_charger_props[] = {
 	POWER_SUPPLY_PROP_STATUS,
 	POWER_SUPPLY_PROP_CHARGE_TYPE,
 	POWER_SUPPLY_PROP_TECHNOLOGY,
 	POWER_SUPPLY_PROP_HEALTH,
+	POWER_SUPPLY_PROP_CAPACITY_LEVEL,
 	POWER_SUPPLY_PROP_MODEL_NAME,
 	POWER_SUPPLY_PROP_MANUFACTURER
 };
@@ -238,6 +298,10 @@ static int act8945a_charger_get_property(struct power_supply *psy,
 	case POWER_SUPPLY_PROP_HEALTH:
 		ret = act8945a_get_battery_health(regmap, &val->intval);
 		break;
+	case POWER_SUPPLY_PROP_CAPACITY_LEVEL:
+		ret = act8945a_get_capacity_level(charger,
+						  regmap, &val->intval);
+		break;
 	case POWER_SUPPLY_PROP_MODEL_NAME:
 		val->strval = act8945a_charger_model;
 		break;
@@ -352,6 +416,20 @@ static int act8945a_charger_config(struct device *dev,
 	if (tmp & APCH_CFG_SUSCHG)
 		value |= APCH_CFG_SUSCHG;
 
+	charger->lbo_pin = of_get_named_gpio(np, "active-semi,lbo-gpios", 0);
+	if (gpio_is_valid(charger->lbo_pin)) {
+		if (!devm_gpio_request(dev, charger->lbo_pin, "lbo-detect")) {
+			ret = devm_request_irq(dev,
+					       gpio_to_irq(charger->lbo_pin),
+					       act8945a_status_changed,
+					       IRQF_TRIGGER_FALLING |
+					       IRQF_TRIGGER_RISING,
+					       "act8945a, lbo-detect", charger);
+			if (ret)
+				dev_dbg(dev, "failed to request LBO pin IRQ\n");
+		}
+	}
+
 	chglev_pin = of_get_named_gpio_flags(np,
 				"active-semi,chglev-gpios", 0, &flags);
 
-- 
2.7.4

[toc] | [prev] | [next] | [standalone]


#1464531 — Re: [PATCH v5 5/7] power: act8945a_charger: Add capacity level property

FromSebastian Reichel <sre@kernel.org>
Date2016-08-17 13:50 +0200
SubjectRe: [PATCH v5 5/7] power: act8945a_charger: Add capacity level property
Message-ID<s77w5-t7-7@gated-at.bofh.it>
In reply to#1463576

[Multipart message — attachments visible in raw view] — view raw

Hi,

On Tue, Aug 16, 2016 at 04:59:56PM +0800, Wenyou Yang wrote:
> Add the power supply capacity level property, it corresponds to
> POWER_SUPPLY_CAPACITY_LEVEL_*.
> 
> It also utilizes the precision voltage detector function module
> to catch the low battery voltage.

Please use gpiod API instead of old gpio API.

-- Sebastian

[toc] | [prev] | [next] | [standalone]


#1463580 — [PATCH v5 3/7] power: act8945a_charger: Add status change update support

FromWenyou Yang <wenyou.yang@atmel.com>
Date2016-08-16 11:20 +0200
Subject[PATCH v5 3/7] power: act8945a_charger: Add status change update support
Message-ID<s6IHo-1dz-35@gated-at.bofh.it>
In reply to#1463575
Add the charger status change interrupt support, it will report
the power supply changed event.

This interrupt is generated by one of the conditions as below:
 - the state machine jumps out of or into the EOC state
 - the CHGIN input voltage goes out of or into the valid range.
 - the battery temperature goes out of or into the valid range.
 - the PRECHARGE time-out occurs.
 - the total charge time-out occurs.

Signed-off-by: Wenyou Yang <wenyou.yang@atmel.com>
---

Changes in v5: None
Changes in v4:
 - Use "interrupts" property, instead of "active-semi,lbo-gpios"
   for irq.

Changes in v3: None
Changes in v2: None

 drivers/power/supply/act8945a_charger.c | 82 ++++++++++++++++++++++++++++++---
 1 file changed, 75 insertions(+), 7 deletions(-)

diff --git a/drivers/power/supply/act8945a_charger.c b/drivers/power/supply/act8945a_charger.c
index 6ddfc1d..74778f7 100644
--- a/drivers/power/supply/act8945a_charger.c
+++ b/drivers/power/supply/act8945a_charger.c
@@ -10,9 +10,11 @@
  * published by the Free Software Foundation.
  *
  */
+#include <linux/interrupt.h>
 #include <linux/module.h>
 #include <linux/of.h>
 #include <linux/of_gpio.h>
+#include <linux/of_irq.h>
 #include <linux/platform_device.h>
 #include <linux/power_supply.h>
 #include <linux/regmap.h>
@@ -75,7 +77,11 @@ static const char *act8945a_charger_manufacturer = "Active-semi";
 #define APCH_STATE_CSTATE_PRE		0x03
 
 struct act8945a_charger {
+	struct power_supply *psy;
 	struct regmap *regmap;
+	struct work_struct work;
+
+	bool init_done;
 };
 
 static int act8945a_get_charger_state(struct regmap *regmap, int *val)
@@ -252,6 +258,47 @@ static const struct power_supply_desc act8945a_charger_desc = {
 	.num_properties	= ARRAY_SIZE(act8945a_charger_props),
 };
 
+static int act8945a_enable_interrupt(struct act8945a_charger *charger)
+{
+	struct regmap *regmap = charger->regmap;
+	unsigned char ctrl;
+	int ret;
+
+	ctrl = APCH_CTRL_CHGEOCOUT | APCH_CTRL_CHGEOCIN |
+	       APCH_CTRL_INDIS | APCH_CTRL_INCON |
+	       APCH_CTRL_TEMPOUT | APCH_CTRL_TEMPIN |
+	       APCH_CTRL_TIMRPRE | APCH_CTRL_TIMRTOT;
+	ret = regmap_write(regmap, ACT8945A_APCH_CTRL, ctrl);
+	if (ret)
+		return ret;
+
+	ctrl = APCH_STATUS_CHGSTAT | APCH_STATUS_INSTAT |
+	       APCH_STATUS_TEMPSTAT | APCH_STATUS_TIMRSTAT;
+	ret = regmap_write(regmap, ACT8945A_APCH_STATUS, ctrl);
+	if (ret)
+		return ret;
+
+	return 0;
+}
+
+static void act8945a_work(struct work_struct *work)
+{
+	struct act8945a_charger *charger =
+			container_of(work, struct act8945a_charger, work);
+
+	power_supply_changed(charger->psy);
+}
+
+static irqreturn_t act8945a_status_changed(int irq, void *dev_id)
+{
+	struct act8945a_charger *charger = dev_id;
+
+	if (charger->init_done)
+		schedule_work(&charger->work);
+
+	return IRQ_HANDLED;
+}
+
 #define DEFAULT_TOTAL_TIME_OUT		3
 #define DEFAULT_PRE_TIME_OUT		40
 #define DEFAULT_INPUT_OVP_THRESHOLD	6600
@@ -360,9 +407,8 @@ static int act8945a_charger_config(struct device *dev,
 static int act8945a_charger_probe(struct platform_device *pdev)
 {
 	struct act8945a_charger *charger;
-	struct power_supply *psy;
 	struct power_supply_config psy_cfg = {};
-	int ret;
+	int irq, ret;
 
 	charger = devm_kzalloc(&pdev->dev, sizeof(*charger), GFP_KERNEL);
 	if (!charger)
@@ -378,17 +424,39 @@ static int act8945a_charger_probe(struct platform_device *pdev)
 	if (ret)
 		return ret;
 
+	irq = of_irq_get(pdev->dev.parent->of_node, 0);
+	if (irq == -EPROBE_DEFER) {
+		dev_err(&pdev->dev, "failed to find IRQ number\n");
+		return -EPROBE_DEFER;
+	}
+
+	ret = devm_request_irq(&pdev->dev, irq, act8945a_status_changed,
+			       IRQF_TRIGGER_FALLING, "act8945a_interrupt",
+			       charger);
+	if (ret) {
+		dev_err(&pdev->dev, "failed to request nIRQ pin IRQ\n");
+		return ret;
+	}
+
 	psy_cfg.of_node	= pdev->dev.parent->of_node;
 	psy_cfg.drv_data = charger;
 
-	psy = devm_power_supply_register(&pdev->dev,
-					 &act8945a_charger_desc,
-					 &psy_cfg);
-	if (IS_ERR(psy)) {
+	charger->psy = devm_power_supply_register(&pdev->dev,
+						  &act8945a_charger_desc,
+						  &psy_cfg);
+	if (IS_ERR(charger->psy)) {
 		dev_err(&pdev->dev, "failed to register power supply\n");
-		return PTR_ERR(psy);
+		return PTR_ERR(charger->psy);
 	}
 
+	INIT_WORK(&charger->work, act8945a_work);
+
+	ret = act8945a_enable_interrupt(charger);
+	if (ret)
+		return -EIO;
+
+	charger->init_done = true;
+
 	return 0;
 }
 
-- 
2.7.4

[toc] | [prev] | [next] | [standalone]


#1464530 — Re: [PATCH v5 3/7] power: act8945a_charger: Add status change update support

FromSebastian Reichel <sre@kernel.org>
Date2016-08-17 13:50 +0200
SubjectRe: [PATCH v5 3/7] power: act8945a_charger: Add status change update support
Message-ID<s77w5-t7-5@gated-at.bofh.it>
In reply to#1463580

[Multipart message — attachments visible in raw view] — view raw

Hi,

On Tue, Aug 16, 2016 at 04:59:54PM +0800, Wenyou Yang wrote:
> Add the charger status change interrupt support, it will report
> the power supply changed event.
> 
> This interrupt is generated by one of the conditions as below:
>  - the state machine jumps out of or into the EOC state
>  - the CHGIN input voltage goes out of or into the valid range.
>  - the battery temperature goes out of or into the valid range.
>  - the PRECHARGE time-out occurs.
>  - the total charge time-out occurs.

This is unsafe during module remove, since irq work may be scheduled
while power-supply is unregistered. You will have to add a remove
function, which does something like

charger->init_done = false;
cancel_work_sync(&charger->work);

-- Sebastian

> Signed-off-by: Wenyou Yang <wenyou.yang@atmel.com>
> ---
> 
> Changes in v5: None
> Changes in v4:
>  - Use "interrupts" property, instead of "active-semi,lbo-gpios"
>    for irq.
> 
> Changes in v3: None
> Changes in v2: None
> 
>  drivers/power/supply/act8945a_charger.c | 82 ++++++++++++++++++++++++++++++---
>  1 file changed, 75 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/power/supply/act8945a_charger.c b/drivers/power/supply/act8945a_charger.c
> index 6ddfc1d..74778f7 100644
> --- a/drivers/power/supply/act8945a_charger.c
> +++ b/drivers/power/supply/act8945a_charger.c
> @@ -10,9 +10,11 @@
>   * published by the Free Software Foundation.
>   *
>   */
> +#include <linux/interrupt.h>
>  #include <linux/module.h>
>  #include <linux/of.h>
>  #include <linux/of_gpio.h>
> +#include <linux/of_irq.h>
>  #include <linux/platform_device.h>
>  #include <linux/power_supply.h>
>  #include <linux/regmap.h>
> @@ -75,7 +77,11 @@ static const char *act8945a_charger_manufacturer = "Active-semi";
>  #define APCH_STATE_CSTATE_PRE		0x03
>  
>  struct act8945a_charger {
> +	struct power_supply *psy;
>  	struct regmap *regmap;
> +	struct work_struct work;
> +
> +	bool init_done;
>  };
>  
>  static int act8945a_get_charger_state(struct regmap *regmap, int *val)
> @@ -252,6 +258,47 @@ static const struct power_supply_desc act8945a_charger_desc = {
>  	.num_properties	= ARRAY_SIZE(act8945a_charger_props),
>  };
>  
> +static int act8945a_enable_interrupt(struct act8945a_charger *charger)
> +{
> +	struct regmap *regmap = charger->regmap;
> +	unsigned char ctrl;
> +	int ret;
> +
> +	ctrl = APCH_CTRL_CHGEOCOUT | APCH_CTRL_CHGEOCIN |
> +	       APCH_CTRL_INDIS | APCH_CTRL_INCON |
> +	       APCH_CTRL_TEMPOUT | APCH_CTRL_TEMPIN |
> +	       APCH_CTRL_TIMRPRE | APCH_CTRL_TIMRTOT;
> +	ret = regmap_write(regmap, ACT8945A_APCH_CTRL, ctrl);
> +	if (ret)
> +		return ret;
> +
> +	ctrl = APCH_STATUS_CHGSTAT | APCH_STATUS_INSTAT |
> +	       APCH_STATUS_TEMPSTAT | APCH_STATUS_TIMRSTAT;
> +	ret = regmap_write(regmap, ACT8945A_APCH_STATUS, ctrl);
> +	if (ret)
> +		return ret;
> +
> +	return 0;
> +}
> +
> +static void act8945a_work(struct work_struct *work)
> +{
> +	struct act8945a_charger *charger =
> +			container_of(work, struct act8945a_charger, work);
> +
> +	power_supply_changed(charger->psy);
> +}
> +
> +static irqreturn_t act8945a_status_changed(int irq, void *dev_id)
> +{
> +	struct act8945a_charger *charger = dev_id;
> +
> +	if (charger->init_done)
> +		schedule_work(&charger->work);
> +
> +	return IRQ_HANDLED;
> +}
> +
>  #define DEFAULT_TOTAL_TIME_OUT		3
>  #define DEFAULT_PRE_TIME_OUT		40
>  #define DEFAULT_INPUT_OVP_THRESHOLD	6600
> @@ -360,9 +407,8 @@ static int act8945a_charger_config(struct device *dev,
>  static int act8945a_charger_probe(struct platform_device *pdev)
>  {
>  	struct act8945a_charger *charger;
> -	struct power_supply *psy;
>  	struct power_supply_config psy_cfg = {};
> -	int ret;
> +	int irq, ret;
>  
>  	charger = devm_kzalloc(&pdev->dev, sizeof(*charger), GFP_KERNEL);
>  	if (!charger)
> @@ -378,17 +424,39 @@ static int act8945a_charger_probe(struct platform_device *pdev)
>  	if (ret)
>  		return ret;
>  
> +	irq = of_irq_get(pdev->dev.parent->of_node, 0);
> +	if (irq == -EPROBE_DEFER) {
> +		dev_err(&pdev->dev, "failed to find IRQ number\n");
> +		return -EPROBE_DEFER;
> +	}
> +
> +	ret = devm_request_irq(&pdev->dev, irq, act8945a_status_changed,
> +			       IRQF_TRIGGER_FALLING, "act8945a_interrupt",
> +			       charger);
> +	if (ret) {
> +		dev_err(&pdev->dev, "failed to request nIRQ pin IRQ\n");
> +		return ret;
> +	}
> +
>  	psy_cfg.of_node	= pdev->dev.parent->of_node;
>  	psy_cfg.drv_data = charger;
>  
> -	psy = devm_power_supply_register(&pdev->dev,
> -					 &act8945a_charger_desc,
> -					 &psy_cfg);
> -	if (IS_ERR(psy)) {
> +	charger->psy = devm_power_supply_register(&pdev->dev,
> +						  &act8945a_charger_desc,
> +						  &psy_cfg);
> +	if (IS_ERR(charger->psy)) {
>  		dev_err(&pdev->dev, "failed to register power supply\n");
> -		return PTR_ERR(psy);
> +		return PTR_ERR(charger->psy);
>  	}
>  
> +	INIT_WORK(&charger->work, act8945a_work);
> +
> +	ret = act8945a_enable_interrupt(charger);
> +	if (ret)
> +		return -EIO;
> +
> +	charger->init_done = true;
> +
>  	return 0;
>  }
>  
> -- 
> 2.7.4
> 

[toc] | [prev] | [next] | [standalone]


#1463582 — [PATCH v5 4/7] power: act8945a_charger: Fix the power supply type

FromWenyou Yang <wenyou.yang@atmel.com>
Date2016-08-16 11:20 +0200
Subject[PATCH v5 4/7] power: act8945a_charger: Fix the power supply type
Message-ID<s6IHo-1dz-31@gated-at.bofh.it>
In reply to#1463575
The power supply type property is varying as the external power
supply changes. It is not a constant.

Signed-off-by: Wenyou Yang <wenyou.yang@atmel.com>
---

Changes in v5: None
Changes in v4: None
Changes in v3: None
Changes in v2: None

 drivers/power/supply/act8945a_charger.c | 48 ++++++++++++++++++++++++++-------
 1 file changed, 39 insertions(+), 9 deletions(-)

diff --git a/drivers/power/supply/act8945a_charger.c b/drivers/power/supply/act8945a_charger.c
index 74778f7..a3d89be 100644
--- a/drivers/power/supply/act8945a_charger.c
+++ b/drivers/power/supply/act8945a_charger.c
@@ -78,6 +78,7 @@ static const char *act8945a_charger_manufacturer = "Active-semi";
 
 struct act8945a_charger {
 	struct power_supply *psy;
+	struct power_supply_desc desc;
 	struct regmap *regmap;
 	struct work_struct work;
 
@@ -250,14 +251,6 @@ static int act8945a_charger_get_property(struct power_supply *psy,
 	return ret;
 }
 
-static const struct power_supply_desc act8945a_charger_desc = {
-	.name		= "act8945a-charger",
-	.type		= POWER_SUPPLY_TYPE_BATTERY,
-	.get_property	= act8945a_charger_get_property,
-	.properties	= act8945a_charger_props,
-	.num_properties	= ARRAY_SIZE(act8945a_charger_props),
-};
-
 static int act8945a_enable_interrupt(struct act8945a_charger *charger)
 {
 	struct regmap *regmap = charger->regmap;
@@ -281,11 +274,39 @@ static int act8945a_enable_interrupt(struct act8945a_charger *charger)
 	return 0;
 }
 
+static unsigned int act8945a_set_supply_type(struct act8945a_charger *charger,
+					     unsigned int *type)
+{
+	unsigned int status, state;
+	int ret;
+
+	ret = regmap_read(charger->regmap, ACT8945A_APCH_STATUS, &status);
+	if (ret < 0)
+		return ret;
+
+	ret = regmap_read(charger->regmap, ACT8945A_APCH_STATE, &state);
+	if (ret < 0)
+		return ret;
+
+	if (status & APCH_STATUS_INDAT) {
+		if (state & APCH_STATE_ACINSTAT)
+			*type = POWER_SUPPLY_TYPE_MAINS;
+		else
+			*type = POWER_SUPPLY_TYPE_USB;
+	} else {
+		*type = POWER_SUPPLY_TYPE_BATTERY;
+	}
+
+	return 0;
+}
+
 static void act8945a_work(struct work_struct *work)
 {
 	struct act8945a_charger *charger =
 			container_of(work, struct act8945a_charger, work);
 
+	act8945a_set_supply_type(charger, &charger->desc.type);
+
 	power_supply_changed(charger->psy);
 }
 
@@ -438,11 +459,20 @@ static int act8945a_charger_probe(struct platform_device *pdev)
 		return ret;
 	}
 
+	charger->desc.name = "act8945a-charger";
+	charger->desc.get_property = act8945a_charger_get_property;
+	charger->desc.properties = act8945a_charger_props;
+	charger->desc.num_properties = ARRAY_SIZE(act8945a_charger_props);
+
+	ret = act8945a_set_supply_type(charger, &charger->desc.type);
+	if (ret)
+		return -EINVAL;
+
 	psy_cfg.of_node	= pdev->dev.parent->of_node;
 	psy_cfg.drv_data = charger;
 
 	charger->psy = devm_power_supply_register(&pdev->dev,
-						  &act8945a_charger_desc,
+						  &charger->desc,
 						  &psy_cfg);
 	if (IS_ERR(charger->psy)) {
 		dev_err(&pdev->dev, "failed to register power supply\n");
-- 
2.7.4

[toc] | [prev] | [next] | [standalone]


#1463589 — [PATCH v5 7/7] doc: bindings: act8945a-charger: Update properties

FromWenyou Yang <wenyou.yang@atmel.com>
Date2016-08-16 11:30 +0200
Subject[PATCH v5 7/7] doc: bindings: act8945a-charger: Update properties
Message-ID<s6IR4-1hW-17@gated-at.bofh.it>
In reply to#1463575
Due the driver improvements, update the properties,
 - Remove "active-semi,check-battery-temperature" property.
 - Add the properties, "active-semi,irq_gpio"
   and "active-semi,lbo-gpios".

Signed-off-by: Wenyou Yang <wenyou.yang@atmel.com>
Acked-by: Rob Herring <robh@kernel.org>
---

Changes in v5:
 - Add Acked-by tag.

Changes in v4:
 - Update the doc/binding for using "interrupts" property.

Changes in v3: None
Changes in v2: None

 .../bindings/power/supply/act8945a-charger.txt           | 16 +++++++++++++---
 1 file changed, 13 insertions(+), 3 deletions(-)

diff --git a/Documentation/devicetree/bindings/power/supply/act8945a-charger.txt b/Documentation/devicetree/bindings/power/supply/act8945a-charger.txt
index bea254c..f9866c4 100644
--- a/Documentation/devicetree/bindings/power/supply/act8945a-charger.txt
+++ b/Documentation/devicetree/bindings/power/supply/act8945a-charger.txt
@@ -4,10 +4,15 @@ Required properties:
  - compatible: "active-semi,act8945a", please refer to ../mfd/act8945a.txt.
  - active-semi,chglev-gpios: charge current level phandle with args
    as described in ../gpio/gpio.txt.
+ - active-semi,lbo-gpios: specify the low battery voltage detect phandle
+   with args as as described in ../gpio/gpio.txt.
+ - interrupts: <a b> where a is the interrupt number and b is a
+   field that represents an encoding of the sense and level
+   information for the interrupt.
+ - interrupt-parent: the phandle for the interrupt controller that
+   services interrupts for this device.
 
 Optional properties:
- - active-semi,check-battery-temperature: boolean to check the battery
-   temperature or not.
  - active-semi,input-voltage-threshold-microvolt: unit: mV;
    Specifies the charger's input over-voltage threshold value;
    The value can be: 6600, 7000, 7500, 8000; default: 6600
@@ -27,9 +32,14 @@ Example:
 		status = "okay";
 
 		pinctrl-names = "default";
-		pinctrl-0 = <&pinctrl_charger_chglev>;
+		pinctrl-0 = <&pinctrl_charger_chglev &pinctrl_charger_lbo &pinctrl_charger_irq>;
+
 		active-semi,chglev-gpios = <&pioA 12 GPIO_ACTIVE_HIGH>;
+		active-semi,lbo-gpios = <&pioA 72 GPIO_ACTIVE_LOW>;
 		active-semi,input-voltage-threshold-microvolt = <6600>;
 		active-semi,precondition-timeout = <40>;
 		active-semi,total-timeout = <3>;
+		interrupt-parent = <&pioA>;
+		interrupts = <45 GPIO_ACTIVE_LOW>;
+
 	};
-- 
2.7.4

[toc] | [prev] | [next] | [standalone]


#1463592 — [PATCH v5 6/7] power: act8945a_charger: Add max current property

FromWenyou Yang <wenyou.yang@atmel.com>
Date2016-08-16 11:30 +0200
Subject[PATCH v5 6/7] power: act8945a_charger: Add max current property
Message-ID<s6IR4-1hW-29@gated-at.bofh.it>
In reply to#1463575
Add the power supply's current max property,
POWER_SUPPLY_PROP_CURRENT_MAX.

Signed-off-by: Wenyou Yang <wenyou.yang@atmel.com>
---

Changes in v5: None
Changes in v4:
 - Fix wrong gpio assignment for chglev_pin.

Changes in v3: None
Changes in v2: None

 drivers/power/supply/act8945a_charger.c | 79 ++++++++++++++++++++++++++++++++-
 1 file changed, 77 insertions(+), 2 deletions(-)

diff --git a/drivers/power/supply/act8945a_charger.c b/drivers/power/supply/act8945a_charger.c
index 2321796..9bfbc87 100644
--- a/drivers/power/supply/act8945a_charger.c
+++ b/drivers/power/supply/act8945a_charger.c
@@ -84,6 +84,7 @@ struct act8945a_charger {
 
 	bool init_done;
 	int lbo_pin;
+	int chgin_level;
 };
 
 static int act8945a_get_charger_state(struct regmap *regmap, int *val)
@@ -267,12 +268,79 @@ static int act8945a_get_capacity_level(struct act8945a_charger *charger,
 	return 0;
 }
 
+#define MAX_CURRENT_USB_HIGH	450000
+#define MAX_CURRENT_USB_LOW	90000
+#define MAX_CURRENT_USB_PRE	45000
+/*
+ * Riset(K) = 2336 * (1V/Ichg(mA)) - 0.205
+ * Riset = 2.43K
+ */
+#define MAX_CURRENT_AC_HIGH		886527
+#define MAX_CURRENT_AC_LOW		117305
+#define MAX_CURRENT_AC_HIGH_PRE		88653
+#define MAX_CURRENT_AC_LOW_PRE		11731
+
+static int act8945a_get_current_max(struct act8945a_charger *charger,
+				    struct regmap *regmap, int *val)
+{
+	int ret;
+	unsigned int status, state;
+	unsigned int acin_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)
+		return ret;
+
+	acin_state = (state & APCH_STATE_ACINSTAT) >> 1;
+
+	state &= APCH_STATE_CSTATE;
+	state >>= APCH_STATE_CSTATE_SHIFT;
+
+	switch (state) {
+	case APCH_STATE_CSTATE_PRE:
+		if (acin_state) {
+			if (charger->chgin_level)
+				*val = MAX_CURRENT_AC_HIGH_PRE;
+			else
+				*val = MAX_CURRENT_AC_LOW_PRE;
+		} else {
+			*val = MAX_CURRENT_USB_PRE;
+		}
+		break;
+	case APCH_STATE_CSTATE_FAST:
+		if (acin_state) {
+			if (charger->chgin_level)
+				*val = MAX_CURRENT_AC_HIGH;
+			else
+				*val = MAX_CURRENT_AC_LOW;
+		} else {
+			if (charger->chgin_level)
+				*val = MAX_CURRENT_USB_HIGH;
+			else
+				*val = MAX_CURRENT_USB_LOW;
+		}
+		break;
+	case APCH_STATE_CSTATE_EOC:
+	case APCH_STATE_CSTATE_DISABLED:
+	default:
+		*val = 0;
+		break;
+	}
+
+	return 0;
+}
+
 static enum power_supply_property act8945a_charger_props[] = {
 	POWER_SUPPLY_PROP_STATUS,
 	POWER_SUPPLY_PROP_CHARGE_TYPE,
 	POWER_SUPPLY_PROP_TECHNOLOGY,
 	POWER_SUPPLY_PROP_HEALTH,
 	POWER_SUPPLY_PROP_CAPACITY_LEVEL,
+	POWER_SUPPLY_PROP_CURRENT_MAX,
 	POWER_SUPPLY_PROP_MODEL_NAME,
 	POWER_SUPPLY_PROP_MANUFACTURER
 };
@@ -302,6 +370,10 @@ static int act8945a_charger_get_property(struct power_supply *psy,
 		ret = act8945a_get_capacity_level(charger,
 						  regmap, &val->intval);
 		break;
+	case POWER_SUPPLY_PROP_CURRENT_MAX:
+		ret = act8945a_get_current_max(charger,
+					       regmap, &val->intval);
+		break;
 	case POWER_SUPPLY_PROP_MODEL_NAME:
 		val->strval = act8945a_charger_model;
 		break;
@@ -434,8 +506,11 @@ static int act8945a_charger_config(struct device *dev,
 				"active-semi,chglev-gpios", 0, &flags);
 
 	if (gpio_is_valid(chglev_pin)) {
-		gpio_set_value(chglev_pin,
-			       ((flags == OF_GPIO_ACTIVE_LOW) ? 0 : 1));
+		if (!devm_gpio_request(dev, chglev_pin, "chglev-pin")) {
+			charger->chgin_level =
+					(flags == OF_GPIO_ACTIVE_LOW) ? 0 : 1;
+			gpio_set_value(chglev_pin, charger->chgin_level);
+		}
 	}
 
 	if (of_property_read_u32(np,
-- 
2.7.4

[toc] | [prev] | [next] | [standalone]


#1464535 — Re: [PATCH v5 6/7] power: act8945a_charger: Add max current property

FromSebastian Reichel <sre@kernel.org>
Date2016-08-17 14:00 +0200
SubjectRe: [PATCH v5 6/7] power: act8945a_charger: Add max current property
Message-ID<s77FM-wB-9@gated-at.bofh.it>
In reply to#1463592

[Multipart message — attachments visible in raw view] — view raw

Hi,

On Tue, Aug 16, 2016 at 04:59:57PM +0800, Wenyou Yang wrote:
> Add the power supply's current max property,
> POWER_SUPPLY_PROP_CURRENT_MAX.

Please also switch chgin_level to gpiod API.

-- Sebastian

[toc] | [prev] | [standalone]


Back to top | Article view | linux.kernel


csiph-web