Re: [PATCH 3/4] iio: adc: ade9000: add support for ADE9039

From: Jonathan Cameron

Date: Sat Oct 17 2026 - 19:42:10 EST


On Mon, 12 Oct 2026 14:13:39 +0300
Antoniu Miclaus <antoniu.miclaus@xxxxxxxxxx> wrote:

> The ADE9039 is a polyphase energy metering device that is register
> compatible with the ADE9000 for every register the driver touches. The
> differences relevant to the driver are that it shares the full-scale codes
> of the ADE9078 rather than those of the ADE9000, and that it has no total
> reactive power register: the register map has no AVAR at 0x211 and no
> AVAROS at 0x010, only the fundamental AFVAR and AFVAROS.
>
> Add a chip_info for it and a channel table that keeps the dip/swell events
> of the ADE9000 but drops the three total reactive power channels. The
> fundamental reactive energy channels are unaffected, as AFVARHR is present.
>
> No change is needed in the CALIBBIAS path: with no channel carrying the
> AVAR address, that case is simply never reached for this part.
>
> Signed-off-by: Antoniu Miclaus <antoniu.miclaus@xxxxxxxxxx>
> ---
> drivers/iio/adc/Kconfig | 1 +
> drivers/iio/adc/ade9000.c | 14 ++++++++++++++
> 2 files changed, 15 insertions(+)
>
> diff --git a/drivers/iio/adc/Kconfig b/drivers/iio/adc/Kconfig
> index 02de4809ae31..3052a86c460f 100644
> --- a/drivers/iio/adc/Kconfig
> +++ b/drivers/iio/adc/Kconfig
> @@ -603,6 +603,7 @@ config ADE9000
> - ADE9000
> - ADE9078
> - ADE9430
> + - ADE9039
>
> The devices feature high-precision analog-to-digital converters
> and digital signal processing to compute RMS values, power factor,
> diff --git a/drivers/iio/adc/ade9000.c b/drivers/iio/adc/ade9000.c
> index 03b69556b62f..e7f509bbac77 100644
> --- a/drivers/iio/adc/ade9000.c
> +++ b/drivers/iio/adc/ade9000.c
> @@ -683,6 +683,8 @@ ADE9000_DECLARE_CHANNELS(ade9000_channels, ADE9000_ALTVOLTAGE_RMS_CHANNEL,
> ADE9000_POWER_REACTIVE_ENTRY);
> ADE9000_DECLARE_CHANNELS(ade9078_channels, ADE9000_ALTVOLTAGE_RMS_CHANNEL_NO_EVENTS,
> ADE9000_POWER_REACTIVE_ENTRY);
> +ADE9000_DECLARE_CHANNELS(ade9039_channels, ADE9000_ALTVOLTAGE_RMS_CHANNEL,
> + ADE9000_NO_POWER_REACTIVE_ENTRY);

Put this such that the various parts are in numeric order.

>
> /*
> * Full-scale codes referred from the respective datasheets. These are the
> @@ -718,6 +720,16 @@ static const struct ade9000_chip_info ade9430_chip_info = {
> .has_digital_integrator = false, /* no on-chip digital integrator */
> };
>
> +static const struct ade9000_chip_info ade9039_chip_info = {
> + .name = "ade9039",
> + .channels = ade9039_channels,
> + .num_channels = ARRAY_SIZE(ade9039_channels),
> + .rms_full_scale_codes = 52866837,
> + .watt_full_scale_codes = 20823646,
> + .pcf_full_scale_codes = 74680000,
> + .has_digital_integrator = true,
> +};

Put this in location that is appropriate for part number.

> +
> static const struct reg_sequence ade9000_initialization_sequence[] = {
> { ADE9000_REG_PGA_GAIN, ADE9000_PGA_GAIN },
> { ADE9000_REG_CONFIG0, ADE9000_CONFIG0 },
> @@ -1883,6 +1895,7 @@ static const struct spi_device_id ade9000_id[] = {
> { .name = "ade9000", .driver_data = (kernel_ulong_t)&ade9000_chip_info },
> { .name = "ade9078", .driver_data = (kernel_ulong_t)&ade9078_chip_info },
> { .name = "ade9430", .driver_data = (kernel_ulong_t)&ade9430_chip_info },
> + { .name = "ade9039", .driver_data = (kernel_ulong_t)&ade9039_chip_info },
numeric order here as well.
> { }
> };
> MODULE_DEVICE_TABLE(spi, ade9000_id);
> @@ -1891,6 +1904,7 @@ static const struct of_device_id ade9000_of_match[] = {
> { .compatible = "adi,ade9000", .data = &ade9000_chip_info },
> { .compatible = "adi,ade9078", .data = &ade9078_chip_info },
> { .compatible = "adi,ade9430", .data = &ade9430_chip_info },
> + { .compatible = "adi,ade9039", .data = &ade9039_chip_info },
And here as well.

Otherwise LGTM.
> { }
> };
> MODULE_DEVICE_TABLE(of, ade9000_of_match);