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

iio: add resource managed triggered buffer init helpers

Add resource managed devm_iio_triggered_buffer_setup() and
devm_iio_triggered_buffer_cleanup() to automatically clean up triggered
buffers setup by IIO drivers, thus leading to simplified IIO drivers code.

Signed-off-by: Gregor Boirie <gregor.boirie@parrot.com>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>

authored by

Gregor Boirie and committed by
Jonathan Cameron
70e48348 9083325f

+55 -1
+2
Documentation/driver-model/devres.txt
··· 266 266 devm_iio_device_unregister() 267 267 devm_iio_kfifo_allocate() 268 268 devm_iio_kfifo_free() 269 + devm_iio_triggered_buffer_setup() 270 + devm_iio_triggered_buffer_cleanup() 269 271 devm_iio_trigger_alloc() 270 272 devm_iio_trigger_free() 271 273 devm_iio_trigger_register()
+42
drivers/iio/buffer/industrialio-triggered-buffer.c
··· 98 98 } 99 99 EXPORT_SYMBOL(iio_triggered_buffer_cleanup); 100 100 101 + static void devm_iio_triggered_buffer_clean(struct device *dev, void *res) 102 + { 103 + iio_triggered_buffer_cleanup(*(struct iio_dev **)res); 104 + } 105 + 106 + int devm_iio_triggered_buffer_setup(struct device *dev, 107 + struct iio_dev *indio_dev, 108 + irqreturn_t (*h)(int irq, void *p), 109 + irqreturn_t (*thread)(int irq, void *p), 110 + const struct iio_buffer_setup_ops *ops) 111 + { 112 + struct iio_dev **ptr; 113 + int ret; 114 + 115 + ptr = devres_alloc(devm_iio_triggered_buffer_clean, sizeof(*ptr), 116 + GFP_KERNEL); 117 + if (!ptr) 118 + return -ENOMEM; 119 + 120 + *ptr = indio_dev; 121 + 122 + ret = iio_triggered_buffer_setup(indio_dev, h, thread, ops); 123 + if (!ret) 124 + devres_add(dev, ptr); 125 + else 126 + devres_free(ptr); 127 + 128 + return ret; 129 + } 130 + EXPORT_SYMBOL_GPL(devm_iio_triggered_buffer_setup); 131 + 132 + void devm_iio_triggered_buffer_cleanup(struct device *dev, 133 + struct iio_dev *indio_dev) 134 + { 135 + int rc; 136 + 137 + rc = devres_release(dev, devm_iio_triggered_buffer_clean, 138 + devm_iio_device_match, indio_dev); 139 + WARN_ON(rc); 140 + } 141 + EXPORT_SYMBOL_GPL(devm_iio_triggered_buffer_cleanup); 142 + 101 143 MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>"); 102 144 MODULE_DESCRIPTION("IIO helper functions for setting up triggered buffers"); 103 145 MODULE_LICENSE("GPL");
+2 -1
drivers/iio/industrialio-core.c
··· 1309 1309 iio_device_free(*(struct iio_dev **)res); 1310 1310 } 1311 1311 1312 - static int devm_iio_device_match(struct device *dev, void *res, void *data) 1312 + int devm_iio_device_match(struct device *dev, void *res, void *data) 1313 1313 { 1314 1314 struct iio_dev **r = res; 1315 1315 if (!r || !*r) { ··· 1318 1318 } 1319 1319 return *r == data; 1320 1320 } 1321 + EXPORT_SYMBOL_GPL(devm_iio_device_match); 1321 1322 1322 1323 /** 1323 1324 * devm_iio_device_alloc - Resource-managed iio_device_alloc()
+1
include/linux/iio/iio.h
··· 644 644 } 645 645 646 646 void iio_device_free(struct iio_dev *indio_dev); 647 + int devm_iio_device_match(struct device *dev, void *res, void *data); 647 648 struct iio_dev *devm_iio_device_alloc(struct device *dev, int sizeof_priv); 648 649 void devm_iio_device_free(struct device *dev, struct iio_dev *indio_dev); 649 650 struct iio_trigger *devm_iio_trigger_alloc(struct device *dev,
+8
include/linux/iio/triggered_buffer.h
··· 12 12 const struct iio_buffer_setup_ops *setup_ops); 13 13 void iio_triggered_buffer_cleanup(struct iio_dev *indio_dev); 14 14 15 + int devm_iio_triggered_buffer_setup(struct device *dev, 16 + struct iio_dev *indio_dev, 17 + irqreturn_t (*h)(int irq, void *p), 18 + irqreturn_t (*thread)(int irq, void *p), 19 + const struct iio_buffer_setup_ops *ops); 20 + void devm_iio_triggered_buffer_cleanup(struct device *dev, 21 + struct iio_dev *indio_dev); 22 + 15 23 #endif