mbox series

[v3,0/2] add Watchdog Timer delay support for BQ24735

Message ID 20210709142731.23418-1-bruno.meneguele@smartgreen.net
Headers show
Series add Watchdog Timer delay support for BQ24735 | expand

Message

Bruno Meneguele July 9, 2021, 2:27 p.m. UTC
The IC BQ24735 has the ability to suspend the battery charging in case the
system freezes for some reason: the IC observes consecutive writes for
either CargeCurrent of ChargVoltage registers in a maximum period of time.

This period of time can be configured by the user through the ChargeOption
register in the bits 13 and 14, but it's only possible to change if the user
sends the value directly accessing the I2C bus through userspace, because
the kernel driver doesn't read or write to the Watchdog bits.

This patchset enables the user to configure the value through the
device-tree option "ti,wdt-timeout".

Changelog:
  v2 - unfortunately I used a default gitconfig that was pointing to my
  default user.email and email smtp. This new version corrects it.

Bruno Meneguele (2):
  power: supply: bq24735: reorganize ChargeOption command macros
  power: supply: bq24735: add watchdog timer delay support

 .../bindings/power/supply/bq24735.yaml        | 13 ++++
 drivers/power/supply/bq24735-charger.c        | 75 ++++++++++++++++---
 include/linux/power/bq24735-charger.h         |  1 +
 3 files changed, 77 insertions(+), 12 deletions(-)

Comments

Sebastian Reichel Aug. 13, 2021, 4:12 p.m. UTC | #1
Hi,

On Fri, Jul 09, 2021 at 11:27:30AM -0300, Bruno Meneguele wrote:
> Rename ChargeOption macros to match the others for ChargeCurrent and

> ChargeVoltage and also separate the command & masks macros from the bits of

> interest macros for each command.  This macro doesn't introduce any

> functional change, only code re-org.

> 

> Signed-off-by: Bruno Meneguele <bruno.meneguele@smartgreen.net>

> ---


Thanks, queued.

-- Sebastian

>  drivers/power/supply/bq24735-charger.c | 27 ++++++++++++++------------

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

> 

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

> index b5d619db79f6..3ce36d09c017 100644

> --- a/drivers/power/supply/bq24735-charger.c

> +++ b/drivers/power/supply/bq24735-charger.c

> @@ -31,9 +31,8 @@

>  

>  #include <linux/power/bq24735-charger.h>

>  

> -#define BQ24735_CHG_OPT			0x12

> -#define BQ24735_CHG_OPT_CHARGE_DISABLE	(1 << 0)

> -#define BQ24735_CHG_OPT_AC_PRESENT	(1 << 4)

> +/* BQ24735 available commands and their respective masks */

> +#define BQ24735_CHARGE_OPT		0x12

>  #define BQ24735_CHARGE_CURRENT		0x14

>  #define BQ24735_CHARGE_CURRENT_MASK	0x1fc0

>  #define BQ24735_CHARGE_VOLTAGE		0x15

> @@ -43,6 +42,10 @@

>  #define BQ24735_MANUFACTURER_ID		0xfe

>  #define BQ24735_DEVICE_ID		0xff

>  

> +/* ChargeOptions bits of interest */

> +#define BQ24735_CHARGE_OPT_CHG_DISABLE	(1 << 0)

> +#define BQ24735_CHARGE_OPT_AC_PRESENT	(1 << 4)

> +

>  struct bq24735 {

>  	struct power_supply		*charger;

>  	struct power_supply_desc	charger_desc;

> @@ -167,8 +170,8 @@ static inline int bq24735_enable_charging(struct bq24735 *charger)

>  	if (ret)

>  		return ret;

>  

> -	return bq24735_update_word(charger->client, BQ24735_CHG_OPT,

> -				   BQ24735_CHG_OPT_CHARGE_DISABLE, 0);

> +	return bq24735_update_word(charger->client, BQ24735_CHARGE_OPT,

> +				   BQ24735_CHARGE_OPT_CHG_DISABLE, 0);

>  }

>  

>  static inline int bq24735_disable_charging(struct bq24735 *charger)

> @@ -176,9 +179,9 @@ static inline int bq24735_disable_charging(struct bq24735 *charger)

>  	if (charger->pdata->ext_control)

>  		return 0;

>  

> -	return bq24735_update_word(charger->client, BQ24735_CHG_OPT,

> -				   BQ24735_CHG_OPT_CHARGE_DISABLE,

> -				   BQ24735_CHG_OPT_CHARGE_DISABLE);

> +	return bq24735_update_word(charger->client, BQ24735_CHARGE_OPT,

> +				   BQ24735_CHARGE_OPT_CHG_DISABLE,

> +				   BQ24735_CHARGE_OPT_CHG_DISABLE);

>  }

>  

>  static bool bq24735_charger_is_present(struct bq24735 *charger)

> @@ -188,14 +191,14 @@ static bool bq24735_charger_is_present(struct bq24735 *charger)

>  	} else {

>  		int ac = 0;

>  

> -		ac = bq24735_read_word(charger->client, BQ24735_CHG_OPT);

> +		ac = bq24735_read_word(charger->client, BQ24735_CHARGE_OPT);

>  		if (ac < 0) {

>  			dev_dbg(&charger->client->dev,

>  				"Failed to read charger options : %d\n",

>  				ac);

>  			return false;

>  		}

> -		return (ac & BQ24735_CHG_OPT_AC_PRESENT) ? true : false;

> +		return (ac & BQ24735_CHARGE_OPT_AC_PRESENT) ? true : false;

>  	}

>  

>  	return false;

> @@ -208,11 +211,11 @@ static int bq24735_charger_is_charging(struct bq24735 *charger)

>  	if (!bq24735_charger_is_present(charger))

>  		return 0;

>  

> -	ret  = bq24735_read_word(charger->client, BQ24735_CHG_OPT);

> +	ret  = bq24735_read_word(charger->client, BQ24735_CHARGE_OPT);

>  	if (ret < 0)

>  		return ret;

>  

> -	return !(ret & BQ24735_CHG_OPT_CHARGE_DISABLE);

> +	return !(ret & BQ24735_CHARGE_OPT_CHG_DISABLE);

>  }

>  

>  static void bq24735_update(struct bq24735 *charger)

> -- 

> 2.31.1

>