* [PATCH v3 0/4] Add IIO backend support for AD7779
@ 2025-08-18 13:12 Ioana Risteiu
2025-08-18 13:12 ` [PATCH v3 1/4] iio: adc: adi-axi-adc: add axi_adc_num_lanes_set Ioana Risteiu
` (3 more replies)
0 siblings, 4 replies; 9+ messages in thread
From: Ioana Risteiu @ 2025-08-18 13:12 UTC (permalink / raw)
To: Lars-Peter Clausen, Michael Hennerich, Jonathan Cameron,
David Lechner, Nuno Sá, Andy Shevchenko, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Ramona Nechita, linux-iio,
devicetree, linux-kernel
Cc: Ioana Risteiu
- Add axi_adc_num_lanes_set in the adi_axi_adc_ops structure to support
setting number of lanes used by AXI ADC.
- Add the generic io-backends property to the AD7779 binding to enable
support for the IIO backend framework.
- Add the adi,num-lanes property to set the number of lanes used by
AD7779.
- Move the initialization specific to communication without iio-backend
into a separate setup function.
- Add a new functionality to ad7779 driver that streams data through data
output interface using IIO backend interface.
Ioana Risteiu (4):
iio: adc: adi-axi-adc: add axi_adc_num_lanes_set
dt-bindings: iio: adc: add IIO backend support
iio: adc: extract setup function without backend
iio: adc: update ad7779 to use IIO backend
.../bindings/iio/adc/adi,ad7779.yaml | 35 +++-
drivers/iio/adc/ad7779.c | 188 ++++++++++++++----
drivers/iio/adc/adi-axi-adc.c | 1 +
3 files changed, 185 insertions(+), 39 deletions(-)
--
2.47.2
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v3 1/4] iio: adc: adi-axi-adc: add axi_adc_num_lanes_set
2025-08-18 13:12 [PATCH v3 0/4] Add IIO backend support for AD7779 Ioana Risteiu
@ 2025-08-18 13:12 ` Ioana Risteiu
2025-08-18 18:26 ` Jonathan Cameron
2025-08-18 13:12 ` [PATCH v3 2/4] dt-bindings: iio: adc: add IIO backend support Ioana Risteiu
` (2 subsequent siblings)
3 siblings, 1 reply; 9+ messages in thread
From: Ioana Risteiu @ 2025-08-18 13:12 UTC (permalink / raw)
To: Lars-Peter Clausen, Michael Hennerich, Jonathan Cameron,
David Lechner, Nuno Sá, Andy Shevchenko, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Ramona Nechita, linux-iio,
devicetree, linux-kernel
Cc: Ioana Risteiu
Add axi_adc_num_lanes_set in the adi_axi_adc_ops structure to support
setting number of lanes used by AXI ADC.
Signed-off-by: Ioana Risteiu <Ioana.Risteiu@analog.com>
---
drivers/iio/adc/adi-axi-adc.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/drivers/iio/adc/adi-axi-adc.c b/drivers/iio/adc/adi-axi-adc.c
index 2d86bb0e08a7..20bb59c24acf 100644
--- a/drivers/iio/adc/adi-axi-adc.c
+++ b/drivers/iio/adc/adi-axi-adc.c
@@ -617,6 +617,7 @@ static const struct iio_backend_ops adi_axi_adc_ops = {
.chan_status = axi_adc_chan_status,
.interface_type_get = axi_adc_interface_type_get,
.oversampling_ratio_set = axi_adc_oversampling_ratio_set,
+ .num_lanes_set = axi_adc_num_lanes_set,
.debugfs_reg_access = iio_backend_debugfs_ptr(axi_adc_reg_access),
.debugfs_print_chan_status = iio_backend_debugfs_ptr(axi_adc_debugfs_print_chan_status),
};
--
2.47.2
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v3 2/4] dt-bindings: iio: adc: add IIO backend support
2025-08-18 13:12 [PATCH v3 0/4] Add IIO backend support for AD7779 Ioana Risteiu
2025-08-18 13:12 ` [PATCH v3 1/4] iio: adc: adi-axi-adc: add axi_adc_num_lanes_set Ioana Risteiu
@ 2025-08-18 13:12 ` Ioana Risteiu
2025-08-18 13:37 ` Krzysztof Kozlowski
2025-08-18 13:45 ` David Lechner
2025-08-18 13:12 ` [PATCH v3 3/4] iio: adc: extract setup function without backend Ioana Risteiu
2025-08-18 13:12 ` [PATCH v3 4/4] iio: adc: update ad7779 to use IIO backend Ioana Risteiu
3 siblings, 2 replies; 9+ messages in thread
From: Ioana Risteiu @ 2025-08-18 13:12 UTC (permalink / raw)
To: Lars-Peter Clausen, Michael Hennerich, Jonathan Cameron,
David Lechner, Nuno Sá, Andy Shevchenko, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Ramona Nechita, linux-iio,
devicetree, linux-kernel
Cc: Ioana Risteiu
Add the generic io-backends property to the AD7779 binding to enable
support for the IIO backend framework.
Also add the adi,num-lanes property to set the number of lanes used by
AD7779.
Signed-off-by: Ioana Risteiu <Ioana.Risteiu@analog.com>
---
.../bindings/iio/adc/adi,ad7779.yaml | 35 ++++++++++++++++++-
1 file changed, 34 insertions(+), 1 deletion(-)
diff --git a/Documentation/devicetree/bindings/iio/adc/adi,ad7779.yaml b/Documentation/devicetree/bindings/iio/adc/adi,ad7779.yaml
index 044f92f39cfa..4a212c8bc9d3 100644
--- a/Documentation/devicetree/bindings/iio/adc/adi,ad7779.yaml
+++ b/Documentation/devicetree/bindings/iio/adc/adi,ad7779.yaml
@@ -80,11 +80,27 @@ properties:
reset-gpios:
maxItems: 1
+ io-backends:
+ maxItems: 1
+
+ adi,num-lanes:
+ description:
+ Number of lanes on which the data is sent on the output when the data
+ output interface is used.
+ $ref: /schemas/types.yaml#/definitions/uint32
+ enum: [1, 2, 4]
+ default: 4
+
required:
- compatible
- reg
- clocks
- - interrupts
+
+oneOf:
+ - required:
+ - interrupts
+ - required:
+ - io-backends
unevaluatedProperties: false
@@ -107,4 +123,21 @@ examples:
clocks = <&adc_clk>;
};
};
+
+ - |
+ #include <dt-bindings/gpio/gpio.h>
+ spi {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ adc@0 {
+ compatible = "adi,ad7779";
+ reg = <0>;
+ start-gpios = <&gpio0 87 GPIO_ACTIVE_LOW>;
+ reset-gpios = <&gpio0 93 GPIO_ACTIVE_LOW>;
+ clocks = <&adc_clk>;
+ io-backends = <&iio_backend>;
+ adi,num-lanes = <4>;
+ };
+ };
...
--
2.47.2
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v3 3/4] iio: adc: extract setup function without backend
2025-08-18 13:12 [PATCH v3 0/4] Add IIO backend support for AD7779 Ioana Risteiu
2025-08-18 13:12 ` [PATCH v3 1/4] iio: adc: adi-axi-adc: add axi_adc_num_lanes_set Ioana Risteiu
2025-08-18 13:12 ` [PATCH v3 2/4] dt-bindings: iio: adc: add IIO backend support Ioana Risteiu
@ 2025-08-18 13:12 ` Ioana Risteiu
2025-08-18 13:12 ` [PATCH v3 4/4] iio: adc: update ad7779 to use IIO backend Ioana Risteiu
3 siblings, 0 replies; 9+ messages in thread
From: Ioana Risteiu @ 2025-08-18 13:12 UTC (permalink / raw)
To: Lars-Peter Clausen, Michael Hennerich, Jonathan Cameron,
David Lechner, Nuno Sá, Andy Shevchenko, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Ramona Nechita, linux-iio,
devicetree, linux-kernel
Cc: Ioana Risteiu
Refactor probe function by moving the initialization specific to
communication without iio-backend into a separate setup function.
The purpose of this modification is better code organization. No
functional changes intended.
Signed-off-by: Ioana Risteiu <Ioana.Risteiu@analog.com>
---
drivers/iio/adc/ad7779.c | 83 ++++++++++++++++++++++------------------
1 file changed, 45 insertions(+), 38 deletions(-)
diff --git a/drivers/iio/adc/ad7779.c b/drivers/iio/adc/ad7779.c
index 845adc510239..f7e681c0e8c0 100644
--- a/drivers/iio/adc/ad7779.c
+++ b/drivers/iio/adc/ad7779.c
@@ -752,6 +752,50 @@ static int ad7779_conf(struct ad7779_state *st, struct gpio_desc *start_gpio)
return 0;
}
+static int ad7779_setup_without_backend(struct ad7779_state *st, struct iio_dev *indio_dev)
+{
+ int ret;
+ struct device *dev = &st->spi->dev;
+
+ indio_dev->info = &ad7779_info;
+ indio_dev->channels = st->chip_info->channels;
+
+ st->trig = devm_iio_trigger_alloc(dev, "%s-dev%d", indio_dev->name,
+ iio_device_id(indio_dev));
+ if (!st->trig)
+ return -ENOMEM;
+
+ st->trig->ops = &ad7779_trigger_ops;
+
+ iio_trigger_set_drvdata(st->trig, st);
+
+ ret = devm_request_irq(dev, st->spi->irq, iio_trigger_generic_data_rdy_poll,
+ IRQF_ONESHOT | IRQF_NO_AUTOEN, indio_dev->name,
+ st->trig);
+ if (ret)
+ return dev_err_probe(dev, ret, "request IRQ %d failed\n",
+ st->spi->irq);
+
+ ret = devm_iio_trigger_register(dev, st->trig);
+ if (ret)
+ return ret;
+
+ indio_dev->trig = iio_trigger_get(st->trig);
+
+ init_completion(&st->completion);
+
+ ret = devm_iio_triggered_buffer_setup(dev, indio_dev,
+ &iio_pollfunc_store_time,
+ &ad7779_trigger_handler,
+ &ad7779_buffer_setup_ops);
+ if (ret)
+ return ret;
+
+ return ad7779_spi_write_mask(st, AD7779_REG_DOUT_FORMAT,
+ AD7779_DCLK_CLK_DIV_MSK,
+ FIELD_PREP(AD7779_DCLK_CLK_DIV_MSK, 7));
+}
+
static int ad7779_probe(struct spi_device *spi)
{
struct iio_dev *indio_dev;
@@ -760,9 +804,6 @@ static int ad7779_probe(struct spi_device *spi)
struct device *dev = &spi->dev;
int ret = -EINVAL;
- if (!spi->irq)
- return dev_err_probe(dev, ret, "DRDY irq not present\n");
-
indio_dev = devm_iio_device_alloc(dev, sizeof(*st));
if (!indio_dev)
return -ENOMEM;
@@ -804,45 +845,11 @@ static int ad7779_probe(struct spi_device *spi)
return ret;
indio_dev->name = st->chip_info->name;
- indio_dev->info = &ad7779_info;
indio_dev->modes = INDIO_DIRECT_MODE;
- indio_dev->channels = st->chip_info->channels;
indio_dev->num_channels = ARRAY_SIZE(ad7779_channels);
- st->trig = devm_iio_trigger_alloc(dev, "%s-dev%d", indio_dev->name,
- iio_device_id(indio_dev));
- if (!st->trig)
- return -ENOMEM;
-
- st->trig->ops = &ad7779_trigger_ops;
-
- iio_trigger_set_drvdata(st->trig, st);
-
- ret = devm_request_irq(dev, spi->irq, iio_trigger_generic_data_rdy_poll,
- IRQF_ONESHOT | IRQF_NO_AUTOEN, indio_dev->name,
- st->trig);
- if (ret)
- return dev_err_probe(dev, ret, "request IRQ %d failed\n",
- st->spi->irq);
-
- ret = devm_iio_trigger_register(dev, st->trig);
- if (ret)
- return ret;
-
- indio_dev->trig = iio_trigger_get(st->trig);
-
- init_completion(&st->completion);
-
- ret = devm_iio_triggered_buffer_setup(dev, indio_dev,
- &iio_pollfunc_store_time,
- &ad7779_trigger_handler,
- &ad7779_buffer_setup_ops);
- if (ret)
- return ret;
+ ret = ad7779_setup_without_backend(st, indio_dev);
- ret = ad7779_spi_write_mask(st, AD7779_REG_DOUT_FORMAT,
- AD7779_DCLK_CLK_DIV_MSK,
- FIELD_PREP(AD7779_DCLK_CLK_DIV_MSK, 7));
if (ret)
return ret;
--
2.47.2
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v3 4/4] iio: adc: update ad7779 to use IIO backend
2025-08-18 13:12 [PATCH v3 0/4] Add IIO backend support for AD7779 Ioana Risteiu
` (2 preceding siblings ...)
2025-08-18 13:12 ` [PATCH v3 3/4] iio: adc: extract setup function without backend Ioana Risteiu
@ 2025-08-18 13:12 ` Ioana Risteiu
2025-08-18 15:15 ` David Lechner
3 siblings, 1 reply; 9+ messages in thread
From: Ioana Risteiu @ 2025-08-18 13:12 UTC (permalink / raw)
To: Lars-Peter Clausen, Michael Hennerich, Jonathan Cameron,
David Lechner, Nuno Sá, Andy Shevchenko, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Ramona Nechita, linux-iio,
devicetree, linux-kernel
Cc: Ioana Risteiu
Add a new functionality to ad7779 driver that streams data through data
output interface using IIO backend interface.
Signed-off-by: Ioana Risteiu <Ioana.Risteiu@analog.com>
---
drivers/iio/adc/ad7779.c | 107 ++++++++++++++++++++++++++++++++++++++-
1 file changed, 106 insertions(+), 1 deletion(-)
diff --git a/drivers/iio/adc/ad7779.c b/drivers/iio/adc/ad7779.c
index f7e681c0e8c0..abf3fff20dd4 100644
--- a/drivers/iio/adc/ad7779.c
+++ b/drivers/iio/adc/ad7779.c
@@ -31,6 +31,8 @@
#include <linux/iio/triggered_buffer.h>
#include <linux/iio/trigger_consumer.h>
+#include <linux/iio/backend.h>
+
#define AD7779_SPI_READ_CMD BIT(7)
#define AD7779_DISABLE_SD BIT(7)
@@ -157,6 +159,8 @@ struct ad7779_state {
u8 reg_rx_buf[3];
u8 reg_tx_buf[3];
u8 reset_buf[8];
+
+ struct iio_backend *back;
};
static const char * const ad7779_filter_type[] = {
@@ -630,12 +634,38 @@ static int ad7779_reset(struct iio_dev *indio_dev, struct gpio_desc *reset_gpio)
return ret;
}
+static int ad7779_update_scan_mode(struct iio_dev *indio_dev,
+ const unsigned long *scan_mask)
+{
+ struct ad7779_state *st = iio_priv(indio_dev);
+ unsigned int c;
+ int ret;
+
+ for (c = 0; c < AD7779_NUM_CHANNELS; c++) {
+ if (test_bit(c, scan_mask))
+ ret = iio_backend_chan_enable(st->back, c);
+ else
+ ret = iio_backend_chan_disable(st->back, c);
+ if (ret)
+ return ret;
+ }
+
+ return 0;
+}
+
static const struct iio_info ad7779_info = {
.read_raw = ad7779_read_raw,
.write_raw = ad7779_write_raw,
.debugfs_reg_access = &ad7779_reg_access,
};
+static const struct iio_info ad7779_info_data = {
+ .read_raw = ad7779_read_raw,
+ .write_raw = ad7779_write_raw,
+ .debugfs_reg_access = &ad7779_reg_access,
+ .update_scan_mode = &ad7779_update_scan_mode,
+};
+
static const struct iio_enum ad7779_filter_enum = {
.items = ad7779_filter_type,
.num_items = ARRAY_SIZE(ad7779_filter_type),
@@ -674,6 +704,7 @@ static const struct iio_chan_spec_ext_info ad7779_ext_filter[] = {
#define AD777x_CHAN_FILTER_S(index) \
AD777x_CHAN_S(index, ad7779_ext_filter)
+
static const struct iio_chan_spec ad7779_channels[] = {
AD777x_CHAN_NO_FILTER_S(0),
AD777x_CHAN_NO_FILTER_S(1),
@@ -752,6 +783,44 @@ static int ad7779_conf(struct ad7779_state *st, struct gpio_desc *start_gpio)
return 0;
}
+static int ad7779_set_data_lines(struct iio_dev *indio_dev,
+ unsigned int num_lanes)
+{
+ struct ad7779_state *st = iio_priv(indio_dev);
+ int ret;
+
+ ret = ad7779_set_sampling_frequency(st, num_lanes * AD7779_DEFAULT_SAMPLING_1LINE);
+ if (ret)
+ return ret;
+
+ ret = iio_backend_num_lanes_set(st->back, num_lanes);
+ if (ret)
+ return ret;
+
+ return ad7779_spi_write_mask(st, AD7779_REG_DOUT_FORMAT,
+ AD7779_DOUT_FORMAT_MSK,
+ FIELD_PREP(AD7779_DOUT_FORMAT_MSK, 2 - ilog2(num_lanes)));
+}
+
+static int ad7779_setup_channels(struct iio_dev *indio_dev, const struct ad7779_state *st)
+{
+ struct iio_chan_spec *channels;
+ struct device *dev = &st->spi->dev;
+
+ channels = devm_kmemdup_array(dev, st->chip_info->channels,
+ ARRAY_SIZE(ad7779_channels),
+ sizeof(*channels), GFP_KERNEL);
+ if (!channels)
+ return -ENOMEM;
+
+ for (int i = 0; i < ARRAY_SIZE(ad7779_channels); i++)
+ channels[i].scan_type.endianness = IIO_CPU;
+
+ indio_dev->channels = channels;
+
+ return 0;
+}
+
static int ad7779_setup_without_backend(struct ad7779_state *st, struct iio_dev *indio_dev)
{
int ret;
@@ -796,6 +865,38 @@ static int ad7779_setup_without_backend(struct ad7779_state *st, struct iio_dev
FIELD_PREP(AD7779_DCLK_CLK_DIV_MSK, 7));
}
+static int ad7779_setup_backend(struct ad7779_state *st, struct iio_dev *indio_dev)
+{
+ struct device *dev = &st->spi->dev;
+ int ret = -EINVAL;
+ int num_lanes;
+
+ indio_dev->info = &ad7779_info_data;
+
+ ret = ad7779_setup_channels(indio_dev, st);
+ if (ret)
+ return ret;
+
+ st->back = devm_iio_backend_get(dev, NULL);
+ if (IS_ERR(st->back))
+ return dev_err_probe(dev, PTR_ERR(st->back),
+ "failed to get iio backend");
+
+ ret = devm_iio_backend_request_buffer(dev, st->back, indio_dev);
+ if (ret)
+ return ret;
+
+ ret = devm_iio_backend_enable(dev, st->back);
+ if (ret)
+ return ret;
+
+ ret = device_property_read_u32(dev, "adi,num-lanes", &num_lanes);
+ if (ret)
+ return ad7779_set_data_lines(indio_dev, 4);
+
+ return ad7779_set_data_lines(indio_dev, num_lanes);
+}
+
static int ad7779_probe(struct spi_device *spi)
{
struct iio_dev *indio_dev;
@@ -848,7 +949,10 @@ static int ad7779_probe(struct spi_device *spi)
indio_dev->modes = INDIO_DIRECT_MODE;
indio_dev->num_channels = ARRAY_SIZE(ad7779_channels);
- ret = ad7779_setup_without_backend(st, indio_dev);
+ if (device_property_present(dev, "io-backends"))
+ ret = ad7779_setup_backend(st, indio_dev);
+ else
+ ret = ad7779_setup_without_backend(st, indio_dev);
if (ret)
return ret;
@@ -943,3 +1047,4 @@ module_spi_driver(ad7779_driver);
MODULE_AUTHOR("Ramona Alexandra Nechita <ramona.nechita@analog.com>");
MODULE_DESCRIPTION("Analog Devices AD7779 ADC");
MODULE_LICENSE("GPL");
+MODULE_IMPORT_NS("IIO_BACKEND");
--
2.47.2
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH v3 2/4] dt-bindings: iio: adc: add IIO backend support
2025-08-18 13:12 ` [PATCH v3 2/4] dt-bindings: iio: adc: add IIO backend support Ioana Risteiu
@ 2025-08-18 13:37 ` Krzysztof Kozlowski
2025-08-18 13:45 ` David Lechner
1 sibling, 0 replies; 9+ messages in thread
From: Krzysztof Kozlowski @ 2025-08-18 13:37 UTC (permalink / raw)
To: Ioana Risteiu, Lars-Peter Clausen, Michael Hennerich,
Jonathan Cameron, David Lechner, Nuno Sá, Andy Shevchenko,
Rob Herring, Krzysztof Kozlowski, Conor Dooley, Ramona Nechita,
linux-iio, devicetree, linux-kernel
On 18/08/2025 15:12, Ioana Risteiu wrote:
> Add the generic io-backends property to the AD7779 binding to enable
> support for the IIO backend framework.
>
> Also add the adi,num-lanes property to set the number of lanes used by
> AD7779.
>
> Signed-off-by: Ioana Risteiu <Ioana.Risteiu@analog.com>
> ---
Nothing changed? No improvements? No review?
Your changelog should explain why you drop review and why you disagree
with comments.
BTW, where is the changelog in the first place?
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v3 2/4] dt-bindings: iio: adc: add IIO backend support
2025-08-18 13:12 ` [PATCH v3 2/4] dt-bindings: iio: adc: add IIO backend support Ioana Risteiu
2025-08-18 13:37 ` Krzysztof Kozlowski
@ 2025-08-18 13:45 ` David Lechner
1 sibling, 0 replies; 9+ messages in thread
From: David Lechner @ 2025-08-18 13:45 UTC (permalink / raw)
To: Ioana Risteiu, Lars-Peter Clausen, Michael Hennerich,
Jonathan Cameron, Nuno Sá, Andy Shevchenko, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Ramona Nechita, linux-iio,
devicetree, linux-kernel
On 8/18/25 8:12 AM, Ioana Risteiu wrote:
> Add the generic io-backends property to the AD7779 binding to enable
> support for the IIO backend framework.
>
> Also add the adi,num-lanes property to set the number of lanes used by
> AD7779.
>
> Signed-off-by: Ioana Risteiu <Ioana.Risteiu@analog.com>
> ---
> .../bindings/iio/adc/adi,ad7779.yaml | 35 ++++++++++++++++++-
> 1 file changed, 34 insertions(+), 1 deletion(-)
>
> diff --git a/Documentation/devicetree/bindings/iio/adc/adi,ad7779.yaml b/Documentation/devicetree/bindings/iio/adc/adi,ad7779.yaml
> index 044f92f39cfa..4a212c8bc9d3 100644
> --- a/Documentation/devicetree/bindings/iio/adc/adi,ad7779.yaml
> +++ b/Documentation/devicetree/bindings/iio/adc/adi,ad7779.yaml
> @@ -80,11 +80,27 @@ properties:
> reset-gpios:
> maxItems: 1
>
> + io-backends:
> + maxItems: 1
> +
> + adi,num-lanes:
> + description:
> + Number of lanes on which the data is sent on the output when the data
> + output interface is used.
> + $ref: /schemas/types.yaml#/definitions/uint32
> + enum: [1, 2, 4]
> + default: 4
Isn't 0 lanes wired up an option? I.e. it is possible to use the
chip in SPI-only mode. So it seems like 0 should be the default.
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v3 4/4] iio: adc: update ad7779 to use IIO backend
2025-08-18 13:12 ` [PATCH v3 4/4] iio: adc: update ad7779 to use IIO backend Ioana Risteiu
@ 2025-08-18 15:15 ` David Lechner
0 siblings, 0 replies; 9+ messages in thread
From: David Lechner @ 2025-08-18 15:15 UTC (permalink / raw)
To: Ioana Risteiu, Lars-Peter Clausen, Michael Hennerich,
Jonathan Cameron, Nuno Sá, Andy Shevchenko, Rob Herring,
Krzysztof Kozlowski, Conor Dooley, Ramona Nechita, linux-iio,
devicetree, linux-kernel
On 8/18/25 8:12 AM, Ioana Risteiu wrote:
> Add a new functionality to ad7779 driver that streams data through data
> output interface using IIO backend interface.
>
> Signed-off-by: Ioana Risteiu <Ioana.Risteiu@analog.com>
> ---
> drivers/iio/adc/ad7779.c | 107 ++++++++++++++++++++++++++++++++++++++-
> 1 file changed, 106 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/iio/adc/ad7779.c b/drivers/iio/adc/ad7779.c
> index f7e681c0e8c0..abf3fff20dd4 100644
> --- a/drivers/iio/adc/ad7779.c
> +++ b/drivers/iio/adc/ad7779.c
> @@ -31,6 +31,8 @@
> #include <linux/iio/triggered_buffer.h>
> #include <linux/iio/trigger_consumer.h>
>
> +#include <linux/iio/backend.h>
This should be grouped in alphabetical order with other
linux/iio/ includes.
> +
> #define AD7779_SPI_READ_CMD BIT(7)
>
> #define AD7779_DISABLE_SD BIT(7)
> @@ -157,6 +159,8 @@ struct ad7779_state {
> u8 reg_rx_buf[3];
> u8 reg_tx_buf[3];
> u8 reset_buf[8];
> +
> + struct iio_backend *back;
This field needs to be placed in the struct before
__aligned(IIO_DMA_MINALIGN) to avoid issues cache lines.
> };
>
> static const char * const ad7779_filter_type[] = {
> @@ -630,12 +634,38 @@ static int ad7779_reset(struct iio_dev *indio_dev, struct gpio_desc *reset_gpio)
> return ret;
> }
>
> +static int ad7779_update_scan_mode(struct iio_dev *indio_dev,
> + const unsigned long *scan_mask)
> +{
> + struct ad7779_state *st = iio_priv(indio_dev);
> + unsigned int c;
> + int ret;
> +
> + for (c = 0; c < AD7779_NUM_CHANNELS; c++) {
> + if (test_bit(c, scan_mask))
> + ret = iio_backend_chan_enable(st->back, c);
> + else
> + ret = iio_backend_chan_disable(st->back, c);
> + if (ret)
> + return ret;
> + }
> +
> + return 0;
> +}
> +
> static const struct iio_info ad7779_info = {
> .read_raw = ad7779_read_raw,
> .write_raw = ad7779_write_raw,
> .debugfs_reg_access = &ad7779_reg_access,
> };
>
> +static const struct iio_info ad7779_info_data = {
> + .read_raw = ad7779_read_raw,
> + .write_raw = ad7779_write_raw,
> + .debugfs_reg_access = &ad7779_reg_access,
> + .update_scan_mode = &ad7779_update_scan_mode,
> +};
> +
> static const struct iio_enum ad7779_filter_enum = {
> .items = ad7779_filter_type,
> .num_items = ARRAY_SIZE(ad7779_filter_type),
> @@ -674,6 +704,7 @@ static const struct iio_chan_spec_ext_info ad7779_ext_filter[] = {
>
> #define AD777x_CHAN_FILTER_S(index) \
> AD777x_CHAN_S(index, ad7779_ext_filter)
> +
Unrelated blank line add (should not be in this patch).
> static const struct iio_chan_spec ad7779_channels[] = {
> AD777x_CHAN_NO_FILTER_S(0),
> AD777x_CHAN_NO_FILTER_S(1),
> @@ -752,6 +783,44 @@ static int ad7779_conf(struct ad7779_state *st, struct gpio_desc *start_gpio)
> return 0;
> }
>
> +static int ad7779_set_data_lines(struct iio_dev *indio_dev,
> + unsigned int num_lanes)
> +{
> + struct ad7779_state *st = iio_priv(indio_dev);
> + int ret;
> +
> + ret = ad7779_set_sampling_frequency(st, num_lanes * AD7779_DEFAULT_SAMPLING_1LINE);
> + if (ret)
> + return ret;
> +
> + ret = iio_backend_num_lanes_set(st->back, num_lanes);
> + if (ret)
> + return ret;
> +
> + return ad7779_spi_write_mask(st, AD7779_REG_DOUT_FORMAT,
> + AD7779_DOUT_FORMAT_MSK,
> + FIELD_PREP(AD7779_DOUT_FORMAT_MSK, 2 - ilog2(num_lanes)));
> +}
> +
> +static int ad7779_setup_channels(struct iio_dev *indio_dev, const struct ad7779_state *st)
> +{
> + struct iio_chan_spec *channels;
> + struct device *dev = &st->spi->dev;
> +
> + channels = devm_kmemdup_array(dev, st->chip_info->channels,
> + ARRAY_SIZE(ad7779_channels),
> + sizeof(*channels), GFP_KERNEL);
> + if (!channels)
> + return -ENOMEM;
> +
> + for (int i = 0; i < ARRAY_SIZE(ad7779_channels); i++)
> + channels[i].scan_type.endianness = IIO_CPU;
> +
> + indio_dev->channels = channels;
> +
> + return 0;
> +}
> +
> static int ad7779_setup_without_backend(struct ad7779_state *st, struct iio_dev *indio_dev)
> {
> int ret;
> @@ -796,6 +865,38 @@ static int ad7779_setup_without_backend(struct ad7779_state *st, struct iio_dev
> FIELD_PREP(AD7779_DCLK_CLK_DIV_MSK, 7));
> }
>
> +static int ad7779_setup_backend(struct ad7779_state *st, struct iio_dev *indio_dev)
> +{
> + struct device *dev = &st->spi->dev;
> + int ret = -EINVAL;
> + int num_lanes;
> +
> + indio_dev->info = &ad7779_info_data;
> +
> + ret = ad7779_setup_channels(indio_dev, st);
> + if (ret)
> + return ret;
> +
> + st->back = devm_iio_backend_get(dev, NULL);
> + if (IS_ERR(st->back))
> + return dev_err_probe(dev, PTR_ERR(st->back),
> + "failed to get iio backend");
> +
> + ret = devm_iio_backend_request_buffer(dev, st->back, indio_dev);
> + if (ret)
> + return ret;
> +
> + ret = devm_iio_backend_enable(dev, st->back);
> + if (ret)
> + return ret;
> +
The usual way of doing this is to set num_lanes = 4 here.
> + ret = device_property_read_u32(dev, "adi,num-lanes", &num_lanes);
> + if (ret)
It is best to not ignore all errors. So typically, we would have
if (ret && ret != -EINVAL)
return ret;
here. In the -EINVAL case, the default we set above will be used.
We should also validate that the value is 1, 2 or 4 so that later
calculations that use this are valid.
> + return ad7779_set_data_lines(indio_dev, 4);
> +
> + return ad7779_set_data_lines(indio_dev, num_lanes);
Then we don't have to have 2 calls to the same function.
> +}
> +
> static int ad7779_probe(struct spi_device *spi)
> {
> struct iio_dev *indio_dev;
> @@ -848,7 +949,10 @@ static int ad7779_probe(struct spi_device *spi)
> indio_dev->modes = INDIO_DIRECT_MODE;
> indio_dev->num_channels = ARRAY_SIZE(ad7779_channels);
>
> - ret = ad7779_setup_without_backend(st, indio_dev);
> + if (device_property_present(dev, "io-backends"))
> + ret = ad7779_setup_backend(st, indio_dev);
> + else
> + ret = ad7779_setup_without_backend(st, indio_dev);
>
> if (ret)
> return ret;
> @@ -943,3 +1047,4 @@ module_spi_driver(ad7779_driver);
> MODULE_AUTHOR("Ramona Alexandra Nechita <ramona.nechita@analog.com>");
> MODULE_DESCRIPTION("Analog Devices AD7779 ADC");
> MODULE_LICENSE("GPL");
> +MODULE_IMPORT_NS("IIO_BACKEND");
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v3 1/4] iio: adc: adi-axi-adc: add axi_adc_num_lanes_set
2025-08-18 13:12 ` [PATCH v3 1/4] iio: adc: adi-axi-adc: add axi_adc_num_lanes_set Ioana Risteiu
@ 2025-08-18 18:26 ` Jonathan Cameron
0 siblings, 0 replies; 9+ messages in thread
From: Jonathan Cameron @ 2025-08-18 18:26 UTC (permalink / raw)
To: Ioana Risteiu
Cc: Lars-Peter Clausen, Michael Hennerich, David Lechner,
Nuno Sá, Andy Shevchenko, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Ramona Nechita, linux-iio, devicetree, linux-kernel
On Mon, 18 Aug 2025 16:12:47 +0300
Ioana Risteiu <Ioana.Risteiu@analog.com> wrote:
> Add axi_adc_num_lanes_set in the adi_axi_adc_ops structure to support
> setting number of lanes used by AXI ADC.
>
> Signed-off-by: Ioana Risteiu <Ioana.Risteiu@analog.com>
So far we only have this set for a specific compatible. Why does it
now make sense to set it for the 'generic' case? Please add something
to the patch description.
Jonathan
> ---
> drivers/iio/adc/adi-axi-adc.c | 1 +
> 1 file changed, 1 insertion(+)
>
> diff --git a/drivers/iio/adc/adi-axi-adc.c b/drivers/iio/adc/adi-axi-adc.c
> index 2d86bb0e08a7..20bb59c24acf 100644
> --- a/drivers/iio/adc/adi-axi-adc.c
> +++ b/drivers/iio/adc/adi-axi-adc.c
> @@ -617,6 +617,7 @@ static const struct iio_backend_ops adi_axi_adc_ops = {
> .chan_status = axi_adc_chan_status,
> .interface_type_get = axi_adc_interface_type_get,
> .oversampling_ratio_set = axi_adc_oversampling_ratio_set,
> + .num_lanes_set = axi_adc_num_lanes_set,
> .debugfs_reg_access = iio_backend_debugfs_ptr(axi_adc_reg_access),
> .debugfs_print_chan_status = iio_backend_debugfs_ptr(axi_adc_debugfs_print_chan_status),
> };
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2025-08-18 18:26 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-08-18 13:12 [PATCH v3 0/4] Add IIO backend support for AD7779 Ioana Risteiu
2025-08-18 13:12 ` [PATCH v3 1/4] iio: adc: adi-axi-adc: add axi_adc_num_lanes_set Ioana Risteiu
2025-08-18 18:26 ` Jonathan Cameron
2025-08-18 13:12 ` [PATCH v3 2/4] dt-bindings: iio: adc: add IIO backend support Ioana Risteiu
2025-08-18 13:37 ` Krzysztof Kozlowski
2025-08-18 13:45 ` David Lechner
2025-08-18 13:12 ` [PATCH v3 3/4] iio: adc: extract setup function without backend Ioana Risteiu
2025-08-18 13:12 ` [PATCH v3 4/4] iio: adc: update ad7779 to use IIO backend Ioana Risteiu
2025-08-18 15:15 ` David Lechner
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).