diff options
author | Gregor Boirie <gregor.boirie@parrot.com> | 2016-09-02 14:47:55 -0400 |
---|---|---|
committer | Jonathan Cameron <jic23@kernel.org> | 2016-09-04 10:42:46 -0400 |
commit | 70e483487db787b152da756d4be0fef917378142 (patch) | |
tree | 53e07ce3e66eede20b9516083d06f9d5571f4386 | |
parent | 9083325f1197a6956db17809d74dbe3578dc1005 (diff) |
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>
-rw-r--r-- | Documentation/driver-model/devres.txt | 2 | ||||
-rw-r--r-- | drivers/iio/buffer/industrialio-triggered-buffer.c | 42 | ||||
-rw-r--r-- | drivers/iio/industrialio-core.c | 3 | ||||
-rw-r--r-- | include/linux/iio/iio.h | 1 | ||||
-rw-r--r-- | include/linux/iio/triggered_buffer.h | 8 |
5 files changed, 55 insertions, 1 deletions
diff --git a/Documentation/driver-model/devres.txt b/Documentation/driver-model/devres.txt index 6a2138a7c3ff..75bc5b8add2f 100644 --- a/Documentation/driver-model/devres.txt +++ b/Documentation/driver-model/devres.txt | |||
@@ -266,6 +266,8 @@ IIO | |||
266 | devm_iio_device_unregister() | 266 | devm_iio_device_unregister() |
267 | devm_iio_kfifo_allocate() | 267 | devm_iio_kfifo_allocate() |
268 | devm_iio_kfifo_free() | 268 | devm_iio_kfifo_free() |
269 | devm_iio_triggered_buffer_setup() | ||
270 | devm_iio_triggered_buffer_cleanup() | ||
269 | devm_iio_trigger_alloc() | 271 | devm_iio_trigger_alloc() |
270 | devm_iio_trigger_free() | 272 | devm_iio_trigger_free() |
271 | devm_iio_trigger_register() | 273 | devm_iio_trigger_register() |
diff --git a/drivers/iio/buffer/industrialio-triggered-buffer.c b/drivers/iio/buffer/industrialio-triggered-buffer.c index 4b2858ba1fd6..d3db1fce54d2 100644 --- a/drivers/iio/buffer/industrialio-triggered-buffer.c +++ b/drivers/iio/buffer/industrialio-triggered-buffer.c | |||
@@ -98,6 +98,48 @@ void iio_triggered_buffer_cleanup(struct iio_dev *indio_dev) | |||
98 | } | 98 | } |
99 | EXPORT_SYMBOL(iio_triggered_buffer_cleanup); | 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 | MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>"); | 143 | MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>"); |
102 | MODULE_DESCRIPTION("IIO helper functions for setting up triggered buffers"); | 144 | MODULE_DESCRIPTION("IIO helper functions for setting up triggered buffers"); |
103 | MODULE_LICENSE("GPL"); | 145 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/iio/industrialio-core.c b/drivers/iio/industrialio-core.c index f914d5d140e4..0528a0c1b964 100644 --- a/drivers/iio/industrialio-core.c +++ b/drivers/iio/industrialio-core.c | |||
@@ -1309,7 +1309,7 @@ static void devm_iio_device_release(struct device *dev, void *res) | |||
1309 | iio_device_free(*(struct iio_dev **)res); | 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 | struct iio_dev **r = res; | 1314 | struct iio_dev **r = res; |
1315 | if (!r || !*r) { | 1315 | if (!r || !*r) { |
@@ -1318,6 +1318,7 @@ static int devm_iio_device_match(struct device *dev, void *res, void *data) | |||
1318 | } | 1318 | } |
1319 | return *r == data; | 1319 | return *r == data; |
1320 | } | 1320 | } |
1321 | EXPORT_SYMBOL_GPL(devm_iio_device_match); | ||
1321 | 1322 | ||
1322 | /** | 1323 | /** |
1323 | * devm_iio_device_alloc - Resource-managed iio_device_alloc() | 1324 | * devm_iio_device_alloc - Resource-managed iio_device_alloc() |
diff --git a/include/linux/iio/iio.h b/include/linux/iio/iio.h index 786952cd509f..b4a0679e4a49 100644 --- a/include/linux/iio/iio.h +++ b/include/linux/iio/iio.h | |||
@@ -644,6 +644,7 @@ static inline struct iio_dev *iio_priv_to_dev(void *priv) | |||
644 | } | 644 | } |
645 | 645 | ||
646 | void iio_device_free(struct iio_dev *indio_dev); | 646 | void iio_device_free(struct iio_dev *indio_dev); |
647 | int devm_iio_device_match(struct device *dev, void *res, void *data); | ||
647 | struct iio_dev *devm_iio_device_alloc(struct device *dev, int sizeof_priv); | 648 | struct iio_dev *devm_iio_device_alloc(struct device *dev, int sizeof_priv); |
648 | void devm_iio_device_free(struct device *dev, struct iio_dev *indio_dev); | 649 | void devm_iio_device_free(struct device *dev, struct iio_dev *indio_dev); |
649 | struct iio_trigger *devm_iio_trigger_alloc(struct device *dev, | 650 | struct iio_trigger *devm_iio_trigger_alloc(struct device *dev, |
diff --git a/include/linux/iio/triggered_buffer.h b/include/linux/iio/triggered_buffer.h index f72f70d5a97b..30145616773d 100644 --- a/include/linux/iio/triggered_buffer.h +++ b/include/linux/iio/triggered_buffer.h | |||
@@ -12,4 +12,12 @@ int iio_triggered_buffer_setup(struct iio_dev *indio_dev, | |||
12 | const struct iio_buffer_setup_ops *setup_ops); | 12 | const struct iio_buffer_setup_ops *setup_ops); |
13 | void iio_triggered_buffer_cleanup(struct iio_dev *indio_dev); | 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 | #endif | 23 | #endif |