diff mbox series

[3/7] power: supply: bq25890: Clean up POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE

Message ID 20221010210310.165461-3-marex@denx.de (mailing list archive)
State Handled Elsewhere, archived
Headers show
Series [1/7] power: supply: bq25890: Document POWER_SUPPLY_PROP_CURRENT_NOW | expand

Commit Message

Marek Vasut Oct. 10, 2022, 9:03 p.m. UTC
Clean up misuse of POWER_SUPPLY_PROP_VOLTAGE,
POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX
and POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE
and document what exactly each value means.

The POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE content is newly read
back from hardware, while POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX
is reported as the maximum value set in DT.

The POWER_SUPPLY_PROP_VOLTAGE is newly used to report immediate value
of battery voltage V_BAT, which is what this property was intended to
report and which has been thus far misused to report the charger chip
output voltage V_SYS.

The V_SYS is no longer reported as there is currently no suitable
property to report V_SYS. V_SYS reporting will be reinstated in
subsequent patch.

Signed-off-by: Marek Vasut <marex@denx.de>
---
Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Cc: Hans de Goede <hdegoede@redhat.com>
Cc: Michał Mirosław <mirq-linux@rere.qmqm.pl>
Cc: Sebastian Reichel <sebastian.reichel@collabora.com>
To: linux-pm@vger.kernel.org
---
 drivers/power/supply/bq25890_charger.c | 76 +++++++++++++++++---------
 1 file changed, 49 insertions(+), 27 deletions(-)

Comments

Hans de Goede Oct. 12, 2022, 7:56 p.m. UTC | #1
Hi,

On 10/10/22 23:03, Marek Vasut wrote:
> Clean up misuse of POWER_SUPPLY_PROP_VOLTAGE,
> POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX
> and POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE
> and document what exactly each value means.
> 
> The POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE content is newly read
> back from hardware, while POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX
> is reported as the maximum value set in DT.
> 
> The POWER_SUPPLY_PROP_VOLTAGE is newly used to report immediate value
> of battery voltage V_BAT, which is what this property was intended to
> report and which has been thus far misused to report the charger chip
> output voltage V_SYS.
> 
> The V_SYS is no longer reported as there is currently no suitable
> property to report V_SYS. V_SYS reporting will be reinstated in
> subsequent patch.
> 
> Signed-off-by: Marek Vasut <marex@denx.de>
> ---
> Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> Cc: Hans de Goede <hdegoede@redhat.com>
> Cc: Michał Mirosław <mirq-linux@rere.qmqm.pl>
> Cc: Sebastian Reichel <sebastian.reichel@collabora.com>
> To: linux-pm@vger.kernel.org
> ---
>  drivers/power/supply/bq25890_charger.c | 76 +++++++++++++++++---------
>  1 file changed, 49 insertions(+), 27 deletions(-)
> 
> diff --git a/drivers/power/supply/bq25890_charger.c b/drivers/power/supply/bq25890_charger.c
> index 5924b036b1588..7632aad8bf0a1 100644
> --- a/drivers/power/supply/bq25890_charger.c
> +++ b/drivers/power/supply/bq25890_charger.c
> @@ -529,24 +529,6 @@ static int bq25890_power_supply_get_property(struct power_supply *psy,
>  			val->intval = POWER_SUPPLY_HEALTH_UNSPEC_FAILURE;
>  		break;
>  
> -	case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
> -		if (!state.online) {
> -			val->intval = 0;
> -			break;
> -		}
> -
> -		ret = bq25890_field_read(bq, F_BATV); /* read measured value */
> -		if (ret < 0)
> -			return ret;
> -
> -		/* converted_val = 2.304V + ADC_val * 20mV (table 10.3.15) */
> -		val->intval = 2304000 + ret * 20000;
> -		break;
> -
> -	case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX:
> -		val->intval = bq25890_find_val(bq->init_data.vreg, TBL_VREG);
> -		break;
> -
>  	case POWER_SUPPLY_PROP_PRECHARGE_CURRENT:
>  		val->intval = bq25890_find_val(bq->init_data.iprechg, TBL_ITERM);
>  		break;
> @@ -563,15 +545,6 @@ static int bq25890_power_supply_get_property(struct power_supply *psy,
>  		val->intval = bq25890_find_val(ret, TBL_IINLIM);
>  		break;
>  
> -	case POWER_SUPPLY_PROP_VOLTAGE_NOW:
> -		ret = bq25890_field_read(bq, F_SYSV); /* read measured value */
> -		if (ret < 0)
> -			return ret;
> -
> -		/* converted_val = 2.304V + ADC_val * 20mV (table 10.3.15) */
> -		val->intval = 2304000 + ret * 20000;
> -		break;
> -
>  	case POWER_SUPPLY_PROP_CURRENT_NOW:	/* I_BAT now */
>  		/*
>  		 * This is ADC-sampled immediate charge current supplied
> @@ -628,6 +601,55 @@ static int bq25890_power_supply_get_property(struct power_supply *psy,
>  		val->intval = bq25890_find_val(bq->init_data.ichg, TBL_ICHG);
>  		break;
>  
> +	case POWER_SUPPLY_PROP_VOLTAGE_NOW:	/* V_BAT now */
> +		/*
> +		 * This is ADC-sampled immediate charge voltage supplied
> +		 * from charger to battery. The property name is confusing,
> +		 * for clarification refer to:
> +		 * Documentation/ABI/testing/sysfs-class-power
> +		 * /sys/class/power_supply/<supply_name>/voltage_now
> +		 */
> +		if (!state.online) {
> +			val->intval = 0;
> +			break;
> +		}

I see that this 'if (!state.online) { }' block was also there in the original
POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE code, but I wonder why this is here?

Does the bq25890 not support sampling the battery voltage when discharging/
when running from the battery as power-source ?

I would expect the battery voltage sampling to work fine when discharging
too, and this is useful into to have during discharge too. Especially when
there is no fuel-gauge ...

> +
> +		ret = bq25890_field_read(bq, F_BATV); /* read measured value */
> +		if (ret < 0)
> +			return ret;
> +
> +		/* converted_val = 2.304V + ADC_val * 20mV (table 10.3.15) */
> +		val->intval = 2304000 + ret * 20000;
> +		break;
> +
> +	case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:	/* V_BAT user limit */
> +		/*
> +		 * This is user-configured constant charge voltage supplied
> +		 * from charger to battery in second phase of charging, when
> +		 * battery voltage reached constant charge voltage.
> +		 *
> +		 * This value reflects the current hardware setting.
> +		 *
> +		 * The POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX is the
> +		 * maximum value of this property.
> +		 */
> +		ret = bq25890_field_read(bq, F_VREG);
> +		if (ret < 0)
> +			return ret;
> +		val->intval = bq25890_find_val(ret, TBL_VREG);
> +		break;
> +
> +	case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX:	/* V_BAT max */
> +		/*
> +		 * This is maximum allowed constant charge voltage supplied
> +		 * from charger to battery in second phase of charging, when
> +		 * battery voltage reached constant charge voltage.
> +		 *
> +		 * This value is constant for each battery and set from DT.
> +		 */
> +		val->intval = bq25890_find_val(bq->init_data.vreg, TBL_VREG);
> +		break;
> +
>  	case POWER_SUPPLY_PROP_TEMP:
>  		ret = bq25890_field_read(bq, F_TSPCT);
>  		if (ret < 0)


Otherwise this looks good to me.

Regards,

Hans
Marek Vasut Oct. 12, 2022, 9:36 p.m. UTC | #2
On 10/12/22 21:56, Hans de Goede wrote:
> Hi,

Hi,

> On 10/10/22 23:03, Marek Vasut wrote:
>> Clean up misuse of POWER_SUPPLY_PROP_VOLTAGE,
>> POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX
>> and POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE
>> and document what exactly each value means.
>>
>> The POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE content is newly read
>> back from hardware, while POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX
>> is reported as the maximum value set in DT.
>>
>> The POWER_SUPPLY_PROP_VOLTAGE is newly used to report immediate value
>> of battery voltage V_BAT, which is what this property was intended to
>> report and which has been thus far misused to report the charger chip
>> output voltage V_SYS.
>>
>> The V_SYS is no longer reported as there is currently no suitable
>> property to report V_SYS. V_SYS reporting will be reinstated in
>> subsequent patch.
>>
>> Signed-off-by: Marek Vasut <marex@denx.de>
>> ---
>> Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
>> Cc: Hans de Goede <hdegoede@redhat.com>
>> Cc: Michał Mirosław <mirq-linux@rere.qmqm.pl>
>> Cc: Sebastian Reichel <sebastian.reichel@collabora.com>
>> To: linux-pm@vger.kernel.org
>> ---
>>   drivers/power/supply/bq25890_charger.c | 76 +++++++++++++++++---------
>>   1 file changed, 49 insertions(+), 27 deletions(-)
>>
>> diff --git a/drivers/power/supply/bq25890_charger.c b/drivers/power/supply/bq25890_charger.c
>> index 5924b036b1588..7632aad8bf0a1 100644
>> --- a/drivers/power/supply/bq25890_charger.c
>> +++ b/drivers/power/supply/bq25890_charger.c
>> @@ -529,24 +529,6 @@ static int bq25890_power_supply_get_property(struct power_supply *psy,
>>   			val->intval = POWER_SUPPLY_HEALTH_UNSPEC_FAILURE;
>>   		break;
>>   
>> -	case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
>> -		if (!state.online) {
>> -			val->intval = 0;
>> -			break;
>> -		}
>> -
>> -		ret = bq25890_field_read(bq, F_BATV); /* read measured value */
>> -		if (ret < 0)
>> -			return ret;
>> -
>> -		/* converted_val = 2.304V + ADC_val * 20mV (table 10.3.15) */
>> -		val->intval = 2304000 + ret * 20000;
>> -		break;
>> -
>> -	case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX:
>> -		val->intval = bq25890_find_val(bq->init_data.vreg, TBL_VREG);
>> -		break;
>> -
>>   	case POWER_SUPPLY_PROP_PRECHARGE_CURRENT:
>>   		val->intval = bq25890_find_val(bq->init_data.iprechg, TBL_ITERM);
>>   		break;
>> @@ -563,15 +545,6 @@ static int bq25890_power_supply_get_property(struct power_supply *psy,
>>   		val->intval = bq25890_find_val(ret, TBL_IINLIM);
>>   		break;
>>   
>> -	case POWER_SUPPLY_PROP_VOLTAGE_NOW:
>> -		ret = bq25890_field_read(bq, F_SYSV); /* read measured value */
>> -		if (ret < 0)
>> -			return ret;
>> -
>> -		/* converted_val = 2.304V + ADC_val * 20mV (table 10.3.15) */
>> -		val->intval = 2304000 + ret * 20000;
>> -		break;
>> -
>>   	case POWER_SUPPLY_PROP_CURRENT_NOW:	/* I_BAT now */
>>   		/*
>>   		 * This is ADC-sampled immediate charge current supplied
>> @@ -628,6 +601,55 @@ static int bq25890_power_supply_get_property(struct power_supply *psy,
>>   		val->intval = bq25890_find_val(bq->init_data.ichg, TBL_ICHG);
>>   		break;
>>   
>> +	case POWER_SUPPLY_PROP_VOLTAGE_NOW:	/* V_BAT now */
>> +		/*
>> +		 * This is ADC-sampled immediate charge voltage supplied
>> +		 * from charger to battery. The property name is confusing,
>> +		 * for clarification refer to:
>> +		 * Documentation/ABI/testing/sysfs-class-power
>> +		 * /sys/class/power_supply/<supply_name>/voltage_now
>> +		 */
>> +		if (!state.online) {
>> +			val->intval = 0;
>> +			break;
>> +		}
> 
> I see that this 'if (!state.online) { }' block was also there in the original
> POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE code, but I wonder why this is here?
> 
> Does the bq25890 not support sampling the battery voltage when discharging/
> when running from the battery as power-source ?
> 
> I would expect the battery voltage sampling to work fine when discharging
> too, and this is useful into to have during discharge too. Especially when
> there is no fuel-gauge ...

This does work fine while discharging too, so I'll drop the 
!state.online check .
diff mbox series

Patch

diff --git a/drivers/power/supply/bq25890_charger.c b/drivers/power/supply/bq25890_charger.c
index 5924b036b1588..7632aad8bf0a1 100644
--- a/drivers/power/supply/bq25890_charger.c
+++ b/drivers/power/supply/bq25890_charger.c
@@ -529,24 +529,6 @@  static int bq25890_power_supply_get_property(struct power_supply *psy,
 			val->intval = POWER_SUPPLY_HEALTH_UNSPEC_FAILURE;
 		break;
 
-	case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:
-		if (!state.online) {
-			val->intval = 0;
-			break;
-		}
-
-		ret = bq25890_field_read(bq, F_BATV); /* read measured value */
-		if (ret < 0)
-			return ret;
-
-		/* converted_val = 2.304V + ADC_val * 20mV (table 10.3.15) */
-		val->intval = 2304000 + ret * 20000;
-		break;
-
-	case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX:
-		val->intval = bq25890_find_val(bq->init_data.vreg, TBL_VREG);
-		break;
-
 	case POWER_SUPPLY_PROP_PRECHARGE_CURRENT:
 		val->intval = bq25890_find_val(bq->init_data.iprechg, TBL_ITERM);
 		break;
@@ -563,15 +545,6 @@  static int bq25890_power_supply_get_property(struct power_supply *psy,
 		val->intval = bq25890_find_val(ret, TBL_IINLIM);
 		break;
 
-	case POWER_SUPPLY_PROP_VOLTAGE_NOW:
-		ret = bq25890_field_read(bq, F_SYSV); /* read measured value */
-		if (ret < 0)
-			return ret;
-
-		/* converted_val = 2.304V + ADC_val * 20mV (table 10.3.15) */
-		val->intval = 2304000 + ret * 20000;
-		break;
-
 	case POWER_SUPPLY_PROP_CURRENT_NOW:	/* I_BAT now */
 		/*
 		 * This is ADC-sampled immediate charge current supplied
@@ -628,6 +601,55 @@  static int bq25890_power_supply_get_property(struct power_supply *psy,
 		val->intval = bq25890_find_val(bq->init_data.ichg, TBL_ICHG);
 		break;
 
+	case POWER_SUPPLY_PROP_VOLTAGE_NOW:	/* V_BAT now */
+		/*
+		 * This is ADC-sampled immediate charge voltage supplied
+		 * from charger to battery. The property name is confusing,
+		 * for clarification refer to:
+		 * Documentation/ABI/testing/sysfs-class-power
+		 * /sys/class/power_supply/<supply_name>/voltage_now
+		 */
+		if (!state.online) {
+			val->intval = 0;
+			break;
+		}
+
+		ret = bq25890_field_read(bq, F_BATV); /* read measured value */
+		if (ret < 0)
+			return ret;
+
+		/* converted_val = 2.304V + ADC_val * 20mV (table 10.3.15) */
+		val->intval = 2304000 + ret * 20000;
+		break;
+
+	case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE:	/* V_BAT user limit */
+		/*
+		 * This is user-configured constant charge voltage supplied
+		 * from charger to battery in second phase of charging, when
+		 * battery voltage reached constant charge voltage.
+		 *
+		 * This value reflects the current hardware setting.
+		 *
+		 * The POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX is the
+		 * maximum value of this property.
+		 */
+		ret = bq25890_field_read(bq, F_VREG);
+		if (ret < 0)
+			return ret;
+		val->intval = bq25890_find_val(ret, TBL_VREG);
+		break;
+
+	case POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX:	/* V_BAT max */
+		/*
+		 * This is maximum allowed constant charge voltage supplied
+		 * from charger to battery in second phase of charging, when
+		 * battery voltage reached constant charge voltage.
+		 *
+		 * This value is constant for each battery and set from DT.
+		 */
+		val->intval = bq25890_find_val(bq->init_data.vreg, TBL_VREG);
+		break;
+
 	case POWER_SUPPLY_PROP_TEMP:
 		ret = bq25890_field_read(bq, F_TSPCT);
 		if (ret < 0)