]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
iio: adc: ade9000: fix wrong register in CALIBBIAS case for active power
authorGiorgi Tchankvetadze <giorgitchankvetadze1997@gmail.com>
Thu, 26 Feb 2026 14:07:02 +0000 (18:07 +0400)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Sun, 1 Mar 2026 11:20:10 +0000 (11:20 +0000)
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@gmail.com>
Reviewed-by: Antoniu Miclaus <antoniu.miclaus@analog.com>
Cc: <Stable@vger.kernel.org>
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/adc/ade9000.c

index c62c6480dd0a908100042f862295fc656b1581a1..945a159e5de66ba2338b2cd3743827d973918165 100644 (file)
@@ -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);