[v3] power: supply: axp20x_battery: implement writeable status to enable/disable battery charging

Message ID 20210512105856.GA15727@lemon.iwr.uni-heidelberg.de
State New
Headers show
Series
  • [v3] power: supply: axp20x_battery: implement writeable status to enable/disable battery charging
Related show

Commit Message

Hermann Lauer May 12, 2021, 10:58 a.m.
Allow disabling and reenabling battery charging of an axp209 PMIC through a
writable status property. With the current driver code charging is always on.

This works on the axp209 of Banana {Pi M1+,Pro} and should work on all AXP chips.

Signed-off-by: Hermann.Lauer@uni-heidelberg.de
---
v2: add fallthrough and improve commit message (thanks to Maxime and ChenYu)
v3: fix fallthrough usage

Thanks to ChenYu for the idea and greetings
  Hermann

 drivers/power/supply/axp20x_battery.c | 17 +++++++++++++++--
 1 file changed, 15 insertions(+), 2 deletions(-)

Comments

Sebastian Reichel June 4, 2021, 12:20 p.m. | #1
Hi,

On Wed, May 12, 2021 at 12:58:56PM +0200, Hermann Lauer wrote:
> Allow disabling and reenabling battery charging of an axp209 PMIC through a

> writable status property. With the current driver code charging is always on.

> 

> This works on the axp209 of Banana {Pi M1+,Pro} and should work on all AXP chips.

> 

> Signed-off-by: Hermann.Lauer@uni-heidelberg.de

> ---


Thanks, queued.

-- Sebastian

> v2: add fallthrough and improve commit message (thanks to Maxime and ChenYu)

> v3: fix fallthrough usage

> 

> Thanks to ChenYu for the idea and greetings

>   Hermann

> 

>  drivers/power/supply/axp20x_battery.c | 17 +++++++++++++++--

>  1 file changed, 15 insertions(+), 2 deletions(-)

> 

> diff --git a/drivers/power/supply/axp20x_battery.c b/drivers/power/supply/axp20x_battery.c

> --- a/drivers/power/supply/axp20x_battery.c

> +++ b/drivers/power/supply/axp20x_battery.c

> @@ -40,6 +40,7 @@

>  #define AXP209_FG_PERCENT		GENMASK(6, 0)

>  #define AXP22X_FG_VALID			BIT(7)

>  

> +#define AXP20X_CHRG_CTRL1_ENABLE	BIT(7)

>  #define AXP20X_CHRG_CTRL1_TGT_VOLT	GENMASK(6, 5)

>  #define AXP20X_CHRG_CTRL1_TGT_4_1V	(0 << 5)

>  #define AXP20X_CHRG_CTRL1_TGT_4_15V	(1 << 5)

> @@ -468,7 +469,18 @@

>  	case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX:

>  		return axp20x_set_max_constant_charge_current(axp20x_batt,

>  							      val->intval);

> +	case POWER_SUPPLY_PROP_STATUS:

> +		switch (val->intval) {

> +		case POWER_SUPPLY_STATUS_CHARGING:

> +			return regmap_update_bits(axp20x_batt->regmap, AXP20X_CHRG_CTRL1,

> +				AXP20X_CHRG_CTRL1_ENABLE, AXP20X_CHRG_CTRL1_ENABLE);

>  

> +		case POWER_SUPPLY_STATUS_DISCHARGING:

> +		case POWER_SUPPLY_STATUS_NOT_CHARGING:

> +			return regmap_update_bits(axp20x_batt->regmap, AXP20X_CHRG_CTRL1,

> +				AXP20X_CHRG_CTRL1_ENABLE, 0);

> +		}

> +		fallthrough;

>  	default:

>  		return -EINVAL;

>  	}

> @@ -491,7 +503,8 @@

>  static int axp20x_battery_prop_writeable(struct power_supply *psy,

>  					 enum power_supply_property psp)

>  {

> -	return psp == POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN ||

> +	return psp == POWER_SUPPLY_PROP_STATUS ||

> +	       psp == POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN ||

>  	       psp == POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN ||

>  	       psp == POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT ||

>  	       psp == POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX;

Patch

diff --git a/drivers/power/supply/axp20x_battery.c b/drivers/power/supply/axp20x_battery.c
--- a/drivers/power/supply/axp20x_battery.c
+++ b/drivers/power/supply/axp20x_battery.c
@@ -40,6 +40,7 @@ 
 #define AXP209_FG_PERCENT		GENMASK(6, 0)
 #define AXP22X_FG_VALID			BIT(7)
 
+#define AXP20X_CHRG_CTRL1_ENABLE	BIT(7)
 #define AXP20X_CHRG_CTRL1_TGT_VOLT	GENMASK(6, 5)
 #define AXP20X_CHRG_CTRL1_TGT_4_1V	(0 << 5)
 #define AXP20X_CHRG_CTRL1_TGT_4_15V	(1 << 5)
@@ -468,7 +469,18 @@ 
 	case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX:
 		return axp20x_set_max_constant_charge_current(axp20x_batt,
 							      val->intval);
+	case POWER_SUPPLY_PROP_STATUS:
+		switch (val->intval) {
+		case POWER_SUPPLY_STATUS_CHARGING:
+			return regmap_update_bits(axp20x_batt->regmap, AXP20X_CHRG_CTRL1,
+				AXP20X_CHRG_CTRL1_ENABLE, AXP20X_CHRG_CTRL1_ENABLE);
 
+		case POWER_SUPPLY_STATUS_DISCHARGING:
+		case POWER_SUPPLY_STATUS_NOT_CHARGING:
+			return regmap_update_bits(axp20x_batt->regmap, AXP20X_CHRG_CTRL1,
+				AXP20X_CHRG_CTRL1_ENABLE, 0);
+		}
+		fallthrough;
 	default:
 		return -EINVAL;
 	}
@@ -491,7 +503,8 @@ 
 static int axp20x_battery_prop_writeable(struct power_supply *psy,
 					 enum power_supply_property psp)
 {
-	return psp == POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN ||
+	return psp == POWER_SUPPLY_PROP_STATUS ||
+	       psp == POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN ||
 	       psp == POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN ||
 	       psp == POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT ||
 	       psp == POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX;