Linux Power Management development
 help / color / mirror / Atom feed
From: Sebastian Reichel <sebastian.reichel@collabora.com>
To: Vincent Cloutier <vincent.cloutier@icloud.com>
Cc: Hans de Goede <hansg@kernel.org>,
	 Krzysztof Kozlowski <krzk@kernel.org>,
	Marek Szyprowski <m.szyprowski@samsung.com>,
	 Sebastian Krzyszkowiak <sebastian.krzyszkowiak@puri.sm>,
	Purism Kernel Team <kernel@puri.sm>,
	linux-pm@vger.kernel.org,  linux-kernel@vger.kernel.org,
	Vincent Cloutier <vincent@cloutier.co>
Subject: Re: [PATCH v1 8/9] power: supply: Read MAX17042 battery info before registration
Date: Thu, 4 Jun 2026 18:37:46 +0200	[thread overview]
Message-ID: <aiGkI-JDc-6H5e07@venus> (raw)
In-Reply-To: <20260406205759.493288-9-vincent.cloutier@icloud.com>

[-- Attachment #1: Type: text/plain, Size: 19066 bytes --]

Hi,

On Mon, Apr 06, 2026 at 04:57:56PM -0400, Vincent Cloutier wrote:
> From: Vincent Cloutier <vincent@cloutier.co>
> 
> Rework the MAX17042 `monitored-battery` path so the driver can consume DT
> battery information before registering its power-supply device.
> 
> To do that, factor the parser in `power_supply_core` behind a new
> `devm_power_supply_get_battery_info()` helper and let battery drivers
> pass the pre-parsed `battery_info` through `struct power_supply_config`.
> MAX17042 can then apply the design-capacity and termination-current data
> before registration without exposing the battery too early or reparsing
> the same node later in the class core.
> 
> Signed-off-by: Vincent Cloutier <vincent@cloutier.co>
> ---

This is multiple patches. One to change the power-supply core and
one to change the driver. Apart from that I would prefer a slightly
different solution:

Create a new init callback, which is called from the power-supply
registration method (__power_supply_register) before device_add() is
being called. At this point it's okay to call
power_supply_get_battery_info() and for POWER_SUPPLY_TYPE_BATTERY
devices psy->battery_info is already initialized.

Greetings,

-- Sebastian

>  drivers/power/supply/max17042_battery.c  |  62 ++++++++
>  drivers/power/supply/power_supply_core.c | 188 ++++++++++++++---------
>  include/linux/power/max17042_battery.h   |   1 +
>  include/linux/power_supply.h             |  10 ++
>  4 files changed, 187 insertions(+), 74 deletions(-)
> 
> diff --git a/drivers/power/supply/max17042_battery.c b/drivers/power/supply/max17042_battery.c
> index 793164bd55d9..5bf15c19fc5d 100644
> --- a/drivers/power/supply/max17042_battery.c
> +++ b/drivers/power/supply/max17042_battery.c
> @@ -1025,6 +1025,57 @@ static int max17042_init_defaults(struct max17042_chip *chip)
>  	return 0;
>  }
>  
> +static int max17042_apply_battery_properties(struct max17042_chip *chip,
> +					     struct power_supply_battery_info *info)
> +{
> +	struct device *dev = chip->dev;
> +	bool needs_config;
> +	u64 data64;
> +
> +	if (!info)
> +		return 0;
> +
> +	needs_config = (chip->enable_current_sense &&
> +			(info->charge_full_design_uah != -EINVAL ||
> +			 info->charge_term_current_ua != -EINVAL)) ||
> +		       (chip->chip_type == MAXIM_DEVICE_TYPE_MAX17055 &&
> +			info->voltage_max_design_uv > 4250000);
> +	if (!needs_config)
> +		return 0;
> +
> +	if (!chip->config_data) {
> +		chip->config_data = devm_kzalloc(dev,
> +						 sizeof(*chip->config_data),
> +						 GFP_KERNEL);
> +		if (!chip->config_data)
> +			return -ENOMEM;
> +	}
> +
> +	if (chip->enable_current_sense &&
> +	    info->charge_full_design_uah != -EINVAL) {
> +		data64 = (u64)info->charge_full_design_uah * chip->r_sns;
> +		do_div(data64, MAX17042_CAPACITY_LSB);
> +		chip->config_data->design_cap = (u16)data64;
> +		chip->enable_por_init = true;
> +	}
> +
> +	if (chip->enable_current_sense &&
> +	    info->charge_term_current_ua != -EINVAL) {
> +		data64 = (u64)info->charge_term_current_ua * chip->r_sns;
> +		do_div(data64, MAX17042_CURRENT_LSB);
> +		chip->config_data->ichgt_term = (u16)data64;
> +		chip->enable_por_init = true;
> +	}
> +
> +	if (chip->chip_type == MAXIM_DEVICE_TYPE_MAX17055 &&
> +	    info->voltage_max_design_uv > 4250000) {
> +		chip->config_data->model_cfg = MAX17055_MODELCFG_VCHG_BIT;
> +		chip->enable_por_init = true;
> +	}
> +
> +	return 0;
> +}
> +
>  static const struct regmap_config max17042_regmap_config = {
>  	.name = "max17042",
>  	.reg_bits = 8,
> @@ -1060,6 +1111,7 @@ static int max17042_probe(struct i2c_client *client, struct device *dev, int irq
>  	const struct power_supply_desc *max17042_desc = &max17042_psy_desc;
>  	struct power_supply_config psy_cfg = {};
>  	struct max17042_chip *chip;
> +	struct power_supply_battery_info *battery_info = NULL;
>  	int ret;
>  	u32 val;
>  	bool use_default_config = false;
> @@ -1106,12 +1158,22 @@ static int max17042_probe(struct i2c_client *client, struct device *dev, int irq
>  	if (chip->r_sns == 0)
>  		chip->r_sns = MAX17042_DEFAULT_SNS_RESISTOR;
>  
> +	ret = devm_power_supply_get_battery_info(dev, &battery_info);
> +	if (ret && ret != -ENODEV && ret != -ENOENT)
> +		return ret;
> +
> +	ret = max17042_apply_battery_properties(chip, battery_info);
> +	if (ret)
> +		return ret;
> +
>  	if (!chip->enable_current_sense) {
>  		regmap_write(chip->regmap, MAX17042_CGAIN, 0x0000);
>  		regmap_write(chip->regmap, MAX17042_MiscCFG, 0x0003);
>  		regmap_write(chip->regmap, MAX17042_LearnCFG, 0x0007);
>  	}
>  
> +	psy_cfg.battery_info = battery_info;
> +
>  	chip->battery = devm_power_supply_register(dev, max17042_desc,
>  						   &psy_cfg);
>  	if (IS_ERR(chip->battery))
> diff --git a/drivers/power/supply/power_supply_core.c b/drivers/power/supply/power_supply_core.c
> index a446d3d086fc..7ca3ed34095e 100644
> --- a/drivers/power/supply/power_supply_core.c
> +++ b/drivers/power/supply/power_supply_core.c
> @@ -577,20 +577,76 @@ struct power_supply *devm_power_supply_get_by_reference(struct device *dev,
>  }
>  EXPORT_SYMBOL_GPL(devm_power_supply_get_by_reference);
>  
> -int power_supply_get_battery_info(struct power_supply *psy,
> -				  struct power_supply_battery_info **info_out)
> +static void __power_supply_put_battery_info(struct device *dev,
> +					    struct power_supply_battery_info *info)
> +{
> +	int i;
> +
> +	for (i = 0; i < POWER_SUPPLY_OCV_TEMP_MAX; i++) {
> +		if (info->ocv_table[i])
> +			devm_kfree(dev, info->ocv_table[i]);
> +	}
> +
> +	if (info->resist_table)
> +		devm_kfree(dev, info->resist_table);
> +
> +	devm_kfree(dev, info);
> +}
> +
> +static void power_supply_init_battery_info(struct power_supply_battery_info *info)
> +{
> +	int index;
> +
> +	info->technology = POWER_SUPPLY_TECHNOLOGY_UNKNOWN;
> +	info->energy_full_design_uwh = -EINVAL;
> +	info->charge_full_design_uah = -EINVAL;
> +	info->voltage_min_design_uv = -EINVAL;
> +	info->voltage_max_design_uv = -EINVAL;
> +	info->precharge_current_ua = -EINVAL;
> +	info->charge_term_current_ua = -EINVAL;
> +	info->constant_charge_current_max_ua = -EINVAL;
> +	info->constant_charge_voltage_max_uv = -EINVAL;
> +	info->tricklecharge_current_ua = -EINVAL;
> +	info->precharge_voltage_max_uv = -EINVAL;
> +	info->charge_restart_voltage_uv = -EINVAL;
> +	info->overvoltage_limit_uv = -EINVAL;
> +	info->maintenance_charge = NULL;
> +	info->alert_low_temp_charge_current_ua = -EINVAL;
> +	info->alert_low_temp_charge_voltage_uv = -EINVAL;
> +	info->alert_high_temp_charge_current_ua = -EINVAL;
> +	info->alert_high_temp_charge_voltage_uv = -EINVAL;
> +	info->temp_ambient_alert_min = INT_MIN;
> +	info->temp_ambient_alert_max = INT_MAX;
> +	info->temp_alert_min = INT_MIN;
> +	info->temp_alert_max = INT_MAX;
> +	info->temp_min = INT_MIN;
> +	info->temp_max = INT_MAX;
> +	info->factory_internal_resistance_uohm = -EINVAL;
> +	info->resist_table = NULL;
> +	info->bti_resistance_ohm = -EINVAL;
> +	info->bti_resistance_tolerance = -EINVAL;
> +
> +	for (index = 0; index < POWER_SUPPLY_OCV_TEMP_MAX; index++) {
> +		info->ocv_table[index] = NULL;
> +		info->ocv_temp[index] = -EINVAL;
> +		info->ocv_table_size[index] = -EINVAL;
> +	}
> +}
> +
> +static int __power_supply_get_battery_info(struct device *dev,
> +					   struct fwnode_handle *srcnode,
> +					   struct power_supply_battery_info **info_out)
>  {
>  	struct power_supply_resistance_temp_table *resist_table;
>  	struct power_supply_battery_info *info;
> -	struct fwnode_handle *srcnode, *fwnode;
> +	struct fwnode_handle *fwnode;
>  	const char *value;
>  	int err, len, index, proplen;
>  	u32 *propdata __free(kfree) = NULL;
>  	u32 min_max[2];
>  
> -	srcnode = dev_fwnode(&psy->dev);
> -	if (!srcnode && psy->dev.parent)
> -		srcnode = dev_fwnode(psy->dev.parent);
> +	if (!srcnode)
> +		return -ENODEV;
>  
>  	fwnode = fwnode_find_reference(srcnode, "monitored-battery", 0);
>  	if (IS_ERR(fwnode))
> @@ -602,7 +658,7 @@ int power_supply_get_battery_info(struct power_supply *psy,
>  
>  
>  	/* Try static batteries first */
> -	err = samsung_sdi_battery_get_info(&psy->dev, value, &info);
> +	err = samsung_sdi_battery_get_info(dev, value, &info);
>  	if (!err)
>  		goto out_ret_pointer;
>  	else if (err == -ENODEV)
> @@ -617,46 +673,13 @@ int power_supply_get_battery_info(struct power_supply *psy,
>  		goto out_put_node;
>  	}
>  
> -	info = devm_kzalloc(&psy->dev, sizeof(*info), GFP_KERNEL);
> +	info = devm_kzalloc(dev, sizeof(*info), GFP_KERNEL);
>  	if (!info) {
>  		err = -ENOMEM;
>  		goto out_put_node;
>  	}
>  
> -	info->technology                     = POWER_SUPPLY_TECHNOLOGY_UNKNOWN;
> -	info->energy_full_design_uwh         = -EINVAL;
> -	info->charge_full_design_uah         = -EINVAL;
> -	info->voltage_min_design_uv          = -EINVAL;
> -	info->voltage_max_design_uv          = -EINVAL;
> -	info->precharge_current_ua           = -EINVAL;
> -	info->charge_term_current_ua         = -EINVAL;
> -	info->constant_charge_current_max_ua = -EINVAL;
> -	info->constant_charge_voltage_max_uv = -EINVAL;
> -	info->tricklecharge_current_ua       = -EINVAL;
> -	info->precharge_voltage_max_uv       = -EINVAL;
> -	info->charge_restart_voltage_uv      = -EINVAL;
> -	info->overvoltage_limit_uv           = -EINVAL;
> -	info->maintenance_charge             = NULL;
> -	info->alert_low_temp_charge_current_ua = -EINVAL;
> -	info->alert_low_temp_charge_voltage_uv = -EINVAL;
> -	info->alert_high_temp_charge_current_ua = -EINVAL;
> -	info->alert_high_temp_charge_voltage_uv = -EINVAL;
> -	info->temp_ambient_alert_min         = INT_MIN;
> -	info->temp_ambient_alert_max         = INT_MAX;
> -	info->temp_alert_min                 = INT_MIN;
> -	info->temp_alert_max                 = INT_MAX;
> -	info->temp_min                       = INT_MIN;
> -	info->temp_max                       = INT_MAX;
> -	info->factory_internal_resistance_uohm  = -EINVAL;
> -	info->resist_table                   = NULL;
> -	info->bti_resistance_ohm             = -EINVAL;
> -	info->bti_resistance_tolerance       = -EINVAL;
> -
> -	for (index = 0; index < POWER_SUPPLY_OCV_TEMP_MAX; index++) {
> -		info->ocv_table[index]       = NULL;
> -		info->ocv_temp[index]        = -EINVAL;
> -		info->ocv_table_size[index]  = -EINVAL;
> -	}
> +	power_supply_init_battery_info(info);
>  
>  	/* The property and field names below must correspond to elements
>  	 * in enum power_supply_property. For reasoning, see
> @@ -678,7 +701,7 @@ int power_supply_get_battery_info(struct power_supply *psy,
>  		else if (!strcmp("lithium-ion-manganese-oxide", value))
>  			info->technology = POWER_SUPPLY_TECHNOLOGY_LiMn;
>  		else
> -			dev_warn(&psy->dev, "%s unknown battery type\n", value);
> +			dev_warn(dev, "%s unknown battery type\n", value);
>  	}
>  
>  	fwnode_property_read_u32(fwnode, "energy-full-design-microwatt-hours",
> @@ -729,7 +752,7 @@ int power_supply_get_battery_info(struct power_supply *psy,
>  		err = len;
>  		goto out_put_node;
>  	} else if (len > POWER_SUPPLY_OCV_TEMP_MAX) {
> -		dev_err(&psy->dev, "Too many temperature values\n");
> +		dev_err(dev, "Too many temperature values\n");
>  		err = -EINVAL;
>  		goto out_put_node;
>  	} else if (len > 0) {
> @@ -744,28 +767,28 @@ int power_supply_get_battery_info(struct power_supply *psy,
>  		char *propname __free(kfree) = kasprintf(GFP_KERNEL, "ocv-capacity-table-%d",
>  							 index);
>  		if (!propname) {
> -			power_supply_put_battery_info(psy, info);
> +			__power_supply_put_battery_info(dev, info);
>  			err = -ENOMEM;
>  			goto out_put_node;
>  		}
>  		proplen = fwnode_property_count_u32(fwnode, propname);
>  		if (proplen < 0 || proplen % 2 != 0) {
> -			dev_err(&psy->dev, "failed to get %s\n", propname);
> -			power_supply_put_battery_info(psy, info);
> +			dev_err(dev, "failed to get %s\n", propname);
> +			__power_supply_put_battery_info(dev, info);
>  			err = -EINVAL;
>  			goto out_put_node;
>  		}
>  
>  		u32 *propdata __free(kfree) = kcalloc(proplen, sizeof(*propdata), GFP_KERNEL);
>  		if (!propdata) {
> -			power_supply_put_battery_info(psy, info);
> +			__power_supply_put_battery_info(dev, info);
>  			err = -EINVAL;
>  			goto out_put_node;
>  		}
>  		err = fwnode_property_read_u32_array(fwnode, propname, propdata, proplen);
>  		if (err < 0) {
> -			dev_err(&psy->dev, "failed to get %s\n", propname);
> -			power_supply_put_battery_info(psy, info);
> +			dev_err(dev, "failed to get %s\n", propname);
> +			__power_supply_put_battery_info(dev, info);
>  			goto out_put_node;
>  		}
>  
> @@ -773,9 +796,9 @@ int power_supply_get_battery_info(struct power_supply *psy,
>  		info->ocv_table_size[index] = tab_len;
>  
>  		info->ocv_table[index] = table =
> -			devm_kcalloc(&psy->dev, tab_len, sizeof(*table), GFP_KERNEL);
> +			devm_kcalloc(dev, tab_len, sizeof(*table), GFP_KERNEL);
>  		if (!info->ocv_table[index]) {
> -			power_supply_put_battery_info(psy, info);
> +			__power_supply_put_battery_info(dev, info);
>  			err = -ENOMEM;
>  			goto out_put_node;
>  		}
> @@ -791,14 +814,14 @@ int power_supply_get_battery_info(struct power_supply *psy,
>  		err = 0;
>  		goto out_ret_pointer;
>  	} else if (proplen < 0 || proplen % 2 != 0) {
> -		power_supply_put_battery_info(psy, info);
> +		__power_supply_put_battery_info(dev, info);
>  		err = (proplen < 0) ? proplen : -EINVAL;
>  		goto out_put_node;
>  	}
>  
>  	propdata = kcalloc(proplen, sizeof(*propdata), GFP_KERNEL);
>  	if (!propdata) {
> -		power_supply_put_battery_info(psy, info);
> +		__power_supply_put_battery_info(dev, info);
>  		err = -ENOMEM;
>  		goto out_put_node;
>  	}
> @@ -806,17 +829,17 @@ int power_supply_get_battery_info(struct power_supply *psy,
>  	err = fwnode_property_read_u32_array(fwnode, "resistance-temp-table",
>  					     propdata, proplen);
>  	if (err < 0) {
> -		power_supply_put_battery_info(psy, info);
> +		__power_supply_put_battery_info(dev, info);
>  		goto out_put_node;
>  	}
>  
>  	info->resist_table_size = proplen / 2;
> -	info->resist_table = resist_table = devm_kcalloc(&psy->dev,
> -							 info->resist_table_size,
> -							 sizeof(*resist_table),
> -							 GFP_KERNEL);
> +	info->resist_table = resist_table = devm_kcalloc(dev,
> +						 info->resist_table_size,
> +						 sizeof(*resist_table),
> +						 GFP_KERNEL);
>  	if (!info->resist_table) {
> -		power_supply_put_battery_info(psy, info);
> +		__power_supply_put_battery_info(dev, info);
>  		err = -ENOMEM;
>  		goto out_put_node;
>  	}
> @@ -834,22 +857,35 @@ int power_supply_get_battery_info(struct power_supply *psy,
>  	fwnode_handle_put(fwnode);
>  	return err;
>  }
> -EXPORT_SYMBOL_GPL(power_supply_get_battery_info);
>  
> -void power_supply_put_battery_info(struct power_supply *psy,
> -				   struct power_supply_battery_info *info)
> +int devm_power_supply_get_battery_info(struct device *dev,
> +					      struct power_supply_battery_info **info_out)
>  {
> -	int i;
> +	struct fwnode_handle *srcnode = dev_fwnode(dev);
>  
> -	for (i = 0; i < POWER_SUPPLY_OCV_TEMP_MAX; i++) {
> -		if (info->ocv_table[i])
> -			devm_kfree(&psy->dev, info->ocv_table[i]);
> -	}
> +	if (!srcnode && dev->parent)
> +		srcnode = dev_fwnode(dev->parent);
>  
> -	if (info->resist_table)
> -		devm_kfree(&psy->dev, info->resist_table);
> +	return __power_supply_get_battery_info(dev, srcnode, info_out);
> +}
> +EXPORT_SYMBOL_GPL(devm_power_supply_get_battery_info);
> +
> +int power_supply_get_battery_info(struct power_supply *psy,
> +				  struct power_supply_battery_info **info_out)
> +{
> +	struct fwnode_handle *srcnode = dev_fwnode(&psy->dev);
> +
> +	if (!srcnode && psy->dev.parent)
> +		srcnode = dev_fwnode(psy->dev.parent);
>  
> -	devm_kfree(&psy->dev, info);
> +	return __power_supply_get_battery_info(&psy->dev, srcnode, info_out);
> +}
> +EXPORT_SYMBOL_GPL(power_supply_get_battery_info);
> +
> +void power_supply_put_battery_info(struct power_supply *psy,
> +				   struct power_supply_battery_info *info)
> +{
> +	__power_supply_put_battery_info(&psy->dev, info);
>  }
>  EXPORT_SYMBOL_GPL(power_supply_put_battery_info);
>  
> @@ -1620,9 +1656,13 @@ __power_supply_register(struct device *parent,
>  	 * expose battery data to userspace for battery devices.
>  	 */
>  	if (desc->type == POWER_SUPPLY_TYPE_BATTERY) {
> -		rc = power_supply_get_battery_info(psy, &psy->battery_info);
> -		if (rc && rc != -ENODEV && rc != -ENOENT)
> -			goto check_supplies_failed;
> +		if (cfg && cfg->battery_info) {
> +			psy->battery_info = cfg->battery_info;
> +		} else {
> +			rc = power_supply_get_battery_info(psy, &psy->battery_info);
> +			if (rc && rc != -ENODEV && rc != -ENOENT)
> +				goto check_supplies_failed;
> +		}
>  	}
>  
>  	spin_lock_init(&psy->changed_lock);
> diff --git a/include/linux/power/max17042_battery.h b/include/linux/power/max17042_battery.h
> index 6b6e01d3e499..e9f2118e57c8 100644
> --- a/include/linux/power/max17042_battery.h
> +++ b/include/linux/power/max17042_battery.h
> @@ -24,6 +24,7 @@
>  #define MAX17042_CHARACTERIZATION_DATA_SIZE 48
>  
>  #define MAX17055_MODELCFG_REFRESH_BIT	BIT(15)
> +#define MAX17055_MODELCFG_VCHG_BIT	BIT(10)
>  
>  enum max17042_register {
>  	MAX17042_STATUS		= 0x00,
> diff --git a/include/linux/power_supply.h b/include/linux/power_supply.h
> index 360ffdf272da..f9fca7bb6e24 100644
> --- a/include/linux/power_supply.h
> +++ b/include/linux/power_supply.h
> @@ -231,6 +231,7 @@ union power_supply_propval {
>  
>  struct device_node;
>  struct power_supply;
> +struct power_supply_battery_info;
>  
>  /* Run-time specific power supply configuration */
>  struct power_supply_config {
> @@ -239,6 +240,12 @@ struct power_supply_config {
>  	/* Driver private data */
>  	void *drv_data;
>  
> +	/*
> +	 * Optional pre-parsed battery info for battery supplies.
> +	 * The pointed-to data must remain valid for the power supply lifetime.
> +	 */
> +	struct power_supply_battery_info *battery_info;
> +
>  	/* Device specific sysfs attributes */
>  	const struct attribute_group **attr_grp;
>  
> @@ -814,6 +821,9 @@ extern struct power_supply *power_supply_get_by_reference(struct fwnode_handle *
>  extern struct power_supply *devm_power_supply_get_by_reference(
>  				    struct device *dev, const char *property);
>  
> +extern int devm_power_supply_get_battery_info(struct device *dev,
> +					      struct power_supply_battery_info **info_out);
> +
>  extern const enum power_supply_property power_supply_battery_info_properties[];
>  extern const size_t power_supply_battery_info_properties_size;
>  extern int power_supply_get_battery_info(struct power_supply *psy,
> -- 
> 2.53.0
> 
> 

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

  reply	other threads:[~2026-06-04 16:38 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-04-06 20:57 [PATCH v1 0/9] power: supply: max17042_battery: improve MAX17055 support Vincent Cloutier
2026-04-06 20:57 ` [PATCH v1 1/9] power: supply: max17042_battery: Put LSB units into defines Vincent Cloutier
2026-04-06 20:57 ` [PATCH v1 2/9] power: supply: max17042_battery: Use Current register in get_status Vincent Cloutier
2026-04-06 20:57 ` [PATCH v1 3/9] power: supply: max17042_battery: Use dev_err_probe for power supply registration Vincent Cloutier
2026-04-06 20:57 ` [PATCH v1 4/9] power: supply: max17042_battery: Route MAX17055 SOC alerts through dSOCi Vincent Cloutier
2026-04-06 20:57 ` [PATCH v1 5/9] power: supply: max17042_battery: Keep only critical alerts during suspend Vincent Cloutier
2026-04-06 20:57 ` [PATCH v1 6/9] power: supply: max17042_battery: Remove unused platform-data plumbing Vincent Cloutier
2026-04-06 20:57 ` [PATCH v1 7/9] power: supply: max17042_battery: use ModelCfg refresh on max17055 Vincent Cloutier
2026-04-06 20:57 ` [PATCH v1 8/9] power: supply: Read MAX17042 battery info before registration Vincent Cloutier
2026-06-04 16:37   ` Sebastian Reichel [this message]
2026-04-06 20:57 ` [PATCH v1 9/9] power: supply: max17042_battery: Treat MAX17055 VChg as explicit DT setting Vincent Cloutier
2026-06-04 16:39 ` [PATCH v1 0/9] power: supply: max17042_battery: improve MAX17055 support Sebastian Reichel

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=aiGkI-JDc-6H5e07@venus \
    --to=sebastian.reichel@collabora.com \
    --cc=hansg@kernel.org \
    --cc=kernel@puri.sm \
    --cc=krzk@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=m.szyprowski@samsung.com \
    --cc=sebastian.krzyszkowiak@puri.sm \
    --cc=vincent.cloutier@icloud.com \
    --cc=vincent@cloutier.co \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox