public inbox for platform-driver-x86@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] surface: surface3_power: Fix battery readings on batteries with a serial no
@ 2022-02-24 10:18 Hans de Goede
  2022-02-24 10:55 ` Benjamin Tissoires
                   ` (2 more replies)
  0 siblings, 3 replies; 8+ messages in thread
From: Hans de Goede @ 2022-02-24 10:18 UTC (permalink / raw)
  To: Benjamin Tissoires, Maximilian Luz, Mark Gross, Andy Shevchenko
  Cc: Hans de Goede, platform-driver-x86

The battery on the 2nd hand Surface 3 which I recently bought appears to
not have a serial no programmed in. This results in any I2C reads from
the registers containing the serial no failing with an I2C NACK.

This was causing mshw0011_bix() to fail causing the battery readings to
not work at all.

Ignore EREMOTEIO (I2C NACK) errors when retrieving the serial no and
continue with an empty serial no to fix this.

Fixes: b1f81b496b0d ("platform/x86: surface3_power: MSHW0011 rev-eng implementation")
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
 drivers/platform/surface/surface3_power.c | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

diff --git a/drivers/platform/surface/surface3_power.c b/drivers/platform/surface/surface3_power.c
index abac3eec565e..b283bc9bb5fd 100644
--- a/drivers/platform/surface/surface3_power.c
+++ b/drivers/platform/surface/surface3_power.c
@@ -232,14 +232,21 @@ static int mshw0011_bix(struct mshw0011_data *cdata, struct bix *bix)
 	}
 	bix->last_full_charg_capacity = ret;
 
-	/* get serial number */
+	/*
+	 * get serial number, on some devices (with unofficial replacement
+	 * battery?) reading any of the serial no range addresses gets nacked
+	 * in this case just leave the serial no empty.
+	 */
 	ret = i2c_smbus_read_i2c_block_data(client, MSHW0011_BAT0_REG_SERIAL_NO,
 					    sizeof(buf), buf);
-	if (ret != sizeof(buf)) {
+	if (ret == -EREMOTEIO) {
+		/* no serial number available */
+	} else if (ret != sizeof(buf)) {
 		dev_err(&client->dev, "Error reading serial no: %d\n", ret);
 		return ret;
+	} else {
+		snprintf(bix->serial, ARRAY_SIZE(bix->serial), "%3pE%6pE", buf + 7, buf);
 	}
-	snprintf(bix->serial, ARRAY_SIZE(bix->serial), "%3pE%6pE", buf + 7, buf);
 
 	/* get cycle count */
 	ret = i2c_smbus_read_word_data(client, MSHW0011_BAT0_REG_CYCLE_CNT);
-- 
2.35.1


^ permalink raw reply related	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2022-02-24 12:50 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-02-24 10:18 [PATCH] surface: surface3_power: Fix battery readings on batteries with a serial no Hans de Goede
2022-02-24 10:55 ` Benjamin Tissoires
2022-02-24 10:57   ` Hans de Goede
2022-02-24 11:00     ` Benjamin Tissoires
2022-02-24 10:55 ` Andy Shevchenko
2022-02-24 10:56   ` Hans de Goede
2022-02-24 12:35 ` Maximilian Luz
2022-02-24 12:50   ` Hans de Goede

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox