diff mbox series

[v2] power: supply: bq25890: Add support for setting IINLIM

Message ID 20220801025727.778218-1-marex@denx.de (mailing list archive)
State Handled Elsewhere, archived
Headers show
Series [v2] power: supply: bq25890: Add support for setting IINLIM | expand

Commit Message

Marek Vasut Aug. 1, 2022, 2:57 a.m. UTC
Let user set input current limit via sysfs. This is useful in case there
are multiple chargers connected to the device, each of which with its own
arbitrary maximum current which it can provide, some of which may provide
more than the default 500mA. In that case, userspace can listen for plug
events generated by each charger and adjust the current limit accordingly,
e.g. to permit battery to charge faster.

Note that the IINLIM is reset every time the bq25890 is disconnected from
a charger, so the userspace must adjust the limit repeatly on every plug
event.

Signed-off-by: Marek Vasut <marex@denx.de>
---
Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Cc: Hans de Goede <hdegoede@redhat.com>
Cc: Sebastian Reichel <sebastian.reichel@collabora.com>
To: linux-pm@vger.kernel.org
---
V2: Use bq25890_find_idx(val->intval, F_IINLIM) instead of ad-hoc division
---
 drivers/power/supply/bq25890_charger.c | 29 ++++++++++++++++++++++++++
 1 file changed, 29 insertions(+)

Comments

Hans de Goede Aug. 1, 2022, 7:15 a.m. UTC | #1
Hi,

On 8/1/22 04:57, Marek Vasut wrote:
> Let user set input current limit via sysfs. This is useful in case there
> are multiple chargers connected to the device, each of which with its own
> arbitrary maximum current which it can provide, some of which may provide
> more than the default 500mA. In that case, userspace can listen for plug
> events generated by each charger and adjust the current limit accordingly,
> e.g. to permit battery to charge faster.
> 
> Note that the IINLIM is reset every time the bq25890 is disconnected from
> a charger, so the userspace must adjust the limit repeatly on every plug
> event.
> 
> Signed-off-by: Marek Vasut <marex@denx.de>

Thanks, patch looks good to me:

Reviewed-by: Hans de Goede <hdegoede@redhat.com>

Regards,

Hans


