On Sat, 21 Mar 2020 10:53:11 +0200 Alexandru Ardelean <alexandru.ardelean@xxxxxxxxxx> wrote: > Currently, when using a 'iio_dmaengine_buffer_alloc()', an matching call to > 'iio_dmaengine_buffer_free()' must be made. > > With this change, this can be avoided by using > 'devm_iio_dmaengine_buffer_alloc()'. The buffer will get free'd via the > device's devres handling. > > Signed-off-by: Alexandru Ardelean <alexandru.ardelean@xxxxxxxxxx> Applied. Thanks, Jonathan > --- > .../buffer/industrialio-buffer-dmaengine.c | 39 +++++++++++++++++++ > include/linux/iio/buffer-dmaengine.h | 3 ++ > 2 files changed, 42 insertions(+) > > diff --git a/drivers/iio/buffer/industrialio-buffer-dmaengine.c b/drivers/iio/buffer/industrialio-buffer-dmaengine.c > index 94da3b1ca3a2..6dedf12b69a4 100644 > --- a/drivers/iio/buffer/industrialio-buffer-dmaengine.c > +++ b/drivers/iio/buffer/industrialio-buffer-dmaengine.c > @@ -229,6 +229,45 @@ void iio_dmaengine_buffer_free(struct iio_buffer *buffer) > } > EXPORT_SYMBOL_GPL(iio_dmaengine_buffer_free); > > +static void __devm_iio_dmaengine_buffer_free(struct device *dev, void *res) > +{ > + iio_dmaengine_buffer_free(*(struct iio_buffer **)res); > +} > + > +/** > + * devm_iio_dmaengine_buffer_alloc() - Resource-managed iio_dmaengine_buffer_alloc() > + * @dev: Parent device for the buffer > + * @channel: DMA channel name, typically "rx". > + * > + * This allocates a new IIO buffer which internally uses the DMAengine framework > + * to perform its transfers. The parent device will be used to request the DMA > + * channel. > + * > + * The buffer will be automatically de-allocated once the device gets destroyed. > + */ > +struct iio_buffer *devm_iio_dmaengine_buffer_alloc(struct device *dev, > + const char *channel) > +{ > + struct iio_buffer **bufferp, *buffer; > + > + bufferp = devres_alloc(__devm_iio_dmaengine_buffer_free, > + sizeof(*bufferp), GFP_KERNEL); > + if (!bufferp) > + return ERR_PTR(-ENOMEM); > + > + buffer = iio_dmaengine_buffer_alloc(dev, channel); > + if (IS_ERR(buffer)) { > + devres_free(bufferp); > + return buffer; > + } > + > + *bufferp = buffer; > + devres_add(dev, bufferp); > + > + return buffer; > +} > +EXPORT_SYMBOL_GPL(devm_iio_dmaengine_buffer_alloc); > + > MODULE_AUTHOR("Lars-Peter Clausen <lars@xxxxxxxxxx>"); > 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 b3a57444a886..0e503db71289 100644 > --- a/include/linux/iio/buffer-dmaengine.h > +++ b/include/linux/iio/buffer-dmaengine.h > @@ -14,4 +14,7 @@ struct iio_buffer *iio_dmaengine_buffer_alloc(struct device *dev, > const char *channel); > void iio_dmaengine_buffer_free(struct iio_buffer *buffer); > > +struct iio_buffer *devm_iio_dmaengine_buffer_alloc(struct device *dev, > + const char *channel); > + > #endif