aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGregor Boirie <gregor.boirie@parrot.com>2016-09-02 14:47:55 -0400
committerJonathan Cameron <jic23@kernel.org>2016-09-04 10:42:46 -0400
commit70e483487db787b152da756d4be0fef917378142 (patch)
tree53e07ce3e66eede20b9516083d06f9d5571f4386
parent9083325f1197a6956db17809d74dbe3578dc1005 (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.txt2
-rw-r--r--drivers/iio/buffer/industrialio-triggered-buffer.c42
-rw-r--r--drivers/iio/industrialio-core.c3
-rw-r--r--include/linux/iio/iio.h1
-rw-r--r--include/linux/iio/triggered_buffer.h8
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}
99EXPORT_SYMBOL(iio_triggered_buffer_cleanup); 99EXPORT_SYMBOL(iio_triggered_buffer_cleanup);
100 100
101static void devm_iio_triggered_buffer_clean(struct device *dev, void *res)
102{
103 iio_triggered_buffer_cleanup(*(struct iio_dev **)res);
104}
105
106int 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}
130EXPORT_SYMBOL_GPL(devm_iio_triggered_buffer_setup);
131
132void 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}
141EXPORT_SYMBOL_GPL(devm_iio_triggered_buffer_cleanup);
142
101MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>"); 143MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>");
102MODULE_DESCRIPTION("IIO helper functions for setting up triggered buffers"); 144MODULE_DESCRIPTION("IIO helper functions for setting up triggered buffers");
103MODULE_LICENSE("GPL"); 145MODULE_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
1312static int devm_iio_device_match(struct device *dev, void *res, void *data) 1312int 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}
1321EXPORT_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
646void iio_device_free(struct iio_dev *indio_dev); 646void iio_device_free(struct iio_dev *indio_dev);
647int devm_iio_device_match(struct device *dev, void *res, void *data);
647struct iio_dev *devm_iio_device_alloc(struct device *dev, int sizeof_priv); 648struct iio_dev *devm_iio_device_alloc(struct device *dev, int sizeof_priv);
648void devm_iio_device_free(struct device *dev, struct iio_dev *indio_dev); 649void devm_iio_device_free(struct device *dev, struct iio_dev *indio_dev);
649struct iio_trigger *devm_iio_trigger_alloc(struct device *dev, 650struct 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);
13void iio_triggered_buffer_cleanup(struct iio_dev *indio_dev); 13void iio_triggered_buffer_cleanup(struct iio_dev *indio_dev);
14 14
15int 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);
20void devm_iio_triggered_buffer_cleanup(struct device *dev,
21 struct iio_dev *indio_dev);
22
15#endif 23#endif