Re: [PATCH] surface: surface3_power: Fix battery readings on batteries with a serial no

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, Feb 24, 2022 at 11:57 AM Hans de Goede <hdegoede@xxxxxxxxxx> wrote:
>
> Hi,
>
> On 2/24/22 11:55, Benjamin Tissoires wrote:
> > On Thu, Feb 24, 2022 at 11:19 AM Hans de Goede <hdegoede@xxxxxxxxxx> wrote:
> >>
> >> 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@xxxxxxxxxx>
> >
> > LGTM, (and scratching this off my list):
>
> Ah, so I guess this was already a known issue also hit by others ?
>
> Do you have a buglink which I can add to the commit message ?

Oh, no, sorry. The email popped up, and instead of adding it at the
end of the TODO list, I spent a few minutes checking it and answering.
Sorry for the confusion.

The problem in itself is entirely new to me.

Cheers,
Benjamin

>
>
> > Reviewed-by: Benjamin Tissoires <benjamin.tissoires@xxxxxxxxxx>
>
> Thanks.
>
> Regards,
>
> Hans
>
>
> >> ---
> >>  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
> >>
> >
>




[Index of Archives]     [Linux Kernel Development]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux