* [PATCH v5 01/11] MAINTAINERS: Add missing maintainer entry for AD8366 driver
2026-02-16 17:10 [PATCH v5 00/11] iio: amplifiers: ad8366: driver update and dt support Rodrigo Alencar via B4 Relay
@ 2026-02-16 17:10 ` Rodrigo Alencar via B4 Relay
2026-02-16 17:10 ` [PATCH v5 02/11] dt-bindings: iio: amplifiers: Add AD8366 support Rodrigo Alencar via B4 Relay
` (10 subsequent siblings)
11 siblings, 0 replies; 13+ messages in thread
From: Rodrigo Alencar via B4 Relay @ 2026-02-16 17:10 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 [flat|nested] 13+ messages in thread* [PATCH v5 02/11] dt-bindings: iio: amplifiers: Add AD8366 support
2026-02-16 17:10 [PATCH v5 00/11] iio: amplifiers: ad8366: driver update and dt support Rodrigo Alencar via B4 Relay
2026-02-16 17:10 ` [PATCH v5 01/11] MAINTAINERS: Add missing maintainer entry for AD8366 driver Rodrigo Alencar via B4 Relay
@ 2026-02-16 17:10 ` Rodrigo Alencar via B4 Relay
2026-02-16 17:10 ` [PATCH v5 03/11] iio: amplifiers: ad8366: refactor include headers Rodrigo Alencar via B4 Relay
` (9 subsequent siblings)
11 siblings, 0 replies; 13+ messages in thread
From: Rodrigo Alencar via B4 Relay @ 2026-02-16 17:10 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, Conor Dooley
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.
Reviewed-by: Conor Dooley <conor.dooley@microchip.com>
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 [flat|nested] 13+ messages in thread* [PATCH v5 03/11] iio: amplifiers: ad8366: refactor include headers
2026-02-16 17:10 [PATCH v5 00/11] iio: amplifiers: ad8366: driver update and dt support Rodrigo Alencar via B4 Relay
2026-02-16 17:10 ` [PATCH v5 01/11] MAINTAINERS: Add missing maintainer entry for AD8366 driver Rodrigo Alencar via B4 Relay
2026-02-16 17:10 ` [PATCH v5 02/11] dt-bindings: iio: amplifiers: Add AD8366 support Rodrigo Alencar via B4 Relay
@ 2026-02-16 17:10 ` Rodrigo Alencar via B4 Relay
2026-02-16 17:10 ` [PATCH v5 04/11] iio: amplifiers: ad8366: add local dev pointer to the probe function Rodrigo Alencar via B4 Relay
` (8 subsequent siblings)
11 siblings, 0 replies; 13+ messages in thread
From: Rodrigo Alencar via B4 Relay @ 2026-02-16 17:10 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>
Apply IWYU principle, removing the following headers:
- linux/device.h: no usage of devm_add_action_or_reset, device_attr...
- linux/kernel.h: no usage of container_of, kasprintf, ...
- linux/slab.h: memory management handled by iio
- linux/sysfs.h: sysfs interaction is managed by iio
- linux/iio/sysfs.h: not using iio device attributes in this driver
Adding the following missing headers:
+ linux/array_size.h: for ARRAY_SIZE
+ linux/bits.h: for BIT
+ linux/dev_printk.h: for dev_err
+ linux/math.h: for abs
+ linux/mutex.h: for mutex_lock, mutex_unlock
+ linux/mod_devicetable.h: for spi_device_id
+ linux/types.h for NULL, __aligned
Additionally, those include directives are alphabetically sorted.
Signed-off-by: Rodrigo Alencar <rodrigo.alencar@analog.com>
---
drivers/iio/amplifiers/ad8366.c | 23 +++++++++++++----------
1 file changed, 13 insertions(+), 10 deletions(-)
diff --git a/drivers/iio/amplifiers/ad8366.c b/drivers/iio/amplifiers/ad8366.c
index d06ac786501c..8dc639d30dbb 100644
--- a/drivers/iio/amplifiers/ad8366.c
+++ b/drivers/iio/amplifiers/ad8366.c
@@ -11,19 +11,22 @@
* 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/array_size.h>
#include <linux/bitrev.h>
+#include <linux/bits.h>
+#include <linux/dev_printk.h>
+#include <linux/err.h>
+#include <linux/gpio/consumer.h>
+#include <linux/math.h>
+#include <linux/minmax.h>
+#include <linux/mod_devicetable.h>
+#include <linux/module.h>
+#include <linux/mutex.h>
+#include <linux/regulator/consumer.h>
+#include <linux/spi/spi.h>
+#include <linux/types.h>
#include <linux/iio/iio.h>
-#include <linux/iio/sysfs.h>
enum ad8366_type {
ID_AD8366,
--
2.43.0
^ permalink raw reply [flat|nested] 13+ messages in thread* [PATCH v5 04/11] iio: amplifiers: ad8366: add local dev pointer to the probe function
2026-02-16 17:10 [PATCH v5 00/11] iio: amplifiers: ad8366: driver update and dt support Rodrigo Alencar via B4 Relay
` (2 preceding siblings ...)
2026-02-16 17:10 ` [PATCH v5 03/11] iio: amplifiers: ad8366: refactor include headers Rodrigo Alencar via B4 Relay
@ 2026-02-16 17:10 ` Rodrigo Alencar via B4 Relay
2026-02-16 17:10 ` [PATCH v5 05/11] iio: amplifiers: ad8366: use devm_mutex_init() and drop mutex_init() Rodrigo Alencar via B4 Relay
` (7 subsequent siblings)
11 siblings, 0 replies; 13+ messages in thread
From: Rodrigo Alencar via B4 Relay @ 2026-02-16 17:10 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>
Create local device pointer in the probe function to shorten lines, making
the code easier to read. The local device pointer replaces &spi->dev and
will be reused across other probe function places in later patches.
Signed-off-by: Rodrigo Alencar <rodrigo.alencar@analog.com>
---
drivers/iio/amplifiers/ad8366.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/drivers/iio/amplifiers/ad8366.c b/drivers/iio/amplifiers/ad8366.c
index 8dc639d30dbb..677d02f4f075 100644
--- a/drivers/iio/amplifiers/ad8366.c
+++ b/drivers/iio/amplifiers/ad8366.c
@@ -248,11 +248,12 @@ static const struct iio_chan_spec ada4961_channels[] = {
static int ad8366_probe(struct spi_device *spi)
{
+ struct device *dev = &spi->dev;
struct iio_dev *indio_dev;
struct ad8366_state *st;
int ret;
- indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st));
+ indio_dev = devm_iio_device_alloc(dev, sizeof(*st));
if (indio_dev == NULL)
return -ENOMEM;
--
2.43.0
^ permalink raw reply [flat|nested] 13+ messages in thread* [PATCH v5 05/11] iio: amplifiers: ad8366: use devm_mutex_init() and drop mutex_init()
2026-02-16 17:10 [PATCH v5 00/11] iio: amplifiers: ad8366: driver update and dt support Rodrigo Alencar via B4 Relay
` (3 preceding siblings ...)
2026-02-16 17:10 ` [PATCH v5 04/11] iio: amplifiers: ad8366: add local dev pointer to the probe function Rodrigo Alencar via B4 Relay
@ 2026-02-16 17:10 ` Rodrigo Alencar via B4 Relay
2026-02-16 17:10 ` [PATCH v5 06/11] iio: amplifiers: ad8366: refactor device resource management Rodrigo Alencar via B4 Relay
` (6 subsequent siblings)
11 siblings, 0 replies; 13+ messages in thread
From: Rodrigo Alencar via B4 Relay @ 2026-02-16 17:10 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(). Mutex init is moved up (before regulator init),
so that goto statement in the error path is avoided (which will
be cleaned up later).
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 677d02f4f075..6466f3eb6bbc 100644
--- a/drivers/iio/amplifiers/ad8366.c
+++ b/drivers/iio/amplifiers/ad8366.c
@@ -259,6 +259,10 @@ static int ad8366_probe(struct spi_device *spi)
st = iio_priv(indio_dev);
+ ret = devm_mutex_init(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);
@@ -267,7 +271,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 [flat|nested] 13+ messages in thread* [PATCH v5 06/11] iio: amplifiers: ad8366: refactor device resource management
2026-02-16 17:10 [PATCH v5 00/11] iio: amplifiers: ad8366: driver update and dt support Rodrigo Alencar via B4 Relay
` (4 preceding siblings ...)
2026-02-16 17:10 ` [PATCH v5 05/11] iio: amplifiers: ad8366: use devm_mutex_init() and drop mutex_init() Rodrigo Alencar via B4 Relay
@ 2026-02-16 17:10 ` Rodrigo Alencar via B4 Relay
2026-02-16 17:10 ` [PATCH v5 07/11] iio: amplifiers: ad8366: replace reset-gpio with reset controller Rodrigo Alencar via B4 Relay
` (5 subsequent siblings)
11 siblings, 0 replies; 13+ messages in thread
From: Rodrigo Alencar via B4 Relay @ 2026-02-16 17:10 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 6466f3eb6bbc..e8c80551d524 100644
--- a/drivers/iio/amplifiers/ad8366.c
+++ b/drivers/iio/amplifiers/ad8366.c
@@ -43,7 +43,6 @@ struct ad8366_info {
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];
@@ -263,14 +262,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(dev, "vcc");
+ if (ret)
+ return dev_err_probe(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;
@@ -284,17 +279,15 @@ static int ad8366_probe(struct spi_device *spi)
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);
- goto error_disable_reg;
- }
+ if (IS_ERR(st->reset_gpio))
+ return dev_err_probe(dev, PTR_ERR(st->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(dev, -EINVAL, "Invalid device ID\n");
}
st->info = &ad8366_infos[st->type];
@@ -304,31 +297,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(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(dev, indio_dev);
}
static const struct spi_device_id ad8366_id[] = {
@@ -346,7 +317,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 [flat|nested] 13+ messages in thread* [PATCH v5 07/11] iio: amplifiers: ad8366: replace reset-gpio with reset controller
2026-02-16 17:10 [PATCH v5 00/11] iio: amplifiers: ad8366: driver update and dt support Rodrigo Alencar via B4 Relay
` (5 preceding siblings ...)
2026-02-16 17:10 ` [PATCH v5 06/11] iio: amplifiers: ad8366: refactor device resource management Rodrigo Alencar via B4 Relay
@ 2026-02-16 17:10 ` Rodrigo Alencar via B4 Relay
2026-02-16 17:10 ` [PATCH v5 08/11] iio: amplifiers: ad8366: prepare for device-tree support Rodrigo Alencar via B4 Relay
` (4 subsequent siblings)
11 siblings, 0 replies; 13+ messages in thread
From: Rodrigo Alencar via B4 Relay @ 2026-02-16 17:10 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 use the reset_control
interface instead, using a local variable, as it is not being used
anywhere else. The reset controller init is moved out from the switch case
and optionally initialized for every device variant. Although not all
devices have a reset pin the code does not need to change if it is not
wired.
Signed-off-by: Rodrigo Alencar <rodrigo.alencar@analog.com>
---
drivers/iio/amplifiers/ad8366.c | 13 +++++++------
1 file changed, 7 insertions(+), 6 deletions(-)
diff --git a/drivers/iio/amplifiers/ad8366.c b/drivers/iio/amplifiers/ad8366.c
index e8c80551d524..8b3d6825423e 100644
--- a/drivers/iio/amplifiers/ad8366.c
+++ b/drivers/iio/amplifiers/ad8366.c
@@ -23,6 +23,7 @@
#include <linux/module.h>
#include <linux/mutex.h>
#include <linux/regulator/consumer.h>
+#include <linux/reset.h>
#include <linux/spi/spi.h>
#include <linux/types.h>
@@ -44,7 +45,6 @@ struct ad8366_info {
struct ad8366_state {
struct spi_device *spi;
struct mutex lock; /* protect sensor state */
- struct gpio_desc *reset_gpio;
unsigned char ch[2];
enum ad8366_type type;
const struct ad8366_info *info;
@@ -248,6 +248,7 @@ static const struct iio_chan_spec ada4961_channels[] = {
static int ad8366_probe(struct spi_device *spi)
{
struct device *dev = &spi->dev;
+ struct reset_control *rstc;
struct iio_dev *indio_dev;
struct ad8366_state *st;
int ret;
@@ -278,11 +279,6 @@ 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))
- return dev_err_probe(dev, PTR_ERR(st->reset_gpio),
- "Failed to get reset gpio\n");
-
indio_dev->channels = ada4961_channels;
indio_dev->num_channels = ARRAY_SIZE(ada4961_channels);
break;
@@ -290,6 +286,11 @@ static int ad8366_probe(struct spi_device *spi)
return dev_err_probe(dev, -EINVAL, "Invalid device ID\n");
}
+ rstc = devm_reset_control_get_optional_exclusive_deasserted(dev, NULL);
+ if (IS_ERR(rstc))
+ return dev_err_probe(dev, PTR_ERR(rstc),
+ "Failed to get reset controller\n");
+
st->info = &ad8366_infos[st->type];
indio_dev->name = spi_get_device_id(spi)->name;
indio_dev->info = &ad8366_info;
--
2.43.0
^ permalink raw reply [flat|nested] 13+ messages in thread* [PATCH v5 08/11] iio: amplifiers: ad8366: prepare for device-tree support
2026-02-16 17:10 [PATCH v5 00/11] iio: amplifiers: ad8366: driver update and dt support Rodrigo Alencar via B4 Relay
` (6 preceding siblings ...)
2026-02-16 17:10 ` [PATCH v5 07/11] iio: amplifiers: ad8366: replace reset-gpio with reset controller Rodrigo Alencar via B4 Relay
@ 2026-02-16 17:10 ` Rodrigo Alencar via B4 Relay
2026-02-16 17:10 ` [PATCH v5 09/11] iio: amplifiers: ad8366: add device tree support Rodrigo Alencar via B4 Relay
` (3 subsequent siblings)
11 siblings, 0 replies; 13+ messages in thread
From: Rodrigo Alencar via B4 Relay @ 2026-02-16 17:10 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>
Drop switch case on 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;
Which allowed for a simplified read_raw() and write_raw() callbacks. The
probe() function was adjusted accordingly. The linux/array_size.h include
is removed as number of channels is provided by chip info table.
Signed-off-by: Rodrigo Alencar <rodrigo.alencar@analog.com>
---
drivers/iio/amplifiers/ad8366.c | 134 +++++++++++++---------------------------
1 file changed, 44 insertions(+), 90 deletions(-)
diff --git a/drivers/iio/amplifiers/ad8366.c b/drivers/iio/amplifiers/ad8366.c
index 8b3d6825423e..22eb6c9bb0f6 100644
--- a/drivers/iio/amplifiers/ad8366.c
+++ b/drivers/iio/amplifiers/ad8366.c
@@ -11,7 +11,6 @@
* Copyright 2012-2019 Analog Devices Inc.
*/
-#include <linux/array_size.h>
#include <linux/bitrev.h>
#include <linux/bits.h>
#include <linux/dev_printk.h>
@@ -26,6 +25,7 @@
#include <linux/reset.h>
#include <linux/spi/spi.h>
#include <linux/types.h>
+#include <linux/unaligned.h>
#include <linux/iio/iio.h>
@@ -40,13 +40,16 @@ enum ad8366_type {
struct ad8366_info {
int gain_min;
int gain_max;
+ int gain_step;
+ size_t num_channels;
+ size_t (*pack_code)(const unsigned char *code, size_t num_channels,
+ unsigned char *data);
};
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
@@ -55,60 +58,61 @@ struct ad8366_state {
unsigned char data[2] __aligned(IIO_DMA_MINALIGN);
};
+static size_t ad8366_pack_code(const unsigned char *code, size_t num_channels,
+ unsigned char *data)
+{
+ u8 ch_a = bitrev8(code[0]) >> 2;
+ u8 ch_b = bitrev8(code[1]) >> 2;
+
+ put_unaligned_be16((ch_b << 6) | ch_a, &data[0]);
+ return sizeof(__be16);
+}
+
static const struct ad8366_info ad8366_infos[] = {
[ID_AD8366] = {
.gain_min = 4500,
.gain_max = 20500,
+ .gain_step = 253,
+ .num_channels = 2,
+ .pack_code = ad8366_pack_code,
},
[ID_ADA4961] = {
.gain_min = -6000,
.gain_max = 15000,
+ .gain_step = -1000,
+ .num_channels = 1,
},
[ID_ADL5240] = {
.gain_min = -11500,
.gain_max = 20000,
+ .gain_step = 500,
+ .num_channels = 1,
},
[ID_HMC792] = {
.gain_min = -15750,
.gain_max = 0,
+ .gain_step = 250,
+ .num_channels = 1,
},
[ID_HMC1119] = {
.gain_min = -31750,
.gain_max = 0,
+ .gain_step = -250,
+ .num_channels = 1,
},
};
-static int ad8366_write(struct iio_dev *indio_dev,
- unsigned char ch_a, unsigned char ch_b)
+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->ch, inf->num_channels, st->data);
+ 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,
@@ -118,6 +122,7 @@ 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;
@@ -125,25 +130,8 @@ static int ad8366_read_raw(struct iio_dev *indio_dev,
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 > 0 ? inf->gain_min : inf->gain_max;
+ gain += inf->gain_step * code;
/* Values in dB */
*val = gain / 1000;
*val2 = (gain % 1000) * 1000;
@@ -178,29 +166,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;
@@ -241,10 +214,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 device *dev = &spi->dev;
@@ -268,35 +237,20 @@ static int ad8366_probe(struct spi_device *spi)
return dev_err_probe(dev, ret, "Failed to get regulator\n");
st->spi = spi;
- st->type = spi_get_device_id(spi)->driver_data;
-
- 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:
- indio_dev->channels = ada4961_channels;
- indio_dev->num_channels = ARRAY_SIZE(ada4961_channels);
- break;
- default:
- return dev_err_probe(dev, -EINVAL, "Invalid device ID\n");
- }
+ st->info = &ad8366_infos[spi_get_device_id(spi)->driver_data];
rstc = devm_reset_control_get_optional_exclusive_deasserted(dev, NULL);
if (IS_ERR(rstc))
return dev_err_probe(dev, PTR_ERR(rstc),
"Failed to get reset controller\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(dev, ret, "failed to write initial gain\n");
--
2.43.0
^ permalink raw reply [flat|nested] 13+ messages in thread* [PATCH v5 09/11] iio: amplifiers: ad8366: add device tree support
2026-02-16 17:10 [PATCH v5 00/11] iio: amplifiers: ad8366: driver update and dt support Rodrigo Alencar via B4 Relay
` (7 preceding siblings ...)
2026-02-16 17:10 ` [PATCH v5 08/11] iio: amplifiers: ad8366: prepare for device-tree support Rodrigo Alencar via B4 Relay
@ 2026-02-16 17:10 ` Rodrigo Alencar via B4 Relay
2026-02-16 17:10 ` [PATCH v5 10/11] iio: amplifiers: ad8366: consume enable gpio Rodrigo Alencar via B4 Relay
` (2 subsequent siblings)
11 siblings, 0 replies; 13+ messages in thread
From: Rodrigo Alencar via B4 Relay @ 2026-02-16 17:10 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>
Drop the enum ID, split chip info table into per-device structs and add
of_match_table. Additionally, add 'name' field into the chip info struct,
dropping the usage of spi_get_device_id().
Signed-off-by: Rodrigo Alencar <rodrigo.alencar@analog.com>
---
drivers/iio/amplifiers/ad8366.c | 107 ++++++++++++++++++++++------------------
1 file changed, 59 insertions(+), 48 deletions(-)
diff --git a/drivers/iio/amplifiers/ad8366.c b/drivers/iio/amplifiers/ad8366.c
index 22eb6c9bb0f6..fb787a512bff 100644
--- a/drivers/iio/amplifiers/ad8366.c
+++ b/drivers/iio/amplifiers/ad8366.c
@@ -29,15 +29,8 @@
#include <linux/iio/iio.h>
-enum ad8366_type {
- ID_AD8366,
- ID_ADA4961,
- ID_ADL5240,
- ID_HMC792,
- ID_HMC1119,
-};
-
struct ad8366_info {
+ const char *name;
int gain_min;
int gain_max;
int gain_step;
@@ -68,38 +61,45 @@ static size_t ad8366_pack_code(const unsigned char *code, size_t num_channels,
return sizeof(__be16);
}
-static const struct ad8366_info ad8366_infos[] = {
- [ID_AD8366] = {
- .gain_min = 4500,
- .gain_max = 20500,
- .gain_step = 253,
- .num_channels = 2,
- .pack_code = ad8366_pack_code,
- },
- [ID_ADA4961] = {
- .gain_min = -6000,
- .gain_max = 15000,
- .gain_step = -1000,
- .num_channels = 1,
- },
- [ID_ADL5240] = {
- .gain_min = -11500,
- .gain_max = 20000,
- .gain_step = 500,
- .num_channels = 1,
- },
- [ID_HMC792] = {
- .gain_min = -15750,
- .gain_max = 0,
- .gain_step = 250,
- .num_channels = 1,
- },
- [ID_HMC1119] = {
- .gain_min = -31750,
- .gain_max = 0,
- .gain_step = -250,
- .num_channels = 1,
- },
+static const struct ad8366_info ad8366_chip_info = {
+ .name = "ad8366",
+ .gain_min = 4500,
+ .gain_max = 20500,
+ .gain_step = 253,
+ .num_channels = 2,
+ .pack_code = ad8366_pack_code,
+};
+
+static const struct ad8366_info ada4961_chip_info = {
+ .name = "ada4961",
+ .gain_min = -6000,
+ .gain_max = 15000,
+ .gain_step = -1000,
+ .num_channels = 1,
+};
+
+static const struct ad8366_info adl5240_chip_info = {
+ .name = "adl5240",
+ .gain_min = -11500,
+ .gain_max = 20000,
+ .gain_step = 500,
+ .num_channels = 1,
+};
+
+static const struct ad8366_info hmc792_chip_info = {
+ .name = "hmc792a",
+ .gain_min = -15750,
+ .gain_max = 0,
+ .gain_step = 250,
+ .num_channels = 1,
+};
+
+static const struct ad8366_info hmc1119_chip_info = {
+ .name = "hmc1119",
+ .gain_min = -31750,
+ .gain_max = 0,
+ .gain_step = -250,
+ .num_channels = 1,
};
static int ad8366_write_code(struct ad8366_state *st)
@@ -237,14 +237,14 @@ static int ad8366_probe(struct spi_device *spi)
return dev_err_probe(dev, ret, "Failed to get regulator\n");
st->spi = spi;
- st->info = &ad8366_infos[spi_get_device_id(spi)->driver_data];
+ st->info = spi_get_device_match_data(spi);
rstc = devm_reset_control_get_optional_exclusive_deasserted(dev, NULL);
if (IS_ERR(rstc))
return dev_err_probe(dev, PTR_ERR(rstc),
"Failed to get reset controller\n");
- indio_dev->name = spi_get_device_id(spi)->name;
+ indio_dev->name = st->info->name;
indio_dev->info = &ad8366_info;
indio_dev->modes = INDIO_DIRECT_MODE;
indio_dev->channels = ad8366_channels;
@@ -258,18 +258,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 [flat|nested] 13+ messages in thread* [PATCH v5 10/11] iio: amplifiers: ad8366: consume enable gpio
2026-02-16 17:10 [PATCH v5 00/11] iio: amplifiers: ad8366: driver update and dt support Rodrigo Alencar via B4 Relay
` (8 preceding siblings ...)
2026-02-16 17:10 ` [PATCH v5 09/11] iio: amplifiers: ad8366: add device tree support Rodrigo Alencar via B4 Relay
@ 2026-02-16 17:10 ` Rodrigo Alencar via B4 Relay
2026-02-16 17:10 ` [PATCH v5 11/11] iio: amplifiers: ad8366: update device support Rodrigo Alencar via B4 Relay
2026-02-22 18:00 ` [PATCH v5 00/11] iio: amplifiers: ad8366: driver update and dt support Jonathan Cameron
11 siblings, 0 replies; 13+ messages in thread
From: Rodrigo Alencar via B4 Relay @ 2026-02-16 17:10 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).
Signed-off-by: Rodrigo Alencar <rodrigo.alencar@analog.com>
---
drivers/iio/amplifiers/ad8366.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/drivers/iio/amplifiers/ad8366.c b/drivers/iio/amplifiers/ad8366.c
index fb787a512bff..d4499af0518a 100644
--- a/drivers/iio/amplifiers/ad8366.c
+++ b/drivers/iio/amplifiers/ad8366.c
@@ -217,6 +217,7 @@ static const struct iio_chan_spec ad8366_channels[] = {
static int ad8366_probe(struct spi_device *spi)
{
struct device *dev = &spi->dev;
+ struct gpio_desc *enable_gpio;
struct reset_control *rstc;
struct iio_dev *indio_dev;
struct ad8366_state *st;
@@ -239,6 +240,11 @@ static int ad8366_probe(struct spi_device *spi)
st->spi = spi;
st->info = spi_get_device_match_data(spi);
+ enable_gpio = devm_gpiod_get_optional(dev, "enable", GPIOD_OUT_HIGH);
+ if (IS_ERR(enable_gpio))
+ return dev_err_probe(dev, PTR_ERR(enable_gpio),
+ "Failed to get enable GPIO\n");
+
rstc = devm_reset_control_get_optional_exclusive_deasserted(dev, NULL);
if (IS_ERR(rstc))
return dev_err_probe(dev, PTR_ERR(rstc),
--
2.43.0
^ permalink raw reply [flat|nested] 13+ messages in thread* [PATCH v5 11/11] iio: amplifiers: ad8366: update device support
2026-02-16 17:10 [PATCH v5 00/11] iio: amplifiers: ad8366: driver update and dt support Rodrigo Alencar via B4 Relay
` (9 preceding siblings ...)
2026-02-16 17:10 ` [PATCH v5 10/11] iio: amplifiers: ad8366: consume enable gpio Rodrigo Alencar via B4 Relay
@ 2026-02-16 17:10 ` Rodrigo Alencar via B4 Relay
2026-02-22 18:00 ` [PATCH v5 00/11] iio: amplifiers: ad8366: driver update and dt support Jonathan Cameron
11 siblings, 0 replies; 13+ messages in thread
From: Rodrigo Alencar via B4 Relay @ 2026-02-16 17:10 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,
Andy Shevchenko
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>
Reviewed-by: Andy Shevchenko <andriy.shevchenko@intel.com>
Signed-off-by: Rodrigo Alencar <rodrigo.alencar@analog.com>
---
drivers/iio/amplifiers/Kconfig | 6 +++
drivers/iio/amplifiers/ad8366.c | 84 ++++++++++++++++++++++++++++++++++++++++-
2 files changed, 89 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 d4499af0518a..334ca91c0f59 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>
@@ -61,6 +67,20 @@ static size_t ad8366_pack_code(const unsigned char *code, size_t num_channels,
return sizeof(__be16);
}
+static size_t adrf5731_pack_code(const unsigned char *code, size_t num_channels,
+ unsigned char *data)
+{
+ data[0] = code[0] << 2;
+ return 1;
+}
+
+static size_t hmc271_pack_code(const unsigned char *code, size_t num_channels,
+ unsigned char *data)
+{
+ data[0] = bitrev8(code[0]) >> 3;
+ return 1;
+}
+
static const struct ad8366_info ad8366_chip_info = {
.name = "ad8366",
.gain_min = 4500,
@@ -86,6 +106,40 @@ static const struct ad8366_info adl5240_chip_info = {
.num_channels = 1,
};
+static const struct ad8366_info adrf5720_chip_info = {
+ .name = "adrf5720",
+ .gain_min = -31500,
+ .gain_max = 0,
+ .gain_step = -500,
+ .num_channels = 1,
+};
+
+static const struct ad8366_info adrf5730_chip_info = {
+ .name = "adrf5730",
+ .gain_min = -31500,
+ .gain_max = 0,
+ .gain_step = -500,
+ .num_channels = 1,
+};
+
+static const struct ad8366_info adrf5731_chip_info = {
+ .name = "adrf5731",
+ .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 = {
+ .name = "hmc271a",
+ .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 = {
.name = "hmc792a",
.gain_min = -15750,
@@ -94,6 +148,22 @@ static const struct ad8366_info hmc792_chip_info = {
.num_channels = 1,
};
+static const struct ad8366_info hmc1018_chip_info = {
+ .name = "hmc1018a",
+ .gain_min = -31000,
+ .gain_max = 0,
+ .gain_step = 1000,
+ .num_channels = 1,
+};
+
+static const struct ad8366_info hmc1019_chip_info = {
+ .name = "hmc1019a",
+ .gain_min = -15500,
+ .gain_max = 0,
+ .gain_step = 500,
+ .num_channels = 1,
+};
+
static const struct ad8366_info hmc1119_chip_info = {
.name = "hmc1119",
.gain_min = -31750,
@@ -267,7 +337,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)&adrf5720_chip_info },
+ { "adrf5730", (kernel_ulong_t)&adrf5730_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 },
{ }
};
@@ -277,7 +353,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 = &adrf5720_chip_info },
+ { .compatible = "adi,adrf5730", .data = &adrf5730_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 [flat|nested] 13+ messages in thread* Re: [PATCH v5 00/11] iio: amplifiers: ad8366: driver update and dt support
2026-02-16 17:10 [PATCH v5 00/11] iio: amplifiers: ad8366: driver update and dt support Rodrigo Alencar via B4 Relay
` (10 preceding siblings ...)
2026-02-16 17:10 ` [PATCH v5 11/11] iio: amplifiers: ad8366: update device support Rodrigo Alencar via B4 Relay
@ 2026-02-22 18:00 ` Jonathan Cameron
11 siblings, 0 replies; 13+ messages in thread
From: Jonathan Cameron @ 2026-02-22 18:00 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,
Conor Dooley, Alexandru Ardelean, Andy Shevchenko
On Mon, 16 Feb 2026 17:10:44 +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.
Series applied to the testing branch of iio.git. I'll be rebasing
on rc1 once available and then pushing it out for linux-next to pick up.
Thanks,
Jonathan
^ permalink raw reply [flat|nested] 13+ messages in thread