Message ID | 20241211-dlech-mainline-spi-engine-offload-2-v6-9-88ee574d5d03@baylibre.com |
---|---|
State | New |
Headers | show |
Series | spi: axi-spi-engine: add offload support | expand |
On Wed, 11 Dec 2024 14:54:46 -0600 David Lechner <dlechner@baylibre.com> wrote: > Add a new devm_iio_dmaengine_buffer_setup_with_handle() function to > handle cases where the DMA channel is managed by the caller rather than > being requested and released by the iio_dmaengine module. > > Signed-off-by: David Lechner <dlechner@baylibre.com> Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
On Wed, 2024-12-11 at 14:54 -0600, David Lechner wrote: > Add a new devm_iio_dmaengine_buffer_setup_with_handle() function to > handle cases where the DMA channel is managed by the caller rather than > being requested and released by the iio_dmaengine module. > > Signed-off-by: David Lechner <dlechner@baylibre.com> > --- > Reviewed-by: Nuno Sa <nuno.sa@analog.com> > v6 changes: > * Rename from devm_iio_dmaengine_buffer_setup_ext2() > * This patch now just adds the new function - prep work was split out > to a separate patch > > v5 changes: none > > v4 changes: > * This replaces "iio: buffer-dmaengine: generalize requesting DMA channel" > --- > drivers/iio/buffer/industrialio-buffer-dmaengine.c | 38 > ++++++++++++++++++++++ > include/linux/iio/buffer-dmaengine.h | 5 +++ > 2 files changed, 43 insertions(+) > > diff --git a/drivers/iio/buffer/industrialio-buffer-dmaengine.c > b/drivers/iio/buffer/industrialio-buffer-dmaengine.c > index > 02847d3962fcbb43ec76167db6482ab951f20942..e9d9a7d39fe191c2b6e8c196a08cdd26cd3a > 8d4b 100644 > --- a/drivers/iio/buffer/industrialio-buffer-dmaengine.c > +++ b/drivers/iio/buffer/industrialio-buffer-dmaengine.c > @@ -380,6 +380,44 @@ int devm_iio_dmaengine_buffer_setup_ext(struct device > *dev, > } > EXPORT_SYMBOL_NS_GPL(devm_iio_dmaengine_buffer_setup_ext, > "IIO_DMAENGINE_BUFFER"); > > +static void devm_iio_dmaengine_buffer_free(void *buffer) > +{ > + iio_dmaengine_buffer_free(buffer); > +} > + > +/** > + * devm_iio_dmaengine_buffer_setup_with_handle() - Setup a DMA buffer for an > + * IIO device > + * @dev: Device for devm ownership > + * @indio_dev: IIO device to which to attach this buffer. > + * @chan: DMA channel > + * @dir: Direction of buffer (in or out) > + * > + * This allocates a new IIO buffer with devm_iio_dmaengine_buffer_alloc() > + * and attaches it to an IIO device with iio_device_attach_buffer(). > + * It also appends the INDIO_BUFFER_HARDWARE mode to the supported modes of > the > + * IIO device. > + * > + * This is the same as devm_iio_dmaengine_buffer_setup_ext() except that the > + * caller manages requesting and releasing the DMA channel handle. > + */ > +int devm_iio_dmaengine_buffer_setup_with_handle(struct device *dev, > + struct iio_dev *indio_dev, > + struct dma_chan *chan, > + enum iio_buffer_direction > dir) > +{ > + struct iio_buffer *buffer; > + > + buffer = __iio_dmaengine_buffer_setup_ext(indio_dev, chan, dir); > + if (IS_ERR(buffer)) > + return PTR_ERR(buffer); > + > + return devm_add_action_or_reset(dev, devm_iio_dmaengine_buffer_free, > + buffer); > +} > +EXPORT_SYMBOL_NS_GPL(devm_iio_dmaengine_buffer_setup_with_handle, > + "IIO_DMAENGINE_BUFFER"); > + > MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>"); > MODULE_DESCRIPTION("DMA buffer for the IIO framework"); > MODULE_LICENSE("GPL"); > diff --git a/include/linux/iio/buffer-dmaengine.h b/include/linux/iio/buffer- > dmaengine.h > index > 72a2e3fd8a5bf5e8f27ee226ddd92979d233754b..37f27545f69f761c3327c307cc6311b02a75 > 1096 100644 > --- a/include/linux/iio/buffer-dmaengine.h > +++ b/include/linux/iio/buffer-dmaengine.h > @@ -11,6 +11,7 @@ > > struct iio_dev; > struct device; > +struct dma_chan; > > void iio_dmaengine_buffer_teardown(struct iio_buffer *buffer); > struct iio_buffer *iio_dmaengine_buffer_setup_ext(struct device *dev, > @@ -26,6 +27,10 @@ int devm_iio_dmaengine_buffer_setup_ext(struct device *dev, > struct iio_dev *indio_dev, > const char *channel, > enum iio_buffer_direction dir); > +int devm_iio_dmaengine_buffer_setup_with_handle(struct device *dev, > + struct iio_dev *indio_dev, > + struct dma_chan *chan, > + enum iio_buffer_direction > dir); > > #define devm_iio_dmaengine_buffer_setup(dev, indio_dev, channel) \ > devm_iio_dmaengine_buffer_setup_ext(dev, indio_dev, channel, \ >
diff --git a/drivers/iio/buffer/industrialio-buffer-dmaengine.c b/drivers/iio/buffer/industrialio-buffer-dmaengine.c index 02847d3962fcbb43ec76167db6482ab951f20942..e9d9a7d39fe191c2b6e8c196a08cdd26cd3a8d4b 100644 --- a/drivers/iio/buffer/industrialio-buffer-dmaengine.c +++ b/drivers/iio/buffer/industrialio-buffer-dmaengine.c @@ -380,6 +380,44 @@ int devm_iio_dmaengine_buffer_setup_ext(struct device *dev, } EXPORT_SYMBOL_NS_GPL(devm_iio_dmaengine_buffer_setup_ext, "IIO_DMAENGINE_BUFFER"); +static void devm_iio_dmaengine_buffer_free(void *buffer) +{ + iio_dmaengine_buffer_free(buffer); +} + +/** + * devm_iio_dmaengine_buffer_setup_with_handle() - Setup a DMA buffer for an + * IIO device + * @dev: Device for devm ownership + * @indio_dev: IIO device to which to attach this buffer. + * @chan: DMA channel + * @dir: Direction of buffer (in or out) + * + * This allocates a new IIO buffer with devm_iio_dmaengine_buffer_alloc() + * and attaches it to an IIO device with iio_device_attach_buffer(). + * It also appends the INDIO_BUFFER_HARDWARE mode to the supported modes of the + * IIO device. + * + * This is the same as devm_iio_dmaengine_buffer_setup_ext() except that the + * caller manages requesting and releasing the DMA channel handle. + */ +int devm_iio_dmaengine_buffer_setup_with_handle(struct device *dev, + struct iio_dev *indio_dev, + struct dma_chan *chan, + enum iio_buffer_direction dir) +{ + struct iio_buffer *buffer; + + buffer = __iio_dmaengine_buffer_setup_ext(indio_dev, chan, dir); + if (IS_ERR(buffer)) + return PTR_ERR(buffer); + + return devm_add_action_or_reset(dev, devm_iio_dmaengine_buffer_free, + buffer); +} +EXPORT_SYMBOL_NS_GPL(devm_iio_dmaengine_buffer_setup_with_handle, + "IIO_DMAENGINE_BUFFER"); + MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>"); MODULE_DESCRIPTION("DMA buffer for the IIO framework"); MODULE_LICENSE("GPL"); diff --git a/include/linux/iio/buffer-dmaengine.h b/include/linux/iio/buffer-dmaengine.h index 72a2e3fd8a5bf5e8f27ee226ddd92979d233754b..37f27545f69f761c3327c307cc6311b02a751096 100644 --- a/include/linux/iio/buffer-dmaengine.h +++ b/include/linux/iio/buffer-dmaengine.h @@ -11,6 +11,7 @@ struct iio_dev; struct device; +struct dma_chan; void iio_dmaengine_buffer_teardown(struct iio_buffer *buffer); struct iio_buffer *iio_dmaengine_buffer_setup_ext(struct device *dev, @@ -26,6 +27,10 @@ int devm_iio_dmaengine_buffer_setup_ext(struct device *dev, struct iio_dev *indio_dev, const char *channel, enum iio_buffer_direction dir); +int devm_iio_dmaengine_buffer_setup_with_handle(struct device *dev, + struct iio_dev *indio_dev, + struct dma_chan *chan, + enum iio_buffer_direction dir); #define devm_iio_dmaengine_buffer_setup(dev, indio_dev, channel) \ devm_iio_dmaengine_buffer_setup_ext(dev, indio_dev, channel, \
Add a new devm_iio_dmaengine_buffer_setup_with_handle() function to handle cases where the DMA channel is managed by the caller rather than being requested and released by the iio_dmaengine module. Signed-off-by: David Lechner <dlechner@baylibre.com> --- v6 changes: * Rename from devm_iio_dmaengine_buffer_setup_ext2() * This patch now just adds the new function - prep work was split out to a separate patch v5 changes: none v4 changes: * This replaces "iio: buffer-dmaengine: generalize requesting DMA channel" --- drivers/iio/buffer/industrialio-buffer-dmaengine.c | 38 ++++++++++++++++++++++ include/linux/iio/buffer-dmaengine.h | 5 +++ 2 files changed, 43 insertions(+)