All of lore.kernel.org
 help / color / mirror / Atom feed
From: Alexandre Belloni <alexandre.belloni@bootlin.com>
To: Andrej Picej <andrej.picej@norik.com>
Cc: a.zummo@towertech.it, linux-rtc@vger.kernel.org,
	linux-kernel@vger.kernel.org, upstream@phytec.de
Subject: Re: [PATCH v2] rtc: rv3028: Improve trickle charger logic
Date: Thu, 22 Jun 2023 09:34:58 +0200	[thread overview]
Message-ID: <20230622073458dcd9f636@mail.local> (raw)
In-Reply-To: <20230622071609.4032736-1-andrej.picej@norik.com>

On 22/06/2023 09:16:09+0200, Andrej Picej wrote:
> Property "trickle-resistor-ohms" allows us to set trickle charger
> resistor. However there is no possibility to disable it afterwards.
> 
> From now on, disable trickle charger circuit in case device-tree
> property "trickle-resistor-ohms" is set to -1.
> 
> Additionally, lets make sure we only update internal EEPROM in case of a
> change. This prevents wear due to excessive EEPROM writes on each probe.
> 
> Signed-off-by: Andrej Picej <andrej.picej@norik.com>
> ---
> Changes in v2:
> - disable trickle charger if device tree property trickle-resistor-ohms
>   is set to -1.

What about using aux-voltage-chargeable which is the generic property
for this?

> ---
>  drivers/rtc/rtc-rv3028.c | 45 +++++++++++++++++++++++++++++-----------
>  1 file changed, 33 insertions(+), 12 deletions(-)
> 
> diff --git a/drivers/rtc/rtc-rv3028.c b/drivers/rtc/rtc-rv3028.c
> index ec5d7a614e2d..da2ae81fe7c8 100644
> --- a/drivers/rtc/rtc-rv3028.c
> +++ b/drivers/rtc/rtc-rv3028.c
> @@ -859,7 +859,8 @@ static int rv3028_probe(struct i2c_client *client)
>  {
>  	struct rv3028_data *rv3028;
>  	int ret, status;
> -	u32 ohms;
> +	s32 ohms;
> +	int val_old, val;
>  	struct nvmem_config nvmem_cfg = {
>  		.name = "rv3028_nvram",
>  		.word_size = 1,
> @@ -937,22 +938,42 @@ static int rv3028_probe(struct i2c_client *client)
>  	if (ret)
>  		return ret;
>  
> -	/* setup trickle charger */
> -	if (!device_property_read_u32(&client->dev, "trickle-resistor-ohms",
> -				      &ohms)) {
> -		int i;
> +	ret = regmap_read(rv3028->regmap, RV3028_BACKUP, &val_old);
> +	if (ret < 0)
> +		return ret;
> +
> +	/* mask out only trickle charger bits */
> +	val_old = val_old & (RV3028_BACKUP_TCE | RV3028_BACKUP_TCR_MASK);
>  
> -		for (i = 0; i < ARRAY_SIZE(rv3028_trickle_resistors); i++)
> -			if (ohms == rv3028_trickle_resistors[i])
> -				break;
> +	/* setup trickle charger */
> +	if (!of_property_read_s32(client->dev.of_node, "trickle-resistor-ohms",
> +				  &ohms)) {
> +		/* disable trickle charger if trickle-resistor-ohms = <(-1)>; */
> +		if (ohms == -1) {
> +			val = val_old & ~RV3028_BACKUP_TCE;
> +		} else {
> +			int i;
> +
> +			for (i = 0; i < ARRAY_SIZE(rv3028_trickle_resistors); i++)
> +				if (ohms == rv3028_trickle_resistors[i])
> +					break;
> +
> +			if (i < ARRAY_SIZE(rv3028_trickle_resistors)) {
> +				/* enable trickle charger and its resistor */
> +				val = RV3028_BACKUP_TCE | i;
> +			} else {
> +				dev_warn(&client->dev, "invalid trickle resistor value\n");
> +				/* don't update the trickle charger regs */
> +				val = val_old;
> +			}
> +		}
>  
> -		if (i < ARRAY_SIZE(rv3028_trickle_resistors)) {
> +		/* only update EEPROM if changes are necessary */
> +		if (val_old != val) {
>  			ret = rv3028_update_cfg(rv3028, RV3028_BACKUP, RV3028_BACKUP_TCE |
> -						 RV3028_BACKUP_TCR_MASK, RV3028_BACKUP_TCE | i);
> +						RV3028_BACKUP_TCR_MASK, val);
>  			if (ret)
>  				return ret;
> -		} else {
> -			dev_warn(&client->dev, "invalid trickle resistor value\n");
>  		}
>  	}
>  
> -- 
> 2.25.1
> 

-- 
Alexandre Belloni, co-owner and COO, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com

  reply	other threads:[~2023-06-22  7:35 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-06-22  7:16 [PATCH v2] rtc: rv3028: Improve trickle charger logic Andrej Picej
2023-06-22  7:34 ` Alexandre Belloni [this message]
2023-06-22  8:09   ` Andrej Picej

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20230622073458dcd9f636@mail.local \
    --to=alexandre.belloni@bootlin.com \
    --cc=a.zummo@towertech.it \
    --cc=andrej.picej@norik.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-rtc@vger.kernel.org \
    --cc=upstream@phytec.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.