> ---
> Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> Cc: Hans de Goede <hdegoede@redhat.com>
> Cc: Sebastian Reichel <sebastian.reichel@collabora.com>
> To: linux-pm@vger.kernel.org
> ---
> V2: Use bq25890_find_idx(val->intval, F_IINLIM) instead of ad-hoc division
> ---
>  drivers/power/supply/bq25890_charger.c | 29 ++++++++++++++++++++++++++
>  1 file changed, 29 insertions(+)
> 
> diff --git a/drivers/power/supply/bq25890_charger.c b/drivers/power/supply/bq25890_charger.c
> index 131ec7d882fe9..892609f9dd250 100644
> --- a/drivers/power/supply/bq25890_charger.c
> +++ b/drivers/power/supply/bq25890_charger.c
> @@ -613,6 +613,33 @@ static int bq25890_power_supply_get_property(struct power_supply *psy,
>  	return 0;
>  }
>  
> +static int bq25890_power_supply_set_property(struct power_supply *psy,
> +					     enum power_supply_property psp,
> +					     const union power_supply_propval *val)
> +{
> +	struct bq25890_device *bq = power_supply_get_drvdata(psy);
> +	u8 lval;
> +
> +	switch (psp) {
> +	case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
> +		lval = bq25890_find_idx(val->intval, F_IINLIM);
> +		return bq25890_field_write(bq, F_IINLIM, lval);
> +	default:
> +		return -EINVAL;
> +	}
> +}
> +
> +static int bq25890_power_supply_property_is_writeable(struct power_supply *psy,
> +						      enum power_supply_property psp)
> +{
> +	switch (psp) {
> +	case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
> +		return true;
> +	default:
> +		return false;
> +	}
> +}
> +
>  static int bq25890_get_chip_state(struct bq25890_device *bq,
>  				  struct bq25890_state *state)
>  {
> @@ -837,6 +864,8 @@ static const struct power_supply_desc bq25890_power_supply_desc = {
>  	.properties = bq25890_power_supply_props,
>  	.num_properties = ARRAY_SIZE(bq25890_power_supply_props),
>  	.get_property = bq25890_power_supply_get_property,
> +	.set_property = bq25890_power_supply_set_property,
> +	.property_is_writeable = bq25890_power_supply_property_is_writeable,
>  };
>  
>  static int bq25890_power_supply_init(struct bq25890_device *bq)
Marek Vasut Aug. 23, 2022, 3:59 p.m. UTC | #2
On 8/1/22 09:15, Hans de Goede wrote:
> Hi,

Hi,

> On 8/1/22 04:57, Marek Vasut wrote:
>> Let user set input current limit via sysfs. This is useful in case there
>> are multiple chargers connected to the device, each of which with its own
>> arbitrary maximum current which it can provide, some of which may provide
>> more than the default 500mA. In that case, userspace can listen for plug
>> events generated by each charger and adjust the current limit accordingly,
>> e.g. to permit battery to charge faster.
>>
>> Note that the IINLIM is reset every time the bq25890 is disconnected from
>> a charger, so the userspace must adjust the limit repeatly on every plug
>> event.
>>
>> Signed-off-by: Marek Vasut <marex@denx.de>
> 
> Thanks, patch looks good to me:
> 
> Reviewed-by: Hans de Goede <hdegoede@redhat.com>

Can this be applied now ?
Sebastian Reichel Sept. 11, 2022, 12:43 p.m. UTC | #3
Hi,

On Tue, Aug 23, 2022 at 05:59:33PM +0200, Marek Vasut wrote:
> On 8/1/22 09:15, Hans de Goede wrote:
> > On 8/1/22 04:57, Marek Vasut wrote:
> > > Let user set input current limit via sysfs. This is useful in case there
> > > are multiple chargers connected to the device, each of which with its own
> > > arbitrary maximum current which it can provide, some of which may provide
> > > more than the default 500mA. In that case, userspace can listen for plug
> > > events generated by each charger and adjust the current limit accordingly,
> > > e.g. to permit battery to charge faster.
> > > 
> > > Note that the IINLIM is reset every time the bq25890 is disconnected from
> > > a charger, so the userspace must adjust the limit repeatly on every plug
> > > event.
> > > 
> > > Signed-off-by: Marek Vasut <marex@denx.de>
> > 
> > Thanks, patch looks good to me:
> > 
> > Reviewed-by: Hans de Goede <hdegoede@redhat.com>
> 
> Can this be applied now ?

Thanks, queued to power-supply's for-next branch.

Please make sure you are sending patches based on recent for-next
branch next time. Your patch was from before eab25b4f93aa ("power:
supply: bq25890: On the bq25892 set the IINLIM based on external
charger detection") which was added in 5.18 :(

-- Sebastian
diff mbox series

Patch

diff --git a/drivers/power/supply/bq25890_charger.c b/drivers/power/supply/bq25890_charger.c
index 131ec7d882fe9..892609f9dd250 100644
--- a/drivers/power/supply/bq25890_charger.c
+++ b/drivers/power/supply/bq25890_charger.c
@@ -613,6 +613,33 @@  static int bq25890_power_supply_get_property(struct power_supply *psy,
 	return 0;
 }
 
+static int bq25890_power_supply_set_property(struct power_supply *psy,
+					     enum power_supply_property psp,
+					     const union power_supply_propval *val)
+{
+	struct bq25890_device *bq = power_supply_get_drvdata(psy);
+	u8 lval;
+
+	switch (psp) {
+	case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
+		lval = bq25890_find_idx(val->intval, F_IINLIM);
+		return bq25890_field_write(bq, F_IINLIM, lval);
+	default:
+		return -EINVAL;
+	}
+}
+
+static int bq25890_power_supply_property_is_writeable(struct power_supply *psy,
+						      enum power_supply_property psp)
+{
+	switch (psp) {
+	case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
+		return true;
+	default:
+		return false;
+	}
+}
+
 static int bq25890_get_chip_state(struct bq25890_device *bq,
 				  struct bq25890_state *state)
 {
@@ -837,6 +864,8 @@  static const struct power_supply_desc bq25890_power_supply_desc = {
 	.properties = bq25890_power_supply_props,
 	.num_properties = ARRAY_SIZE(bq25890_power_supply_props),
 	.get_property = bq25890_power_supply_get_property,
+	.set_property = bq25890_power_supply_set_property,
+	.property_is_writeable = bq25890_power_supply_property_is_writeable,
 };
 
 static int bq25890_power_supply_init(struct bq25890_device *bq)