mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: David Heidelberg <david@ixit.cz>
To: Rinat Muhamedgaliev <rinat.muhamedgaliev@gmail.com>,
	linux-pm@vger.kernel.org
Cc: pali@kernel.org, sre@kernel.org, afd@ti.com,
	konrad.dybcio@oss.qualcomm.com, krzk@kernel.org,
	linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v5] power: supply: bq27xxx: detect bq27541 behind bq27411 compatible
Date: Sun, 18 Oct 2026 12:43:14 +0200	[thread overview]
Message-ID: <a8176ca7-2c4b-404b-b1f4-c59eaca9d106@ixit.cz> (raw)
In-Reply-To: <20261018-master-v5-1-0be16441cdd1@gmail.com>

On 18/10/2026 02:51, Rinat Muhamedgaliev wrote:
> OnePlus 6 and 6T replacement battery packs may contain either a bq27411
> or a bq27541 fuel gauge at I2C address 0x55. The device tree currently
> identifies the gauge as bq27411, but a bq27541 uses a different register
> map and then reports invalid battery values.
> 
> Read the DeviceType control subcommand when probing a bq27411. Keep the
> existing profile for DeviceType 0x0421, but select the bq27541 profile
> for DeviceType 0x0541. This retains the established DT ABI and supports
> replacement packs without introducing a generic compatible.
> 
> Tested on OnePlus 6T (fajita) with DeviceType 0x0541: voltage, state of
> charge, and temperature were reported correctly. Testing on hardware with
> DeviceType 0x0421 would be appreciated.
> 
> Signed-off-by: Rinat Muhamedgaliev <rinat.muhamedgaliev@gmail.com>
> ---
>   drivers/power/supply/bq27xxx_battery_i2c.c | 39 ++++++++++++++++++++++++++++++
>   1 file changed, 39 insertions(+)
> 
> diff --git a/drivers/power/supply/bq27xxx_battery_i2c.c b/drivers/power/supply/bq27xxx_battery_i2c.c
> index 94b00bb89c17..8c05740f1173 100644
> --- a/drivers/power/supply/bq27xxx_battery_i2c.c
> +++ b/drivers/power/supply/bq27xxx_battery_i2c.c
> @@ -16,6 +16,11 @@
>   static DEFINE_IDR(battery_id);
>   static DEFINE_MUTEX(battery_mutex);
>   
> +#define BQ27XXX_REG_CTRL		0x00
> +#define BQ27XXX_DEVICE_TYPE		0x0001
> +#define BQ27411_DEVICE_TYPE		0x0421
> +#define BQ27541_DEVICE_TYPE		0x0541
> +
>   static irqreturn_t bq27xxx_battery_irq_handler_thread(int irq, void *data)
>   {
>   	struct bq27xxx_device_info *di = data;
> @@ -136,6 +141,34 @@ static int bq27xxx_battery_i2c_bulk_write(struct bq27xxx_device_info *di,
>   	return 0;
>   }
>   
> +static int bq27xxx_battery_i2c_check_device_type(struct bq27xxx_device_info *di)
> +{
> +	int ret;
> +
> +	ret = di->bus.write(di, BQ27XXX_REG_CTRL, BQ27XXX_DEVICE_TYPE,
> +			    false);
> +	if (ret < 0)
> +		return ret;
> +
> +	ret = di->bus.read(di, BQ27XXX_REG_CTRL, false);
> +	if (ret < 0)
> +		return ret;
> +
> +	switch (ret) {
> +	case BQ27411_DEVICE_TYPE:
> +		return 0;

Hello Rinat.

Thanks for the next version, comments below :)

you made the function generic, that's good, but then when it's BQ27411 returning 
success. The switch should account that you comparing model acquired from 
compatible against the model you detected, not blindly assume original chip is 
27411.

> +	case BQ27541_DEVICE_TYPE:
> +		dev_warn(di->dev,
> +			 "detected DeviceType 0x%04x instead of expected 0x%04x\n",
> +			 ret, BQ27411_DEVICE_TYPE);
> +		di->chip = BQ27541;
> +		return 0;
> +	default:
> +		dev_err(di->dev, "unrecognized DeviceType 0x%04x\n", ret);
> +		return -ENODEV;
> +	}
> +}
> +
>   static int bq27xxx_battery_i2c_probe(struct i2c_client *client,
>   				     const struct i2c_device_id *id)
>   {
> @@ -169,6 +202,12 @@ static int bq27xxx_battery_i2c_probe(struct i2c_client *client,
>   	di->bus.read_bulk = bq27xxx_battery_i2c_bulk_read;
>   	di->bus.write_bulk = bq27xxx_battery_i2c_bulk_write;
>   

I would suggest dropping comment here that's a list of models which we can 
detect verify.

> +	if (di->chip == BQ27411) {

With our data, can should be able detect BQ27541 -> BQ27411 too. I would suggest 
transforming this into some switch statement block.

Thank you
David

> +		ret = bq27xxx_battery_i2c_check_device_type(di);
> +		if (ret)
> +			goto err_failed;
> +	}
> +
>   	ret = bq27xxx_battery_setup(di);
>   	if (ret)
>   		goto err_failed;
> 


      reply	other threads:[~2026-10-18 10:43 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-18  0:51 [PATCH v5] bq27xxx: support interchangeable OnePlus 6/6T fuel gauges Rinat Muhamedgaliev
2026-10-18  0:51 ` [PATCH v5] power: supply: bq27xxx: detect bq27541 behind bq27411 compatible Rinat Muhamedgaliev
2026-10-18 10:43   ` David Heidelberg [this message]

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=a8176ca7-2c4b-404b-b1f4-c59eaca9d106@ixit.cz \
    --to=david@ixit.cz \
    --cc=afd@ti.com \
    --cc=konrad.dybcio@oss.qualcomm.com \
    --cc=krzk@kernel.org \
    --cc=linux-arm-msm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=pali@kernel.org \
    --cc=rinat.muhamedgaliev@gmail.com \
    --cc=sre@kernel.org \
    /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

all inboxes | Powered by JetHome®