* [PATCH 0/3] iio: adc: ade9000: series of probe and channel fixes
@ 2026-08-07 8:56 Antoniu Miclaus
2026-08-07 8:56 ` [PATCH 1/3] iio: adc: ade9000: request interrupts after powering the device Antoniu Miclaus
` (2 more replies)
0 siblings, 3 replies; 5+ messages in thread
From: Antoniu Miclaus @ 2026-08-07 8:56 UTC (permalink / raw)
To: Antoniu Miclaus, Nuno Sá, Michael Hennerich,
Jonathan Cameron, David Lechner, linux-iio, linux, linux-kernel
This series fixes three issues in the ade9000 driver, all present since
the driver was added.
Patch 1 moves the interrupt requests after the vdd regulator is enabled,
so an early interrupt no longer runs a handler doing SPI accesses against
an unpowered chip.
Patch 2 corrects the overlapping scan_index values for the current and
voltage channels, which caused the Phase B and C waveform buffers to be
configured incorrectly.
Patch 3 fixes the STATUS1 event scan bound so that Phase C dip events
(bit 25) are actually reported.
Antoniu Miclaus (3):
iio: adc: ade9000: request interrupts after powering the device
iio: adc: ade9000: fix overlapping scan_index for current and voltage
channels
iio: adc: ade9000: handle Phase C dip events in IRQ1 handler
drivers/iio/adc/ade9000.c | 31 ++++++++++++++++---------------
1 file changed, 16 insertions(+), 15 deletions(-)
--
2.43.0
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH 1/3] iio: adc: ade9000: request interrupts after powering the device
2026-08-07 8:56 [PATCH 0/3] iio: adc: ade9000: series of probe and channel fixes Antoniu Miclaus
@ 2026-08-07 8:56 ` Antoniu Miclaus
2026-08-07 10:37 ` Joshua Crofts
2026-08-07 8:56 ` [PATCH 2/3] iio: adc: ade9000: fix overlapping scan_index for current and voltage channels Antoniu Miclaus
2026-08-07 8:56 ` [PATCH 3/3] iio: adc: ade9000: handle Phase C dip events in IRQ1 handler Antoniu Miclaus
2 siblings, 1 reply; 5+ messages in thread
From: Antoniu Miclaus @ 2026-08-07 8:56 UTC (permalink / raw)
To: Antoniu Miclaus, Nuno Sá, Michael Hennerich,
Jonathan Cameron, David Lechner, linux-iio, linux, linux-kernel
The IRQ handlers do SPI register accesses, but the interrupts were
requested before the vdd regulator was enabled. An interrupt arriving
while the chip is unpowered runs a handler against a dead chip, causing
SPI errors or garbage reads.
Request the interrupts after enabling the regulator. This keeps irq1
registered before ade9000_reset(), which waits on it, and lets devm free
the interrupts before the regulator is disabled.
Fixes: 81de7b4619fc ("iio: adc: add ade9000 support")
Signed-off-by: Antoniu Miclaus <antoniu.miclaus@analog.com>
---
drivers/iio/adc/ade9000.c | 25 +++++++++++++------------
1 file changed, 13 insertions(+), 12 deletions(-)
diff --git a/drivers/iio/adc/ade9000.c b/drivers/iio/adc/ade9000.c
index c6c3ea953fea..51cb43755a1f 100644
--- a/drivers/iio/adc/ade9000.c
+++ b/drivers/iio/adc/ade9000.c
@@ -1705,18 +1705,6 @@ static int ade9000_probe(struct spi_device *spi)
if (ret)
return ret;
- ret = ade9000_request_irq(dev, "irq0", ade9000_irq0_thread, indio_dev);
- if (ret)
- return ret;
-
- ret = ade9000_request_irq(dev, "irq1", ade9000_irq1_thread, indio_dev);
- if (ret)
- return ret;
-
- ret = ade9000_request_irq(dev, "dready", ade9000_dready_thread, indio_dev);
- if (ret)
- return ret;
-
/* External CMOS clock input (optional - crystal can be used instead) */
st->clkin = devm_clk_get_optional_enabled(dev, NULL);
if (IS_ERR(st->clkin))
@@ -1736,6 +1724,19 @@ static int ade9000_probe(struct spi_device *spi)
return dev_err_probe(&spi->dev, ret,
"Failed to get and enable vdd regulator\n");
+ /* Request IRQs only after powering the chip; the handlers do SPI access. */
+ ret = ade9000_request_irq(dev, "irq0", ade9000_irq0_thread, indio_dev);
+ if (ret)
+ return ret;
+
+ ret = ade9000_request_irq(dev, "irq1", ade9000_irq1_thread, indio_dev);
+ if (ret)
+ return ret;
+
+ ret = ade9000_request_irq(dev, "dready", ade9000_dready_thread, indio_dev);
+ if (ret)
+ return ret;
+
indio_dev->channels = ade9000_channels;
indio_dev->num_channels = ARRAY_SIZE(ade9000_channels);
--
2.43.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 2/3] iio: adc: ade9000: fix overlapping scan_index for current and voltage channels
2026-08-07 8:56 [PATCH 0/3] iio: adc: ade9000: series of probe and channel fixes Antoniu Miclaus
2026-08-07 8:56 ` [PATCH 1/3] iio: adc: ade9000: request interrupts after powering the device Antoniu Miclaus
@ 2026-08-07 8:56 ` Antoniu Miclaus
2026-08-07 8:56 ` [PATCH 3/3] iio: adc: ade9000: handle Phase C dip events in IRQ1 handler Antoniu Miclaus
2 siblings, 0 replies; 5+ messages in thread
From: Antoniu Miclaus @ 2026-08-07 8:56 UTC (permalink / raw)
To: Antoniu Miclaus, Nuno Sá, Michael Hennerich,
Jonathan Cameron, David Lechner, linux-iio, linux, linux-kernel
Current channels used scan_index "num" and voltage "num + 1", so with
phases 0, 1 and 2 the indices overlapped and no longer matched the
IA=0, VA=1, IB=2, VB=3, IC=4, VC=5 layout expected by
ade9000_waveform_buffer_config(). Phase B and C buffers were configured
incorrectly.
Use "num * 2" for current and "num * 2 + 1" for voltage to get the
non-overlapping 0/1, 2/3, 4/5 layout.
Fixes: 81de7b4619fc ("iio: adc: add ade9000 support")
Signed-off-by: Antoniu Miclaus <antoniu.miclaus@analog.com>
---
drivers/iio/adc/ade9000.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/iio/adc/ade9000.c b/drivers/iio/adc/ade9000.c
index 51cb43755a1f..167b1f4d6279 100644
--- a/drivers/iio/adc/ade9000.c
+++ b/drivers/iio/adc/ade9000.c
@@ -444,7 +444,7 @@ static const struct iio_chan_spec_ext_info ade9000_ext_info[] = {
BIT(IIO_CHAN_INFO_CALIBSCALE), \
.event_spec = ade9000_current_events, \
.num_event_specs = ARRAY_SIZE(ade9000_current_events), \
- .scan_index = num, \
+ .scan_index = num * 2, \
.indexed = 1, \
.scan_type = { \
.sign = 's', \
@@ -464,7 +464,7 @@ static const struct iio_chan_spec_ext_info ade9000_ext_info[] = {
BIT(IIO_CHAN_INFO_FREQUENCY), \
.event_spec = ade9000_voltage_events, \
.num_event_specs = ARRAY_SIZE(ade9000_voltage_events), \
- .scan_index = num + 1, /* interleave with current channels */ \
+ .scan_index = num * 2 + 1, /* interleave with current channels */ \
.indexed = 1, \
.scan_type = { \
.sign = 's', \
--
2.43.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 3/3] iio: adc: ade9000: handle Phase C dip events in IRQ1 handler
2026-08-07 8:56 [PATCH 0/3] iio: adc: ade9000: series of probe and channel fixes Antoniu Miclaus
2026-08-07 8:56 ` [PATCH 1/3] iio: adc: ade9000: request interrupts after powering the device Antoniu Miclaus
2026-08-07 8:56 ` [PATCH 2/3] iio: adc: ade9000: fix overlapping scan_index for current and voltage channels Antoniu Miclaus
@ 2026-08-07 8:56 ` Antoniu Miclaus
2 siblings, 0 replies; 5+ messages in thread
From: Antoniu Miclaus @ 2026-08-07 8:56 UTC (permalink / raw)
To: Antoniu Miclaus, Nuno Sá, Michael Hennerich,
Jonathan Cameron, David Lechner, linux-iio, linux, linux-kernel
ADE9000_ST1_CROSSING_DEPTH is the exclusive upper bound for scanning the
STATUS1 event bits, so a value of 25 left out the highest event bit,
ADE9000_ST1_DIPC_BIT (bit 25). Phase C dip events were never reported.
Bump the value to 26 so bit 25 is scanned.
Fixes: 81de7b4619fc ("iio: adc: add ade9000 support")
Signed-off-by: Antoniu Miclaus <antoniu.miclaus@analog.com>
---
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 167b1f4d6279..da6caabfe2a4 100644
--- a/drivers/iio/adc/ade9000.c
+++ b/drivers/iio/adc/ade9000.c
@@ -219,7 +219,7 @@
#define ADE9000_ST1_ERROR2_BIT BIT(30)
#define ADE9000_ST1_ERROR3_BIT BIT(31)
#define ADE9000_ST1_CROSSING_FIRST 6
-#define ADE9000_ST1_CROSSING_DEPTH 25
+#define ADE9000_ST1_CROSSING_DEPTH 26
#define ADE9000_WFB_TRG_DIP_BIT BIT(0)
#define ADE9000_WFB_TRG_SWELL_BIT BIT(1)
--
2.43.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH 1/3] iio: adc: ade9000: request interrupts after powering the device
2026-08-07 8:56 ` [PATCH 1/3] iio: adc: ade9000: request interrupts after powering the device Antoniu Miclaus
@ 2026-08-07 10:37 ` Joshua Crofts
0 siblings, 0 replies; 5+ messages in thread
From: Joshua Crofts @ 2026-08-07 10:37 UTC (permalink / raw)
To: Antoniu Miclaus
Cc: Nuno Sá, Michael Hennerich, Jonathan Cameron, David Lechner,
linux-iio, linux, linux-kernel
On Fri, 7 Aug 2026 11:56:41 +0300
Antoniu Miclaus <antoniu.miclaus@analog.com> wrote:
> The IRQ handlers do SPI register accesses, but the interrupts were
> requested before the vdd regulator was enabled. An interrupt arriving
> while the chip is unpowered runs a handler against a dead chip, causing
> SPI errors or garbage reads.
>
> Request the interrupts after enabling the regulator. This keeps irq1
> registered before ade9000_reset(), which waits on it, and lets devm free
> the interrupts before the regulator is disabled.
>
> Fixes: 81de7b4619fc ("iio: adc: add ade9000 support")
> Signed-off-by: Antoniu Miclaus <antoniu.miclaus@analog.com>
> ---
LGTM.
Reviewed-by: Joshua Crofts <joshua.crofts1@gmail.com>
--
Kind regards,
Joshua Crofts
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2026-08-07 10:37 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-07 8:56 [PATCH 0/3] iio: adc: ade9000: series of probe and channel fixes Antoniu Miclaus
2026-08-07 8:56 ` [PATCH 1/3] iio: adc: ade9000: request interrupts after powering the device Antoniu Miclaus
2026-08-07 10:37 ` Joshua Crofts
2026-08-07 8:56 ` [PATCH 2/3] iio: adc: ade9000: fix overlapping scan_index for current and voltage channels Antoniu Miclaus
2026-08-07 8:56 ` [PATCH 3/3] iio: adc: ade9000: handle Phase C dip events in IRQ1 handler Antoniu Miclaus
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.