* [PATCH v4 01/12] dt-bindings: iio: dac: Document AD5446 and similar devices
2025-11-04 15:35 [PATCH v4 00/12] iio: dac: ad5446: Refactor and add support for AD5542 Nuno Sá via B4 Relay
@ 2025-11-04 15:35 ` Nuno Sá via B4 Relay
2025-11-04 17:51 ` [PATCH v5 6/7] dt-bindings: clock: rockchip: Add RK3506 clock and reset unit Conor Dooley
2025-11-04 15:35 ` [PATCH v4 02/12] iio: dac: ad5446: Use DMA safe buffer for transfers Nuno Sá via B4 Relay
` (11 subsequent siblings)
12 siblings, 1 reply; 23+ messages in thread
From: Nuno Sá via B4 Relay @ 2025-11-04 15:35 UTC (permalink / raw)
To: linux-iio, devicetree
Cc: Michael Hennerich, Jonathan Cameron, David Lechner,
Andy Shevchenko, Lars-Peter Clausen, Rob Herring,
Krzysztof Kozlowski, Conor Dooley
From: Nuno Sá <nuno.sa@analog.com>
Add device tree binding documentation for the Analog Devices AD5446
family of Digital-to-Analog Converters and derivative devices from
Texas Instruments. There's both SPI and I2C interfaces and feature
resolutions ranging from 8-bit to 16-bit.
The binding covers 29 derivatives devices including the AD5446 series,
AD5600 series, AD5620/5640/5660 variants with different voltage ranges,
and TI DAC081s101/DAC101s101/DAC121s101 devices.
Signed-off-by: Nuno Sá <nuno.sa@analog.com>
---
.../devicetree/bindings/iio/dac/adi,ad5446.yaml | 138 +++++++++++++++++++++
MAINTAINERS | 8 ++
2 files changed, 146 insertions(+)
diff --git a/Documentation/devicetree/bindings/iio/dac/adi,ad5446.yaml b/Documentation/devicetree/bindings/iio/dac/adi,ad5446.yaml
new file mode 100644
index 000000000000..2669d2c4948b
--- /dev/null
+++ b/Documentation/devicetree/bindings/iio/dac/adi,ad5446.yaml
@@ -0,0 +1,138 @@
+# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/iio/dac/adi,ad5446.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Analog Devices AD5446 and similar DACs
+
+maintainers:
+ - Michael Hennerich <michael.hennerich@analog.com>
+ - Nuno Sá <nuno.sa@analog.com>
+
+description:
+ Digital to Analog Converter devices supporting both SPI and I2C interfaces.
+ These devices feature a range of resolutions from 8-bit to 16-bit.
+
+properties:
+ compatible:
+ oneOf:
+ - description: SPI DACs
+ enum:
+ - adi,ad5300
+ - adi,ad5310
+ - adi,ad5320
+ - adi,ad5444
+ - adi,ad5446
+ - adi,ad5450
+ - adi,ad5451
+ - adi,ad5452
+ - adi,ad5453
+ - adi,ad5512a
+ - adi,ad5541a
+ - adi,ad5542
+ - adi,ad5542a
+ - adi,ad5543
+ - adi,ad5553
+ - adi,ad5600
+ - adi,ad5601
+ - adi,ad5611
+ - adi,ad5621
+ - adi,ad5641
+ - adi,ad5620-2500
+ - adi,ad5620-1250
+ - adi,ad5640-2500
+ - adi,ad5640-1250
+ - adi,ad5660-2500
+ - adi,ad5660-1250
+ - adi,ad5662
+ - ti,dac081s101
+ - ti,dac101s101
+ - ti,dac121s101
+ - description: I2C DACs
+ enum:
+ - adi,ad5301
+ - adi,ad5311
+ - adi,ad5321
+ - adi,ad5602
+ - adi,ad5612
+ - adi,ad5622
+
+ reg:
+ maxItems: 1
+
+ vcc-supply:
+ description:
+ Reference voltage supply. If not supplied, devices with internal
+ voltage reference will use that.
+
+required:
+ - compatible
+ - reg
+
+allOf:
+ - if:
+ properties:
+ compatible:
+ contains:
+ enum:
+ - adi,ad5300
+ - adi,ad5310
+ - adi,ad5320
+ - adi,ad5444
+ - adi,ad5446
+ - adi,ad5450
+ - adi,ad5451
+ - adi,ad5452
+ - adi,ad5453
+ - adi,ad5512a
+ - adi,ad5541a
+ - adi,ad5542
+ - adi,ad5542a
+ - adi,ad5543
+ - adi,ad5553
+ - adi,ad5600
+ - adi,ad5601
+ - adi,ad5611
+ - adi,ad5621
+ - adi,ad5641
+ - adi,ad5620-2500
+ - adi,ad5620-1250
+ - adi,ad5640-2500
+ - adi,ad5640-1250
+ - adi,ad5660-2500
+ - adi,ad5660-1250
+ - adi,ad5662
+ - ti,dac081s101
+ - ti,dac101s101
+ - ti,dac121s101
+ then:
+ allOf:
+ - $ref: /schemas/spi/spi-peripheral-props.yaml#
+
+unevaluatedProperties: false
+
+examples:
+ - |
+ spi {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ dac@0 {
+ compatible = "adi,ad5446";
+ reg = <0>;
+ vcc-supply = <&dac_vref>;
+ };
+ };
+ - |
+ i2c {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ dac@42 {
+ compatible = "adi,ad5622";
+ reg = <0x42>;
+ vcc-supply = <&dac_vref>;
+ };
+ };
+...
diff --git a/MAINTAINERS b/MAINTAINERS
index 8082081ea742..9654f0c25423 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -440,6 +440,14 @@ W: http://wiki.analog.com/AD5398
W: https://ez.analog.com/linux-software-drivers
F: drivers/regulator/ad5398.c
+AD5446 ANALOG DEVICES INC AD5446 DAC DRIVER
+M: Michael Hennerich <michael.hennerich@analog.com>
+M: Nuno Sá <nuno.sa@analog.com>
+L: linux-iio@vger.kernel.org
+S: Supported
+W: https://ez.analog.com/linux-software-drivers
+F: Documentation/devicetree/bindings/iio/dac/adi,ad5446.yaml
+
AD714X CAPACITANCE TOUCH SENSOR DRIVER (AD7142/3/7/8/7A)
M: Michael Hennerich <michael.hennerich@analog.com>
S: Supported
--
2.51.0
^ permalink raw reply related [flat|nested] 23+ messages in thread* Re: [PATCH v5 6/7] dt-bindings: clock: rockchip: Add RK3506 clock and reset unit
2025-11-04 15:35 ` [PATCH v4 01/12] dt-bindings: iio: dac: Document AD5446 and similar devices Nuno Sá via B4 Relay
@ 2025-11-04 17:51 ` Conor Dooley
0 siblings, 0 replies; 23+ messages in thread
From: Conor Dooley @ 2025-11-04 17:51 UTC (permalink / raw)
To: nuno.sa
Cc: linux-iio, devicetree, Michael Hennerich, Jonathan Cameron,
David Lechner, Andy Shevchenko, Lars-Peter Clausen, Rob Herring,
Krzysztof Kozlowski, Conor Dooley
[-- Attachment #1: Type: text/plain, Size: 75 bytes --]
Acked-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] 23+ messages in thread
* [PATCH v4 02/12] iio: dac: ad5446: Use DMA safe buffer for transfers
2025-11-04 15:35 [PATCH v4 00/12] iio: dac: ad5446: Refactor and add support for AD5542 Nuno Sá via B4 Relay
2025-11-04 15:35 ` [PATCH v4 01/12] dt-bindings: iio: dac: Document AD5446 and similar devices Nuno Sá via B4 Relay
@ 2025-11-04 15:35 ` Nuno Sá via B4 Relay
2025-11-04 17:10 ` Andy Shevchenko
2025-11-04 15:35 ` [PATCH v4 03/12] iio: dac: ad5446: Drop duplicated spi_id entry Nuno Sá via B4 Relay
` (10 subsequent siblings)
12 siblings, 1 reply; 23+ messages in thread
From: Nuno Sá via B4 Relay @ 2025-11-04 15:35 UTC (permalink / raw)
To: linux-iio, devicetree
Cc: Michael Hennerich, Jonathan Cameron, David Lechner,
Andy Shevchenko, Lars-Peter Clausen, Rob Herring,
Krzysztof Kozlowski, Conor Dooley
From: Nuno Sá <nuno.sa@analog.com>
Make sure to use DMA safe buffer. While for i2c we could be fine without
them, we need it for spi anyways.
As we now have DMA safe buffers, use i2c_master_send_dmasafe().
Signed-off-by: Nuno Sá <nuno.sa@analog.com>
---
drivers/iio/dac/ad5446.c | 19 +++++++++++--------
1 file changed, 11 insertions(+), 8 deletions(-)
diff --git a/drivers/iio/dac/ad5446.c b/drivers/iio/dac/ad5446.c
index ad304b0fec08..de5e4e0e397e 100644
--- a/drivers/iio/dac/ad5446.c
+++ b/drivers/iio/dac/ad5446.c
@@ -47,6 +47,10 @@ struct ad5446_state {
unsigned pwr_down_mode;
unsigned pwr_down;
struct mutex lock;
+ union {
+ __be16 d16;
+ u8 d24[3];
+ } __aligned(IIO_DMA_MINALIGN);
};
/**
@@ -265,19 +269,18 @@ static int ad5446_probe(struct device *dev, const char *name,
static int ad5446_write(struct ad5446_state *st, unsigned val)
{
struct spi_device *spi = to_spi_device(st->dev);
- __be16 data = cpu_to_be16(val);
+ st->d16 = cpu_to_be16(val);
- return spi_write(spi, &data, sizeof(data));
+ return spi_write(spi, &st->d16, sizeof(st->d16));
}
static int ad5660_write(struct ad5446_state *st, unsigned val)
{
struct spi_device *spi = to_spi_device(st->dev);
- uint8_t data[3];
- put_unaligned_be24(val, &data[0]);
+ put_unaligned_be24(val, &st->d24[0]);
- return spi_write(spi, data, sizeof(data));
+ return spi_write(spi, st->d24, sizeof(st->d24));
}
/*
@@ -489,13 +492,13 @@ static inline void ad5446_spi_unregister_driver(void) { }
static int ad5622_write(struct ad5446_state *st, unsigned val)
{
struct i2c_client *client = to_i2c_client(st->dev);
- __be16 data = cpu_to_be16(val);
+ st->d16 = cpu_to_be16(val);
int ret;
- ret = i2c_master_send(client, (char *)&data, sizeof(data));
+ ret = i2c_master_send_dmasafe(client, (char *)&st->d16, sizeof(st->d16));
if (ret < 0)
return ret;
- if (ret != sizeof(data))
+ if (ret != sizeof(st->d16))
return -EIO;
return 0;
--
2.51.0
^ permalink raw reply related [flat|nested] 23+ messages in thread* Re: [PATCH v4 02/12] iio: dac: ad5446: Use DMA safe buffer for transfers
2025-11-04 15:35 ` [PATCH v4 02/12] iio: dac: ad5446: Use DMA safe buffer for transfers Nuno Sá via B4 Relay
@ 2025-11-04 17:10 ` Andy Shevchenko
0 siblings, 0 replies; 23+ messages in thread
From: Andy Shevchenko @ 2025-11-04 17:10 UTC (permalink / raw)
To: nuno.sa
Cc: linux-iio, devicetree, Michael Hennerich, Jonathan Cameron,
David Lechner, Andy Shevchenko, Lars-Peter Clausen, Rob Herring,
Krzysztof Kozlowski, Conor Dooley
On Tue, Nov 04, 2025 at 03:35:07PM +0000, Nuno Sá via B4 Relay wrote:
>
> Make sure to use DMA safe buffer. While for i2c we could be fine without
> them, we need it for spi anyways.
>
> As we now have DMA safe buffers, use i2c_master_send_dmasafe().
...
> - put_unaligned_be24(val, &data[0]);
> + put_unaligned_be24(val, &st->d24[0]);
Now this &...[0] are redundant as you defined (by name) that the variable is to
be used as 24-bit one, i.o.w. as a whole.
put_unaligned_be24(val, st->d24);
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH v4 03/12] iio: dac: ad5446: Drop duplicated spi_id entry
2025-11-04 15:35 [PATCH v4 00/12] iio: dac: ad5446: Refactor and add support for AD5542 Nuno Sá via B4 Relay
2025-11-04 15:35 ` [PATCH v4 01/12] dt-bindings: iio: dac: Document AD5446 and similar devices Nuno Sá via B4 Relay
2025-11-04 15:35 ` [PATCH v4 02/12] iio: dac: ad5446: Use DMA safe buffer for transfers Nuno Sá via B4 Relay
@ 2025-11-04 15:35 ` Nuno Sá via B4 Relay
2025-11-04 17:12 ` Andy Shevchenko
2025-11-04 15:35 ` [PATCH v4 04/12] iio: dac: ad5446: Don't ignore missing regulator Nuno Sá via B4 Relay
` (9 subsequent siblings)
12 siblings, 1 reply; 23+ messages in thread
From: Nuno Sá via B4 Relay @ 2025-11-04 15:35 UTC (permalink / raw)
To: linux-iio, devicetree
Cc: Michael Hennerich, Jonathan Cameron, David Lechner,
Andy Shevchenko, Lars-Peter Clausen, Rob Herring,
Krzysztof Kozlowski, Conor Dooley
From: Nuno Sá <nuno.sa@analog.com>
AD5600 and AD5541A are compatible so there's no need to have a dedicated
entry for ID_AD5600.
Signed-off-by: Nuno Sá <nuno.sa@analog.com>
---
drivers/iio/dac/ad5446.c | 7 +------
1 file changed, 1 insertion(+), 6 deletions(-)
diff --git a/drivers/iio/dac/ad5446.c b/drivers/iio/dac/ad5446.c
index de5e4e0e397e..c0a38f642451 100644
--- a/drivers/iio/dac/ad5446.c
+++ b/drivers/iio/dac/ad5446.c
@@ -301,7 +301,6 @@ enum ad5446_supported_spi_device_ids {
ID_AD5541A,
ID_AD5512A,
ID_AD5553,
- ID_AD5600,
ID_AD5601,
ID_AD5611,
ID_AD5621,
@@ -356,10 +355,6 @@ static const struct ad5446_chip_info ad5446_spi_chip_info[] = {
.channel = AD5446_CHANNEL(14, 16, 0),
.write = ad5446_write,
},
- [ID_AD5600] = {
- .channel = AD5446_CHANNEL(16, 16, 0),
- .write = ad5446_write,
- },
[ID_AD5601] = {
.channel = AD5446_CHANNEL_POWERDOWN(8, 16, 6),
.write = ad5446_write,
@@ -427,7 +422,7 @@ static const struct spi_device_id ad5446_spi_ids[] = {
{"ad5542a", ID_AD5541A}, /* ad5541a and ad5542a are compatible */
{"ad5543", ID_AD5541A}, /* ad5541a and ad5543 are compatible */
{"ad5553", ID_AD5553},
- {"ad5600", ID_AD5600},
+ {"ad5600", ID_AD5541A}, /* ad5541a and ad5600 are compatible */
{"ad5601", ID_AD5601},
{"ad5611", ID_AD5611},
{"ad5621", ID_AD5621},
--
2.51.0
^ permalink raw reply related [flat|nested] 23+ messages in thread* Re: [PATCH v4 03/12] iio: dac: ad5446: Drop duplicated spi_id entry
2025-11-04 15:35 ` [PATCH v4 03/12] iio: dac: ad5446: Drop duplicated spi_id entry Nuno Sá via B4 Relay
@ 2025-11-04 17:12 ` Andy Shevchenko
2025-11-05 10:16 ` Nuno Sá
0 siblings, 1 reply; 23+ messages in thread
From: Andy Shevchenko @ 2025-11-04 17:12 UTC (permalink / raw)
To: nuno.sa
Cc: linux-iio, devicetree, Michael Hennerich, Jonathan Cameron,
David Lechner, Andy Shevchenko, Lars-Peter Clausen, Rob Herring,
Krzysztof Kozlowski, Conor Dooley
On Tue, Nov 04, 2025 at 03:35:08PM +0000, Nuno Sá via B4 Relay wrote:
>
> AD5600 and AD5541A are compatible so there's no need to have a dedicated
> entry for ID_AD5600.
Suggested-by?
Reviewed-by: Andy Shevchenko <andriy.shevchenko@intel.com>
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 23+ messages in thread
* Re: [PATCH v4 03/12] iio: dac: ad5446: Drop duplicated spi_id entry
2025-11-04 17:12 ` Andy Shevchenko
@ 2025-11-05 10:16 ` Nuno Sá
0 siblings, 0 replies; 23+ messages in thread
From: Nuno Sá @ 2025-11-05 10:16 UTC (permalink / raw)
To: Andy Shevchenko, nuno.sa
Cc: linux-iio, devicetree, Michael Hennerich, Jonathan Cameron,
David Lechner, Andy Shevchenko, Lars-Peter Clausen, Rob Herring,
Krzysztof Kozlowski, Conor Dooley
On Tue, 2025-11-04 at 19:12 +0200, Andy Shevchenko wrote:
> On Tue, Nov 04, 2025 at 03:35:08PM +0000, Nuno Sá via B4 Relay wrote:
> >
> > AD5600 and AD5541A are compatible so there's no need to have a dedicated
> > entry for ID_AD5600.
>
> Suggested-by?
Oh sure, that would make sense yes. Maybe Jonathan can do it when applying...
- Nuno Sá
> Reviewed-by: Andy Shevchenko <andriy.shevchenko@intel.com>
^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH v4 04/12] iio: dac: ad5446: Don't ignore missing regulator
2025-11-04 15:35 [PATCH v4 00/12] iio: dac: ad5446: Refactor and add support for AD5542 Nuno Sá via B4 Relay
` (2 preceding siblings ...)
2025-11-04 15:35 ` [PATCH v4 03/12] iio: dac: ad5446: Drop duplicated spi_id entry Nuno Sá via B4 Relay
@ 2025-11-04 15:35 ` Nuno Sá via B4 Relay
2025-11-04 15:35 ` [PATCH v4 05/12] iio: dac: ad5446: Move to single chip_info structures Nuno Sá via B4 Relay
` (8 subsequent siblings)
12 siblings, 0 replies; 23+ messages in thread
From: Nuno Sá via B4 Relay @ 2025-11-04 15:35 UTC (permalink / raw)
To: linux-iio, devicetree
Cc: Michael Hennerich, Jonathan Cameron, David Lechner,
Andy Shevchenko, Lars-Peter Clausen, Rob Herring,
Krzysztof Kozlowski, Conor Dooley
From: Nuno Sá <nuno.sa@analog.com>
If the chip does not have an internal reference, do not ignore a missing
regulator as we won't be able to actually provide a proper scale for the
DAC. Since it's now seen as an error, flip the if() logic so errors are
treated first (which is the typical pattern).
Signed-off-by: Nuno Sá <nuno.sa@analog.com>
---
drivers/iio/dac/ad5446.c | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/drivers/iio/dac/ad5446.c b/drivers/iio/dac/ad5446.c
index c0a38f642451..cbe2a6862f10 100644
--- a/drivers/iio/dac/ad5446.c
+++ b/drivers/iio/dac/ad5446.c
@@ -253,10 +253,11 @@ static int ad5446_probe(struct device *dev, const char *name,
if (ret < 0 && ret != -ENODEV)
return ret;
if (ret == -ENODEV) {
- if (chip_info->int_vref_mv)
- st->vref_mv = chip_info->int_vref_mv;
- else
- dev_warn(dev, "reference voltage unspecified\n");
+ if (!chip_info->int_vref_mv)
+ return dev_err_probe(dev, ret,
+ "reference voltage unspecified\n");
+
+ st->vref_mv = chip_info->int_vref_mv;
} else {
st->vref_mv = ret / 1000;
}
--
2.51.0
^ permalink raw reply related [flat|nested] 23+ messages in thread* [PATCH v4 05/12] iio: dac: ad5446: Move to single chip_info structures
2025-11-04 15:35 [PATCH v4 00/12] iio: dac: ad5446: Refactor and add support for AD5542 Nuno Sá via B4 Relay
` (3 preceding siblings ...)
2025-11-04 15:35 ` [PATCH v4 04/12] iio: dac: ad5446: Don't ignore missing regulator Nuno Sá via B4 Relay
@ 2025-11-04 15:35 ` Nuno Sá via B4 Relay
2025-11-04 15:35 ` [PATCH v4 06/12] iio: dac: ad5456: Add missing DT compatibles Nuno Sá via B4 Relay
` (7 subsequent siblings)
12 siblings, 0 replies; 23+ messages in thread
From: Nuno Sá via B4 Relay @ 2025-11-04 15:35 UTC (permalink / raw)
To: linux-iio, devicetree
Cc: Michael Hennerich, Jonathan Cameron, David Lechner,
Andy Shevchenko, Lars-Peter Clausen, Rob Herring,
Krzysztof Kozlowski, Conor Dooley
From: Nuno Sá <nuno.sa@analog.com>
Do not use an array with an enum id kind of thing. Use the more
maintainable chip_info variable per chip.
Adapt the probe functions to use the proper helpers (for SPI and I2c).
Note that in a following patch we'll also add the chip_info variables to
the of_device_id tables. Hence already use the helpers that internally use
device_get_match_data().
Signed-off-by: Nuno Sá <nuno.sa@analog.com>
---
drivers/iio/dac/ad5446.c | 340 +++++++++++++++++++++++------------------------
1 file changed, 170 insertions(+), 170 deletions(-)
diff --git a/drivers/iio/dac/ad5446.c b/drivers/iio/dac/ad5446.c
index cbe2a6862f10..539a8fcc7078 100644
--- a/drivers/iio/dac/ad5446.c
+++ b/drivers/iio/dac/ad5446.c
@@ -291,154 +291,150 @@ static int ad5660_write(struct ad5446_state *st, unsigned val)
* (and a bit cryptic), however this style is used to make clear which
* parts are supported here.
*/
-enum ad5446_supported_spi_device_ids {
- ID_AD5300,
- ID_AD5310,
- ID_AD5320,
- ID_AD5444,
- ID_AD5446,
- ID_AD5450,
- ID_AD5451,
- ID_AD5541A,
- ID_AD5512A,
- ID_AD5553,
- ID_AD5601,
- ID_AD5611,
- ID_AD5621,
- ID_AD5641,
- ID_AD5620_2500,
- ID_AD5620_1250,
- ID_AD5640_2500,
- ID_AD5640_1250,
- ID_AD5660_2500,
- ID_AD5660_1250,
- ID_AD5662,
+
+static const struct ad5446_chip_info ad5300_chip_info = {
+ .channel = AD5446_CHANNEL_POWERDOWN(8, 16, 4),
+ .write = ad5446_write,
};
-static const struct ad5446_chip_info ad5446_spi_chip_info[] = {
- [ID_AD5300] = {
- .channel = AD5446_CHANNEL_POWERDOWN(8, 16, 4),
- .write = ad5446_write,
- },
- [ID_AD5310] = {
- .channel = AD5446_CHANNEL_POWERDOWN(10, 16, 2),
- .write = ad5446_write,
- },
- [ID_AD5320] = {
- .channel = AD5446_CHANNEL_POWERDOWN(12, 16, 0),
- .write = ad5446_write,
- },
- [ID_AD5444] = {
- .channel = AD5446_CHANNEL(12, 16, 2),
- .write = ad5446_write,
- },
- [ID_AD5446] = {
- .channel = AD5446_CHANNEL(14, 16, 0),
- .write = ad5446_write,
- },
- [ID_AD5450] = {
- .channel = AD5446_CHANNEL(8, 16, 6),
- .write = ad5446_write,
- },
- [ID_AD5451] = {
- .channel = AD5446_CHANNEL(10, 16, 4),
- .write = ad5446_write,
- },
- [ID_AD5541A] = {
- .channel = AD5446_CHANNEL(16, 16, 0),
- .write = ad5446_write,
- },
- [ID_AD5512A] = {
- .channel = AD5446_CHANNEL(12, 16, 4),
- .write = ad5446_write,
- },
- [ID_AD5553] = {
- .channel = AD5446_CHANNEL(14, 16, 0),
- .write = ad5446_write,
- },
- [ID_AD5601] = {
- .channel = AD5446_CHANNEL_POWERDOWN(8, 16, 6),
- .write = ad5446_write,
- },
- [ID_AD5611] = {
- .channel = AD5446_CHANNEL_POWERDOWN(10, 16, 4),
- .write = ad5446_write,
- },
- [ID_AD5621] = {
- .channel = AD5446_CHANNEL_POWERDOWN(12, 16, 2),
- .write = ad5446_write,
- },
- [ID_AD5641] = {
- .channel = AD5446_CHANNEL_POWERDOWN(14, 16, 0),
- .write = ad5446_write,
- },
- [ID_AD5620_2500] = {
- .channel = AD5446_CHANNEL_POWERDOWN(12, 16, 2),
- .int_vref_mv = 2500,
- .write = ad5446_write,
- },
- [ID_AD5620_1250] = {
- .channel = AD5446_CHANNEL_POWERDOWN(12, 16, 2),
- .int_vref_mv = 1250,
- .write = ad5446_write,
- },
- [ID_AD5640_2500] = {
- .channel = AD5446_CHANNEL_POWERDOWN(14, 16, 0),
- .int_vref_mv = 2500,
- .write = ad5446_write,
- },
- [ID_AD5640_1250] = {
- .channel = AD5446_CHANNEL_POWERDOWN(14, 16, 0),
- .int_vref_mv = 1250,
- .write = ad5446_write,
- },
- [ID_AD5660_2500] = {
- .channel = AD5446_CHANNEL_POWERDOWN(16, 16, 0),
- .int_vref_mv = 2500,
- .write = ad5660_write,
- },
- [ID_AD5660_1250] = {
- .channel = AD5446_CHANNEL_POWERDOWN(16, 16, 0),
- .int_vref_mv = 1250,
- .write = ad5660_write,
- },
- [ID_AD5662] = {
- .channel = AD5446_CHANNEL_POWERDOWN(16, 16, 0),
- .write = ad5660_write,
- },
+static const struct ad5446_chip_info ad5310_chip_info = {
+ .channel = AD5446_CHANNEL_POWERDOWN(10, 16, 2),
+ .write = ad5446_write,
+};
+
+static const struct ad5446_chip_info ad5320_chip_info = {
+ .channel = AD5446_CHANNEL_POWERDOWN(12, 16, 0),
+ .write = ad5446_write,
+};
+
+static const struct ad5446_chip_info ad5444_chip_info = {
+ .channel = AD5446_CHANNEL(12, 16, 2),
+ .write = ad5446_write,
+};
+
+static const struct ad5446_chip_info ad5446_chip_info = {
+ .channel = AD5446_CHANNEL(14, 16, 0),
+ .write = ad5446_write,
+};
+
+static const struct ad5446_chip_info ad5450_chip_info = {
+ .channel = AD5446_CHANNEL(8, 16, 6),
+ .write = ad5446_write,
+};
+
+static const struct ad5446_chip_info ad5451_chip_info = {
+ .channel = AD5446_CHANNEL(10, 16, 4),
+ .write = ad5446_write,
+};
+
+static const struct ad5446_chip_info ad5541a_chip_info = {
+ .channel = AD5446_CHANNEL(16, 16, 0),
+ .write = ad5446_write,
+};
+
+static const struct ad5446_chip_info ad5512a_chip_info = {
+ .channel = AD5446_CHANNEL(12, 16, 4),
+ .write = ad5446_write,
+};
+
+static const struct ad5446_chip_info ad5553_chip_info = {
+ .channel = AD5446_CHANNEL(14, 16, 0),
+ .write = ad5446_write,
+};
+
+static const struct ad5446_chip_info ad5601_chip_info = {
+ .channel = AD5446_CHANNEL_POWERDOWN(8, 16, 6),
+ .write = ad5446_write,
+};
+
+static const struct ad5446_chip_info ad5611_chip_info = {
+ .channel = AD5446_CHANNEL_POWERDOWN(10, 16, 4),
+ .write = ad5446_write,
+};
+
+static const struct ad5446_chip_info ad5621_chip_info = {
+ .channel = AD5446_CHANNEL_POWERDOWN(12, 16, 2),
+ .write = ad5446_write,
+};
+
+static const struct ad5446_chip_info ad5641_chip_info = {
+ .channel = AD5446_CHANNEL_POWERDOWN(14, 16, 0),
+ .write = ad5446_write,
+};
+
+static const struct ad5446_chip_info ad5620_2500_chip_info = {
+ .channel = AD5446_CHANNEL_POWERDOWN(12, 16, 2),
+ .int_vref_mv = 2500,
+ .write = ad5446_write,
+};
+
+static const struct ad5446_chip_info ad5620_1250_chip_info = {
+ .channel = AD5446_CHANNEL_POWERDOWN(12, 16, 2),
+ .int_vref_mv = 1250,
+ .write = ad5446_write,
+};
+
+static const struct ad5446_chip_info ad5640_2500_chip_info = {
+ .channel = AD5446_CHANNEL_POWERDOWN(14, 16, 0),
+ .int_vref_mv = 2500,
+ .write = ad5446_write,
+};
+
+static const struct ad5446_chip_info ad5640_1250_chip_info = {
+ .channel = AD5446_CHANNEL_POWERDOWN(14, 16, 0),
+ .int_vref_mv = 1250,
+ .write = ad5446_write,
+};
+
+static const struct ad5446_chip_info ad5660_2500_chip_info = {
+ .channel = AD5446_CHANNEL_POWERDOWN(16, 16, 0),
+ .int_vref_mv = 2500,
+ .write = ad5660_write,
+};
+
+static const struct ad5446_chip_info ad5660_1250_chip_info = {
+ .channel = AD5446_CHANNEL_POWERDOWN(16, 16, 0),
+ .int_vref_mv = 1250,
+ .write = ad5660_write,
+};
+
+static const struct ad5446_chip_info ad5662_chip_info = {
+ .channel = AD5446_CHANNEL_POWERDOWN(16, 16, 0),
+ .write = ad5660_write,
};
static const struct spi_device_id ad5446_spi_ids[] = {
- {"ad5300", ID_AD5300},
- {"ad5310", ID_AD5310},
- {"ad5320", ID_AD5320},
- {"ad5444", ID_AD5444},
- {"ad5446", ID_AD5446},
- {"ad5450", ID_AD5450},
- {"ad5451", ID_AD5451},
- {"ad5452", ID_AD5444}, /* ad5452 is compatible to the ad5444 */
- {"ad5453", ID_AD5446}, /* ad5453 is compatible to the ad5446 */
- {"ad5512a", ID_AD5512A},
- {"ad5541a", ID_AD5541A},
- {"ad5542a", ID_AD5541A}, /* ad5541a and ad5542a are compatible */
- {"ad5543", ID_AD5541A}, /* ad5541a and ad5543 are compatible */
- {"ad5553", ID_AD5553},
- {"ad5600", ID_AD5541A}, /* ad5541a and ad5600 are compatible */
- {"ad5601", ID_AD5601},
- {"ad5611", ID_AD5611},
- {"ad5621", ID_AD5621},
- {"ad5641", ID_AD5641},
- {"ad5620-2500", ID_AD5620_2500}, /* AD5620/40/60: */
- {"ad5620-1250", ID_AD5620_1250}, /* part numbers may look differently */
- {"ad5640-2500", ID_AD5640_2500},
- {"ad5640-1250", ID_AD5640_1250},
- {"ad5660-2500", ID_AD5660_2500},
- {"ad5660-1250", ID_AD5660_1250},
- {"ad5662", ID_AD5662},
- {"dac081s101", ID_AD5300}, /* compatible Texas Instruments chips */
- {"dac101s101", ID_AD5310},
- {"dac121s101", ID_AD5320},
- {"dac7512", ID_AD5320},
+ {"ad5300", (kernel_ulong_t)&ad5300_chip_info},
+ {"ad5310", (kernel_ulong_t)&ad5310_chip_info},
+ {"ad5320", (kernel_ulong_t)&ad5320_chip_info},
+ {"ad5444", (kernel_ulong_t)&ad5444_chip_info},
+ {"ad5446", (kernel_ulong_t)&ad5446_chip_info},
+ {"ad5450", (kernel_ulong_t)&ad5450_chip_info},
+ {"ad5451", (kernel_ulong_t)&ad5451_chip_info},
+ {"ad5452", (kernel_ulong_t)&ad5444_chip_info}, /* ad5452 is compatible to the ad5444 */
+ {"ad5453", (kernel_ulong_t)&ad5446_chip_info}, /* ad5453 is compatible to the ad5446 */
+ {"ad5512a", (kernel_ulong_t)&ad5512a_chip_info},
+ {"ad5541a", (kernel_ulong_t)&ad5541a_chip_info},
+ {"ad5542a", (kernel_ulong_t)&ad5541a_chip_info}, /* ad5541a and ad5542a are compatible */
+ {"ad5543", (kernel_ulong_t)&ad5541a_chip_info}, /* ad5541a and ad5543 are compatible */
+ {"ad5553", (kernel_ulong_t)&ad5553_chip_info},
+ {"ad5600", (kernel_ulong_t)&ad5541a_chip_info}, /* ad5541a and ad5600 are compatible */
+ {"ad5601", (kernel_ulong_t)&ad5601_chip_info},
+ {"ad5611", (kernel_ulong_t)&ad5611_chip_info},
+ {"ad5621", (kernel_ulong_t)&ad5621_chip_info},
+ {"ad5641", (kernel_ulong_t)&ad5641_chip_info},
+ {"ad5620-2500", (kernel_ulong_t)&ad5620_2500_chip_info}, /* AD5620/40/60: */
+ /* part numbers may look differently */
+ {"ad5620-1250", (kernel_ulong_t)&ad5620_1250_chip_info},
+ {"ad5640-2500", (kernel_ulong_t)&ad5640_2500_chip_info},
+ {"ad5640-1250", (kernel_ulong_t)&ad5640_1250_chip_info},
+ {"ad5660-2500", (kernel_ulong_t)&ad5660_2500_chip_info},
+ {"ad5660-1250", (kernel_ulong_t)&ad5660_1250_chip_info},
+ {"ad5662", (kernel_ulong_t)&ad5662_chip_info},
+ {"dac081s101", (kernel_ulong_t)&ad5300_chip_info}, /* compatible Texas Instruments chips */
+ {"dac101s101", (kernel_ulong_t)&ad5310_chip_info},
+ {"dac121s101", (kernel_ulong_t)&ad5320_chip_info},
+ {"dac7512", (kernel_ulong_t)&ad5320_chip_info},
{ }
};
MODULE_DEVICE_TABLE(spi, ad5446_spi_ids);
@@ -452,9 +448,13 @@ MODULE_DEVICE_TABLE(of, ad5446_of_ids);
static int ad5446_spi_probe(struct spi_device *spi)
{
const struct spi_device_id *id = spi_get_device_id(spi);
+ const struct ad5446_chip_info *chip_info;
- return ad5446_probe(&spi->dev, id->name,
- &ad5446_spi_chip_info[id->driver_data]);
+ chip_info = spi_get_device_match_data(spi);
+ if (!chip_info)
+ return -ENODEV;
+
+ return ad5446_probe(&spi->dev, id->name, chip_info);
}
static struct spi_driver ad5446_spi_driver = {
@@ -507,41 +507,41 @@ static int ad5622_write(struct ad5446_state *st, unsigned val)
* (and a bit cryptic), however this style is used to make clear which
* parts are supported here.
*/
-enum ad5446_supported_i2c_device_ids {
- ID_AD5602,
- ID_AD5612,
- ID_AD5622,
+
+static const struct ad5446_chip_info ad5602_chip_info = {
+ .channel = AD5446_CHANNEL_POWERDOWN(8, 16, 4),
+ .write = ad5622_write,
};
-static const struct ad5446_chip_info ad5446_i2c_chip_info[] = {
- [ID_AD5602] = {
- .channel = AD5446_CHANNEL_POWERDOWN(8, 16, 4),
- .write = ad5622_write,
- },
- [ID_AD5612] = {
- .channel = AD5446_CHANNEL_POWERDOWN(10, 16, 2),
- .write = ad5622_write,
- },
- [ID_AD5622] = {
- .channel = AD5446_CHANNEL_POWERDOWN(12, 16, 0),
- .write = ad5622_write,
- },
+static const struct ad5446_chip_info ad5612_chip_info = {
+ .channel = AD5446_CHANNEL_POWERDOWN(10, 16, 2),
+ .write = ad5622_write,
+};
+
+static const struct ad5446_chip_info ad5622_chip_info = {
+ .channel = AD5446_CHANNEL_POWERDOWN(12, 16, 0),
+ .write = ad5622_write,
};
static int ad5446_i2c_probe(struct i2c_client *i2c)
{
const struct i2c_device_id *id = i2c_client_get_device_id(i2c);
- return ad5446_probe(&i2c->dev, id->name,
- &ad5446_i2c_chip_info[id->driver_data]);
+ const struct ad5446_chip_info *chip_info;
+
+ chip_info = i2c_get_match_data(i2c);
+ if (!chip_info)
+ return -ENODEV;
+
+ return ad5446_probe(&i2c->dev, id->name, chip_info);
}
static const struct i2c_device_id ad5446_i2c_ids[] = {
- {"ad5301", ID_AD5602},
- {"ad5311", ID_AD5612},
- {"ad5321", ID_AD5622},
- {"ad5602", ID_AD5602},
- {"ad5612", ID_AD5612},
- {"ad5622", ID_AD5622},
+ {"ad5301", (kernel_ulong_t)&ad5602_chip_info},
+ {"ad5311", (kernel_ulong_t)&ad5612_chip_info},
+ {"ad5321", (kernel_ulong_t)&ad5622_chip_info},
+ {"ad5602", (kernel_ulong_t)&ad5602_chip_info},
+ {"ad5612", (kernel_ulong_t)&ad5612_chip_info},
+ {"ad5622", (kernel_ulong_t)&ad5622_chip_info},
{ }
};
MODULE_DEVICE_TABLE(i2c, ad5446_i2c_ids);
--
2.51.0
^ permalink raw reply related [flat|nested] 23+ messages in thread* [PATCH v4 06/12] iio: dac: ad5456: Add missing DT compatibles
2025-11-04 15:35 [PATCH v4 00/12] iio: dac: ad5446: Refactor and add support for AD5542 Nuno Sá via B4 Relay
` (4 preceding siblings ...)
2025-11-04 15:35 ` [PATCH v4 05/12] iio: dac: ad5446: Move to single chip_info structures Nuno Sá via B4 Relay
@ 2025-11-04 15:35 ` Nuno Sá via B4 Relay
2025-11-04 15:35 ` [PATCH v4 07/12] iio: dac: ad5446: Separate I2C/SPI into different drivers Nuno Sá via B4 Relay
` (6 subsequent siblings)
12 siblings, 0 replies; 23+ messages in thread
From: Nuno Sá via B4 Relay @ 2025-11-04 15:35 UTC (permalink / raw)
To: linux-iio, devicetree
Cc: Michael Hennerich, Jonathan Cameron, David Lechner,
Andy Shevchenko, Lars-Peter Clausen, Rob Herring,
Krzysztof Kozlowski, Conor Dooley
From: Nuno Sá <nuno.sa@analog.com>
Add missing of_device_id compatibles for the i2c and spi drivers.
Signed-off-by: Nuno Sá <nuno.sa@analog.com>
---
drivers/iio/dac/ad5446.c | 41 +++++++++++++++++++++++++++++++++++++++++
1 file changed, 41 insertions(+)
diff --git a/drivers/iio/dac/ad5446.c b/drivers/iio/dac/ad5446.c
index 539a8fcc7078..01f934036185 100644
--- a/drivers/iio/dac/ad5446.c
+++ b/drivers/iio/dac/ad5446.c
@@ -440,6 +440,35 @@ static const struct spi_device_id ad5446_spi_ids[] = {
MODULE_DEVICE_TABLE(spi, ad5446_spi_ids);
static const struct of_device_id ad5446_of_ids[] = {
+ { .compatible = "adi,ad5300", .data = &ad5300_chip_info },
+ { .compatible = "adi,ad5310", .data = &ad5310_chip_info },
+ { .compatible = "adi,ad5320", .data = &ad5320_chip_info },
+ { .compatible = "adi,ad5444", .data = &ad5444_chip_info },
+ { .compatible = "adi,ad5446", .data = &ad5446_chip_info },
+ { .compatible = "adi,ad5450", .data = &ad5450_chip_info },
+ { .compatible = "adi,ad5451", .data = &ad5451_chip_info },
+ { .compatible = "adi,ad5452", .data = &ad5444_chip_info },
+ { .compatible = "adi,ad5453", .data = &ad5446_chip_info },
+ { .compatible = "adi,ad5512a", .data = &ad5512a_chip_info },
+ { .compatible = "adi,ad5541a", .data = &ad5541a_chip_info },
+ { .compatible = "adi,ad5542a", .data = &ad5541a_chip_info },
+ { .compatible = "adi,ad5543", .data = &ad5541a_chip_info },
+ { .compatible = "adi,ad5553", .data = &ad5553_chip_info },
+ { .compatible = "adi,ad5600", .data = &ad5541a_chip_info },
+ { .compatible = "adi,ad5601", .data = &ad5601_chip_info },
+ { .compatible = "adi,ad5611", .data = &ad5611_chip_info },
+ { .compatible = "adi,ad5621", .data = &ad5621_chip_info },
+ { .compatible = "adi,ad5641", .data = &ad5641_chip_info },
+ { .compatible = "adi,ad5620-2500", .data = &ad5620_2500_chip_info },
+ { .compatible = "adi,ad5620-1250", .data = &ad5620_1250_chip_info },
+ { .compatible = "adi,ad5640-2500", .data = &ad5640_2500_chip_info },
+ { .compatible = "adi,ad5640-1250", .data = &ad5640_1250_chip_info },
+ { .compatible = "adi,ad5660-2500", .data = &ad5660_2500_chip_info },
+ { .compatible = "adi,ad5660-1250", .data = &ad5660_1250_chip_info },
+ { .compatible = "adi,ad5662", .data = &ad5662_chip_info },
+ { .compatible = "ti,dac081s101", .data = &ad5300_chip_info },
+ { .compatible = "ti,dac101s101", .data = &ad5310_chip_info },
+ { .compatible = "ti,dac121s101", .data = &ad5320_chip_info },
{ .compatible = "ti,dac7512" },
{ }
};
@@ -546,9 +575,21 @@ static const struct i2c_device_id ad5446_i2c_ids[] = {
};
MODULE_DEVICE_TABLE(i2c, ad5446_i2c_ids);
+static const struct of_device_id ad5446_i2c_of_ids[] = {
+ { .compatible = "adi,ad5301", .data = &ad5602_chip_info },
+ { .compatible = "adi,ad5311", .data = &ad5612_chip_info },
+ { .compatible = "adi,ad5321", .data = &ad5622_chip_info },
+ { .compatible = "adi,ad5602", .data = &ad5602_chip_info },
+ { .compatible = "adi,ad5612", .data = &ad5612_chip_info },
+ { .compatible = "adi,ad5622", .data = &ad5622_chip_info },
+ { }
+};
+MODULE_DEVICE_TABLE(of, ad5446_i2c_of_ids);
+
static struct i2c_driver ad5446_i2c_driver = {
.driver = {
.name = "ad5446",
+ .of_match_table = ad5446_i2c_of_ids,
},
.probe = ad5446_i2c_probe,
.id_table = ad5446_i2c_ids,
--
2.51.0
^ permalink raw reply related [flat|nested] 23+ messages in thread* [PATCH v4 07/12] iio: dac: ad5446: Separate I2C/SPI into different drivers
2025-11-04 15:35 [PATCH v4 00/12] iio: dac: ad5446: Refactor and add support for AD5542 Nuno Sá via B4 Relay
` (5 preceding siblings ...)
2025-11-04 15:35 ` [PATCH v4 06/12] iio: dac: ad5456: Add missing DT compatibles Nuno Sá via B4 Relay
@ 2025-11-04 15:35 ` Nuno Sá via B4 Relay
2025-11-04 18:20 ` Andy Shevchenko
2025-11-04 15:35 ` [PATCH v4 08/12] iio: dac: ad5446: Make use of devm_mutex_init() Nuno Sá via B4 Relay
` (5 subsequent siblings)
12 siblings, 1 reply; 23+ messages in thread
From: Nuno Sá via B4 Relay @ 2025-11-04 15:35 UTC (permalink / raw)
To: linux-iio, devicetree
Cc: Michael Hennerich, Jonathan Cameron, David Lechner,
Andy Shevchenko, Lars-Peter Clausen, Rob Herring,
Krzysztof Kozlowski, Conor Dooley
From: Nuno Sá <nuno.sa@analog.com>
Properly separate the I2C and SPI drivers into two different drivers
living in their own source file (as usual). So that no need for the
hacky ifdefery.
Signed-off-by: Nuno Sá <nuno.sa@analog.com>
---
MAINTAINERS | 4 +
drivers/iio/dac/Kconfig | 31 ++-
drivers/iio/dac/Makefile | 2 +
drivers/iio/dac/ad5446-i2c.c | 102 ++++++++++
drivers/iio/dac/ad5446-spi.c | 250 ++++++++++++++++++++++++
drivers/iio/dac/ad5446.c | 450 +------------------------------------------
drivers/iio/dac/ad5446.h | 76 ++++++++
7 files changed, 466 insertions(+), 449 deletions(-)
diff --git a/MAINTAINERS b/MAINTAINERS
index 9654f0c25423..c845ad7307fb 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -447,6 +447,10 @@ L: linux-iio@vger.kernel.org
S: Supported
W: https://ez.analog.com/linux-software-drivers
F: Documentation/devicetree/bindings/iio/dac/adi,ad5446.yaml
+F: drivers/iio/dac/ad5446-i2c.c
+F: drivers/iio/dac/ad5446-spi.c
+F: drivers/iio/dac/ad5446.c
+F: drivers/iio/dac/ad5446.h
AD714X CAPACITANCE TOUCH SENSOR DRIVER (AD7142/3/7/8/7A)
M: Michael Hennerich <michael.hennerich@analog.com>
diff --git a/drivers/iio/dac/Kconfig b/drivers/iio/dac/Kconfig
index e0996dc014a3..7cd3caec1262 100644
--- a/drivers/iio/dac/Kconfig
+++ b/drivers/iio/dac/Kconfig
@@ -97,17 +97,32 @@ config AD5421
ad5421.
config AD5446
- tristate "Analog Devices AD5446 and similar single channel DACs driver"
- depends on (SPI_MASTER && I2C!=m) || I2C
+ tristate
+
+config AD5446_SPI
+ tristate "Analog Devices AD5446 and similar single channel DACs driver (SPI)"
+ depends on SPI
+ select AD5446
help
- Say yes here to build support for Analog Devices AD5300, AD5301, AD5310,
- AD5311, AD5320, AD5321, AD5444, AD5446, AD5450, AD5451, AD5452, AD5453,
- AD5512A, AD5541A, AD5542A, AD5543, AD5553, AD5600, AD5601, AD5602, AD5611,
- AD5612, AD5620, AD5621, AD5622, AD5640, AD5641, AD5660, AD5662 DACs
- as well as Texas Instruments DAC081S101, DAC101S101, DAC121S101.
+ Say yes here to build support for Analog Devices AD5300, AD5310,
+ AD5320, AD5444, AD5446, AD5450, AD5451, AD5452, AD5453, AD5512A,
+ AD5541A, AD5542A, AD5543, AD5553, AD5600, AD5601, AD5611, AD5620,
+ AD5621, AD5640, AD5641, AD5660, AD5662 DACs as well as
+ Texas Instruments DAC081S101, DAC101S101, DAC121S101.
To compile this driver as a module, choose M here: the
- module will be called ad5446.
+ module will be called ad5446-spi.
+
+config AD5446_I2C
+ tristate "Analog Devices AD5446 and similar single channel DACs driver (I2C)"
+ depends on I2C
+ select AD5446
+ help
+ Say yes here to build support for Analog Devices AD5301, AD5311, AD5321,
+ AD5602, AD5612, AD5622 DACs.
+
+ To compile this driver as a module, choose M here: the
+ module will be called ad5446-i2c.
config AD5449
tristate "Analog Devices AD5449 and similar DACs driver"
diff --git a/drivers/iio/dac/Makefile b/drivers/iio/dac/Makefile
index 3684cd52b7fa..e6ac4c67e337 100644
--- a/drivers/iio/dac/Makefile
+++ b/drivers/iio/dac/Makefile
@@ -15,6 +15,8 @@ obj-$(CONFIG_AD5624R_SPI) += ad5624r_spi.o
obj-$(CONFIG_AD5064) += ad5064.o
obj-$(CONFIG_AD5504) += ad5504.o
obj-$(CONFIG_AD5446) += ad5446.o
+obj-$(CONFIG_AD5446_SPI) += ad5446-spi.o
+obj-$(CONFIG_AD5446_I2C) += ad5446-i2c.o
obj-$(CONFIG_AD5449) += ad5449.o
obj-$(CONFIG_AD5592R_BASE) += ad5592r-base.o
obj-$(CONFIG_AD5592R) += ad5592r.o
diff --git a/drivers/iio/dac/ad5446-i2c.c b/drivers/iio/dac/ad5446-i2c.c
new file mode 100644
index 000000000000..40fe7e17fce4
--- /dev/null
+++ b/drivers/iio/dac/ad5446-i2c.c
@@ -0,0 +1,102 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * AD5446 SPI I2C driver
+ *
+ * Copyright 2025 Analog Devices Inc.
+ */
+#include <linux/err.h>
+#include <linux/module.h>
+#include <linux/mod_devicetable.h>
+#include <linux/i2c.h>
+
+#include <asm/byteorder.h>
+
+#include "ad5446.h"
+
+static int ad5622_write(struct ad5446_state *st, unsigned int val)
+{
+ struct i2c_client *client = to_i2c_client(st->dev);
+ int ret;
+
+ st->d16 = cpu_to_be16(val);
+
+ ret = i2c_master_send_dmasafe(client, (char *)&st->d16, sizeof(st->d16));
+ if (ret < 0)
+ return ret;
+ if (ret != sizeof(st->d16))
+ return -EIO;
+
+ return 0;
+}
+
+static int ad5446_i2c_probe(struct i2c_client *i2c)
+{
+ const struct i2c_device_id *id = i2c_client_get_device_id(i2c);
+ const struct ad5446_chip_info *chip_info;
+
+ chip_info = i2c_get_match_data(i2c);
+ if (!chip_info)
+ return -ENODEV;
+
+ return ad5446_probe(&i2c->dev, id->name, chip_info);
+}
+
+/*
+ * ad5446_supported_i2c_device_ids:
+ * The AD5620/40/60 parts are available in different fixed internal reference
+ * voltage options. The actual part numbers may look differently
+ * (and a bit cryptic), however this style is used to make clear which
+ * parts are supported here.
+ */
+
+static const struct ad5446_chip_info ad5602_chip_info = {
+ .channel = AD5446_CHANNEL_POWERDOWN(8, 16, 4),
+ .write = ad5622_write,
+};
+
+static const struct ad5446_chip_info ad5612_chip_info = {
+ .channel = AD5446_CHANNEL_POWERDOWN(10, 16, 2),
+ .write = ad5622_write,
+};
+
+static const struct ad5446_chip_info ad5622_chip_info = {
+ .channel = AD5446_CHANNEL_POWERDOWN(12, 16, 0),
+ .write = ad5622_write,
+};
+
+static const struct i2c_device_id ad5446_i2c_ids[] = {
+ {"ad5301", (kernel_ulong_t)&ad5602_chip_info},
+ {"ad5311", (kernel_ulong_t)&ad5612_chip_info},
+ {"ad5321", (kernel_ulong_t)&ad5622_chip_info},
+ {"ad5602", (kernel_ulong_t)&ad5602_chip_info},
+ {"ad5612", (kernel_ulong_t)&ad5612_chip_info},
+ {"ad5622", (kernel_ulong_t)&ad5622_chip_info},
+ { }
+};
+MODULE_DEVICE_TABLE(i2c, ad5446_i2c_ids);
+
+static const struct of_device_id ad5446_i2c_of_ids[] = {
+ { .compatible = "adi,ad5301", .data = &ad5602_chip_info },
+ { .compatible = "adi,ad5311", .data = &ad5612_chip_info },
+ { .compatible = "adi,ad5321", .data = &ad5622_chip_info },
+ { .compatible = "adi,ad5602", .data = &ad5602_chip_info },
+ { .compatible = "adi,ad5612", .data = &ad5612_chip_info },
+ { .compatible = "adi,ad5622", .data = &ad5622_chip_info },
+ { }
+};
+MODULE_DEVICE_TABLE(OF, ad5446_i2c_of_ids);
+
+static struct i2c_driver ad5446_i2c_driver = {
+ .driver = {
+ .name = "ad5446",
+ .of_match_table = ad5446_i2c_of_ids,
+ },
+ .probe = ad5446_i2c_probe,
+ .id_table = ad5446_i2c_ids,
+};
+module_i2c_driver(ad5446_i2c_driver);
+
+MODULE_AUTHOR("Nuno Sá <nuno.sa@analog.com>");
+MODULE_DESCRIPTION("Analog Devices AD5622 and similar I2C DACs");
+MODULE_LICENSE("GPL");
+MODULE_IMPORT_NS("IIO_AD5446");
diff --git a/drivers/iio/dac/ad5446-spi.c b/drivers/iio/dac/ad5446-spi.c
new file mode 100644
index 000000000000..1a52f6014fad
--- /dev/null
+++ b/drivers/iio/dac/ad5446-spi.c
@@ -0,0 +1,250 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * AD5446 SPI DAC driver
+ *
+ * Copyright 2025 Analog Devices Inc.
+ */
+#include <linux/err.h>
+#include <linux/module.h>
+#include <linux/mod_devicetable.h>
+#include <linux/spi/spi.h>
+#include <linux/unaligned.h>
+
+#include <asm/byteorder.h>
+
+#include "ad5446.h"
+
+static int ad5446_write(struct ad5446_state *st, unsigned int val)
+{
+ struct spi_device *spi = to_spi_device(st->dev);
+
+ st->d16 = cpu_to_be16(val);
+
+ return spi_write(spi, &st->d16, sizeof(st->d16));
+}
+
+static int ad5660_write(struct ad5446_state *st, unsigned int val)
+{
+ struct spi_device *spi = to_spi_device(st->dev);
+
+ put_unaligned_be24(val, &st->d24[0]);
+
+ return spi_write(spi, st->d24, sizeof(st->d24));
+}
+
+static int ad5446_spi_probe(struct spi_device *spi)
+{
+ const struct spi_device_id *id = spi_get_device_id(spi);
+ const struct ad5446_chip_info *chip_info;
+
+ chip_info = spi_get_device_match_data(spi);
+ if (!chip_info)
+ return -ENODEV;
+
+ return ad5446_probe(&spi->dev, id->name, chip_info);
+}
+
+/*
+ * ad5446_supported_spi_device_ids:
+ * The AD5620/40/60 parts are available in different fixed internal reference
+ * voltage options. The actual part numbers may look differently
+ * (and a bit cryptic), however this style is used to make clear which
+ * parts are supported here.
+ */
+
+static const struct ad5446_chip_info ad5300_chip_info = {
+ .channel = AD5446_CHANNEL_POWERDOWN(8, 16, 4),
+ .write = ad5446_write,
+};
+
+static const struct ad5446_chip_info ad5310_chip_info = {
+ .channel = AD5446_CHANNEL_POWERDOWN(10, 16, 2),
+ .write = ad5446_write,
+};
+
+static const struct ad5446_chip_info ad5320_chip_info = {
+ .channel = AD5446_CHANNEL_POWERDOWN(12, 16, 0),
+ .write = ad5446_write,
+};
+
+static const struct ad5446_chip_info ad5444_chip_info = {
+ .channel = AD5446_CHANNEL(12, 16, 2),
+ .write = ad5446_write,
+};
+
+static const struct ad5446_chip_info ad5446_chip_info = {
+ .channel = AD5446_CHANNEL(14, 16, 0),
+ .write = ad5446_write,
+};
+
+static const struct ad5446_chip_info ad5450_chip_info = {
+ .channel = AD5446_CHANNEL(8, 16, 6),
+ .write = ad5446_write,
+};
+
+static const struct ad5446_chip_info ad5451_chip_info = {
+ .channel = AD5446_CHANNEL(10, 16, 4),
+ .write = ad5446_write,
+};
+
+static const struct ad5446_chip_info ad5541a_chip_info = {
+ .channel = AD5446_CHANNEL(16, 16, 0),
+ .write = ad5446_write,
+};
+
+static const struct ad5446_chip_info ad5512a_chip_info = {
+ .channel = AD5446_CHANNEL(12, 16, 4),
+ .write = ad5446_write,
+};
+
+static const struct ad5446_chip_info ad5553_chip_info = {
+ .channel = AD5446_CHANNEL(14, 16, 0),
+ .write = ad5446_write,
+};
+
+static const struct ad5446_chip_info ad5601_chip_info = {
+ .channel = AD5446_CHANNEL_POWERDOWN(8, 16, 6),
+ .write = ad5446_write,
+};
+
+static const struct ad5446_chip_info ad5611_chip_info = {
+ .channel = AD5446_CHANNEL_POWERDOWN(10, 16, 4),
+ .write = ad5446_write,
+};
+
+static const struct ad5446_chip_info ad5621_chip_info = {
+ .channel = AD5446_CHANNEL_POWERDOWN(12, 16, 2),
+ .write = ad5446_write,
+};
+
+static const struct ad5446_chip_info ad5641_chip_info = {
+ .channel = AD5446_CHANNEL_POWERDOWN(14, 16, 0),
+ .write = ad5446_write,
+};
+
+static const struct ad5446_chip_info ad5620_2500_chip_info = {
+ .channel = AD5446_CHANNEL_POWERDOWN(12, 16, 2),
+ .int_vref_mv = 2500,
+ .write = ad5446_write,
+};
+
+static const struct ad5446_chip_info ad5620_1250_chip_info = {
+ .channel = AD5446_CHANNEL_POWERDOWN(12, 16, 2),
+ .int_vref_mv = 1250,
+ .write = ad5446_write,
+};
+
+static const struct ad5446_chip_info ad5640_2500_chip_info = {
+ .channel = AD5446_CHANNEL_POWERDOWN(14, 16, 0),
+ .int_vref_mv = 2500,
+ .write = ad5446_write,
+};
+
+static const struct ad5446_chip_info ad5640_1250_chip_info = {
+ .channel = AD5446_CHANNEL_POWERDOWN(14, 16, 0),
+ .int_vref_mv = 1250,
+ .write = ad5446_write,
+};
+
+static const struct ad5446_chip_info ad5660_2500_chip_info = {
+ .channel = AD5446_CHANNEL_POWERDOWN(16, 16, 0),
+ .int_vref_mv = 2500,
+ .write = ad5660_write,
+};
+
+static const struct ad5446_chip_info ad5660_1250_chip_info = {
+ .channel = AD5446_CHANNEL_POWERDOWN(16, 16, 0),
+ .int_vref_mv = 1250,
+ .write = ad5660_write,
+};
+
+static const struct ad5446_chip_info ad5662_chip_info = {
+ .channel = AD5446_CHANNEL_POWERDOWN(16, 16, 0),
+ .write = ad5660_write,
+};
+
+static const struct spi_device_id ad5446_spi_ids[] = {
+ {"ad5300", (kernel_ulong_t)&ad5300_chip_info},
+ {"ad5310", (kernel_ulong_t)&ad5310_chip_info},
+ {"ad5320", (kernel_ulong_t)&ad5320_chip_info},
+ {"ad5444", (kernel_ulong_t)&ad5444_chip_info},
+ {"ad5446", (kernel_ulong_t)&ad5446_chip_info},
+ {"ad5450", (kernel_ulong_t)&ad5450_chip_info},
+ {"ad5451", (kernel_ulong_t)&ad5451_chip_info},
+ {"ad5452", (kernel_ulong_t)&ad5444_chip_info}, /* ad5452 is compatible to the ad5444 */
+ {"ad5453", (kernel_ulong_t)&ad5446_chip_info}, /* ad5453 is compatible to the ad5446 */
+ {"ad5512a", (kernel_ulong_t)&ad5512a_chip_info},
+ {"ad5541a", (kernel_ulong_t)&ad5541a_chip_info},
+ {"ad5542a", (kernel_ulong_t)&ad5541a_chip_info}, /* ad5541a and ad5542a are compatible */
+ {"ad5543", (kernel_ulong_t)&ad5541a_chip_info}, /* ad5541a and ad5543 are compatible */
+ {"ad5553", (kernel_ulong_t)&ad5553_chip_info},
+ {"ad5600", (kernel_ulong_t)&ad5541a_chip_info}, /* ad5541a and ad5600 are compatible */
+ {"ad5601", (kernel_ulong_t)&ad5601_chip_info},
+ {"ad5611", (kernel_ulong_t)&ad5611_chip_info},
+ {"ad5621", (kernel_ulong_t)&ad5621_chip_info},
+ {"ad5641", (kernel_ulong_t)&ad5641_chip_info},
+ {"ad5620-2500", (kernel_ulong_t)&ad5620_2500_chip_info}, /* AD5620/40/60: */
+ /* part numbers may look differently */
+ {"ad5620-1250", (kernel_ulong_t)&ad5620_1250_chip_info},
+ {"ad5640-2500", (kernel_ulong_t)&ad5640_2500_chip_info},
+ {"ad5640-1250", (kernel_ulong_t)&ad5640_1250_chip_info},
+ {"ad5660-2500", (kernel_ulong_t)&ad5660_2500_chip_info},
+ {"ad5660-1250", (kernel_ulong_t)&ad5660_1250_chip_info},
+ {"ad5662", (kernel_ulong_t)&ad5662_chip_info},
+ {"dac081s101", (kernel_ulong_t)&ad5300_chip_info}, /* compatible Texas Instruments chips */
+ {"dac101s101", (kernel_ulong_t)&ad5310_chip_info},
+ {"dac121s101", (kernel_ulong_t)&ad5320_chip_info},
+ {"dac7512", (kernel_ulong_t)&ad5320_chip_info},
+ { }
+};
+MODULE_DEVICE_TABLE(spi, ad5446_spi_ids);
+
+static const struct of_device_id ad5446_of_ids[] = {
+ { .compatible = "adi,ad5300", .data = &ad5300_chip_info },
+ { .compatible = "adi,ad5310", .data = &ad5310_chip_info },
+ { .compatible = "adi,ad5320", .data = &ad5320_chip_info },
+ { .compatible = "adi,ad5444", .data = &ad5444_chip_info },
+ { .compatible = "adi,ad5446", .data = &ad5446_chip_info },
+ { .compatible = "adi,ad5450", .data = &ad5450_chip_info },
+ { .compatible = "adi,ad5451", .data = &ad5451_chip_info },
+ { .compatible = "adi,ad5452", .data = &ad5444_chip_info },
+ { .compatible = "adi,ad5453", .data = &ad5446_chip_info },
+ { .compatible = "adi,ad5512a", .data = &ad5512a_chip_info },
+ { .compatible = "adi,ad5541a", .data = &ad5541a_chip_info },
+ { .compatible = "adi,ad5542a", .data = &ad5541a_chip_info },
+ { .compatible = "adi,ad5543", .data = &ad5541a_chip_info },
+ { .compatible = "adi,ad5553", .data = &ad5553_chip_info },
+ { .compatible = "adi,ad5600", .data = &ad5541a_chip_info },
+ { .compatible = "adi,ad5601", .data = &ad5601_chip_info },
+ { .compatible = "adi,ad5611", .data = &ad5611_chip_info },
+ { .compatible = "adi,ad5621", .data = &ad5621_chip_info },
+ { .compatible = "adi,ad5641", .data = &ad5641_chip_info },
+ { .compatible = "adi,ad5620-2500", .data = &ad5620_2500_chip_info },
+ { .compatible = "adi,ad5620-1250", .data = &ad5620_1250_chip_info },
+ { .compatible = "adi,ad5640-2500", .data = &ad5640_2500_chip_info },
+ { .compatible = "adi,ad5640-1250", .data = &ad5640_1250_chip_info },
+ { .compatible = "adi,ad5660-2500", .data = &ad5660_2500_chip_info },
+ { .compatible = "adi,ad5660-1250", .data = &ad5660_1250_chip_info },
+ { .compatible = "adi,ad5662", .data = &ad5662_chip_info },
+ { .compatible = "ti,dac081s101", .data = &ad5300_chip_info },
+ { .compatible = "ti,dac101s101", .data = &ad5310_chip_info },
+ { .compatible = "ti,dac121s101", .data = &ad5320_chip_info },
+ { .compatible = "ti,dac7512", .data = &ad5320_chip_info },
+ { }
+};
+MODULE_DEVICE_TABLE(of, ad5446_of_ids);
+
+static struct spi_driver ad5446_spi_driver = {
+ .driver = {
+ .name = "ad5446",
+ .of_match_table = ad5446_of_ids,
+ },
+ .probe = ad5446_spi_probe,
+ .id_table = ad5446_spi_ids,
+};
+module_spi_driver(ad5446_spi_driver);
+
+MODULE_AUTHOR("Nuno Sá <nuno.sa@analog.com>");
+MODULE_DESCRIPTION("Analog Devices AD5446 and similar SPI DACs");
+MODULE_LICENSE("GPL");
+MODULE_IMPORT_NS("IIO_AD5446");
diff --git a/drivers/iio/dac/ad5446.c b/drivers/iio/dac/ad5446.c
index 01f934036185..c7876217c7ec 100644
--- a/drivers/iio/dac/ad5446.c
+++ b/drivers/iio/dac/ad5446.c
@@ -1,10 +1,11 @@
// SPDX-License-Identifier: GPL-2.0-or-later
/*
- * AD5446 SPI DAC driver
+ * AD5446 CORE DAC driver
*
* Copyright 2010 Analog Devices Inc.
*/
+#include <linux/export.h>
#include <linux/interrupt.h>
#include <linux/workqueue.h>
#include <linux/device.h>
@@ -12,60 +13,19 @@
#include <linux/slab.h>
#include <linux/sysfs.h>
#include <linux/list.h>
-#include <linux/spi/spi.h>
-#include <linux/i2c.h>
#include <linux/regulator/consumer.h>
#include <linux/err.h>
#include <linux/module.h>
-#include <linux/mod_devicetable.h>
#include <linux/iio/iio.h>
#include <linux/iio/sysfs.h>
-#include <linux/unaligned.h>
+#include "ad5446.h"
#define MODE_PWRDWN_1k 0x1
#define MODE_PWRDWN_100k 0x2
#define MODE_PWRDWN_TRISTATE 0x3
-/**
- * struct ad5446_state - driver instance specific data
- * @dev: this device
- * @chip_info: chip model specific constants, available modes etc
- * @vref_mv: actual reference voltage used
- * @cached_val: store/retrieve values during power down
- * @pwr_down_mode: power down mode (1k, 100k or tristate)
- * @pwr_down: true if the device is in power down
- * @lock: lock to protect the data buffer during write ops
- */
-
-struct ad5446_state {
- struct device *dev;
- const struct ad5446_chip_info *chip_info;
- unsigned short vref_mv;
- unsigned cached_val;
- unsigned pwr_down_mode;
- unsigned pwr_down;
- struct mutex lock;
- union {
- __be16 d16;
- u8 d24[3];
- } __aligned(IIO_DMA_MINALIGN);
-};
-
-/**
- * struct ad5446_chip_info - chip specific information
- * @channel: channel spec for the DAC
- * @int_vref_mv: AD5620/40/60: the internal reference voltage
- * @write: chip specific helper function to write to the register
- */
-
-struct ad5446_chip_info {
- struct iio_chan_spec channel;
- u16 int_vref_mv;
- int (*write)(struct ad5446_state *st, unsigned val);
-};
-
static const char * const ad5446_powerdown_modes[] = {
"1kohm_to_gnd", "100kohm_to_gnd", "three_state"
};
@@ -136,7 +96,7 @@ static ssize_t ad5446_write_dac_powerdown(struct iio_dev *indio_dev,
return ret ? ret : len;
}
-static const struct iio_chan_spec_ext_info ad5446_ext_info_powerdown[] = {
+const struct iio_chan_spec_ext_info ad5446_ext_info_powerdown[] = {
{
.name = "powerdown",
.read = ad5446_read_dac_powerdown,
@@ -147,28 +107,7 @@ static const struct iio_chan_spec_ext_info ad5446_ext_info_powerdown[] = {
IIO_ENUM_AVAILABLE("powerdown_mode", IIO_SHARED_BY_TYPE, &ad5446_powerdown_mode_enum),
{ }
};
-
-#define _AD5446_CHANNEL(bits, storage, _shift, ext) { \
- .type = IIO_VOLTAGE, \
- .indexed = 1, \
- .output = 1, \
- .channel = 0, \
- .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
- .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \
- .scan_type = { \
- .sign = 'u', \
- .realbits = (bits), \
- .storagebits = (storage), \
- .shift = (_shift), \
- }, \
- .ext_info = (ext), \
-}
-
-#define AD5446_CHANNEL(bits, storage, shift) \
- _AD5446_CHANNEL(bits, storage, shift, NULL)
-
-#define AD5446_CHANNEL_POWERDOWN(bits, storage, shift) \
- _AD5446_CHANNEL(bits, storage, shift, ad5446_ext_info_powerdown)
+EXPORT_SYMBOL_NS_GPL(ad5446_ext_info_powerdown, "IIO_AD5446");
static int ad5446_read_raw(struct iio_dev *indio_dev,
struct iio_chan_spec const *chan,
@@ -223,8 +162,8 @@ static const struct iio_info ad5446_info = {
.write_raw = ad5446_write_raw,
};
-static int ad5446_probe(struct device *dev, const char *name,
- const struct ad5446_chip_info *chip_info)
+int ad5446_probe(struct device *dev, const char *name,
+ const struct ad5446_chip_info *chip_info)
{
struct ad5446_state *st;
struct iio_dev *indio_dev;
@@ -264,379 +203,8 @@ static int ad5446_probe(struct device *dev, const char *name,
return devm_iio_device_register(dev, indio_dev);
}
-
-#if IS_ENABLED(CONFIG_SPI_MASTER)
-
-static int ad5446_write(struct ad5446_state *st, unsigned val)
-{
- struct spi_device *spi = to_spi_device(st->dev);
- st->d16 = cpu_to_be16(val);
-
- return spi_write(spi, &st->d16, sizeof(st->d16));
-}
-
-static int ad5660_write(struct ad5446_state *st, unsigned val)
-{
- struct spi_device *spi = to_spi_device(st->dev);
-
- put_unaligned_be24(val, &st->d24[0]);
-
- return spi_write(spi, st->d24, sizeof(st->d24));
-}
-
-/*
- * ad5446_supported_spi_device_ids:
- * The AD5620/40/60 parts are available in different fixed internal reference
- * voltage options. The actual part numbers may look differently
- * (and a bit cryptic), however this style is used to make clear which
- * parts are supported here.
- */
-
-static const struct ad5446_chip_info ad5300_chip_info = {
- .channel = AD5446_CHANNEL_POWERDOWN(8, 16, 4),
- .write = ad5446_write,
-};
-
-static const struct ad5446_chip_info ad5310_chip_info = {
- .channel = AD5446_CHANNEL_POWERDOWN(10, 16, 2),
- .write = ad5446_write,
-};
-
-static const struct ad5446_chip_info ad5320_chip_info = {
- .channel = AD5446_CHANNEL_POWERDOWN(12, 16, 0),
- .write = ad5446_write,
-};
-
-static const struct ad5446_chip_info ad5444_chip_info = {
- .channel = AD5446_CHANNEL(12, 16, 2),
- .write = ad5446_write,
-};
-
-static const struct ad5446_chip_info ad5446_chip_info = {
- .channel = AD5446_CHANNEL(14, 16, 0),
- .write = ad5446_write,
-};
-
-static const struct ad5446_chip_info ad5450_chip_info = {
- .channel = AD5446_CHANNEL(8, 16, 6),
- .write = ad5446_write,
-};
-
-static const struct ad5446_chip_info ad5451_chip_info = {
- .channel = AD5446_CHANNEL(10, 16, 4),
- .write = ad5446_write,
-};
-
-static const struct ad5446_chip_info ad5541a_chip_info = {
- .channel = AD5446_CHANNEL(16, 16, 0),
- .write = ad5446_write,
-};
-
-static const struct ad5446_chip_info ad5512a_chip_info = {
- .channel = AD5446_CHANNEL(12, 16, 4),
- .write = ad5446_write,
-};
-
-static const struct ad5446_chip_info ad5553_chip_info = {
- .channel = AD5446_CHANNEL(14, 16, 0),
- .write = ad5446_write,
-};
-
-static const struct ad5446_chip_info ad5601_chip_info = {
- .channel = AD5446_CHANNEL_POWERDOWN(8, 16, 6),
- .write = ad5446_write,
-};
-
-static const struct ad5446_chip_info ad5611_chip_info = {
- .channel = AD5446_CHANNEL_POWERDOWN(10, 16, 4),
- .write = ad5446_write,
-};
-
-static const struct ad5446_chip_info ad5621_chip_info = {
- .channel = AD5446_CHANNEL_POWERDOWN(12, 16, 2),
- .write = ad5446_write,
-};
-
-static const struct ad5446_chip_info ad5641_chip_info = {
- .channel = AD5446_CHANNEL_POWERDOWN(14, 16, 0),
- .write = ad5446_write,
-};
-
-static const struct ad5446_chip_info ad5620_2500_chip_info = {
- .channel = AD5446_CHANNEL_POWERDOWN(12, 16, 2),
- .int_vref_mv = 2500,
- .write = ad5446_write,
-};
-
-static const struct ad5446_chip_info ad5620_1250_chip_info = {
- .channel = AD5446_CHANNEL_POWERDOWN(12, 16, 2),
- .int_vref_mv = 1250,
- .write = ad5446_write,
-};
-
-static const struct ad5446_chip_info ad5640_2500_chip_info = {
- .channel = AD5446_CHANNEL_POWERDOWN(14, 16, 0),
- .int_vref_mv = 2500,
- .write = ad5446_write,
-};
-
-static const struct ad5446_chip_info ad5640_1250_chip_info = {
- .channel = AD5446_CHANNEL_POWERDOWN(14, 16, 0),
- .int_vref_mv = 1250,
- .write = ad5446_write,
-};
-
-static const struct ad5446_chip_info ad5660_2500_chip_info = {
- .channel = AD5446_CHANNEL_POWERDOWN(16, 16, 0),
- .int_vref_mv = 2500,
- .write = ad5660_write,
-};
-
-static const struct ad5446_chip_info ad5660_1250_chip_info = {
- .channel = AD5446_CHANNEL_POWERDOWN(16, 16, 0),
- .int_vref_mv = 1250,
- .write = ad5660_write,
-};
-
-static const struct ad5446_chip_info ad5662_chip_info = {
- .channel = AD5446_CHANNEL_POWERDOWN(16, 16, 0),
- .write = ad5660_write,
-};
-
-static const struct spi_device_id ad5446_spi_ids[] = {
- {"ad5300", (kernel_ulong_t)&ad5300_chip_info},
- {"ad5310", (kernel_ulong_t)&ad5310_chip_info},
- {"ad5320", (kernel_ulong_t)&ad5320_chip_info},
- {"ad5444", (kernel_ulong_t)&ad5444_chip_info},
- {"ad5446", (kernel_ulong_t)&ad5446_chip_info},
- {"ad5450", (kernel_ulong_t)&ad5450_chip_info},
- {"ad5451", (kernel_ulong_t)&ad5451_chip_info},
- {"ad5452", (kernel_ulong_t)&ad5444_chip_info}, /* ad5452 is compatible to the ad5444 */
- {"ad5453", (kernel_ulong_t)&ad5446_chip_info}, /* ad5453 is compatible to the ad5446 */
- {"ad5512a", (kernel_ulong_t)&ad5512a_chip_info},
- {"ad5541a", (kernel_ulong_t)&ad5541a_chip_info},
- {"ad5542a", (kernel_ulong_t)&ad5541a_chip_info}, /* ad5541a and ad5542a are compatible */
- {"ad5543", (kernel_ulong_t)&ad5541a_chip_info}, /* ad5541a and ad5543 are compatible */
- {"ad5553", (kernel_ulong_t)&ad5553_chip_info},
- {"ad5600", (kernel_ulong_t)&ad5541a_chip_info}, /* ad5541a and ad5600 are compatible */
- {"ad5601", (kernel_ulong_t)&ad5601_chip_info},
- {"ad5611", (kernel_ulong_t)&ad5611_chip_info},
- {"ad5621", (kernel_ulong_t)&ad5621_chip_info},
- {"ad5641", (kernel_ulong_t)&ad5641_chip_info},
- {"ad5620-2500", (kernel_ulong_t)&ad5620_2500_chip_info}, /* AD5620/40/60: */
- /* part numbers may look differently */
- {"ad5620-1250", (kernel_ulong_t)&ad5620_1250_chip_info},
- {"ad5640-2500", (kernel_ulong_t)&ad5640_2500_chip_info},
- {"ad5640-1250", (kernel_ulong_t)&ad5640_1250_chip_info},
- {"ad5660-2500", (kernel_ulong_t)&ad5660_2500_chip_info},
- {"ad5660-1250", (kernel_ulong_t)&ad5660_1250_chip_info},
- {"ad5662", (kernel_ulong_t)&ad5662_chip_info},
- {"dac081s101", (kernel_ulong_t)&ad5300_chip_info}, /* compatible Texas Instruments chips */
- {"dac101s101", (kernel_ulong_t)&ad5310_chip_info},
- {"dac121s101", (kernel_ulong_t)&ad5320_chip_info},
- {"dac7512", (kernel_ulong_t)&ad5320_chip_info},
- { }
-};
-MODULE_DEVICE_TABLE(spi, ad5446_spi_ids);
-
-static const struct of_device_id ad5446_of_ids[] = {
- { .compatible = "adi,ad5300", .data = &ad5300_chip_info },
- { .compatible = "adi,ad5310", .data = &ad5310_chip_info },
- { .compatible = "adi,ad5320", .data = &ad5320_chip_info },
- { .compatible = "adi,ad5444", .data = &ad5444_chip_info },
- { .compatible = "adi,ad5446", .data = &ad5446_chip_info },
- { .compatible = "adi,ad5450", .data = &ad5450_chip_info },
- { .compatible = "adi,ad5451", .data = &ad5451_chip_info },
- { .compatible = "adi,ad5452", .data = &ad5444_chip_info },
- { .compatible = "adi,ad5453", .data = &ad5446_chip_info },
- { .compatible = "adi,ad5512a", .data = &ad5512a_chip_info },
- { .compatible = "adi,ad5541a", .data = &ad5541a_chip_info },
- { .compatible = "adi,ad5542a", .data = &ad5541a_chip_info },
- { .compatible = "adi,ad5543", .data = &ad5541a_chip_info },
- { .compatible = "adi,ad5553", .data = &ad5553_chip_info },
- { .compatible = "adi,ad5600", .data = &ad5541a_chip_info },
- { .compatible = "adi,ad5601", .data = &ad5601_chip_info },
- { .compatible = "adi,ad5611", .data = &ad5611_chip_info },
- { .compatible = "adi,ad5621", .data = &ad5621_chip_info },
- { .compatible = "adi,ad5641", .data = &ad5641_chip_info },
- { .compatible = "adi,ad5620-2500", .data = &ad5620_2500_chip_info },
- { .compatible = "adi,ad5620-1250", .data = &ad5620_1250_chip_info },
- { .compatible = "adi,ad5640-2500", .data = &ad5640_2500_chip_info },
- { .compatible = "adi,ad5640-1250", .data = &ad5640_1250_chip_info },
- { .compatible = "adi,ad5660-2500", .data = &ad5660_2500_chip_info },
- { .compatible = "adi,ad5660-1250", .data = &ad5660_1250_chip_info },
- { .compatible = "adi,ad5662", .data = &ad5662_chip_info },
- { .compatible = "ti,dac081s101", .data = &ad5300_chip_info },
- { .compatible = "ti,dac101s101", .data = &ad5310_chip_info },
- { .compatible = "ti,dac121s101", .data = &ad5320_chip_info },
- { .compatible = "ti,dac7512" },
- { }
-};
-MODULE_DEVICE_TABLE(of, ad5446_of_ids);
-
-static int ad5446_spi_probe(struct spi_device *spi)
-{
- const struct spi_device_id *id = spi_get_device_id(spi);
- const struct ad5446_chip_info *chip_info;
-
- chip_info = spi_get_device_match_data(spi);
- if (!chip_info)
- return -ENODEV;
-
- return ad5446_probe(&spi->dev, id->name, chip_info);
-}
-
-static struct spi_driver ad5446_spi_driver = {
- .driver = {
- .name = "ad5446",
- .of_match_table = ad5446_of_ids,
- },
- .probe = ad5446_spi_probe,
- .id_table = ad5446_spi_ids,
-};
-
-static int __init ad5446_spi_register_driver(void)
-{
- return spi_register_driver(&ad5446_spi_driver);
-}
-
-static void ad5446_spi_unregister_driver(void)
-{
- spi_unregister_driver(&ad5446_spi_driver);
-}
-
-#else
-
-static inline int ad5446_spi_register_driver(void) { return 0; }
-static inline void ad5446_spi_unregister_driver(void) { }
-
-#endif
-
-#if IS_ENABLED(CONFIG_I2C)
-
-static int ad5622_write(struct ad5446_state *st, unsigned val)
-{
- struct i2c_client *client = to_i2c_client(st->dev);
- st->d16 = cpu_to_be16(val);
- int ret;
-
- ret = i2c_master_send_dmasafe(client, (char *)&st->d16, sizeof(st->d16));
- if (ret < 0)
- return ret;
- if (ret != sizeof(st->d16))
- return -EIO;
-
- return 0;
-}
-
-/*
- * ad5446_supported_i2c_device_ids:
- * The AD5620/40/60 parts are available in different fixed internal reference
- * voltage options. The actual part numbers may look differently
- * (and a bit cryptic), however this style is used to make clear which
- * parts are supported here.
- */
-
-static const struct ad5446_chip_info ad5602_chip_info = {
- .channel = AD5446_CHANNEL_POWERDOWN(8, 16, 4),
- .write = ad5622_write,
-};
-
-static const struct ad5446_chip_info ad5612_chip_info = {
- .channel = AD5446_CHANNEL_POWERDOWN(10, 16, 2),
- .write = ad5622_write,
-};
-
-static const struct ad5446_chip_info ad5622_chip_info = {
- .channel = AD5446_CHANNEL_POWERDOWN(12, 16, 0),
- .write = ad5622_write,
-};
-
-static int ad5446_i2c_probe(struct i2c_client *i2c)
-{
- const struct i2c_device_id *id = i2c_client_get_device_id(i2c);
- const struct ad5446_chip_info *chip_info;
-
- chip_info = i2c_get_match_data(i2c);
- if (!chip_info)
- return -ENODEV;
-
- return ad5446_probe(&i2c->dev, id->name, chip_info);
-}
-
-static const struct i2c_device_id ad5446_i2c_ids[] = {
- {"ad5301", (kernel_ulong_t)&ad5602_chip_info},
- {"ad5311", (kernel_ulong_t)&ad5612_chip_info},
- {"ad5321", (kernel_ulong_t)&ad5622_chip_info},
- {"ad5602", (kernel_ulong_t)&ad5602_chip_info},
- {"ad5612", (kernel_ulong_t)&ad5612_chip_info},
- {"ad5622", (kernel_ulong_t)&ad5622_chip_info},
- { }
-};
-MODULE_DEVICE_TABLE(i2c, ad5446_i2c_ids);
-
-static const struct of_device_id ad5446_i2c_of_ids[] = {
- { .compatible = "adi,ad5301", .data = &ad5602_chip_info },
- { .compatible = "adi,ad5311", .data = &ad5612_chip_info },
- { .compatible = "adi,ad5321", .data = &ad5622_chip_info },
- { .compatible = "adi,ad5602", .data = &ad5602_chip_info },
- { .compatible = "adi,ad5612", .data = &ad5612_chip_info },
- { .compatible = "adi,ad5622", .data = &ad5622_chip_info },
- { }
-};
-MODULE_DEVICE_TABLE(of, ad5446_i2c_of_ids);
-
-static struct i2c_driver ad5446_i2c_driver = {
- .driver = {
- .name = "ad5446",
- .of_match_table = ad5446_i2c_of_ids,
- },
- .probe = ad5446_i2c_probe,
- .id_table = ad5446_i2c_ids,
-};
-
-static int __init ad5446_i2c_register_driver(void)
-{
- return i2c_add_driver(&ad5446_i2c_driver);
-}
-
-static void __exit ad5446_i2c_unregister_driver(void)
-{
- i2c_del_driver(&ad5446_i2c_driver);
-}
-
-#else
-
-static inline int ad5446_i2c_register_driver(void) { return 0; }
-static inline void ad5446_i2c_unregister_driver(void) { }
-
-#endif
-
-static int __init ad5446_init(void)
-{
- int ret;
-
- ret = ad5446_spi_register_driver();
- if (ret)
- return ret;
-
- ret = ad5446_i2c_register_driver();
- if (ret) {
- ad5446_spi_unregister_driver();
- return ret;
- }
-
- return 0;
-}
-module_init(ad5446_init);
-
-static void __exit ad5446_exit(void)
-{
- ad5446_i2c_unregister_driver();
- ad5446_spi_unregister_driver();
-}
-module_exit(ad5446_exit);
+EXPORT_SYMBOL_NS_GPL(ad5446_probe, "IIO_AD5446");
MODULE_AUTHOR("Michael Hennerich <michael.hennerich@analog.com>");
-MODULE_DESCRIPTION("Analog Devices AD5444/AD5446 DAC");
+MODULE_DESCRIPTION("Analog Devices CORE AD5446 DAC and similar devices");
MODULE_LICENSE("GPL v2");
diff --git a/drivers/iio/dac/ad5446.h b/drivers/iio/dac/ad5446.h
new file mode 100644
index 000000000000..ee3d2c7d1764
--- /dev/null
+++ b/drivers/iio/dac/ad5446.h
@@ -0,0 +1,76 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef _LINUX_AD5446_H
+#define _LINUX_AD5446_H
+
+#include <linux/bits.h>
+#include <linux/iio/iio.h>
+#include <linux/mutex.h>
+#include <linux/types.h>
+
+struct device;
+
+extern const struct iio_chan_spec_ext_info ad5446_ext_info_powerdown[];
+
+#define _AD5446_CHANNEL(bits, storage, _shift, ext) { \
+ .type = IIO_VOLTAGE, \
+ .indexed = 1, \
+ .output = 1, \
+ .channel = 0, \
+ .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
+ .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \
+ .scan_type = { \
+ .sign = 'u', \
+ .realbits = (bits), \
+ .storagebits = (storage), \
+ .shift = (_shift), \
+ }, \
+ .ext_info = (ext), \
+}
+
+#define AD5446_CHANNEL(bits, storage, shift) \
+ _AD5446_CHANNEL(bits, storage, shift, NULL)
+
+#define AD5446_CHANNEL_POWERDOWN(bits, storage, shift) \
+ _AD5446_CHANNEL(bits, storage, shift, ad5446_ext_info_powerdown)
+
+/**
+ * struct ad5446_state - driver instance specific data
+ * @dev: this device
+ * @chip_info: chip model specific constants, available modes etc
+ * @vref_mv: actual reference voltage used
+ * @cached_val: store/retrieve values during power down
+ * @pwr_down_mode: power down mode (1k, 100k or tristate)
+ * @pwr_down: true if the device is in power down
+ * @lock: lock to protect the data buffer during write ops
+ */
+struct ad5446_state {
+ struct device *dev;
+ const struct ad5446_chip_info *chip_info;
+ unsigned short vref_mv;
+ unsigned int cached_val;
+ unsigned int pwr_down_mode;
+ unsigned int pwr_down;
+ /* mutex to protect device shared data */
+ struct mutex lock;
+ union {
+ __be16 d16;
+ u8 d24[3];
+ } __aligned(IIO_DMA_MINALIGN);
+};
+
+/**
+ * struct ad5446_chip_info - chip specific information
+ * @channel: channel spec for the DAC
+ * @int_vref_mv: AD5620/40/60: the internal reference voltage
+ * @write: chip specific helper function to write to the register
+ */
+struct ad5446_chip_info {
+ struct iio_chan_spec channel;
+ u16 int_vref_mv;
+ int (*write)(struct ad5446_state *st, unsigned int val);
+};
+
+int ad5446_probe(struct device *dev, const char *name,
+ const struct ad5446_chip_info *chip_info);
+
+#endif
--
2.51.0
^ permalink raw reply related [flat|nested] 23+ messages in thread* Re: [PATCH v4 07/12] iio: dac: ad5446: Separate I2C/SPI into different drivers
2025-11-04 15:35 ` [PATCH v4 07/12] iio: dac: ad5446: Separate I2C/SPI into different drivers Nuno Sá via B4 Relay
@ 2025-11-04 18:20 ` Andy Shevchenko
0 siblings, 0 replies; 23+ messages in thread
From: Andy Shevchenko @ 2025-11-04 18:20 UTC (permalink / raw)
To: nuno.sa
Cc: linux-iio, devicetree, Michael Hennerich, Jonathan Cameron,
David Lechner, Andy Shevchenko, Lars-Peter Clausen, Rob Herring,
Krzysztof Kozlowski, Conor Dooley
On Tue, Nov 04, 2025 at 03:35:12PM +0000, Nuno Sá via B4 Relay wrote:
>
> Properly separate the I2C and SPI drivers into two different drivers
> living in their own source file (as usual). So that no need for the
> hacky ifdefery.
...
> +#include <linux/iio/iio.h>
> +#include <linux/mutex.h>
> +#include <linux/types.h>
> +
> +struct device;
> +
> +extern const struct iio_chan_spec_ext_info ad5446_ext_info_powerdown[];
> +
> +#define _AD5446_CHANNEL(bits, storage, _shift, ext) { \
> + .type = IIO_VOLTAGE, \
> + .indexed = 1, \
> + .output = 1, \
> + .channel = 0, \
Unneeded.
> + .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \
> + .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE), \
> + .scan_type = { \
> + .sign = 'u', \
> + .realbits = (bits), \
> + .storagebits = (storage), \
> + .shift = (_shift), \
> + }, \
> + .ext_info = (ext), \
> +}
> +
> +#define AD5446_CHANNEL(bits, storage, shift) \
> + _AD5446_CHANNEL(bits, storage, shift, NULL)
> +#define AD5446_CHANNEL_POWERDOWN(bits, storage, shift) \
> + _AD5446_CHANNEL(bits, storage, shift, ad5446_ext_info_powerdown)
> +
> +/**
> + * struct ad5446_state - driver instance specific data
> + * @dev: this device
> + * @chip_info: chip model specific constants, available modes etc
> + * @vref_mv: actual reference voltage used
> + * @cached_val: store/retrieve values during power down
> + * @pwr_down_mode: power down mode (1k, 100k or tristate)
> + * @pwr_down: true if the device is in power down
> + * @lock: lock to protect the data buffer during write ops
> + */
> +struct ad5446_state {
> + struct device *dev;
> + const struct ad5446_chip_info *chip_info;
> + unsigned short vref_mv;
_mV?
> + unsigned int cached_val;
> + unsigned int pwr_down_mode;
> + unsigned int pwr_down;
> + /* mutex to protect device shared data */
> + struct mutex lock;
> + union {
> + __be16 d16;
> + u8 d24[3];
> + } __aligned(IIO_DMA_MINALIGN);
> +};
> +
> +/**
> + * struct ad5446_chip_info - chip specific information
> + * @channel: channel spec for the DAC
> + * @int_vref_mv: AD5620/40/60: the internal reference voltage
> + * @write: chip specific helper function to write to the register
> + */
> +struct ad5446_chip_info {
> + struct iio_chan_spec channel;
> + u16 int_vref_mv;
_mV?
> + int (*write)(struct ad5446_state *st, unsigned int val);
> +};
> +
> +int ad5446_probe(struct device *dev, const char *name,
> + const struct ad5446_chip_info *chip_info);
> +
> +#endif
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH v4 08/12] iio: dac: ad5446: Make use of devm_mutex_init()
2025-11-04 15:35 [PATCH v4 00/12] iio: dac: ad5446: Refactor and add support for AD5542 Nuno Sá via B4 Relay
` (6 preceding siblings ...)
2025-11-04 15:35 ` [PATCH v4 07/12] iio: dac: ad5446: Separate I2C/SPI into different drivers Nuno Sá via B4 Relay
@ 2025-11-04 15:35 ` Nuno Sá via B4 Relay
2025-11-04 15:35 ` [PATCH v4 09/12] iio: dac: ad5446: Make use of the cleanup helpers Nuno Sá via B4 Relay
` (4 subsequent siblings)
12 siblings, 0 replies; 23+ messages in thread
From: Nuno Sá via B4 Relay @ 2025-11-04 15:35 UTC (permalink / raw)
To: linux-iio, devicetree
Cc: Michael Hennerich, Jonathan Cameron, David Lechner,
Andy Shevchenko, Lars-Peter Clausen, Rob Herring,
Krzysztof Kozlowski, Conor Dooley
From: Nuno Sá <nuno.sa@analog.com>
Use devm_mutex_init() which is helpful with CONFIG_DEBUG_MUTEXES.
Signed-off-by: Nuno Sá <nuno.sa@analog.com>
---
drivers/iio/dac/ad5446.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/drivers/iio/dac/ad5446.c b/drivers/iio/dac/ad5446.c
index c7876217c7ec..59e1f67ef334 100644
--- a/drivers/iio/dac/ad5446.c
+++ b/drivers/iio/dac/ad5446.c
@@ -184,7 +184,9 @@ int ad5446_probe(struct device *dev, const char *name,
indio_dev->channels = &st->chip_info->channel;
indio_dev->num_channels = 1;
- mutex_init(&st->lock);
+ ret = devm_mutex_init(dev, &st->lock);
+ if (ret)
+ return ret;
st->pwr_down_mode = MODE_PWRDWN_1k;
--
2.51.0
^ permalink raw reply related [flat|nested] 23+ messages in thread* [PATCH v4 09/12] iio: dac: ad5446: Make use of the cleanup helpers
2025-11-04 15:35 [PATCH v4 00/12] iio: dac: ad5446: Refactor and add support for AD5542 Nuno Sá via B4 Relay
` (7 preceding siblings ...)
2025-11-04 15:35 ` [PATCH v4 08/12] iio: dac: ad5446: Make use of devm_mutex_init() Nuno Sá via B4 Relay
@ 2025-11-04 15:35 ` Nuno Sá via B4 Relay
2025-11-04 18:23 ` Andy Shevchenko
2025-11-04 15:35 ` [PATCH v4 10/12] iio: dac: ad5446: Refactor header inclusion Nuno Sá via B4 Relay
` (3 subsequent siblings)
12 siblings, 1 reply; 23+ messages in thread
From: Nuno Sá via B4 Relay @ 2025-11-04 15:35 UTC (permalink / raw)
To: linux-iio, devicetree
Cc: Michael Hennerich, Jonathan Cameron, David Lechner,
Andy Shevchenko, Lars-Peter Clausen, Rob Herring,
Krzysztof Kozlowski, Conor Dooley
From: Nuno Sá <nuno.sa@analog.com>
Use the auto unlocking helpers from cleanup.h. Allows for some code
simplification.
While at it, don't use the ternary operator in
ad5446_write_dac_powerdown() and add an helper function to write the DAC
code. The reason for the function was purely to avoid having to use
unreachable().
Signed-off-by: Nuno Sá <nuno.sa@analog.com>
---
drivers/iio/dac/ad5446.c | 45 ++++++++++++++++++++++++++-------------------
1 file changed, 26 insertions(+), 19 deletions(-)
diff --git a/drivers/iio/dac/ad5446.c b/drivers/iio/dac/ad5446.c
index 59e1f67ef334..1943e8014990 100644
--- a/drivers/iio/dac/ad5446.c
+++ b/drivers/iio/dac/ad5446.c
@@ -5,6 +5,7 @@
* Copyright 2010 Analog Devices Inc.
*/
+#include <linux/cleanup.h>
#include <linux/export.h>
#include <linux/interrupt.h>
#include <linux/workqueue.h>
@@ -80,7 +81,7 @@ static ssize_t ad5446_write_dac_powerdown(struct iio_dev *indio_dev,
if (ret)
return ret;
- mutex_lock(&st->lock);
+ guard(mutex)(&st->lock);
st->pwr_down = powerdown;
if (st->pwr_down) {
@@ -91,9 +92,10 @@ static ssize_t ad5446_write_dac_powerdown(struct iio_dev *indio_dev,
}
ret = st->chip_info->write(st, val);
- mutex_unlock(&st->lock);
+ if (ret)
+ return ret;
- return ret ? ret : len;
+ return len;
}
const struct iio_chan_spec_ext_info ad5446_ext_info_powerdown[] = {
@@ -129,32 +131,37 @@ static int ad5446_read_raw(struct iio_dev *indio_dev,
return -EINVAL;
}
+static int ad5446_write_dac_raw(struct iio_dev *indio_dev,
+ const struct iio_chan_spec *chan,
+ int val)
+{
+ struct ad5446_state *st = iio_priv(indio_dev);
+
+ if (val >= (1 << chan->scan_type.realbits) || val < 0)
+ return -EINVAL;
+
+ val <<= chan->scan_type.shift;
+ guard(mutex)(&st->lock);
+
+ st->cached_val = val;
+ if (st->pwr_down)
+ return 0;
+
+ return st->chip_info->write(st, val);
+}
+
static int ad5446_write_raw(struct iio_dev *indio_dev,
struct iio_chan_spec const *chan,
int val,
int val2,
long mask)
{
- struct ad5446_state *st = iio_priv(indio_dev);
- int ret = 0;
-
switch (mask) {
case IIO_CHAN_INFO_RAW:
- if (val >= (1 << chan->scan_type.realbits) || val < 0)
- return -EINVAL;
-
- val <<= chan->scan_type.shift;
- mutex_lock(&st->lock);
- st->cached_val = val;
- if (!st->pwr_down)
- ret = st->chip_info->write(st, val);
- mutex_unlock(&st->lock);
- break;
+ return ad5446_write_dac_raw(indio_dev, chan, val);
default:
- ret = -EINVAL;
+ return -EINVAL;
}
-
- return ret;
}
static const struct iio_info ad5446_info = {
--
2.51.0
^ permalink raw reply related [flat|nested] 23+ messages in thread* Re: [PATCH v4 09/12] iio: dac: ad5446: Make use of the cleanup helpers
2025-11-04 15:35 ` [PATCH v4 09/12] iio: dac: ad5446: Make use of the cleanup helpers Nuno Sá via B4 Relay
@ 2025-11-04 18:23 ` Andy Shevchenko
0 siblings, 0 replies; 23+ messages in thread
From: Andy Shevchenko @ 2025-11-04 18:23 UTC (permalink / raw)
To: nuno.sa
Cc: linux-iio, devicetree, Michael Hennerich, Jonathan Cameron,
David Lechner, Andy Shevchenko, Lars-Peter Clausen, Rob Herring,
Krzysztof Kozlowski, Conor Dooley
On Tue, Nov 04, 2025 at 03:35:14PM +0000, Nuno Sá via B4 Relay wrote:
> Use the auto unlocking helpers from cleanup.h. Allows for some code
> simplification.
>
> While at it, don't use the ternary operator in
> ad5446_write_dac_powerdown() and add an helper function to write the DAC
> code. The reason for the function was purely to avoid having to use
> unreachable().
...
> +static int ad5446_write_dac_raw(struct iio_dev *indio_dev,
> + const struct iio_chan_spec *chan,
> + int val)
> +{
> + struct ad5446_state *st = iio_priv(indio_dev);
> + if (val >= (1 << chan->scan_type.realbits) || val < 0)
> + return -EINVAL;
BIT() ?
in_range() ?
> + val <<= chan->scan_type.shift;
> + guard(mutex)(&st->lock);
> +
> + st->cached_val = val;
> + if (st->pwr_down)
> + return 0;
> +
> + return st->chip_info->write(st, val);
> +}
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH v4 10/12] iio: dac: ad5446: Refactor header inclusion
2025-11-04 15:35 [PATCH v4 00/12] iio: dac: ad5446: Refactor and add support for AD5542 Nuno Sá via B4 Relay
` (8 preceding siblings ...)
2025-11-04 15:35 ` [PATCH v4 09/12] iio: dac: ad5446: Make use of the cleanup helpers Nuno Sá via B4 Relay
@ 2025-11-04 15:35 ` Nuno Sá via B4 Relay
2025-11-04 18:24 ` Andy Shevchenko
2025-11-04 15:35 ` [PATCH v4 11/12] iio: dac: ad5446: Fix coding style issues Nuno Sá via B4 Relay
` (2 subsequent siblings)
12 siblings, 1 reply; 23+ messages in thread
From: Nuno Sá via B4 Relay @ 2025-11-04 15:35 UTC (permalink / raw)
To: linux-iio, devicetree
Cc: Michael Hennerich, Jonathan Cameron, David Lechner,
Andy Shevchenko, Lars-Peter Clausen, Rob Herring,
Krzysztof Kozlowski, Conor Dooley
From: Nuno Sá <nuno.sa@analog.com>
Make sure include files are given in alphabetical order and that we include
the ones that were missing and remove the ones we don't really use.
Signed-off-by: Nuno Sá <nuno.sa@analog.com>
---
drivers/iio/dac/ad5446.c | 18 +++++++-----------
1 file changed, 7 insertions(+), 11 deletions(-)
diff --git a/drivers/iio/dac/ad5446.c b/drivers/iio/dac/ad5446.c
index 1943e8014990..0556ce78c2f6 100644
--- a/drivers/iio/dac/ad5446.c
+++ b/drivers/iio/dac/ad5446.c
@@ -5,21 +5,17 @@
* Copyright 2010 Analog Devices Inc.
*/
+#include <linux/array_size.h>
#include <linux/cleanup.h>
-#include <linux/export.h>
-#include <linux/interrupt.h>
-#include <linux/workqueue.h>
#include <linux/device.h>
-#include <linux/kernel.h>
-#include <linux/slab.h>
-#include <linux/sysfs.h>
-#include <linux/list.h>
-#include <linux/regulator/consumer.h>
#include <linux/err.h>
-#include <linux/module.h>
-
+#include <linux/export.h>
#include <linux/iio/iio.h>
-#include <linux/iio/sysfs.h>
+#include <linux/kstrtox.h>
+#include <linux/module.h>
+#include <linux/mutex.h>
+#include <linux/regulator/consumer.h>
+#include <linux/sysfs.h>
#include "ad5446.h"
--
2.51.0
^ permalink raw reply related [flat|nested] 23+ messages in thread* Re: [PATCH v4 10/12] iio: dac: ad5446: Refactor header inclusion
2025-11-04 15:35 ` [PATCH v4 10/12] iio: dac: ad5446: Refactor header inclusion Nuno Sá via B4 Relay
@ 2025-11-04 18:24 ` Andy Shevchenko
0 siblings, 0 replies; 23+ messages in thread
From: Andy Shevchenko @ 2025-11-04 18:24 UTC (permalink / raw)
To: nuno.sa
Cc: linux-iio, devicetree, Michael Hennerich, Jonathan Cameron,
David Lechner, Andy Shevchenko, Lars-Peter Clausen, Rob Herring,
Krzysztof Kozlowski, Conor Dooley
On Tue, Nov 04, 2025 at 03:35:15PM +0000, Nuno Sá via B4 Relay wrote:
>
> Make sure include files are given in alphabetical order and that we include
> the ones that were missing and remove the ones we don't really use.
...
> +#include <linux/export.h>
> #include <linux/iio/iio.h>
> +#include <linux/kstrtox.h>
> +#include <linux/module.h>
> +#include <linux/mutex.h>
> +#include <linux/regulator/consumer.h>
> +#include <linux/sysfs.h>
Most likely the types.h is missing and maybe more...
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH v4 11/12] iio: dac: ad5446: Fix coding style issues
2025-11-04 15:35 [PATCH v4 00/12] iio: dac: ad5446: Refactor and add support for AD5542 Nuno Sá via B4 Relay
` (9 preceding siblings ...)
2025-11-04 15:35 ` [PATCH v4 10/12] iio: dac: ad5446: Refactor header inclusion Nuno Sá via B4 Relay
@ 2025-11-04 15:35 ` Nuno Sá via B4 Relay
2025-11-04 18:26 ` Andy Shevchenko
2025-11-04 15:35 ` [PATCH v4 12/12] iio: dac: ad5446: Add AD5542 to the spi id table Nuno Sá via B4 Relay
2025-11-04 18:30 ` [PATCH v4 00/12] iio: dac: ad5446: Refactor and add support for AD5542 Andy Shevchenko
12 siblings, 1 reply; 23+ messages in thread
From: Nuno Sá via B4 Relay @ 2025-11-04 15:35 UTC (permalink / raw)
To: linux-iio, devicetree
Cc: Michael Hennerich, Jonathan Cameron, David Lechner,
Andy Shevchenko, Lars-Peter Clausen, Rob Herring,
Krzysztof Kozlowski, Conor Dooley
From: Nuno Sá <nuno.sa@analog.com>
Fix style issues as reported by checkpatch.
Signed-off-by: Nuno Sá <nuno.sa@analog.com>
---
drivers/iio/dac/ad5446.c | 23 +++++++++++------------
1 file changed, 11 insertions(+), 12 deletions(-)
diff --git a/drivers/iio/dac/ad5446.c b/drivers/iio/dac/ad5446.c
index 0556ce78c2f6..46a2eadb1d9b 100644
--- a/drivers/iio/dac/ad5446.c
+++ b/drivers/iio/dac/ad5446.c
@@ -28,7 +28,8 @@ static const char * const ad5446_powerdown_modes[] = {
};
static int ad5446_set_powerdown_mode(struct iio_dev *indio_dev,
- const struct iio_chan_spec *chan, unsigned int mode)
+ const struct iio_chan_spec *chan,
+ unsigned int mode)
{
struct ad5446_state *st = iio_priv(indio_dev);
@@ -38,7 +39,7 @@ static int ad5446_set_powerdown_mode(struct iio_dev *indio_dev,
}
static int ad5446_get_powerdown_mode(struct iio_dev *indio_dev,
- const struct iio_chan_spec *chan)
+ const struct iio_chan_spec *chan)
{
struct ad5446_state *st = iio_priv(indio_dev);
@@ -53,9 +54,9 @@ static const struct iio_enum ad5446_powerdown_mode_enum = {
};
static ssize_t ad5446_read_dac_powerdown(struct iio_dev *indio_dev,
- uintptr_t private,
- const struct iio_chan_spec *chan,
- char *buf)
+ uintptr_t private,
+ const struct iio_chan_spec *chan,
+ char *buf)
{
struct ad5446_state *st = iio_priv(indio_dev);
@@ -63,9 +64,9 @@ static ssize_t ad5446_read_dac_powerdown(struct iio_dev *indio_dev,
}
static ssize_t ad5446_write_dac_powerdown(struct iio_dev *indio_dev,
- uintptr_t private,
- const struct iio_chan_spec *chan,
- const char *buf, size_t len)
+ uintptr_t private,
+ const struct iio_chan_spec *chan,
+ const char *buf, size_t len)
{
struct ad5446_state *st = iio_priv(indio_dev);
unsigned int shift;
@@ -147,10 +148,8 @@ static int ad5446_write_dac_raw(struct iio_dev *indio_dev,
}
static int ad5446_write_raw(struct iio_dev *indio_dev,
- struct iio_chan_spec const *chan,
- int val,
- int val2,
- long mask)
+ struct iio_chan_spec const *chan, int val,
+ int val2, long mask)
{
switch (mask) {
case IIO_CHAN_INFO_RAW:
--
2.51.0
^ permalink raw reply related [flat|nested] 23+ messages in thread* Re: [PATCH v4 11/12] iio: dac: ad5446: Fix coding style issues
2025-11-04 15:35 ` [PATCH v4 11/12] iio: dac: ad5446: Fix coding style issues Nuno Sá via B4 Relay
@ 2025-11-04 18:26 ` Andy Shevchenko
0 siblings, 0 replies; 23+ messages in thread
From: Andy Shevchenko @ 2025-11-04 18:26 UTC (permalink / raw)
To: nuno.sa
Cc: linux-iio, devicetree, Michael Hennerich, Jonathan Cameron,
David Lechner, Andy Shevchenko, Lars-Peter Clausen, Rob Herring,
Krzysztof Kozlowski, Conor Dooley
On Tue, Nov 04, 2025 at 03:35:16PM +0000, Nuno Sá via B4 Relay wrote:
> Fix style issues as reported by checkpatch.
Can we do this before splitting the driver?
This sounds to me like a change towards the fix, however quite minor, but still
better to move it closer to the beginning of the series.
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 23+ messages in thread
* [PATCH v4 12/12] iio: dac: ad5446: Add AD5542 to the spi id table
2025-11-04 15:35 [PATCH v4 00/12] iio: dac: ad5446: Refactor and add support for AD5542 Nuno Sá via B4 Relay
` (10 preceding siblings ...)
2025-11-04 15:35 ` [PATCH v4 11/12] iio: dac: ad5446: Fix coding style issues Nuno Sá via B4 Relay
@ 2025-11-04 15:35 ` Nuno Sá via B4 Relay
2025-11-04 18:30 ` [PATCH v4 00/12] iio: dac: ad5446: Refactor and add support for AD5542 Andy Shevchenko
12 siblings, 0 replies; 23+ messages in thread
From: Nuno Sá via B4 Relay @ 2025-11-04 15:35 UTC (permalink / raw)
To: linux-iio, devicetree
Cc: Michael Hennerich, Jonathan Cameron, David Lechner,
Andy Shevchenko, Lars-Peter Clausen, Rob Herring,
Krzysztof Kozlowski, Conor Dooley
From: Michael Hennerich <michael.hennerich@analog.com>
This adds support for the AD5542 single channel Current Source and
Voltage Output DACs.
It is similar to the AD5542A model so just use the same id.
Signed-off-by: Michael Hennerich <michael.hennerich@analog.com>
Co-developed-by: Nuno Sá <nuno.sa@analog.com>
Signed-off-by: Nuno Sá <nuno.sa@analog.com>
---
drivers/iio/dac/ad5446-spi.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/drivers/iio/dac/ad5446-spi.c b/drivers/iio/dac/ad5446-spi.c
index 1a52f6014fad..487268d52ce2 100644
--- a/drivers/iio/dac/ad5446-spi.c
+++ b/drivers/iio/dac/ad5446-spi.c
@@ -175,6 +175,7 @@ static const struct spi_device_id ad5446_spi_ids[] = {
{"ad5453", (kernel_ulong_t)&ad5446_chip_info}, /* ad5453 is compatible to the ad5446 */
{"ad5512a", (kernel_ulong_t)&ad5512a_chip_info},
{"ad5541a", (kernel_ulong_t)&ad5541a_chip_info},
+ {"ad5542", (kernel_ulong_t)&ad5541a_chip_info}, /* ad5541a and ad5542 are compatible */
{"ad5542a", (kernel_ulong_t)&ad5541a_chip_info}, /* ad5541a and ad5542a are compatible */
{"ad5543", (kernel_ulong_t)&ad5541a_chip_info}, /* ad5541a and ad5543 are compatible */
{"ad5553", (kernel_ulong_t)&ad5553_chip_info},
@@ -211,6 +212,7 @@ static const struct of_device_id ad5446_of_ids[] = {
{ .compatible = "adi,ad5453", .data = &ad5446_chip_info },
{ .compatible = "adi,ad5512a", .data = &ad5512a_chip_info },
{ .compatible = "adi,ad5541a", .data = &ad5541a_chip_info },
+ { .compatible = "adi,ad5542", .data = &ad5541a_chip_info },
{ .compatible = "adi,ad5542a", .data = &ad5541a_chip_info },
{ .compatible = "adi,ad5543", .data = &ad5541a_chip_info },
{ .compatible = "adi,ad5553", .data = &ad5553_chip_info },
--
2.51.0
^ permalink raw reply related [flat|nested] 23+ messages in thread* Re: [PATCH v4 00/12] iio: dac: ad5446: Refactor and add support for AD5542
2025-11-04 15:35 [PATCH v4 00/12] iio: dac: ad5446: Refactor and add support for AD5542 Nuno Sá via B4 Relay
` (11 preceding siblings ...)
2025-11-04 15:35 ` [PATCH v4 12/12] iio: dac: ad5446: Add AD5542 to the spi id table Nuno Sá via B4 Relay
@ 2025-11-04 18:30 ` Andy Shevchenko
2025-11-05 10:16 ` Nuno Sá
12 siblings, 1 reply; 23+ messages in thread
From: Andy Shevchenko @ 2025-11-04 18:30 UTC (permalink / raw)
To: nuno.sa
Cc: linux-iio, devicetree, Michael Hennerich, Jonathan Cameron,
David Lechner, Andy Shevchenko, Lars-Peter Clausen, Rob Herring,
Krzysztof Kozlowski, Conor Dooley
On Tue, Nov 04, 2025 at 03:35:05PM +0000, Nuno Sá via B4 Relay wrote:
> Alright, what was suposed to be a simple one liner patch ended up being
> a full refactor (modernization) of the whole thing :). I think the
> changes are anyways fairly simple so hopefully nothing was broken.
>
> I'm also aware of the checkpatch failure in Patch 7 ("iio: dac: ad5446:
> Separate I2C/SPI into different drivers") but I'm really not seeing the
> added value of adding the kconfig help text to the core symbol.
I don't see any major issue with the series, just a bunch of minor nit-picks.
FWIW,
Reviewed-by: Andy Shevchenko <andriy.shevchenko@intel.com>
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 23+ messages in thread* Re: [PATCH v4 00/12] iio: dac: ad5446: Refactor and add support for AD5542
2025-11-04 18:30 ` [PATCH v4 00/12] iio: dac: ad5446: Refactor and add support for AD5542 Andy Shevchenko
@ 2025-11-05 10:16 ` Nuno Sá
0 siblings, 0 replies; 23+ messages in thread
From: Nuno Sá @ 2025-11-05 10:16 UTC (permalink / raw)
To: Andy Shevchenko, nuno.sa
Cc: linux-iio, devicetree, Michael Hennerich, Jonathan Cameron,
David Lechner, Andy Shevchenko, Lars-Peter Clausen, Rob Herring,
Krzysztof Kozlowski, Conor Dooley
On Tue, 2025-11-04 at 20:30 +0200, Andy Shevchenko wrote:
> On Tue, Nov 04, 2025 at 03:35:05PM +0000, Nuno Sá via B4 Relay wrote:
> > Alright, what was suposed to be a simple one liner patch ended up being
> > a full refactor (modernization) of the whole thing :). I think the
> > changes are anyways fairly simple so hopefully nothing was broken.
> >
> > I'm also aware of the checkpatch failure in Patch 7 ("iio: dac: ad5446:
> > Separate I2C/SPI into different drivers") but I'm really not seeing the
> > added value of adding the kconfig help text to the core symbol.
>
> I don't see any major issue with the series, just a bunch of minor nit-picks.
> FWIW,
> Reviewed-by: Andy Shevchenko <andriy.shevchenko@intel.com>
>
Thanks!
If I do need to re-spin, I might get some (or all) of the nit-picks included.
- Nuno Sá
^ permalink raw reply [flat|nested] 23+ messages in thread