Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

iio: buffer-dmaengine: add devm_iio_dmaengine_buffer_setup_with_handle()

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.

Reviewed-by: Nuno Sa <nuno.sa@analog.com>
Signed-off-by: David Lechner <dlechner@baylibre.com>
Link: https://patch.msgid.link/20250207-dlech-mainline-spi-engine-offload-2-v8-9-e48a489be48c@baylibre.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>

authored by

David Lechner and committed by
Jonathan Cameron
79f24971 4fe7fd17

+43
+38
drivers/iio/buffer/industrialio-buffer-dmaengine.c
··· 380 380 } 381 381 EXPORT_SYMBOL_NS_GPL(devm_iio_dmaengine_buffer_setup_ext, "IIO_DMAENGINE_BUFFER"); 382 382 383 + static void devm_iio_dmaengine_buffer_free(void *buffer) 384 + { 385 + iio_dmaengine_buffer_free(buffer); 386 + } 387 + 388 + /** 389 + * devm_iio_dmaengine_buffer_setup_with_handle() - Setup a DMA buffer for an 390 + * IIO device 391 + * @dev: Device for devm ownership 392 + * @indio_dev: IIO device to which to attach this buffer. 393 + * @chan: DMA channel 394 + * @dir: Direction of buffer (in or out) 395 + * 396 + * This allocates a new IIO buffer with devm_iio_dmaengine_buffer_alloc() 397 + * and attaches it to an IIO device with iio_device_attach_buffer(). 398 + * It also appends the INDIO_BUFFER_HARDWARE mode to the supported modes of the 399 + * IIO device. 400 + * 401 + * This is the same as devm_iio_dmaengine_buffer_setup_ext() except that the 402 + * caller manages requesting and releasing the DMA channel handle. 403 + */ 404 + int devm_iio_dmaengine_buffer_setup_with_handle(struct device *dev, 405 + struct iio_dev *indio_dev, 406 + struct dma_chan *chan, 407 + enum iio_buffer_direction dir) 408 + { 409 + struct iio_buffer *buffer; 410 + 411 + buffer = __iio_dmaengine_buffer_setup_ext(indio_dev, chan, dir); 412 + if (IS_ERR(buffer)) 413 + return PTR_ERR(buffer); 414 + 415 + return devm_add_action_or_reset(dev, devm_iio_dmaengine_buffer_free, 416 + buffer); 417 + } 418 + EXPORT_SYMBOL_NS_GPL(devm_iio_dmaengine_buffer_setup_with_handle, 419 + "IIO_DMAENGINE_BUFFER"); 420 + 383 421 MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>"); 384 422 MODULE_DESCRIPTION("DMA buffer for the IIO framework"); 385 423 MODULE_LICENSE("GPL");
+5
include/linux/iio/buffer-dmaengine.h
··· 11 11 12 12 struct iio_dev; 13 13 struct device; 14 + struct dma_chan; 14 15 15 16 void iio_dmaengine_buffer_teardown(struct iio_buffer *buffer); 16 17 struct iio_buffer *iio_dmaengine_buffer_setup_ext(struct device *dev, ··· 27 26 struct iio_dev *indio_dev, 28 27 const char *channel, 29 28 enum iio_buffer_direction dir); 29 + int devm_iio_dmaengine_buffer_setup_with_handle(struct device *dev, 30 + struct iio_dev *indio_dev, 31 + struct dma_chan *chan, 32 + enum iio_buffer_direction dir); 30 33 31 34 #define devm_iio_dmaengine_buffer_setup(dev, indio_dev, channel) \ 32 35 devm_iio_dmaengine_buffer_setup_ext(dev, indio_dev, channel, \