* [PATCH v3 1/9] MAINTAINERS: Add missing maintainer entry for AD8366 driver
2026-02-03 11:24 [PATCH v3 0/9] iio: amplifiers: ad8366: driver update and dt support Rodrigo Alencar via B4 Relay
@ 2026-02-03 11:24 ` Rodrigo Alencar via B4 Relay
2026-02-03 11:24 ` [PATCH v3 2/9] dt-bindings: iio: amplifiers: Add AD8366 support Rodrigo Alencar via B4 Relay
` (8 subsequent siblings)
9 siblings, 0 replies; 21+ messages in thread
From: Rodrigo Alencar via B4 Relay @ 2026-02-03 11:24 UTC (permalink / raw)
To: linux-kernel, linux-iio, devicetree
Cc: Michael Hennerich, Lars-Peter Clausen, Jonathan Cameron,
David Lechner, Andy Shevchenko, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Rodrigo Alencar
From: Rodrigo Alencar <rodrigo.alencar@analog.com>
Add maintainers entry for drivers/iio/amplifiers/ad8366.c
Signed-off-by: Rodrigo Alencar <rodrigo.alencar@analog.com>
---
MAINTAINERS | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/MAINTAINERS b/MAINTAINERS
index 1251965d70bd..ec9a6beb7619 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -1583,6 +1583,14 @@ W: https://ez.analog.com/linux-software-drivers
F: Documentation/devicetree/bindings/iio/adc/adi,ad7780.yaml
F: drivers/iio/adc/ad7780.c
+ANALOG DEVICES INC AD8366 DRIVER
+M: Michael Hennerich <Michael.Hennerich@analog.com>
+M: Rodrigo Alencar <rodrigo.alencar@analog.com>
+L: linux-iio@vger.kernel.org
+S: Supported
+W: https://ez.analog.com/linux-software-drivers
+F: drivers/iio/amplifiers/ad8366.c
+
ANALOG DEVICES INC AD9467 DRIVER
M: Michael Hennerich <Michael.Hennerich@analog.com>
M: Nuno Sa <nuno.sa@analog.com>
--
2.43.0
^ permalink raw reply related [flat|nested] 21+ messages in thread* [PATCH v3 2/9] dt-bindings: iio: amplifiers: Add AD8366 support
2026-02-03 11:24 [PATCH v3 0/9] iio: amplifiers: ad8366: driver update and dt support Rodrigo Alencar via B4 Relay
2026-02-03 11:24 ` [PATCH v3 1/9] MAINTAINERS: Add missing maintainer entry for AD8366 driver Rodrigo Alencar via B4 Relay
@ 2026-02-03 11:24 ` Rodrigo Alencar via B4 Relay
2026-02-04 17:59 ` Conor Dooley
2026-02-03 11:24 ` [PATCH v3 3/9] iio: amplifiers: ad8366: use devm_mutex_init() and drop mutex_init() Rodrigo Alencar via B4 Relay
` (7 subsequent siblings)
9 siblings, 1 reply; 21+ messages in thread
From: Rodrigo Alencar via B4 Relay @ 2026-02-03 11:24 UTC (permalink / raw)
To: linux-kernel, linux-iio, devicetree
Cc: Michael Hennerich, Lars-Peter Clausen, Jonathan Cameron,
David Lechner, Andy Shevchenko, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Rodrigo Alencar
From: Rodrigo Alencar <rodrigo.alencar@analog.com>
Add device tree binding documentation for amplifiers and digital
attenuators. This covers different device variants with similar
SPI control. Each device has its own gain range and step, hence
no fallback compatibles are used.
Signed-off-by: Rodrigo Alencar <rodrigo.alencar@analog.com>
---
.../bindings/iio/amplifiers/adi,ad8366.yaml | 97 ++++++++++++++++++++++
MAINTAINERS | 1 +
2 files changed, 98 insertions(+)
diff --git a/Documentation/devicetree/bindings/iio/amplifiers/adi,ad8366.yaml b/Documentation/devicetree/bindings/iio/amplifiers/adi,ad8366.yaml
new file mode 100644
index 000000000000..2719de1166a1
--- /dev/null
+++ b/Documentation/devicetree/bindings/iio/amplifiers/adi,ad8366.yaml
@@ -0,0 +1,97 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/iio/amplifiers/adi,ad8366.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: AD8366 and similar Gain Amplifiers and Digital Attenuators
+
+maintainers:
+ - Michael Hennerich <michael.hennerich@analog.com>
+ - Rodrigo Alencar <rodrigo.alencar@analog.com>
+
+description:
+ Digital Variable Gain Amplifiers (VGAs) and Digital Attenuators with
+ SPI interface.
+
+properties:
+ compatible:
+ enum:
+ - adi,ad8366
+ - adi,ada4961
+ - adi,adl5240
+ - adi,adrf5720
+ - adi,adrf5730
+ - adi,adrf5731
+ - adi,hmc271a
+ - adi,hmc792a
+ - adi,hmc1018a
+ - adi,hmc1019a
+ - adi,hmc1119
+
+ reg:
+ maxItems: 1
+
+ vcc-supply:
+ description: Regulator that provides power to the device.
+
+ reset-gpios:
+ maxItems: 1
+
+ enable-gpios:
+ maxItems: 1
+ description: Power-up or Serial Mode Enable GPIO.
+
+required:
+ - compatible
+ - reg
+ - vcc-supply
+
+allOf:
+ - $ref: /schemas/spi/spi-peripheral-props.yaml#
+ - if:
+ not:
+ properties:
+ compatible:
+ contains:
+ const: adi,hmc271a
+ then:
+ properties:
+ reset-gpios: false
+ - if:
+ not:
+ properties:
+ compatible:
+ contains:
+ anyOf:
+ - const: adi,ad8366
+ - const: adi,ada4961
+ - const: adi,adrf5720
+ - const: adi,adrf5730
+ - const: adi,adrf5731
+ - const: adi,hmc792a
+ - const: adi,hmc1018a
+ - const: adi,hmc1019a
+ - const: adi,hmc1119
+ then:
+ properties:
+ enable-gpios: false
+
+unevaluatedProperties: false
+
+examples:
+ - |
+ #include <dt-bindings/gpio/gpio.h>
+ spi {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ amplifier@0 {
+ compatible = "adi,ad8366";
+ reg = <0>;
+ spi-max-frequency = <1000000>;
+ vcc-supply = <&vcc_3v3>;
+ enable-gpios = <&gpio 0 GPIO_ACTIVE_HIGH>;
+ };
+ };
+...
diff --git a/MAINTAINERS b/MAINTAINERS
index ec9a6beb7619..ab4e487d603a 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -1589,6 +1589,7 @@ M: Rodrigo Alencar <rodrigo.alencar@analog.com>
L: linux-iio@vger.kernel.org
S: Supported
W: https://ez.analog.com/linux-software-drivers
+F: Documentation/devicetree/bindings/iio/amplifiers/adi,ad8366.yaml
F: drivers/iio/amplifiers/ad8366.c
ANALOG DEVICES INC AD9467 DRIVER
--
2.43.0
^ permalink raw reply related [flat|nested] 21+ messages in thread* Re: [PATCH v3 2/9] dt-bindings: iio: amplifiers: Add AD8366 support
2026-02-03 11:24 ` [PATCH v3 2/9] dt-bindings: iio: amplifiers: Add AD8366 support Rodrigo Alencar via B4 Relay
@ 2026-02-04 17:59 ` Conor Dooley
0 siblings, 0 replies; 21+ messages in thread
From: Conor Dooley @ 2026-02-04 17:59 UTC (permalink / raw)
To: rodrigo.alencar
Cc: linux-kernel, linux-iio, devicetree, Michael Hennerich,
Lars-Peter Clausen, Jonathan Cameron, David Lechner,
Andy Shevchenko, Rob Herring, Krzysztof Kozlowski, Conor Dooley
[-- Attachment #1: Type: text/plain, Size: 78 bytes --]
Reviewed-by: Conor Dooley <conor.dooley@microchip.com>
pw-bot: not-applicable
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]
^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH v3 3/9] iio: amplifiers: ad8366: use devm_mutex_init() and drop mutex_init()
2026-02-03 11:24 [PATCH v3 0/9] iio: amplifiers: ad8366: driver update and dt support Rodrigo Alencar via B4 Relay
2026-02-03 11:24 ` [PATCH v3 1/9] MAINTAINERS: Add missing maintainer entry for AD8366 driver Rodrigo Alencar via B4 Relay
2026-02-03 11:24 ` [PATCH v3 2/9] dt-bindings: iio: amplifiers: Add AD8366 support Rodrigo Alencar via B4 Relay
@ 2026-02-03 11:24 ` Rodrigo Alencar via B4 Relay
2026-02-04 1:53 ` Andy Shevchenko
2026-02-03 11:24 ` [PATCH v3 4/9] iio: amplifiers: ad8366: drop reset_gpio from private struct Rodrigo Alencar via B4 Relay
` (6 subsequent siblings)
9 siblings, 1 reply; 21+ messages in thread
From: Rodrigo Alencar via B4 Relay @ 2026-02-03 11:24 UTC (permalink / raw)
To: linux-kernel, linux-iio, devicetree
Cc: Michael Hennerich, Lars-Peter Clausen, Jonathan Cameron,
David Lechner, Andy Shevchenko, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Rodrigo Alencar
From: Rodrigo Alencar <rodrigo.alencar@analog.com>
Adopt proper mutex lifecycle with devm_mutex_init(),
replacing mutex_init().
Signed-off-by: Rodrigo Alencar <rodrigo.alencar@analog.com>
---
drivers/iio/amplifiers/ad8366.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/drivers/iio/amplifiers/ad8366.c b/drivers/iio/amplifiers/ad8366.c
index d06ac786501c..f0d44f2769ca 100644
--- a/drivers/iio/amplifiers/ad8366.c
+++ b/drivers/iio/amplifiers/ad8366.c
@@ -255,6 +255,10 @@ static int ad8366_probe(struct spi_device *spi)
st = iio_priv(indio_dev);
+ ret = devm_mutex_init(&spi->dev, &st->lock);
+ if (ret)
+ return ret;
+
st->reg = devm_regulator_get(&spi->dev, "vcc");
if (!IS_ERR(st->reg)) {
ret = regulator_enable(st->reg);
@@ -263,7 +267,6 @@ static int ad8366_probe(struct spi_device *spi)
}
spi_set_drvdata(spi, indio_dev);
- mutex_init(&st->lock);
st->spi = spi;
st->type = spi_get_device_id(spi)->driver_data;
--
2.43.0
^ permalink raw reply related [flat|nested] 21+ messages in thread* Re: [PATCH v3 3/9] iio: amplifiers: ad8366: use devm_mutex_init() and drop mutex_init()
2026-02-03 11:24 ` [PATCH v3 3/9] iio: amplifiers: ad8366: use devm_mutex_init() and drop mutex_init() Rodrigo Alencar via B4 Relay
@ 2026-02-04 1:53 ` Andy Shevchenko
2026-02-05 20:32 ` Jonathan Cameron
0 siblings, 1 reply; 21+ messages in thread
From: Andy Shevchenko @ 2026-02-04 1:53 UTC (permalink / raw)
To: rodrigo.alencar
Cc: linux-kernel, linux-iio, devicetree, Michael Hennerich,
Lars-Peter Clausen, Jonathan Cameron, David Lechner,
Andy Shevchenko, Rob Herring, Krzysztof Kozlowski, Conor Dooley
On Tue, Feb 03, 2026 at 11:24:09AM +0000, Rodrigo Alencar via B4 Relay wrote:
> Adopt proper mutex lifecycle with devm_mutex_init(),
> replacing mutex_init().
...
It's better to add here
struct device *dev = &spi->dev;
and (re-)use it in all followup patches. This will make the code easier
to read.
> + ret = devm_mutex_init(&spi->dev, &st->lock);
> + if (ret)
> + return ret;
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v3 3/9] iio: amplifiers: ad8366: use devm_mutex_init() and drop mutex_init()
2026-02-04 1:53 ` Andy Shevchenko
@ 2026-02-05 20:32 ` Jonathan Cameron
0 siblings, 0 replies; 21+ messages in thread
From: Jonathan Cameron @ 2026-02-05 20:32 UTC (permalink / raw)
To: Andy Shevchenko
Cc: rodrigo.alencar, linux-kernel, linux-iio, devicetree,
Michael Hennerich, Lars-Peter Clausen, David Lechner,
Andy Shevchenko, Rob Herring, Krzysztof Kozlowski, Conor Dooley
On Wed, 4 Feb 2026 03:53:36 +0200
Andy Shevchenko <andriy.shevchenko@intel.com> wrote:
> On Tue, Feb 03, 2026 at 11:24:09AM +0000, Rodrigo Alencar via B4 Relay wrote:
>
> > Adopt proper mutex lifecycle with devm_mutex_init(),
> > replacing mutex_init().
>
> ...
>
> It's better to add here
>
> struct device *dev = &spi->dev;
>
> and (re-)use it in all followup patches. This will make the code easier
> to read.
Just to be clear. Please add a patch before this making use of
what Andy suggests in existing code. Then it will be available
to use in this patch as well.
Thanks,
Jonathan
>
> > + ret = devm_mutex_init(&spi->dev, &st->lock);
> > + if (ret)
> > + return ret;
>
^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH v3 4/9] iio: amplifiers: ad8366: drop reset_gpio from private struct
2026-02-03 11:24 [PATCH v3 0/9] iio: amplifiers: ad8366: driver update and dt support Rodrigo Alencar via B4 Relay
` (2 preceding siblings ...)
2026-02-03 11:24 ` [PATCH v3 3/9] iio: amplifiers: ad8366: use devm_mutex_init() and drop mutex_init() Rodrigo Alencar via B4 Relay
@ 2026-02-03 11:24 ` Rodrigo Alencar via B4 Relay
2026-02-04 1:55 ` Andy Shevchenko
2026-02-03 11:24 ` [PATCH v3 5/9] iio: amplifiers: ad8366: refactor device resource management Rodrigo Alencar via B4 Relay
` (5 subsequent siblings)
9 siblings, 1 reply; 21+ messages in thread
From: Rodrigo Alencar via B4 Relay @ 2026-02-03 11:24 UTC (permalink / raw)
To: linux-kernel, linux-iio, devicetree
Cc: Michael Hennerich, Lars-Peter Clausen, Jonathan Cameron,
David Lechner, Andy Shevchenko, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Rodrigo Alencar
From: Rodrigo Alencar <rodrigo.alencar@analog.com>
Remove reset_gpio from the device state struct and turn it
into a local variable, as it is not being used anywhere else.
Signed-off-by: Rodrigo Alencar <rodrigo.alencar@analog.com>
---
drivers/iio/amplifiers/ad8366.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/drivers/iio/amplifiers/ad8366.c b/drivers/iio/amplifiers/ad8366.c
index f0d44f2769ca..d6e18eb71bc8 100644
--- a/drivers/iio/amplifiers/ad8366.c
+++ b/drivers/iio/amplifiers/ad8366.c
@@ -42,7 +42,6 @@ struct ad8366_state {
struct spi_device *spi;
struct regulator *reg;
struct mutex lock; /* protect sensor state */
- struct gpio_desc *reset_gpio;
unsigned char ch[2];
enum ad8366_type type;
const struct ad8366_info *info;
@@ -245,6 +244,7 @@ static const struct iio_chan_spec ada4961_channels[] = {
static int ad8366_probe(struct spi_device *spi)
{
+ struct gpio_desc *reset_gpio;
struct iio_dev *indio_dev;
struct ad8366_state *st;
int ret;
@@ -279,9 +279,9 @@ static int ad8366_probe(struct spi_device *spi)
case ID_ADL5240:
case ID_HMC792:
case ID_HMC1119:
- st->reset_gpio = devm_gpiod_get_optional(&spi->dev, "reset", GPIOD_OUT_HIGH);
- if (IS_ERR(st->reset_gpio)) {
- ret = PTR_ERR(st->reset_gpio);
+ reset_gpio = devm_gpiod_get_optional(&spi->dev, "reset", GPIOD_OUT_HIGH);
+ if (IS_ERR(reset_gpio)) {
+ ret = PTR_ERR(reset_gpio);
goto error_disable_reg;
}
indio_dev->channels = ada4961_channels;
--
2.43.0
^ permalink raw reply related [flat|nested] 21+ messages in thread* Re: [PATCH v3 4/9] iio: amplifiers: ad8366: drop reset_gpio from private struct
2026-02-03 11:24 ` [PATCH v3 4/9] iio: amplifiers: ad8366: drop reset_gpio from private struct Rodrigo Alencar via B4 Relay
@ 2026-02-04 1:55 ` Andy Shevchenko
2026-02-05 18:12 ` Rodrigo Alencar
0 siblings, 1 reply; 21+ messages in thread
From: Andy Shevchenko @ 2026-02-04 1:55 UTC (permalink / raw)
To: rodrigo.alencar
Cc: linux-kernel, linux-iio, devicetree, Michael Hennerich,
Lars-Peter Clausen, Jonathan Cameron, David Lechner,
Andy Shevchenko, Rob Herring, Krzysztof Kozlowski, Conor Dooley
On Tue, Feb 03, 2026 at 11:24:10AM +0000, Rodrigo Alencar via B4 Relay wrote:
> Remove reset_gpio from the device state struct and turn it
> into a local variable, as it is not being used anywhere else.
Why not switching to reset-gpio driver to begin with?
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v3 4/9] iio: amplifiers: ad8366: drop reset_gpio from private struct
2026-02-04 1:55 ` Andy Shevchenko
@ 2026-02-05 18:12 ` Rodrigo Alencar
2026-02-06 7:32 ` Andy Shevchenko
0 siblings, 1 reply; 21+ messages in thread
From: Rodrigo Alencar @ 2026-02-05 18:12 UTC (permalink / raw)
To: Andy Shevchenko, rodrigo.alencar
Cc: linux-kernel, linux-iio, devicetree, Michael Hennerich,
Lars-Peter Clausen, Jonathan Cameron, David Lechner,
Andy Shevchenko, Rob Herring, Krzysztof Kozlowski, Conor Dooley
On 26/02/04 03:55AM, Andy Shevchenko wrote:
> On Tue, Feb 03, 2026 at 11:24:10AM +0000, Rodrigo Alencar via B4 Relay wrote:
>
> > Remove reset_gpio from the device state struct and turn it
> > into a local variable, as it is not being used anywhere else.
>
> Why not switching to reset-gpio driver to begin with?
No particular reason, consuming it as gpio was already there!
Is this a suggestion/recommendation or a mandatory thing for
now on?
looked over some examples, some are not updating dt-bindings with resets,
others don't have Kconfig requiring POWER_RESET or POWER_RESET_GPIO config.
Those things are necessary, right?
--
Kind regards,
Rodrigo Alencar
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v3 4/9] iio: amplifiers: ad8366: drop reset_gpio from private struct
2026-02-05 18:12 ` Rodrigo Alencar
@ 2026-02-06 7:32 ` Andy Shevchenko
0 siblings, 0 replies; 21+ messages in thread
From: Andy Shevchenko @ 2026-02-06 7:32 UTC (permalink / raw)
To: Rodrigo Alencar
Cc: rodrigo.alencar, linux-kernel, linux-iio, devicetree,
Michael Hennerich, Lars-Peter Clausen, Jonathan Cameron,
David Lechner, Andy Shevchenko, Rob Herring, Krzysztof Kozlowski,
Conor Dooley
On Thu, Feb 05, 2026 at 06:12:23PM +0000, Rodrigo Alencar wrote:
> On 26/02/04 03:55AM, Andy Shevchenko wrote:
> > On Tue, Feb 03, 2026 at 11:24:10AM +0000, Rodrigo Alencar via B4 Relay wrote:
> >
> > > Remove reset_gpio from the device state struct and turn it
> > > into a local variable, as it is not being used anywhere else.
> >
> > Why not switching to reset-gpio driver to begin with?
>
> No particular reason, consuming it as gpio was already there!
> Is this a suggestion/recommendation or a mandatory thing for
> now on?
Not mandatory, just preferable since the reset line might be shared in some
(future) PCB designs, with the reset-gpio in place, there will be no need
to take care of that in the driver.
> looked over some examples, some are not updating dt-bindings with resets,
> others don't have Kconfig requiring POWER_RESET or POWER_RESET_GPIO config.
> Those things are necessary, right?
Depends on the optionality. If this resource is mandatory to have,
the mentioned options will be needed, indeed.
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH v3 5/9] iio: amplifiers: ad8366: refactor device resource management
2026-02-03 11:24 [PATCH v3 0/9] iio: amplifiers: ad8366: driver update and dt support Rodrigo Alencar via B4 Relay
` (3 preceding siblings ...)
2026-02-03 11:24 ` [PATCH v3 4/9] iio: amplifiers: ad8366: drop reset_gpio from private struct Rodrigo Alencar via B4 Relay
@ 2026-02-03 11:24 ` Rodrigo Alencar via B4 Relay
2026-02-03 11:24 ` [PATCH v3 6/9] iio: amplifiers: ad8366: sort header includes Rodrigo Alencar via B4 Relay
` (4 subsequent siblings)
9 siblings, 0 replies; 21+ messages in thread
From: Rodrigo Alencar via B4 Relay @ 2026-02-03 11:24 UTC (permalink / raw)
To: linux-kernel, linux-iio, devicetree
Cc: Michael Hennerich, Lars-Peter Clausen, Jonathan Cameron,
David Lechner, Andy Shevchenko, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Rodrigo Alencar
From: Rodrigo Alencar <rodrigo.alencar@analog.com>
Adhere modern device resource management with the following:
- Voltage regulator managed and enabled internally;
- IIO device registration handled with devm_iio_device_register();
- removal of goto's from the probe function;
- ad8366_remove() removed as it is not needed anymore;
With the drop of goto's dev_err_probe() is used to report probe errors.
Signed-off-by: Rodrigo Alencar <rodrigo.alencar@analog.com>
---
drivers/iio/amplifiers/ad8366.c | 50 +++++++++--------------------------------
1 file changed, 10 insertions(+), 40 deletions(-)
diff --git a/drivers/iio/amplifiers/ad8366.c b/drivers/iio/amplifiers/ad8366.c
index d6e18eb71bc8..2da10c748362 100644
--- a/drivers/iio/amplifiers/ad8366.c
+++ b/drivers/iio/amplifiers/ad8366.c
@@ -40,7 +40,6 @@ struct ad8366_info {
struct ad8366_state {
struct spi_device *spi;
- struct regulator *reg;
struct mutex lock; /* protect sensor state */
unsigned char ch[2];
enum ad8366_type type;
@@ -259,14 +258,10 @@ static int ad8366_probe(struct spi_device *spi)
if (ret)
return ret;
- st->reg = devm_regulator_get(&spi->dev, "vcc");
- if (!IS_ERR(st->reg)) {
- ret = regulator_enable(st->reg);
- if (ret)
- return ret;
- }
+ ret = devm_regulator_get_enable(&spi->dev, "vcc");
+ if (ret)
+ return dev_err_probe(&spi->dev, ret, "Failed to get regulator\n");
- spi_set_drvdata(spi, indio_dev);
st->spi = spi;
st->type = spi_get_device_id(spi)->driver_data;
@@ -280,17 +275,15 @@ static int ad8366_probe(struct spi_device *spi)
case ID_HMC792:
case ID_HMC1119:
reset_gpio = devm_gpiod_get_optional(&spi->dev, "reset", GPIOD_OUT_HIGH);
- if (IS_ERR(reset_gpio)) {
- ret = PTR_ERR(reset_gpio);
- goto error_disable_reg;
- }
+ if (IS_ERR(reset_gpio))
+ return dev_err_probe(&spi->dev, PTR_ERR(reset_gpio),
+ "Failed to get reset GPIO\n");
+
indio_dev->channels = ada4961_channels;
indio_dev->num_channels = ARRAY_SIZE(ada4961_channels);
break;
default:
- dev_err(&spi->dev, "Invalid device ID\n");
- ret = -EINVAL;
- goto error_disable_reg;
+ return dev_err_probe(&spi->dev, -EINVAL, "Invalid device ID\n");
}
st->info = &ad8366_infos[st->type];
@@ -300,31 +293,9 @@ static int ad8366_probe(struct spi_device *spi)
ret = ad8366_write(indio_dev, 0, 0);
if (ret < 0)
- goto error_disable_reg;
+ return dev_err_probe(&spi->dev, ret, "failed to write initial gain\n");
- ret = iio_device_register(indio_dev);
- if (ret)
- goto error_disable_reg;
-
- return 0;
-
-error_disable_reg:
- if (!IS_ERR(st->reg))
- regulator_disable(st->reg);
-
- return ret;
-}
-
-static void ad8366_remove(struct spi_device *spi)
-{
- struct iio_dev *indio_dev = spi_get_drvdata(spi);
- struct ad8366_state *st = iio_priv(indio_dev);
- struct regulator *reg = st->reg;
-
- iio_device_unregister(indio_dev);
-
- if (!IS_ERR(reg))
- regulator_disable(reg);
+ return devm_iio_device_register(&spi->dev, indio_dev);
}
static const struct spi_device_id ad8366_id[] = {
@@ -342,7 +313,6 @@ static struct spi_driver ad8366_driver = {
.name = KBUILD_MODNAME,
},
.probe = ad8366_probe,
- .remove = ad8366_remove,
.id_table = ad8366_id,
};
--
2.43.0
^ permalink raw reply related [flat|nested] 21+ messages in thread* [PATCH v3 6/9] iio: amplifiers: ad8366: sort header includes
2026-02-03 11:24 [PATCH v3 0/9] iio: amplifiers: ad8366: driver update and dt support Rodrigo Alencar via B4 Relay
` (4 preceding siblings ...)
2026-02-03 11:24 ` [PATCH v3 5/9] iio: amplifiers: ad8366: refactor device resource management Rodrigo Alencar via B4 Relay
@ 2026-02-03 11:24 ` Rodrigo Alencar via B4 Relay
2026-02-04 1:58 ` Andy Shevchenko
2026-02-03 11:24 ` [PATCH v3 7/9] iio: amplifiers: ad8366: add device tree support Rodrigo Alencar via B4 Relay
` (3 subsequent siblings)
9 siblings, 1 reply; 21+ messages in thread
From: Rodrigo Alencar via B4 Relay @ 2026-02-03 11:24 UTC (permalink / raw)
To: linux-kernel, linux-iio, devicetree
Cc: Michael Hennerich, Lars-Peter Clausen, Jonathan Cameron,
David Lechner, Andy Shevchenko, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Rodrigo Alencar
From: Rodrigo Alencar <rodrigo.alencar@analog.com>
Alphabetically sort include directives and drop include of linux/kernel.h.
Signed-off-by: Rodrigo Alencar <rodrigo.alencar@analog.com>
---
drivers/iio/amplifiers/ad8366.c | 18 ++++++++----------
1 file changed, 8 insertions(+), 10 deletions(-)
diff --git a/drivers/iio/amplifiers/ad8366.c b/drivers/iio/amplifiers/ad8366.c
index 2da10c748362..40b03e417be8 100644
--- a/drivers/iio/amplifiers/ad8366.c
+++ b/drivers/iio/amplifiers/ad8366.c
@@ -11,19 +11,17 @@
* Copyright 2012-2019 Analog Devices Inc.
*/
-#include <linux/device.h>
-#include <linux/kernel.h>
-#include <linux/slab.h>
-#include <linux/sysfs.h>
-#include <linux/spi/spi.h>
-#include <linux/regulator/consumer.h>
-#include <linux/gpio/consumer.h>
-#include <linux/err.h>
-#include <linux/module.h>
#include <linux/bitrev.h>
-
+#include <linux/device.h>
+#include <linux/err.h>
+#include <linux/gpio/consumer.h>
#include <linux/iio/iio.h>
#include <linux/iio/sysfs.h>
+#include <linux/module.h>
+#include <linux/regulator/consumer.h>
+#include <linux/slab.h>
+#include <linux/spi/spi.h>
+#include <linux/sysfs.h>
enum ad8366_type {
ID_AD8366,
--
2.43.0
^ permalink raw reply related [flat|nested] 21+ messages in thread* Re: [PATCH v3 6/9] iio: amplifiers: ad8366: sort header includes
2026-02-03 11:24 ` [PATCH v3 6/9] iio: amplifiers: ad8366: sort header includes Rodrigo Alencar via B4 Relay
@ 2026-02-04 1:58 ` Andy Shevchenko
0 siblings, 0 replies; 21+ messages in thread
From: Andy Shevchenko @ 2026-02-04 1:58 UTC (permalink / raw)
To: rodrigo.alencar
Cc: linux-kernel, linux-iio, devicetree, Michael Hennerich,
Lars-Peter Clausen, Jonathan Cameron, David Lechner,
Andy Shevchenko, Rob Herring, Krzysztof Kozlowski, Conor Dooley
On Tue, Feb 03, 2026 at 11:24:12AM +0000, Rodrigo Alencar via B4 Relay wrote:
> Alphabetically sort include directives and drop include of linux/kernel.h.
Is it safe to be dropped? Do we have all necessary headers included?
...
> -#include <linux/device.h>
> -#include <linux/kernel.h>
> -#include <linux/slab.h>
> -#include <linux/sysfs.h>
> -#include <linux/spi/spi.h>
> -#include <linux/regulator/consumer.h>
> -#include <linux/gpio/consumer.h>
> -#include <linux/err.h>
> -#include <linux/module.h>
> #include <linux/bitrev.h>
> -
No, please keep linux/iio/* in a separate group after linux/*.
> +#include <linux/device.h>
What about this one? If you dropped kernel.h, do you really need device.h?
> +#include <linux/err.h>
> +#include <linux/gpio/consumer.h>
> #include <linux/iio/iio.h>
> #include <linux/iio/sysfs.h>
> +#include <linux/module.h>
> +#include <linux/regulator/consumer.h>
> +#include <linux/slab.h>
> +#include <linux/spi/spi.h>
> +#include <linux/sysfs.h>
...
I suggest to split this to two patches:
1) just pure sorting;
2) converting in accordance with IWYU principle.
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH v3 7/9] iio: amplifiers: ad8366: add device tree support
2026-02-03 11:24 [PATCH v3 0/9] iio: amplifiers: ad8366: driver update and dt support Rodrigo Alencar via B4 Relay
` (5 preceding siblings ...)
2026-02-03 11:24 ` [PATCH v3 6/9] iio: amplifiers: ad8366: sort header includes Rodrigo Alencar via B4 Relay
@ 2026-02-03 11:24 ` Rodrigo Alencar via B4 Relay
2026-02-04 2:07 ` Andy Shevchenko
2026-02-03 11:24 ` [PATCH v3 8/9] iio: amplifiers: ad8366: consume enable gpio Rodrigo Alencar via B4 Relay
` (2 subsequent siblings)
9 siblings, 1 reply; 21+ messages in thread
From: Rodrigo Alencar via B4 Relay @ 2026-02-03 11:24 UTC (permalink / raw)
To: linux-kernel, linux-iio, devicetree
Cc: Michael Hennerich, Lars-Peter Clausen, Jonathan Cameron,
David Lechner, Andy Shevchenko, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Rodrigo Alencar
From: Rodrigo Alencar <rodrigo.alencar@analog.com>
Add device-tree support by dropping the enum ID in favor of extended
chip info table, containing:
- gain_step, indicating with sign the start of the code range;
- num_channels, to indicate the number IIO channels;
- pack_code() function to describe how SPI buffer is populated;
With this, switch cases on the device type were dropped:
- probe() function adjusted accordingly;
- Simplified read_raw() and write_raw() callbacks;
Signed-off-by: Rodrigo Alencar <rodrigo.alencar@analog.com>
---
drivers/iio/amplifiers/ad8366.c | 217 ++++++++++++++++------------------------
1 file changed, 88 insertions(+), 129 deletions(-)
diff --git a/drivers/iio/amplifiers/ad8366.c b/drivers/iio/amplifiers/ad8366.c
index 40b03e417be8..dc2fe94c53cd 100644
--- a/drivers/iio/amplifiers/ad8366.c
+++ b/drivers/iio/amplifiers/ad8366.c
@@ -18,29 +18,27 @@
#include <linux/iio/iio.h>
#include <linux/iio/sysfs.h>
#include <linux/module.h>
+#include <linux/mod_devicetable.h>
#include <linux/regulator/consumer.h>
#include <linux/slab.h>
#include <linux/spi/spi.h>
#include <linux/sysfs.h>
+#include <linux/unaligned.h>
-enum ad8366_type {
- ID_AD8366,
- ID_ADA4961,
- ID_ADL5240,
- ID_HMC792,
- ID_HMC1119,
-};
+struct ad8366_state;
struct ad8366_info {
int gain_min;
int gain_max;
+ int gain_step;
+ int num_channels;
+ size_t (*pack_code)(struct ad8366_state *st);
};
struct ad8366_state {
struct spi_device *spi;
struct mutex lock; /* protect sensor state */
unsigned char ch[2];
- enum ad8366_type type;
const struct ad8366_info *info;
/*
* DMA (thus cache coherency maintenance) may require the
@@ -49,60 +47,62 @@ struct ad8366_state {
unsigned char data[2] __aligned(IIO_DMA_MINALIGN);
};
-static const struct ad8366_info ad8366_infos[] = {
- [ID_AD8366] = {
- .gain_min = 4500,
- .gain_max = 20500,
- },
- [ID_ADA4961] = {
- .gain_min = -6000,
- .gain_max = 15000,
- },
- [ID_ADL5240] = {
- .gain_min = -11500,
- .gain_max = 20000,
- },
- [ID_HMC792] = {
- .gain_min = -15750,
- .gain_max = 0,
- },
- [ID_HMC1119] = {
- .gain_min = -31750,
- .gain_max = 0,
- },
+static size_t ad8366_pack_code(struct ad8366_state *st)
+{
+ u8 ch_a = bitrev8(st->ch[0]) >> 2;
+ u8 ch_b = bitrev8(st->ch[1]) >> 2;
+
+ put_unaligned_be16((ch_b << 6) | ch_a, &st->data[0]);
+ return 2;
+}
+
+static const struct ad8366_info ad8366_chip_info = {
+ .gain_min = 4500,
+ .gain_max = 20500,
+ .gain_step = 253,
+ .num_channels = 2,
+ .pack_code = ad8366_pack_code,
};
-static int ad8366_write(struct iio_dev *indio_dev,
- unsigned char ch_a, unsigned char ch_b)
+static const struct ad8366_info ada4961_chip_info = {
+ .gain_min = -6000,
+ .gain_max = 15000,
+ .gain_step = -1000,
+ .num_channels = 1,
+};
+
+static const struct ad8366_info adl5240_chip_info = {
+ .gain_min = -11500,
+ .gain_max = 20000,
+ .gain_step = 500,
+ .num_channels = 1,
+};
+
+static const struct ad8366_info hmc792_chip_info = {
+ .gain_min = -15750,
+ .gain_max = 0,
+ .gain_step = 250,
+ .num_channels = 1,
+};
+
+static const struct ad8366_info hmc1119_chip_info = {
+ .gain_min = -31750,
+ .gain_max = 0,
+ .gain_step = -250,
+ .num_channels = 1,
+};
+
+static int ad8366_write_code(struct ad8366_state *st)
{
- struct ad8366_state *st = iio_priv(indio_dev);
- int ret;
+ const struct ad8366_info *inf = st->info;
+ size_t len = 1;
- switch (st->type) {
- case ID_AD8366:
- ch_a = bitrev8(ch_a & 0x3F);
- ch_b = bitrev8(ch_b & 0x3F);
+ if (inf->pack_code)
+ len = inf->pack_code(st);
+ else
+ st->data[0] = st->ch[0];
- st->data[0] = ch_b >> 4;
- st->data[1] = (ch_b << 4) | (ch_a >> 2);
- break;
- case ID_ADA4961:
- st->data[0] = ch_a & 0x1F;
- break;
- case ID_ADL5240:
- st->data[0] = (ch_a & 0x3F);
- break;
- case ID_HMC792:
- case ID_HMC1119:
- st->data[0] = ch_a;
- break;
- }
-
- ret = spi_write(st->spi, st->data, indio_dev->num_channels);
- if (ret < 0)
- dev_err(&indio_dev->dev, "write failed (%d)", ret);
-
- return ret;
+ return spi_write(st->spi, st->data, len);
}
static int ad8366_read_raw(struct iio_dev *indio_dev,
@@ -112,32 +112,14 @@ static int ad8366_read_raw(struct iio_dev *indio_dev,
long m)
{
struct ad8366_state *st = iio_priv(indio_dev);
+ const struct ad8366_info *inf = st->info;
int ret;
- int code, gain = 0;
+ int gain = inf->gain_step > 0 ? inf->gain_min : inf->gain_max;
mutex_lock(&st->lock);
switch (m) {
case IIO_CHAN_INFO_HARDWAREGAIN:
- code = st->ch[chan->channel];
-
- switch (st->type) {
- case ID_AD8366:
- gain = code * 253 + 4500;
- break;
- case ID_ADA4961:
- gain = 15000 - code * 1000;
- break;
- case ID_ADL5240:
- gain = 20000 - 31500 + code * 500;
- break;
- case ID_HMC792:
- gain = -1 * code * 500;
- break;
- case ID_HMC1119:
- gain = -1 * code * 250;
- break;
- }
-
+ gain += inf->gain_step * st->ch[chan->channel];
/* Values in dB */
*val = gain / 1000;
*val2 = (gain % 1000) * 1000;
@@ -172,29 +154,14 @@ static int ad8366_write_raw(struct iio_dev *indio_dev,
if (gain > inf->gain_max || gain < inf->gain_min)
return -EINVAL;
- switch (st->type) {
- case ID_AD8366:
- code = (gain - 4500) / 253;
- break;
- case ID_ADA4961:
- code = (15000 - gain) / 1000;
- break;
- case ID_ADL5240:
- code = ((gain - 500 - 20000) / 500) & 0x3F;
- break;
- case ID_HMC792:
- code = (abs(gain) / 500) & 0x3F;
- break;
- case ID_HMC1119:
- code = (abs(gain) / 250) & 0x7F;
- break;
- }
+ gain -= inf->gain_step > 0 ? inf->gain_min : inf->gain_max;
+ code = DIV_ROUND_CLOSEST(gain, inf->gain_step);
mutex_lock(&st->lock);
switch (mask) {
case IIO_CHAN_INFO_HARDWAREGAIN:
st->ch[chan->channel] = code;
- ret = ad8366_write(indio_dev, st->ch[0], st->ch[1]);
+ ret = ad8366_write_code(st);
break;
default:
ret = -EINVAL;
@@ -235,10 +202,6 @@ static const struct iio_chan_spec ad8366_channels[] = {
AD8366_CHAN(1),
};
-static const struct iio_chan_spec ada4961_channels[] = {
- AD8366_CHAN(0),
-};
-
static int ad8366_probe(struct spi_device *spi)
{
struct gpio_desc *reset_gpio;
@@ -261,35 +224,20 @@ static int ad8366_probe(struct spi_device *spi)
return dev_err_probe(&spi->dev, ret, "Failed to get regulator\n");
st->spi = spi;
- st->type = spi_get_device_id(spi)->driver_data;
+ st->info = spi_get_device_match_data(spi);
- switch (st->type) {
- case ID_AD8366:
- indio_dev->channels = ad8366_channels;
- indio_dev->num_channels = ARRAY_SIZE(ad8366_channels);
- break;
- case ID_ADA4961:
- case ID_ADL5240:
- case ID_HMC792:
- case ID_HMC1119:
- reset_gpio = devm_gpiod_get_optional(&spi->dev, "reset", GPIOD_OUT_HIGH);
- if (IS_ERR(reset_gpio))
- return dev_err_probe(&spi->dev, PTR_ERR(reset_gpio),
- "Failed to get reset GPIO\n");
+ reset_gpio = devm_gpiod_get_optional(&spi->dev, "reset", GPIOD_OUT_HIGH);
+ if (IS_ERR(reset_gpio))
+ return dev_err_probe(&spi->dev, PTR_ERR(reset_gpio),
+ "Failed to get reset GPIO\n");
- indio_dev->channels = ada4961_channels;
- indio_dev->num_channels = ARRAY_SIZE(ada4961_channels);
- break;
- default:
- return dev_err_probe(&spi->dev, -EINVAL, "Invalid device ID\n");
- }
-
- st->info = &ad8366_infos[st->type];
indio_dev->name = spi_get_device_id(spi)->name;
indio_dev->info = &ad8366_info;
indio_dev->modes = INDIO_DIRECT_MODE;
+ indio_dev->channels = ad8366_channels;
+ indio_dev->num_channels = st->info->num_channels;
- ret = ad8366_write(indio_dev, 0, 0);
+ ret = ad8366_write_code(st);
if (ret < 0)
return dev_err_probe(&spi->dev, ret, "failed to write initial gain\n");
@@ -297,18 +245,29 @@ static int ad8366_probe(struct spi_device *spi)
}
static const struct spi_device_id ad8366_id[] = {
- {"ad8366", ID_AD8366},
- {"ada4961", ID_ADA4961},
- {"adl5240", ID_ADL5240},
- {"hmc792a", ID_HMC792},
- {"hmc1119", ID_HMC1119},
+ {"ad8366", (kernel_ulong_t)&ad8366_chip_info},
+ {"ada4961", (kernel_ulong_t)&ada4961_chip_info},
+ {"adl5240", (kernel_ulong_t)&adl5240_chip_info},
+ {"hmc792a", (kernel_ulong_t)&hmc792_chip_info},
+ {"hmc1119", (kernel_ulong_t)&hmc1119_chip_info},
{ }
};
MODULE_DEVICE_TABLE(spi, ad8366_id);
+static const struct of_device_id ad8366_of_match[] = {
+ { .compatible = "adi,ad8366", .data = &ad8366_chip_info },
+ { .compatible = "adi,ada4961", .data = &ada4961_chip_info },
+ { .compatible = "adi,adl5240", .data = &adl5240_chip_info },
+ { .compatible = "adi,hmc792a", .data = &hmc792_chip_info },
+ { .compatible = "adi,hmc1119", .data = &hmc1119_chip_info },
+ { }
+};
+MODULE_DEVICE_TABLE(of, ad8366_of_match);
+
static struct spi_driver ad8366_driver = {
.driver = {
- .name = KBUILD_MODNAME,
+ .name = KBUILD_MODNAME,
+ .of_match_table = ad8366_of_match,
},
.probe = ad8366_probe,
.id_table = ad8366_id,
--
2.43.0
^ permalink raw reply related [flat|nested] 21+ messages in thread* Re: [PATCH v3 7/9] iio: amplifiers: ad8366: add device tree support
2026-02-03 11:24 ` [PATCH v3 7/9] iio: amplifiers: ad8366: add device tree support Rodrigo Alencar via B4 Relay
@ 2026-02-04 2:07 ` Andy Shevchenko
0 siblings, 0 replies; 21+ messages in thread
From: Andy Shevchenko @ 2026-02-04 2:07 UTC (permalink / raw)
To: rodrigo.alencar
Cc: linux-kernel, linux-iio, devicetree, Michael Hennerich,
Lars-Peter Clausen, Jonathan Cameron, David Lechner,
Andy Shevchenko, Rob Herring, Krzysztof Kozlowski, Conor Dooley
On Tue, Feb 03, 2026 at 11:24:13AM +0000, Rodrigo Alencar via B4 Relay wrote:
> Add device-tree support by dropping the enum ID in favor of extended
> chip info table, containing:
> - gain_step, indicating with sign the start of the code range;
> - num_channels, to indicate the number IIO channels;
> - pack_code() function to describe how SPI buffer is populated;
>
> With this, switch cases on the device type were dropped:
> - probe() function adjusted accordingly;
> - Simplified read_raw() and write_raw() callbacks;
...
> +static size_t ad8366_pack_code(struct ad8366_state *st)
> +{
> + u8 ch_a = bitrev8(st->ch[0]) >> 2;
> + u8 ch_b = bitrev8(st->ch[1]) >> 2;
> +
> + put_unaligned_be16((ch_b << 6) | ch_a, &st->data[0]);
> + return 2;
With this return it will look better as
return sizeof(__be16);
Alternatively it can be done via array:
u8 ch[] = { bitrev8(st->ch[0]) >> 2, bitrev8(st->ch[1]) >> 2 };
but I find it uglier than the original approach.
> +}
...
> + const struct ad8366_info *inf = st->info;
> + size_t len = 1;
>
> + if (inf->pack_code)
> + len = inf->pack_code(st);
> + else
> + st->data[0] = st->ch[0];
>
> + return spi_write(st->spi, st->data, len);
Hmm... What about
const struct ad8366_info *inf = st->info;
if (inf->pack_code)
return spi_write(st->spi, st->data, inf->pack_code(st));
st->data[0] = st->ch[0];
return spi_write(st->spi, st->data, 1);
?
...
> struct ad8366_state *st = iio_priv(indio_dev);
> + const struct ad8366_info *inf = st->info;
> int ret;
> + int gain = inf->gain_step > 0 ? inf->gain_min : inf->gain_max;
Please, preserve reversed xmas tree order.
...
> - {"ada4961", ID_ADA4961},
> - {"adl5240", ID_ADL5240},
> - {"hmc792a", ID_HMC792},
> - {"hmc1119", ID_HMC1119},
> + {"ad8366", (kernel_ulong_t)&ad8366_chip_info},
> + {"ada4961", (kernel_ulong_t)&ada4961_chip_info},
> + {"adl5240", (kernel_ulong_t)&adl5240_chip_info},
> + {"hmc792a", (kernel_ulong_t)&hmc792_chip_info},
> + {"hmc1119", (kernel_ulong_t)&hmc1119_chip_info},
The conversion to chip_info may be split to a separate patch.
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH v3 8/9] iio: amplifiers: ad8366: consume enable gpio
2026-02-03 11:24 [PATCH v3 0/9] iio: amplifiers: ad8366: driver update and dt support Rodrigo Alencar via B4 Relay
` (6 preceding siblings ...)
2026-02-03 11:24 ` [PATCH v3 7/9] iio: amplifiers: ad8366: add device tree support Rodrigo Alencar via B4 Relay
@ 2026-02-03 11:24 ` Rodrigo Alencar via B4 Relay
2026-02-04 2:22 ` Andy Shevchenko
2026-02-03 11:24 ` [PATCH v3 9/9] iio: amplifiers: ad8366: Update device support Rodrigo Alencar via B4 Relay
2026-02-05 20:37 ` [PATCH v3 0/9] iio: amplifiers: ad8366: driver update and dt support Jonathan Cameron
9 siblings, 1 reply; 21+ messages in thread
From: Rodrigo Alencar via B4 Relay @ 2026-02-03 11:24 UTC (permalink / raw)
To: linux-kernel, linux-iio, devicetree
Cc: Michael Hennerich, Lars-Peter Clausen, Jonathan Cameron,
David Lechner, Andy Shevchenko, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Rodrigo Alencar
From: Rodrigo Alencar <rodrigo.alencar@analog.com>
Some parts may consume enable GPIO to enable serial mode
(HMC1119's and HMC792A P/S pin) or powerup the device
(e.g. ADA4961's PWUP pin). Also, add a comment explaining
that even though chips like HMC271A has a reset gpio, this
driver previously considered the reset pin for parts that
don't actually have a reset gpio, so it might have been
used to enable/power the device.
Signed-off-by: Rodrigo Alencar <rodrigo.alencar@analog.com>
---
drivers/iio/amplifiers/ad8366.c | 13 ++++++++++++-
1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/drivers/iio/amplifiers/ad8366.c b/drivers/iio/amplifiers/ad8366.c
index dc2fe94c53cd..92865ab96ade 100644
--- a/drivers/iio/amplifiers/ad8366.c
+++ b/drivers/iio/amplifiers/ad8366.c
@@ -204,7 +204,7 @@ static const struct iio_chan_spec ad8366_channels[] = {
static int ad8366_probe(struct spi_device *spi)
{
- struct gpio_desc *reset_gpio;
+ struct gpio_desc *reset_gpio, *enable_gpio;
struct iio_dev *indio_dev;
struct ad8366_state *st;
int ret;
@@ -226,11 +226,22 @@ static int ad8366_probe(struct spi_device *spi)
st->spi = spi;
st->info = spi_get_device_match_data(spi);
+ /*
+ * Previously, this driver considered the reset gpio for some devices
+ * that don't actually have a reset pin, which could have been wired
+ * up to the enable pin instead, so some users might be relying on this
+ * to turn the chip on rather than reset it.
+ */
reset_gpio = devm_gpiod_get_optional(&spi->dev, "reset", GPIOD_OUT_HIGH);
if (IS_ERR(reset_gpio))
return dev_err_probe(&spi->dev, PTR_ERR(reset_gpio),
"Failed to get reset GPIO\n");
+ enable_gpio = devm_gpiod_get_optional(&spi->dev, "enable", GPIOD_OUT_HIGH);
+ if (IS_ERR(enable_gpio))
+ return dev_err_probe(&spi->dev, PTR_ERR(enable_gpio),
+ "Failed to get enable GPIO\n");
+
indio_dev->name = spi_get_device_id(spi)->name;
indio_dev->info = &ad8366_info;
indio_dev->modes = INDIO_DIRECT_MODE;
--
2.43.0
^ permalink raw reply related [flat|nested] 21+ messages in thread* Re: [PATCH v3 8/9] iio: amplifiers: ad8366: consume enable gpio
2026-02-03 11:24 ` [PATCH v3 8/9] iio: amplifiers: ad8366: consume enable gpio Rodrigo Alencar via B4 Relay
@ 2026-02-04 2:22 ` Andy Shevchenko
0 siblings, 0 replies; 21+ messages in thread
From: Andy Shevchenko @ 2026-02-04 2:22 UTC (permalink / raw)
To: rodrigo.alencar
Cc: linux-kernel, linux-iio, devicetree, Michael Hennerich,
Lars-Peter Clausen, Jonathan Cameron, David Lechner,
Andy Shevchenko, Rob Herring, Krzysztof Kozlowski, Conor Dooley
On Tue, Feb 03, 2026 at 11:24:14AM +0000, Rodrigo Alencar via B4 Relay wrote:
> Some parts may consume enable GPIO to enable serial mode
> (HMC1119's and HMC792A P/S pin) or powerup the device
> (e.g. ADA4961's PWUP pin). Also, add a comment explaining
> that even though chips like HMC271A has a reset gpio, this
> driver previously considered the reset pin for parts that
> don't actually have a reset gpio, so it might have been
> used to enable/power the device.
...
> + /*
> + * Previously, this driver considered the reset gpio for some devices
GPIO
> + * that don't actually have a reset pin, which could have been wired
> + * up to the enable pin instead, so some users might be relying on this
> + * to turn the chip on rather than reset it.
> + */
> reset_gpio = devm_gpiod_get_optional(&spi->dev, "reset", GPIOD_OUT_HIGH);
> if (IS_ERR(reset_gpio))
> return dev_err_probe(&spi->dev, PTR_ERR(reset_gpio),
> "Failed to get reset GPIO\n");
Yeah, this needs to be addressed somewhere in drivers/gpio/gpiolib-of.c.
Because OUT_HIGH for the reset doesn't sound right if the polarity is active high.
> + enable_gpio = devm_gpiod_get_optional(&spi->dev, "enable", GPIOD_OUT_HIGH);
> + if (IS_ERR(enable_gpio))
> + return dev_err_probe(&spi->dev, PTR_ERR(enable_gpio),
> + "Failed to get enable GPIO\n");
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH v3 9/9] iio: amplifiers: ad8366: Update device support
2026-02-03 11:24 [PATCH v3 0/9] iio: amplifiers: ad8366: driver update and dt support Rodrigo Alencar via B4 Relay
` (7 preceding siblings ...)
2026-02-03 11:24 ` [PATCH v3 8/9] iio: amplifiers: ad8366: consume enable gpio Rodrigo Alencar via B4 Relay
@ 2026-02-03 11:24 ` Rodrigo Alencar via B4 Relay
2026-02-04 2:23 ` Andy Shevchenko
2026-02-05 20:37 ` [PATCH v3 0/9] iio: amplifiers: ad8366: driver update and dt support Jonathan Cameron
9 siblings, 1 reply; 21+ messages in thread
From: Rodrigo Alencar via B4 Relay @ 2026-02-03 11:24 UTC (permalink / raw)
To: linux-kernel, linux-iio, devicetree
Cc: Michael Hennerich, Lars-Peter Clausen, Jonathan Cameron,
David Lechner, Andy Shevchenko, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Rodrigo Alencar, Alexandru Ardelean
From: Rodrigo Alencar <rodrigo.alencar@analog.com>
Add support for the following digital step attenuators:
- HMC271A: 1dB LSB 5-Bit Digital Attenuator SMT, 0.7 - 3.7 GHz
- ADRF5720: 0.5 dB LSB, 6-Bit, Digital Attenuator, 9 kHz to 40 GHz
- ADRF5730: 0.5 dB LSB, 6-Bit, Digital Attenuator, 100 MHz to 40 GHz
- ADRF5731: 2 dB LSB, 4-Bit, Digital Attenuator, 100 MHz to 40 GHz
- HMC1018A: 1.0 dB LSB GaAs MMIC 5-BIT DIGITAL ATTENUATOR, 0.1 - 30 GHz
- HMC1019A: 0.5 dB LSB GaAs MMIC 5-BIT DIGITAL ATTENUATOR, 0.1 - 30 GHz
Additionally, copyright notice was updated with current year.
Co-developed-by: Alexandru Ardelean <alexandru.ardelean@analog.com>
Signed-off-by: Alexandru Ardelean <alexandru.ardelean@analog.com>
Co-developed-by: Michael Hennerich <michael.hennerich@analog.com>
Signed-off-by: Michael Hennerich <michael.hennerich@analog.com>
Signed-off-by: Rodrigo Alencar <rodrigo.alencar@analog.com>
---
drivers/iio/amplifiers/Kconfig | 6 ++++
drivers/iio/amplifiers/ad8366.c | 69 ++++++++++++++++++++++++++++++++++++++++-
2 files changed, 74 insertions(+), 1 deletion(-)
diff --git a/drivers/iio/amplifiers/Kconfig b/drivers/iio/amplifiers/Kconfig
index a8a604863eed..39d280d4d437 100644
--- a/drivers/iio/amplifiers/Kconfig
+++ b/drivers/iio/amplifiers/Kconfig
@@ -18,7 +18,13 @@ config AD8366
AD8366 Dual-Digital Variable Gain Amplifier (VGA)
ADA4961 BiCMOS RF Digital Gain Amplifier (DGA)
ADL5240 Digitally controlled variable gain amplifier (VGA)
+ ADRF5720: 0.5 dB LSB, 6-Bit, Silicon Digital Attenuator
+ ADRF5730: 0.5 dB LSB, 6-Bit, Silicon Digital Attenuator
+ ADRF5731: 2 dB LSB, 4-Bit, Silicon Digital Attenuator
+ HMC271A: 1dB LSB 5-Bit Digital Attenuator SMT
HMC792A 0.25 dB LSB GaAs MMIC 6-Bit Digital Attenuator
+ HMC1018A: 1.0 dB LSB GaAs MMIC 5-BIT Digital Attenuator
+ HMC1019A: 0.5 dB LSB GaAs MMIC 5-BIT Digital Attenuator
HMC1119 0.25 dB LSB, 7-Bit, Silicon Digital Attenuator
To compile this driver as a module, choose M here: the
diff --git a/drivers/iio/amplifiers/ad8366.c b/drivers/iio/amplifiers/ad8366.c
index 92865ab96ade..42b89fef761a 100644
--- a/drivers/iio/amplifiers/ad8366.c
+++ b/drivers/iio/amplifiers/ad8366.c
@@ -5,10 +5,16 @@
* AD8366 Dual-Digital Variable Gain Amplifier (VGA)
* ADA4961 BiCMOS RF Digital Gain Amplifier (DGA)
* ADL5240 Digitally controlled variable gain amplifier (VGA)
+ * ADRF5720: 0.5 dB LSB, 6-Bit, Silicon Digital Attenuator, 9 kHz to 40 GHz
+ * ADRF5730: 0.5 dB LSB, 6-Bit, Silicon Digital Attenuator, 100 MHz to 40 GHz
+ * ADRF5731: 2 dB LSB, 4-Bit, Silicon Digital Attenuator, 100 MHz to 40 GHz
+ * HMC271A: 1dB LSB 5-Bit Digital Attenuator SMT, 0.7 - 3.7 GHz
* HMC792A 0.25 dB LSB GaAs MMIC 6-Bit Digital Attenuator
+ * HMC1018A: 1.0 dB LSB GaAs MMIC 5-BIT DIGITAL ATTENUATOR, 0.1 - 30 GHz
+ * HMC1019A: 0.5 dB LSB GaAs MMIC 5-BIT DIGITAL ATTENUATOR, 0.1 - 30 GHz
* HMC1119 0.25 dB LSB, 7-Bit, Silicon Digital Attenuator
*
- * Copyright 2012-2019 Analog Devices Inc.
+ * Copyright 2012-2026 Analog Devices Inc.
*/
#include <linux/bitrev.h>
@@ -56,6 +62,18 @@ static size_t ad8366_pack_code(struct ad8366_state *st)
return 2;
}
+static size_t adrf5731_pack_code(struct ad8366_state *st)
+{
+ st->data[0] = st->ch[0] << 2;
+ return 1;
+}
+
+static size_t hmc271_pack_code(struct ad8366_state *st)
+{
+ st->data[0] = bitrev8(st->ch[0]) >> 3;
+ return 1;
+}
+
static const struct ad8366_info ad8366_chip_info = {
.gain_min = 4500,
.gain_max = 20500,
@@ -78,6 +96,29 @@ static const struct ad8366_info adl5240_chip_info = {
.num_channels = 1,
};
+static const struct ad8366_info adrf57x0_chip_info = {
+ .gain_min = -31500,
+ .gain_max = 0,
+ .gain_step = -500,
+ .num_channels = 1,
+};
+
+static const struct ad8366_info adrf5731_chip_info = {
+ .gain_min = -30000,
+ .gain_max = 0,
+ .gain_step = -2000,
+ .num_channels = 1,
+ .pack_code = adrf5731_pack_code,
+};
+
+static const struct ad8366_info hmc271_chip_info = {
+ .gain_min = -31000,
+ .gain_max = 0,
+ .gain_step = 1000,
+ .num_channels = 1,
+ .pack_code = hmc271_pack_code,
+};
+
static const struct ad8366_info hmc792_chip_info = {
.gain_min = -15750,
.gain_max = 0,
@@ -85,6 +126,20 @@ static const struct ad8366_info hmc792_chip_info = {
.num_channels = 1,
};
+static const struct ad8366_info hmc1018_chip_info = {
+ .gain_min = -31000,
+ .gain_max = 0,
+ .gain_step = 1000,
+ .num_channels = 1,
+};
+
+static const struct ad8366_info hmc1019_chip_info = {
+ .gain_min = -15500,
+ .gain_max = 0,
+ .gain_step = 500,
+ .num_channels = 1,
+};
+
static const struct ad8366_info hmc1119_chip_info = {
.gain_min = -31750,
.gain_max = 0,
@@ -259,7 +314,13 @@ static const struct spi_device_id ad8366_id[] = {
{"ad8366", (kernel_ulong_t)&ad8366_chip_info},
{"ada4961", (kernel_ulong_t)&ada4961_chip_info},
{"adl5240", (kernel_ulong_t)&adl5240_chip_info},
+ {"adrf5720", (kernel_ulong_t)&adrf57x0_chip_info},
+ {"adrf5730", (kernel_ulong_t)&adrf57x0_chip_info},
+ {"adrf5731", (kernel_ulong_t)&adrf5731_chip_info},
+ {"hmc271a", (kernel_ulong_t)&hmc271_chip_info},
{"hmc792a", (kernel_ulong_t)&hmc792_chip_info},
+ {"hmc1018a", (kernel_ulong_t)&hmc1018_chip_info},
+ {"hmc1019a", (kernel_ulong_t)&hmc1019_chip_info},
{"hmc1119", (kernel_ulong_t)&hmc1119_chip_info},
{ }
};
@@ -269,7 +330,13 @@ static const struct of_device_id ad8366_of_match[] = {
{ .compatible = "adi,ad8366", .data = &ad8366_chip_info },
{ .compatible = "adi,ada4961", .data = &ada4961_chip_info },
{ .compatible = "adi,adl5240", .data = &adl5240_chip_info },
+ { .compatible = "adi,adrf5720", .data = &adrf57x0_chip_info },
+ { .compatible = "adi,adrf5730", .data = &adrf57x0_chip_info },
+ { .compatible = "adi,adrf5731", .data = &adrf5731_chip_info },
+ { .compatible = "adi,hmc271a", .data = &hmc271_chip_info },
{ .compatible = "adi,hmc792a", .data = &hmc792_chip_info },
+ { .compatible = "adi,hmc1018a", .data = &hmc1018_chip_info },
+ { .compatible = "adi,hmc1019a", .data = &hmc1019_chip_info },
{ .compatible = "adi,hmc1119", .data = &hmc1119_chip_info },
{ }
};
--
2.43.0
^ permalink raw reply related [flat|nested] 21+ messages in thread* Re: [PATCH v3 9/9] iio: amplifiers: ad8366: Update device support
2026-02-03 11:24 ` [PATCH v3 9/9] iio: amplifiers: ad8366: Update device support Rodrigo Alencar via B4 Relay
@ 2026-02-04 2:23 ` Andy Shevchenko
0 siblings, 0 replies; 21+ messages in thread
From: Andy Shevchenko @ 2026-02-04 2:23 UTC (permalink / raw)
To: rodrigo.alencar
Cc: linux-kernel, linux-iio, devicetree, Michael Hennerich,
Lars-Peter Clausen, Jonathan Cameron, David Lechner,
Andy Shevchenko, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Alexandru Ardelean
On Tue, Feb 03, 2026 at 11:24:15AM +0000, Rodrigo Alencar via B4 Relay wrote:
> Add support for the following digital step attenuators:
> - HMC271A: 1dB LSB 5-Bit Digital Attenuator SMT, 0.7 - 3.7 GHz
> - ADRF5720: 0.5 dB LSB, 6-Bit, Digital Attenuator, 9 kHz to 40 GHz
> - ADRF5730: 0.5 dB LSB, 6-Bit, Digital Attenuator, 100 MHz to 40 GHz
> - ADRF5731: 2 dB LSB, 4-Bit, Digital Attenuator, 100 MHz to 40 GHz
> - HMC1018A: 1.0 dB LSB GaAs MMIC 5-BIT DIGITAL ATTENUATOR, 0.1 - 30 GHz
> - HMC1019A: 0.5 dB LSB GaAs MMIC 5-BIT DIGITAL ATTENUATOR, 0.1 - 30 GHz
>
> Additionally, copyright notice was updated with current year.
Reviewed-by: Andy Shevchenko <andriy.shevchenko@intel.com>
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH v3 0/9] iio: amplifiers: ad8366: driver update and dt support
2026-02-03 11:24 [PATCH v3 0/9] iio: amplifiers: ad8366: driver update and dt support Rodrigo Alencar via B4 Relay
` (8 preceding siblings ...)
2026-02-03 11:24 ` [PATCH v3 9/9] iio: amplifiers: ad8366: Update device support Rodrigo Alencar via B4 Relay
@ 2026-02-05 20:37 ` Jonathan Cameron
9 siblings, 0 replies; 21+ messages in thread
From: Jonathan Cameron @ 2026-02-05 20:37 UTC (permalink / raw)
To: Rodrigo Alencar via B4 Relay
Cc: rodrigo.alencar, linux-kernel, linux-iio, devicetree,
Michael Hennerich, Lars-Peter Clausen, David Lechner,
Andy Shevchenko, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Alexandru Ardelean
On Tue, 03 Feb 2026 11:24:06 +0000
Rodrigo Alencar via B4 Relay <devnull+rodrigo.alencar.analog.com@kernel.org> wrote:
> This patch series updates the AD8366 amplifier/attenuator driver with
> modern device resource management, including support for additional
> device variants.
>
> Adds support for multiple digital step attenuators:
> - ADRF5720: 0.5 dB LSB, 6-Bit, Digital Attenuator, 9 kHz to 40 GHz
> - ADRF5730: 0.5 dB LSB, 6-Bit, Digital Attenuator, 100 MHz to 40 GHz
> - ADRF5731: 2 dB LSB, 4-Bit, Digital Attenuator, 100 MHz to 40 GHz
> - HMC271A: 1 dB LSB, 5-bit, Digital Attenuator, 0.7 - 3.7 GHz
> - HMC1018A: 1.0 dB LSB GaAs MMIC 5-BIT DIGITAL ATTENUATOR, 0.1 - 30 GHz
> - HMC1019A: 0.5 dB LSB GaAs MMIC 5-BIT DIGITAL ATTENUATOR, 0.1 - 30 GHz
>
> Device Tree Support:
> - Adds device tree binding documentation
> - Adds device tree compatible strings for all supported devices
> - Favor chip info tables over device type.
>
> Signed-off-by: Rodrigo Alencar <rodrigo.alencar@analog.com>
I took a look through and didn't have anything significant to add.
Looks like it'll be good to go for v4. We have plenty of time
to make things extra nice as I won't be merging anything else for
the coming merge window.
Thanks,
Jonathan
^ permalink raw reply [flat|nested] 21+ messages in thread