Re: [PATCH v2] iio: adc: ade9000: fix wrong register in CALIBBIAS case for active power

From: Jonathan Cameron

Date: Sat Feb 28 2026 - 08:18:51 EST


On Fri, 27 Feb 2026 10:01:41 +0000
"Miclaus, Antoniu" <Antoniu.Miclaus@xxxxxxxxxx> wrote:

> > -----Original Message-----
> > From: Giorgi Tchankvetadze <giorgitchankvetadze1997@xxxxxxxxx>
> > Sent: Thursday, February 26, 2026 4:07 PM
> > To: Miclaus, Antoniu <Antoniu.Miclaus@xxxxxxxxxx>
> > Cc: lars@xxxxxxxxxx; Hennerich, Michael <Michael.Hennerich@xxxxxxxxxx>;
> > jic23@xxxxxxxxxx; David Lechner <dlechner@xxxxxxxxxxxx>; Sa, Nuno
> > <Nuno.Sa@xxxxxxxxxx>; andy@xxxxxxxxxx; linux-iio@xxxxxxxxxxxxxxx; linux-
> > kernel@xxxxxxxxxxxxxxx; Giorgi Tchankvetadze
> > <giorgitchankvetadze1997@xxxxxxxxx>
> > Subject: [PATCH v2] iio: adc: ade9000: fix wrong register in CALIBBIAS case for
> > active power
> >
> > [External]
> >
> > The switch statement in ade9000_write_raw() attempts to match
> > chan->address against ADE9000_REG_AWATTOS (0x00F) to dispatch
> > the calibration offset write for active power channels. However,
> > chan->address is set via ADE9000_ADDR_ADJUST(ADE9000_REG_AWATT,
> > num), so after masking the phase bits, tmp holds
> > ADE9000_REG_AWATT (0x210), which never matches 0x00F.
> >
> > As a result, writing IIO_CHAN_INFO_CALIBBIAS for IIO_POWER always
> > falls through to the default case and returns -EINVAL, making
> > active power offset calibration silently broken.
> >
> > Fix this by matching against ADE9000_REG_AWATT instead, which is
> > the actual base address stored in chan->address for watt channels.
> >
> > Reference:ADE9000 datasheet (Rev. B), AWATTOS is the offset correction
> > register at 0x00F (p. 44), while AWATT is the total active power
> > register at 0x210 (p. 48).
> >
> > Fixes: 81de7b4619fc ("iio: adc: add ade9000 support")
> > Signed-off-by: Giorgi Tchankvetadze <giorgitchankvetadze1997@xxxxxxxxx>
> > ---
>
> Reviewed-by: Antoniu Miclaus <antoniu.miclaus@xxxxxxxxxx>
Applied to the fixes-togreg branch of iio.git and marked for stable.
>
> > v2:
> > - Added Fixes tag (Andy)
> > - Added datasheet reference (Rev. B, p. 44 and p. 48) (Andy)
> >
> > drivers/iio/adc/ade9000.c | 2 +-
> > 1 file changed, 1 insertion(+), 1 deletion(-)
> >
> > diff --git a/drivers/iio/adc/ade9000.c b/drivers/iio/adc/ade9000.c
> > index 5dcc26a08970..1499fb1c718a 100644
> > --- a/drivers/iio/adc/ade9000.c
> > +++ b/drivers/iio/adc/ade9000.c
> > @@ -1123,7 +1123,7 @@ static int ade9000_write_raw(struct iio_dev
> > *indio_dev,
> > tmp &= ~ADE9000_PHASE_C_POS_BIT;
> >
> > switch (tmp) {
> > - case ADE9000_REG_AWATTOS:
> > + case ADE9000_REG_AWATT:
> > return regmap_write(st->regmap,
> >
> > ADE9000_ADDR_ADJUST(ADE9000_REG_AWATTOS,
> > chan-
> > >channel), val);
> > --
> > 2.52.0
>