Message ID | 20241003-wip-bl-ad3552r-axi-v0-iio-testing-v4-6-ceb157487329@baylibre.com (mailing list archive) |
---|---|
State | Changes Requested |
Headers | show |
Series | iio: add support for the ad3552r AXI DAC IP | expand |
On Thu, 2024-10-03 at 19:29 +0200, Angelo Dureghello wrote: > From: Angelo Dureghello <adureghello@baylibre.com> > > Extend backend features with new calls needed later on this > patchset from axi version of ad3552r. > > The follwoing calls are added: > > iio_backend_ddr_enable > enable ddr bus transfer > iio_backend_ddr_disable > disable ddr bus transfer > iio_backend_buffer_enable > enable buffer > iio_backend_buffer_disable > disable buffer > iio_backend_data_transfer_addr > define the target register address where the DAC sample > will be written. > > Signed-off-by: Angelo Dureghello <adureghello@baylibre.com> > --- > drivers/iio/industrialio-backend.c | 79 ++++++++++++++++++++++++++++++++++++++ > include/linux/iio/backend.h | 17 ++++++++ > 2 files changed, 96 insertions(+) > > diff --git a/drivers/iio/industrialio-backend.c b/drivers/iio/industrialio- > backend.c > index 20b3b5212da7..d5e0a4da761e 100644 > --- a/drivers/iio/industrialio-backend.c > +++ b/drivers/iio/industrialio-backend.c > @@ -718,6 +718,85 @@ static int __devm_iio_backend_get(struct device *dev, struct > iio_backend *back) > return 0; > } > > +/** > + * iio_backend_ddr_enable - Enable interface DDR (Double Data Rate) mode > + * @back: Backend device > + * > + * Enable DDR, data is generated by the IP at each front (raising and falling) > + * of the bus clock signal. > + * > + * RETURNS: > + * 0 on success, negative error number on failure. > + */ > +int iio_backend_ddr_enable(struct iio_backend *back) > +{ > + return iio_backend_op_call(back, ddr_enable); > +} > +EXPORT_SYMBOL_NS_GPL(iio_backend_ddr_enable, IIO_BACKEND); > + > +/** > + * iio_backend_ddr_disable - Disable interface DDR (Double Data Rate) mode > + * @back: Backend device > + * > + * Disable DDR, setting into SDR mode (Single Data Rate). > + * > + * RETURNS: > + * 0 on success, negative error number on failure. > + */ > +int iio_backend_ddr_disable(struct iio_backend *back) > +{ > + return iio_backend_op_call(back, ddr_disable); > +} > +EXPORT_SYMBOL_NS_GPL(iio_backend_ddr_disable, IIO_BACKEND); > + > +/** > + * iio_backend_dma_stream_enable - Enable iio buffering > + * @back: Backend device > + * > + * Enabling sending the dma data stream over the bus. > + * bus interface. > + * > + * RETURNS: > + * 0 on success, negative error number on failure. > + */ > +int iio_backend_dma_stream_enable(struct iio_backend *back) > +{ > + return iio_backend_op_call(back, dma_stream_enable); > +} > +EXPORT_SYMBOL_NS_GPL(iio_backend_dma_stream_enable, IIO_BACKEND); > + > +/** > + * iio_backend_dma_stream_disable - Disable iio buffering > + * @back: Backend device > + * > + * Disable sending the dma data stream over the bus. > + * > + * RETURNS: > + * 0 on success, negative error number on failure. > + */ > +int iio_backend_dma_stream_disable(struct iio_backend *back) > +{ > + return iio_backend_op_call(back, dma_stream_disable); > +} > +EXPORT_SYMBOL_NS_GPL(iio_backend_dma_stream_disable, IIO_BACKEND); > + I'm not sure if this is what Jonathan was suggesting... Ate least I don't really agree with it. I mean, yes, this is about buffering and to start receiving (or sending) a stream of data. But AFAICT, it might have nothing to do with DMA. Same as .request_buffer() - It's pretty much always a DMA one but we should not take that for granted. So going back to the RFC [1], you can see I was suggesting something like struct iio_buffer_setup_ops. Maybe just add the ones we use for now? So that would be.buffer_postenable() and .buffer_predisable(). Like this, it should be obvious the intent of the ops. - Nuno Sá
Hi Nuno, On 04.10.2024 14:54, Nuno Sá wrote: > On Thu, 2024-10-03 at 19:29 +0200, Angelo Dureghello wrote: > > From: Angelo Dureghello <adureghello@baylibre.com> > > > > Extend backend features with new calls needed later on this > > patchset from axi version of ad3552r. > > > > The follwoing calls are added: > > > > iio_backend_ddr_enable > > enable ddr bus transfer > > iio_backend_ddr_disable > > disable ddr bus transfer > > iio_backend_buffer_enable > > enable buffer > > iio_backend_buffer_disable > > disable buffer > > iio_backend_data_transfer_addr > > define the target register address where the DAC sample > > will be written. > > > > Signed-off-by: Angelo Dureghello <adureghello@baylibre.com> > > --- > > drivers/iio/industrialio-backend.c | 79 ++++++++++++++++++++++++++++++++++++++ > > include/linux/iio/backend.h | 17 ++++++++ > > 2 files changed, 96 insertions(+) > > > > diff --git a/drivers/iio/industrialio-backend.c b/drivers/iio/industrialio- > > backend.c > > index 20b3b5212da7..d5e0a4da761e 100644 > > --- a/drivers/iio/industrialio-backend.c > > +++ b/drivers/iio/industrialio-backend.c > > @@ -718,6 +718,85 @@ static int __devm_iio_backend_get(struct device *dev, struct > > iio_backend *back) > > return 0; > > } > > > > +/** > > + * iio_backend_ddr_enable - Enable interface DDR (Double Data Rate) mode > > + * @back: Backend device > > + * > > + * Enable DDR, data is generated by the IP at each front (raising and falling) > > + * of the bus clock signal. > > + * > > + * RETURNS: > > + * 0 on success, negative error number on failure. > > + */ > > +int iio_backend_ddr_enable(struct iio_backend *back) > > +{ > > + return iio_backend_op_call(back, ddr_enable); > > +} > > +EXPORT_SYMBOL_NS_GPL(iio_backend_ddr_enable, IIO_BACKEND); > > + > > +/** > > + * iio_backend_ddr_disable - Disable interface DDR (Double Data Rate) mode > > + * @back: Backend device > > + * > > + * Disable DDR, setting into SDR mode (Single Data Rate). > > + * > > + * RETURNS: > > + * 0 on success, negative error number on failure. > > + */ > > +int iio_backend_ddr_disable(struct iio_backend *back) > > +{ > > + return iio_backend_op_call(back, ddr_disable); > > +} > > +EXPORT_SYMBOL_NS_GPL(iio_backend_ddr_disable, IIO_BACKEND); > > + > > +/** > > + * iio_backend_dma_stream_enable - Enable iio buffering > > + * @back: Backend device > > + * > > + * Enabling sending the dma data stream over the bus. > > + * bus interface. > > + * > > + * RETURNS: > > + * 0 on success, negative error number on failure. > > + */ > > +int iio_backend_dma_stream_enable(struct iio_backend *back) > > +{ > > + return iio_backend_op_call(back, dma_stream_enable); > > +} > > +EXPORT_SYMBOL_NS_GPL(iio_backend_dma_stream_enable, IIO_BACKEND); > > + > > +/** > > + * iio_backend_dma_stream_disable - Disable iio buffering > > + * @back: Backend device > > + * > > + * Disable sending the dma data stream over the bus. > > + * > > + * RETURNS: > > + * 0 on success, negative error number on failure. > > + */ > > +int iio_backend_dma_stream_disable(struct iio_backend *back) > > +{ > > + return iio_backend_op_call(back, dma_stream_disable); > > +} > > +EXPORT_SYMBOL_NS_GPL(iio_backend_dma_stream_disable, IIO_BACKEND); > > + > > I'm not sure if this is what Jonathan was suggesting... Ate least I don't really > agree with it. I mean, yes, this is about buffering and to start receiving (or > sending) a stream of data. But AFAICT, it might have nothing to do with DMA. Same as > .request_buffer() - It's pretty much always a DMA one but we should not take that for > granted. > > So going back to the RFC [1], you can see I was suggesting something like struct > iio_buffer_setup_ops. Maybe just add the ones we use for now? So that would > be.buffer_postenable() and .buffer_predisable(). Like this, it should be obvious the > intent of the ops. > ok, thanks, so something as : struct iio_backend_setup_ops { int (*buffer_postenable)(struct iio_backend *back); int (*buffer_predisable)(struct iio_backend *back); }; struct iio_backend_ops { struct iio_backend_setup_ops setup_ops; ? > - Nuno Sá > >
On Fri, 4 Oct 2024 15:45:21 +0200 Angelo Dureghello <adureghello@baylibre.com> wrote: > Hi Nuno, > > On 04.10.2024 14:54, Nuno Sá wrote: > > On Thu, 2024-10-03 at 19:29 +0200, Angelo Dureghello wrote: > > > From: Angelo Dureghello <adureghello@baylibre.com> > > > > > > Extend backend features with new calls needed later on this > > > patchset from axi version of ad3552r. > > > > > > The follwoing calls are added: > > > > > > iio_backend_ddr_enable > > > enable ddr bus transfer > > > iio_backend_ddr_disable > > > disable ddr bus transfer > > > iio_backend_buffer_enable > > > enable buffer > > > iio_backend_buffer_disable > > > disable buffer > > > iio_backend_data_transfer_addr > > > define the target register address where the DAC sample > > > will be written. > > > > > > Signed-off-by: Angelo Dureghello <adureghello@baylibre.com> > > > --- > > > drivers/iio/industrialio-backend.c | 79 ++++++++++++++++++++++++++++++++++++++ > > > include/linux/iio/backend.h | 17 ++++++++ > > > 2 files changed, 96 insertions(+) > > > > > > diff --git a/drivers/iio/industrialio-backend.c b/drivers/iio/industrialio- > > > backend.c > > > index 20b3b5212da7..d5e0a4da761e 100644 > > > --- a/drivers/iio/industrialio-backend.c > > > +++ b/drivers/iio/industrialio-backend.c > > > @@ -718,6 +718,85 @@ static int __devm_iio_backend_get(struct device *dev, struct > > > iio_backend *back) > > > return 0; > > > } > > > > > > +/** > > > + * iio_backend_ddr_enable - Enable interface DDR (Double Data Rate) mode > > > + * @back: Backend device > > > + * > > > + * Enable DDR, data is generated by the IP at each front (raising and falling) > > > + * of the bus clock signal. > > > + * > > > + * RETURNS: > > > + * 0 on success, negative error number on failure. > > > + */ > > > +int iio_backend_ddr_enable(struct iio_backend *back) > > > +{ > > > + return iio_backend_op_call(back, ddr_enable); > > > +} > > > +EXPORT_SYMBOL_NS_GPL(iio_backend_ddr_enable, IIO_BACKEND); > > > + > > > +/** > > > + * iio_backend_ddr_disable - Disable interface DDR (Double Data Rate) mode > > > + * @back: Backend device > > > + * > > > + * Disable DDR, setting into SDR mode (Single Data Rate). > > > + * > > > + * RETURNS: > > > + * 0 on success, negative error number on failure. > > > + */ > > > +int iio_backend_ddr_disable(struct iio_backend *back) > > > +{ > > > + return iio_backend_op_call(back, ddr_disable); > > > +} > > > +EXPORT_SYMBOL_NS_GPL(iio_backend_ddr_disable, IIO_BACKEND); > > > + > > > +/** > > > + * iio_backend_dma_stream_enable - Enable iio buffering > > > + * @back: Backend device > > > + * > > > + * Enabling sending the dma data stream over the bus. > > > + * bus interface. > > > + * > > > + * RETURNS: > > > + * 0 on success, negative error number on failure. > > > + */ > > > +int iio_backend_dma_stream_enable(struct iio_backend *back) > > > +{ > > > + return iio_backend_op_call(back, dma_stream_enable); > > > +} > > > +EXPORT_SYMBOL_NS_GPL(iio_backend_dma_stream_enable, IIO_BACKEND); > > > + > > > +/** > > > + * iio_backend_dma_stream_disable - Disable iio buffering > > > + * @back: Backend device > > > + * > > > + * Disable sending the dma data stream over the bus. > > > + * > > > + * RETURNS: > > > + * 0 on success, negative error number on failure. > > > + */ > > > +int iio_backend_dma_stream_disable(struct iio_backend *back) > > > +{ > > > + return iio_backend_op_call(back, dma_stream_disable); > > > +} > > > +EXPORT_SYMBOL_NS_GPL(iio_backend_dma_stream_disable, IIO_BACKEND); > > > + > > > > I'm not sure if this is what Jonathan was suggesting... Ate least I don't really > > agree with it. I mean, yes, this is about buffering and to start receiving (or > > sending) a stream of data. But AFAICT, it might have nothing to do with DMA. Same as > > .request_buffer() - It's pretty much always a DMA one but we should not take that for > > granted. Agreed. The stream bit works, the DMA is more tenuous. Maybe *data_stream_enable() is generic enough. > > > > So going back to the RFC [1], you can see I was suggesting something like struct > > iio_buffer_setup_ops. Maybe just add the ones we use for now? So that would > > be.buffer_postenable() and .buffer_predisable(). Like this, it should be obvious the > > intent of the ops. > > > ok, thanks, > > so something as : > > struct iio_backend_setup_ops { > int (*buffer_postenable)(struct iio_backend *back); > int (*buffer_predisable)(struct iio_backend *back); Hmm. Maybe. My issue with the original naming was the lack of clarify of what it actually meant. I'm not sure this helps though in some cases we do put similar calls in the postenable callback (ones that start the data flow) so at least it's consistent with that. Jonathan > }; > > struct iio_backend_ops { > struct iio_backend_setup_ops setup_ops; > > ? > > > - Nuno Sá > > > > >
On Sun, 2024-10-06 at 14:48 +0100, Jonathan Cameron wrote: > On Fri, 4 Oct 2024 15:45:21 +0200 > Angelo Dureghello <adureghello@baylibre.com> wrote: > > > Hi Nuno, > > > > On 04.10.2024 14:54, Nuno Sá wrote: > > > On Thu, 2024-10-03 at 19:29 +0200, Angelo Dureghello wrote: > > > > From: Angelo Dureghello <adureghello@baylibre.com> > > > > > > > > Extend backend features with new calls needed later on this > > > > patchset from axi version of ad3552r. > > > > > > > > The follwoing calls are added: > > > > > > > > iio_backend_ddr_enable > > > > enable ddr bus transfer > > > > iio_backend_ddr_disable > > > > disable ddr bus transfer > > > > iio_backend_buffer_enable > > > > enable buffer > > > > iio_backend_buffer_disable > > > > disable buffer > > > > iio_backend_data_transfer_addr > > > > define the target register address where the DAC sample > > > > will be written. > > > > > > > > Signed-off-by: Angelo Dureghello <adureghello@baylibre.com> > > > > --- > > > > drivers/iio/industrialio-backend.c | 79 > > > > ++++++++++++++++++++++++++++++++++++++ > > > > include/linux/iio/backend.h | 17 ++++++++ > > > > 2 files changed, 96 insertions(+) > > > > > > > > diff --git a/drivers/iio/industrialio-backend.c b/drivers/iio/industrialio- > > > > backend.c > > > > index 20b3b5212da7..d5e0a4da761e 100644 > > > > --- a/drivers/iio/industrialio-backend.c > > > > +++ b/drivers/iio/industrialio-backend.c > > > > @@ -718,6 +718,85 @@ static int __devm_iio_backend_get(struct device *dev, > > > > struct > > > > iio_backend *back) > > > > return 0; > > > > } > > > > > > > > +/** > > > > + * iio_backend_ddr_enable - Enable interface DDR (Double Data Rate) mode > > > > + * @back: Backend device > > > > + * > > > > + * Enable DDR, data is generated by the IP at each front (raising and > > > > falling) > > > > + * of the bus clock signal. > > > > + * > > > > + * RETURNS: > > > > + * 0 on success, negative error number on failure. > > > > + */ > > > > +int iio_backend_ddr_enable(struct iio_backend *back) > > > > +{ > > > > + return iio_backend_op_call(back, ddr_enable); > > > > +} > > > > +EXPORT_SYMBOL_NS_GPL(iio_backend_ddr_enable, IIO_BACKEND); > > > > + > > > > +/** > > > > + * iio_backend_ddr_disable - Disable interface DDR (Double Data Rate) mode > > > > + * @back: Backend device > > > > + * > > > > + * Disable DDR, setting into SDR mode (Single Data Rate). > > > > + * > > > > + * RETURNS: > > > > + * 0 on success, negative error number on failure. > > > > + */ > > > > +int iio_backend_ddr_disable(struct iio_backend *back) > > > > +{ > > > > + return iio_backend_op_call(back, ddr_disable); > > > > +} > > > > +EXPORT_SYMBOL_NS_GPL(iio_backend_ddr_disable, IIO_BACKEND); > > > > + > > > > +/** > > > > + * iio_backend_dma_stream_enable - Enable iio buffering > > > > + * @back: Backend device > > > > + * > > > > + * Enabling sending the dma data stream over the bus. > > > > + * bus interface. > > > > + * > > > > + * RETURNS: > > > > + * 0 on success, negative error number on failure. > > > > + */ > > > > +int iio_backend_dma_stream_enable(struct iio_backend *back) > > > > +{ > > > > + return iio_backend_op_call(back, dma_stream_enable); > > > > +} > > > > +EXPORT_SYMBOL_NS_GPL(iio_backend_dma_stream_enable, IIO_BACKEND); > > > > + > > > > +/** > > > > + * iio_backend_dma_stream_disable - Disable iio buffering > > > > + * @back: Backend device > > > > + * > > > > + * Disable sending the dma data stream over the bus. > > > > + * > > > > + * RETURNS: > > > > + * 0 on success, negative error number on failure. > > > > + */ > > > > +int iio_backend_dma_stream_disable(struct iio_backend *back) > > > > +{ > > > > + return iio_backend_op_call(back, dma_stream_disable); > > > > +} > > > > +EXPORT_SYMBOL_NS_GPL(iio_backend_dma_stream_disable, IIO_BACKEND); > > > > + > > > > > > I'm not sure if this is what Jonathan was suggesting... Ate least I don't > > > really > > > agree with it. I mean, yes, this is about buffering and to start receiving (or > > > sending) a stream of data. But AFAICT, it might have nothing to do with DMA. > > > Same as > > > .request_buffer() - It's pretty much always a DMA one but we should not take > > > that for > > > granted. > > Agreed. The stream bit works, the DMA is more tenuous. Maybe *data_stream_enable() > is generic enough. > > > > > > > So going back to the RFC [1], you can see I was suggesting something like > > > struct > > > iio_buffer_setup_ops. Maybe just add the ones we use for now? So that would > > > be.buffer_postenable() and .buffer_predisable(). Like this, it should be > > > obvious the > > > intent of the ops. > > > > > ok, thanks, > > > > so something as : > > > > struct iio_backend_setup_ops { > > int (*buffer_postenable)(struct iio_backend *back); > > int (*buffer_predisable)(struct iio_backend *back); > For me the above is ok as it goes in line with what we currently have. But I was not aware that Jonathan was not 100% with that naming :). So, *data_stream_enable() also seems like a good fit to me (and I agree it's more clear about the intent of the function). To sum it up, I'm fine with either option. - Nuno Sá
diff --git a/drivers/iio/industrialio-backend.c b/drivers/iio/industrialio-backend.c index 20b3b5212da7..d5e0a4da761e 100644 --- a/drivers/iio/industrialio-backend.c +++ b/drivers/iio/industrialio-backend.c @@ -718,6 +718,85 @@ static int __devm_iio_backend_get(struct device *dev, struct iio_backend *back) return 0; } +/** + * iio_backend_ddr_enable - Enable interface DDR (Double Data Rate) mode + * @back: Backend device + * + * Enable DDR, data is generated by the IP at each front (raising and falling) + * of the bus clock signal. + * + * RETURNS: + * 0 on success, negative error number on failure. + */ +int iio_backend_ddr_enable(struct iio_backend *back) +{ + return iio_backend_op_call(back, ddr_enable); +} +EXPORT_SYMBOL_NS_GPL(iio_backend_ddr_enable, IIO_BACKEND); + +/** + * iio_backend_ddr_disable - Disable interface DDR (Double Data Rate) mode + * @back: Backend device + * + * Disable DDR, setting into SDR mode (Single Data Rate). + * + * RETURNS: + * 0 on success, negative error number on failure. + */ +int iio_backend_ddr_disable(struct iio_backend *back) +{ + return iio_backend_op_call(back, ddr_disable); +} +EXPORT_SYMBOL_NS_GPL(iio_backend_ddr_disable, IIO_BACKEND); + +/** + * iio_backend_dma_stream_enable - Enable iio buffering + * @back: Backend device + * + * Enabling sending the dma data stream over the bus. + * bus interface. + * + * RETURNS: + * 0 on success, negative error number on failure. + */ +int iio_backend_dma_stream_enable(struct iio_backend *back) +{ + return iio_backend_op_call(back, dma_stream_enable); +} +EXPORT_SYMBOL_NS_GPL(iio_backend_dma_stream_enable, IIO_BACKEND); + +/** + * iio_backend_dma_stream_disable - Disable iio buffering + * @back: Backend device + * + * Disable sending the dma data stream over the bus. + * + * RETURNS: + * 0 on success, negative error number on failure. + */ +int iio_backend_dma_stream_disable(struct iio_backend *back) +{ + return iio_backend_op_call(back, dma_stream_disable); +} +EXPORT_SYMBOL_NS_GPL(iio_backend_dma_stream_disable, IIO_BACKEND); + +/** + * iio_backend_data_transfer_addr - Set data address. + * @back: Backend device + * @address: Data register address + * + * Some devices may need to inform the backend about an address + * where to read or write the data. + * + * RETURNS: + * 0 on success, negative error number on failure. + */ +int iio_backend_data_transfer_addr(struct iio_backend *back, u32 address) +{ + return iio_backend_op_call(back, data_transfer_addr, address); +} +EXPORT_SYMBOL_NS_GPL(iio_backend_data_transfer_addr, IIO_BACKEND); + static struct iio_backend *__devm_iio_backend_fwnode_get(struct device *dev, const char *name, struct fwnode_handle *fwnode) { diff --git a/include/linux/iio/backend.h b/include/linux/iio/backend.h index 37d56914d485..990efdc47b1f 100644 --- a/include/linux/iio/backend.h +++ b/include/linux/iio/backend.h @@ -14,12 +14,14 @@ struct iio_dev; enum iio_backend_data_type { IIO_BACKEND_TWOS_COMPLEMENT, IIO_BACKEND_OFFSET_BINARY, + IIO_BACKEND_DATA_UNSIGNED, IIO_BACKEND_DATA_TYPE_MAX }; enum iio_backend_data_source { IIO_BACKEND_INTERNAL_CONTINUOUS_WAVE, IIO_BACKEND_EXTERNAL, + IIO_BACKEND_INTERNAL_RAMP_16BIT, IIO_BACKEND_DATA_SOURCE_MAX }; @@ -89,6 +91,11 @@ enum iio_backend_sample_trigger { * @read_raw: Read a channel attribute from a backend device * @debugfs_print_chan_status: Print channel status into a buffer. * @debugfs_reg_access: Read or write register value of backend. + * @ddr_enable: Enable interface DDR (Double Data Rate) mode. + * @ddr_disable: Disable interface DDR (Double Data Rate) mode. + * @dma_stream_enable: Enable DMA data stream. + * @dma_stream_disable: Disable DMA data stream. + * @data_transfer_addr: Set data address. **/ struct iio_backend_ops { int (*enable)(struct iio_backend *back); @@ -129,6 +136,11 @@ struct iio_backend_ops { size_t len); int (*debugfs_reg_access)(struct iio_backend *back, unsigned int reg, unsigned int writeval, unsigned int *readval); + int (*ddr_enable)(struct iio_backend *back); + int (*ddr_disable)(struct iio_backend *back); + int (*dma_stream_enable)(struct iio_backend *back); + int (*dma_stream_disable)(struct iio_backend *back); + int (*data_transfer_addr)(struct iio_backend *back, u32 address); }; /** @@ -164,6 +176,11 @@ int iio_backend_data_sample_trigger(struct iio_backend *back, int devm_iio_backend_request_buffer(struct device *dev, struct iio_backend *back, struct iio_dev *indio_dev); +int iio_backend_ddr_enable(struct iio_backend *back); +int iio_backend_ddr_disable(struct iio_backend *back); +int iio_backend_dma_stream_enable(struct iio_backend *back); +int iio_backend_dma_stream_disable(struct iio_backend *back); +int iio_backend_data_transfer_addr(struct iio_backend *back, u32 address); ssize_t iio_backend_ext_info_set(struct iio_dev *indio_dev, uintptr_t private, const struct iio_chan_spec *chan, const char *buf, size_t len);