* [PATCH v5] bq27xxx: support interchangeable OnePlus 6/6T fuel gauges
@ 2026-10-18 0:51 Rinat Muhamedgaliev
2026-10-18 0:51 ` [PATCH v5] power: supply: bq27xxx: detect bq27541 behind bq27411 compatible Rinat Muhamedgaliev
0 siblings, 1 reply; 2+ messages in thread
From: Rinat Muhamedgaliev @ 2026-10-18 0:51 UTC (permalink / raw)
To: linux-pm
Cc: pali, sre, afd, konrad.dybcio, david, krzk, linux-arm-msm,
linux-kernel, Rinat Muhamedgaliev
OnePlus 6 and 6T replacement battery packs can contain either a bq27411 or a
bq27541 fuel gauge. The latter requires a different register map and produces
invalid battery readings when interpreted as a bq27411.
v4 drops the proposed generic DT compatible and DTS changes. The I2C driver
instead reads DeviceType while probing the existing bq27411 compatible, and
selects the bq27541 profile if the device reports 0x0541.
The bq27541 path was tested on a OnePlus 6T with DeviceType 0x0541. It
reported 4.338 V, 100% capacity, 27.8 C, and Full/Good battery status.
Testing on an OnePlus 6 or 6T whose fuel gauge reports DeviceType 0x0421
(bq27411) would be appreciated.
Changes in v5:
- Report detected and expected DeviceType values instead of hard-coding chip names.
- Describe an unknown DeviceType as unrecognized.
- Link to v4: https://patch.msgid.link/20260928-master-v4-1-052c73ec1767@gmail.com
Changes in v4:
- Drop the generic compatible and binding update.
- Keep the established OnePlus DTS unchanged.
- Detect bq27541 from DeviceType in the bq27411 probe path.
- Send as a new thread.
---
Rinat Muhamedgaliev (1):
power: supply: bq27xxx: detect bq27541 behind bq27411 compatible
drivers/power/supply/bq27xxx_battery_i2c.c | 39 ++++++++++++++++++++++++++++++
1 file changed, 39 insertions(+)
---
base-commit: 830b3c68c1fb1e9176028d02ef86f3cf76aa2476
change-id: 20260927-master-bd0afd9696ef
Best regards,
--
Rinat Muhamedgaliev <rinat.muhamedgaliev@gmail.com>
^ permalink raw reply [flat|nested] 2+ messages in thread
* [PATCH v5] power: supply: bq27xxx: detect bq27541 behind bq27411 compatible
2026-10-18 0:51 [PATCH v5] bq27xxx: support interchangeable OnePlus 6/6T fuel gauges Rinat Muhamedgaliev
@ 2026-10-18 0:51 ` Rinat Muhamedgaliev
0 siblings, 0 replies; 2+ messages in thread
From: Rinat Muhamedgaliev @ 2026-10-18 0:51 UTC (permalink / raw)
To: linux-pm
Cc: pali, sre, afd, konrad.dybcio, david, krzk, linux-arm-msm,
linux-kernel, Rinat Muhamedgaliev
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;
+ 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;
+ if (di->chip == BQ27411) {
+ ret = bq27xxx_battery_i2c_check_device_type(di);
+ if (ret)
+ goto err_failed;
+ }
+
ret = bq27xxx_battery_setup(di);
if (ret)
goto err_failed;
--
2.56.0
^ permalink raw reply related [flat|nested] 2+ messages in thread
end of thread, other threads:[~2026-10-18 0:52 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
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
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox