aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJonathan Cameron <jic23@cam.ac.uk>2011-05-18 09:42:32 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2011-05-19 19:15:04 -0400
commit21b185f8d5951ebbf76d61f431fb541dce5113d1 (patch)
treec9337b56b2835849657da639d6ed64bad4a339fe
parente3796e6bbba213ba2aad7212de0bdae2833ac45e (diff)
staging:iio: poll func allocation clean up.
Add a function to neatly deal with allocation of poll functions. Ultimately this allows us to more easily change the implementation. Signed-off-by: Jonathan Cameron <jic23@cam.ac.uk> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r--drivers/staging/iio/accel/adis16201_ring.c22
-rw-r--r--drivers/staging/iio/accel/adis16203_ring.c23
-rw-r--r--drivers/staging/iio/accel/adis16204_ring.c23
-rw-r--r--drivers/staging/iio/accel/adis16209_ring.c24
-rw-r--r--drivers/staging/iio/accel/adis16240_ring.c26
-rw-r--r--drivers/staging/iio/imu/adis16400_ring.c23
-rw-r--r--drivers/staging/iio/industrialio-trigger.c36
-rw-r--r--drivers/staging/iio/trigger.h8
8 files changed, 95 insertions, 90 deletions
diff --git a/drivers/staging/iio/accel/adis16201_ring.c b/drivers/staging/iio/accel/adis16201_ring.c
index 83b53365d8ed..c61f981255ca 100644
--- a/drivers/staging/iio/accel/adis16201_ring.c
+++ b/drivers/staging/iio/accel/adis16201_ring.c
@@ -96,8 +96,7 @@ static irqreturn_t adis16201_trigger_handler(int irq, void *p)
96 96
97void adis16201_unconfigure_ring(struct iio_dev *indio_dev) 97void adis16201_unconfigure_ring(struct iio_dev *indio_dev)
98{ 98{
99 kfree(indio_dev->pollfunc->name); 99 iio_dealloc_pollfunc(indio_dev->pollfunc);
100 kfree(indio_dev->pollfunc);
101 iio_sw_rb_free(indio_dev->ring); 100 iio_sw_rb_free(indio_dev->ring);
102} 101}
103 102
@@ -134,26 +133,19 @@ int adis16201_configure_ring(struct iio_dev *indio_dev)
134 iio_scan_mask_set(ring, ADIS16201_SCAN_INCLI_X); 133 iio_scan_mask_set(ring, ADIS16201_SCAN_INCLI_X);
135 iio_scan_mask_set(ring, ADIS16201_SCAN_INCLI_Y); 134 iio_scan_mask_set(ring, ADIS16201_SCAN_INCLI_Y);
136 135
137 indio_dev->pollfunc = kzalloc(sizeof(*indio_dev->pollfunc), GFP_KERNEL); 136 indio_dev->pollfunc = iio_alloc_pollfunc(&iio_pollfunc_store_time,
137 &adis16201_trigger_handler,
138 IRQF_ONESHOT,
139 indio_dev,
140 "adis16201_consumer%d",
141 indio_dev->id);
138 if (indio_dev->pollfunc == NULL) { 142 if (indio_dev->pollfunc == NULL) {
139 ret = -ENOMEM; 143 ret = -ENOMEM;
140 goto error_iio_sw_rb_free; 144 goto error_iio_sw_rb_free;
141 } 145 }
142 indio_dev->pollfunc->private_data = indio_dev;
143 indio_dev->pollfunc->h = &iio_pollfunc_store_time;
144 indio_dev->pollfunc->thread = &adis16201_trigger_handler;
145 indio_dev->pollfunc->type = IRQF_ONESHOT;
146 indio_dev->pollfunc->name =
147 kasprintf(GFP_KERNEL, "adis16201_consumer%d", indio_dev->id);
148 if (indio_dev->pollfunc->name == NULL) {
149 ret = -ENOMEM;
150 goto error_free_poll_func;
151 }
152 146
153 indio_dev->modes |= INDIO_RING_TRIGGERED; 147 indio_dev->modes |= INDIO_RING_TRIGGERED;
154 return 0; 148 return 0;
155error_free_poll_func:
156 kfree(indio_dev->pollfunc);
157error_iio_sw_rb_free: 149error_iio_sw_rb_free:
158 iio_sw_rb_free(indio_dev->ring); 150 iio_sw_rb_free(indio_dev->ring);
159 return ret; 151 return ret;
diff --git a/drivers/staging/iio/accel/adis16203_ring.c b/drivers/staging/iio/accel/adis16203_ring.c
index 1b8863d2ff09..a9a789d79c09 100644
--- a/drivers/staging/iio/accel/adis16203_ring.c
+++ b/drivers/staging/iio/accel/adis16203_ring.c
@@ -103,8 +103,7 @@ static irqreturn_t adis16203_trigger_handler(int irq, void *p)
103 103
104void adis16203_unconfigure_ring(struct iio_dev *indio_dev) 104void adis16203_unconfigure_ring(struct iio_dev *indio_dev)
105{ 105{
106 kfree(indio_dev->pollfunc->name); 106 iio_dealloc_pollfunc(indio_dev->pollfunc);
107 kfree(indio_dev->pollfunc);
108 iio_sw_rb_free(indio_dev->ring); 107 iio_sw_rb_free(indio_dev->ring);
109} 108}
110 109
@@ -139,26 +138,20 @@ int adis16203_configure_ring(struct iio_dev *indio_dev)
139 iio_scan_mask_set(ring, ADIS16203_SCAN_INCLI_X); 138 iio_scan_mask_set(ring, ADIS16203_SCAN_INCLI_X);
140 iio_scan_mask_set(ring, ADIS16203_SCAN_INCLI_Y); 139 iio_scan_mask_set(ring, ADIS16203_SCAN_INCLI_Y);
141 140
142 indio_dev->pollfunc = kzalloc(sizeof(*indio_dev->pollfunc), GFP_KERNEL); 141 indio_dev->pollfunc = iio_alloc_pollfunc(&iio_pollfunc_store_time,
142 &adis16203_trigger_handler,
143 IRQF_ONESHOT,
144 indio_dev,
145 "adis16203_consumer%d",
146 indio_dev->id);
143 if (indio_dev->pollfunc == NULL) { 147 if (indio_dev->pollfunc == NULL) {
144 ret = -ENOMEM; 148 ret = -ENOMEM;
145 goto error_iio_sw_rb_free; 149 goto error_iio_sw_rb_free;
146 } 150 }
147 indio_dev->pollfunc->private_data = indio_dev;
148 indio_dev->pollfunc->h = &iio_pollfunc_store_time;
149 indio_dev->pollfunc->thread = &adis16203_trigger_handler;
150 indio_dev->pollfunc->type = IRQF_ONESHOT;
151 indio_dev->pollfunc->name =
152 kasprintf(GFP_KERNEL, "adis16203_consumer%d", indio_dev->id);
153 if (indio_dev->pollfunc->name == NULL) {
154 ret = -ENOMEM;
155 goto error_free_poll_func;
156 }
157 151
158 indio_dev->modes |= INDIO_RING_TRIGGERED; 152 indio_dev->modes |= INDIO_RING_TRIGGERED;
159 return 0; 153 return 0;
160error_free_poll_func: 154
161 kfree(indio_dev->pollfunc);
162error_iio_sw_rb_free: 155error_iio_sw_rb_free:
163 iio_sw_rb_free(indio_dev->ring); 156 iio_sw_rb_free(indio_dev->ring);
164 return ret; 157 return ret;
diff --git a/drivers/staging/iio/accel/adis16204_ring.c b/drivers/staging/iio/accel/adis16204_ring.c
index 7d99b4884f94..a2d36fb822e5 100644
--- a/drivers/staging/iio/accel/adis16204_ring.c
+++ b/drivers/staging/iio/accel/adis16204_ring.c
@@ -98,8 +98,7 @@ static irqreturn_t adis16204_trigger_handler(int irq, void *p)
98 98
99void adis16204_unconfigure_ring(struct iio_dev *indio_dev) 99void adis16204_unconfigure_ring(struct iio_dev *indio_dev)
100{ 100{
101 kfree(indio_dev->pollfunc->name); 101 iio_dealloc_pollfunc(indio_dev->pollfunc);
102 kfree(indio_dev->pollfunc);
103 iio_sw_rb_free(indio_dev->ring); 102 iio_sw_rb_free(indio_dev->ring);
104} 103}
105 104
@@ -134,27 +133,21 @@ int adis16204_configure_ring(struct iio_dev *indio_dev)
134 iio_scan_mask_set(ring, ADIS16204_SCAN_AUX_ADC); 133 iio_scan_mask_set(ring, ADIS16204_SCAN_AUX_ADC);
135 iio_scan_mask_set(ring, ADIS16204_SCAN_TEMP); 134 iio_scan_mask_set(ring, ADIS16204_SCAN_TEMP);
136 135
137 indio_dev->pollfunc = kzalloc(sizeof(*indio_dev->pollfunc), GFP_KERNEL); 136 indio_dev->pollfunc = iio_alloc_pollfunc(&iio_pollfunc_store_time,
137 &adis16204_trigger_handler,
138 IRQF_ONESHOT,
139 indio_dev,
140 "%s_consumer%d",
141 indio_dev->name,
142 indio_dev->id);
138 if (indio_dev->pollfunc == NULL) { 143 if (indio_dev->pollfunc == NULL) {
139 ret = -ENOMEM; 144 ret = -ENOMEM;
140 goto error_iio_sw_rb_free; 145 goto error_iio_sw_rb_free;
141 } 146 }
142 indio_dev->pollfunc->private_data = indio_dev;
143 indio_dev->pollfunc->h = &iio_pollfunc_store_time;
144 indio_dev->pollfunc->thread = &adis16204_trigger_handler;
145 indio_dev->pollfunc->type = IRQF_ONESHOT;
146 indio_dev->pollfunc->name =
147 kasprintf(GFP_KERNEL, "adis16204_consumer%d", indio_dev->id);
148 if (indio_dev->pollfunc->name == NULL) {
149 ret = -ENOMEM;
150 goto error_free_poll_func;
151 }
152 147
153 indio_dev->modes |= INDIO_RING_TRIGGERED; 148 indio_dev->modes |= INDIO_RING_TRIGGERED;
154 return 0; 149 return 0;
155 150
156error_free_poll_func:
157 kfree(indio_dev->pollfunc);
158error_iio_sw_rb_free: 151error_iio_sw_rb_free:
159 iio_sw_rb_free(indio_dev->ring); 152 iio_sw_rb_free(indio_dev->ring);
160 return ret; 153 return ret;
diff --git a/drivers/staging/iio/accel/adis16209_ring.c b/drivers/staging/iio/accel/adis16209_ring.c
index 26028e9a9056..390908b3f02f 100644
--- a/drivers/staging/iio/accel/adis16209_ring.c
+++ b/drivers/staging/iio/accel/adis16209_ring.c
@@ -98,8 +98,7 @@ static irqreturn_t adis16209_trigger_handler(int irq, void *p)
98 98
99void adis16209_unconfigure_ring(struct iio_dev *indio_dev) 99void adis16209_unconfigure_ring(struct iio_dev *indio_dev)
100{ 100{
101 kfree(indio_dev->pollfunc->name); 101 iio_dealloc_pollfunc(indio_dev->pollfunc);
102 kfree(indio_dev->pollfunc);
103 iio_sw_rb_free(indio_dev->ring); 102 iio_sw_rb_free(indio_dev->ring);
104} 103}
105 104
@@ -137,26 +136,21 @@ int adis16209_configure_ring(struct iio_dev *indio_dev)
137 iio_scan_mask_set(ring, ADIS16209_SCAN_INCLI_Y); 136 iio_scan_mask_set(ring, ADIS16209_SCAN_INCLI_Y);
138 iio_scan_mask_set(ring, ADIS16209_SCAN_ROT); 137 iio_scan_mask_set(ring, ADIS16209_SCAN_ROT);
139 138
140 indio_dev->pollfunc = kzalloc(sizeof(*indio_dev->pollfunc), GFP_KERNEL); 139 indio_dev->pollfunc = iio_alloc_pollfunc(&iio_pollfunc_store_time,
140 &adis16209_trigger_handler,
141 IRQF_ONESHOT,
142 indio_dev,
143 "%s_consumer%d",
144 indio_dev->name,
145 indio_dev->id);
141 if (indio_dev->pollfunc == NULL) { 146 if (indio_dev->pollfunc == NULL) {
142 ret = -ENOMEM; 147 ret = -ENOMEM;
143 goto error_iio_sw_rb_free; 148 goto error_iio_sw_rb_free;
144 } 149 }
145 indio_dev->pollfunc->private_data = indio_dev;
146 indio_dev->pollfunc->h = &iio_pollfunc_store_time;
147 indio_dev->pollfunc->thread = &adis16209_trigger_handler;
148 indio_dev->pollfunc->type = IRQF_ONESHOT;
149 indio_dev->pollfunc->name =
150 kasprintf(GFP_KERNEL, "adis16209_consumer%d", indio_dev->id);
151 if (indio_dev->pollfunc->name == NULL) {
152 ret = -ENOMEM;
153 goto error_free_poll_func;
154 }
155 150
156 indio_dev->modes |= INDIO_RING_TRIGGERED; 151 indio_dev->modes |= INDIO_RING_TRIGGERED;
157 return 0; 152 return 0;
158error_free_poll_func: 153
159 kfree(indio_dev->pollfunc);
160error_iio_sw_rb_free: 154error_iio_sw_rb_free:
161 iio_sw_rb_free(indio_dev->ring); 155 iio_sw_rb_free(indio_dev->ring);
162 return ret; 156 return ret;
diff --git a/drivers/staging/iio/accel/adis16240_ring.c b/drivers/staging/iio/accel/adis16240_ring.c
index 8450f7f0e538..0c6d781d94c6 100644
--- a/drivers/staging/iio/accel/adis16240_ring.c
+++ b/drivers/staging/iio/accel/adis16240_ring.c
@@ -95,8 +95,7 @@ static irqreturn_t adis16240_trigger_handler(int irq, void *p)
95 95
96void adis16240_unconfigure_ring(struct iio_dev *indio_dev) 96void adis16240_unconfigure_ring(struct iio_dev *indio_dev)
97{ 97{
98 kfree(indio_dev->pollfunc->name); 98 iio_dealloc_pollfunc(indio_dev->pollfunc);
99 kfree(indio_dev->pollfunc);
100 iio_sw_rb_free(indio_dev->ring); 99 iio_sw_rb_free(indio_dev->ring);
101} 100}
102 101
@@ -132,27 +131,22 @@ int adis16240_configure_ring(struct iio_dev *indio_dev)
132 iio_scan_mask_set(ring, ADIS16240_SCAN_AUX_ADC); 131 iio_scan_mask_set(ring, ADIS16240_SCAN_AUX_ADC);
133 iio_scan_mask_set(ring, ADIS16240_SCAN_TEMP); 132 iio_scan_mask_set(ring, ADIS16240_SCAN_TEMP);
134 133
135 indio_dev->pollfunc = kzalloc(sizeof(*indio_dev->pollfunc), GFP_KERNEL); 134 indio_dev->pollfunc = iio_alloc_pollfunc(&iio_pollfunc_store_time,
135 &adis16240_trigger_handler,
136 IRQF_ONESHOT,
137 indio_dev,
138 "%s_consumer%d",
139 indio_dev->name,
140 indio_dev->id);
136 if (indio_dev->pollfunc == NULL) { 141 if (indio_dev->pollfunc == NULL) {
137 ret = -ENOMEM; 142 ret = -ENOMEM;
138 goto error_iio_sw_rb_free; 143 goto error_iio_sw_rb_free;
139 } 144 }
140 indio_dev->pollfunc->private_data = indio_dev; 145
141 indio_dev->pollfunc->h = &iio_pollfunc_store_time;
142 indio_dev->pollfunc->thread = &adis16240_trigger_handler;
143 indio_dev->pollfunc->type = IRQF_ONESHOT;
144 indio_dev->pollfunc->name =
145 kasprintf(GFP_KERNEL, "adis16240_consumer%d", indio_dev->id);
146 if (indio_dev->pollfunc->name == NULL) {
147 ret = -ENOMEM;
148 goto error_free_poll_func;
149 }
150 indio_dev->modes |= INDIO_RING_TRIGGERED; 146 indio_dev->modes |= INDIO_RING_TRIGGERED;
151 return 0; 147 return 0;
152error_free_poll_func: 148
153 kfree(indio_dev->pollfunc);
154error_iio_sw_rb_free: 149error_iio_sw_rb_free:
155 iio_sw_rb_free(indio_dev->ring); 150 iio_sw_rb_free(indio_dev->ring);
156 return ret; 151 return ret;
157} 152}
158
diff --git a/drivers/staging/iio/imu/adis16400_ring.c b/drivers/staging/iio/imu/adis16400_ring.c
index 5d99fba8cc29..2589a7e167e4 100644
--- a/drivers/staging/iio/imu/adis16400_ring.c
+++ b/drivers/staging/iio/imu/adis16400_ring.c
@@ -165,8 +165,7 @@ static irqreturn_t adis16400_trigger_handler(int irq, void *p)
165 165
166void adis16400_unconfigure_ring(struct iio_dev *indio_dev) 166void adis16400_unconfigure_ring(struct iio_dev *indio_dev)
167{ 167{
168 kfree(indio_dev->pollfunc->name); 168 iio_dealloc_pollfunc(indio_dev->pollfunc);
169 kfree(indio_dev->pollfunc);
170 iio_sw_rb_free(indio_dev->ring); 169 iio_sw_rb_free(indio_dev->ring);
171} 170}
172 171
@@ -194,28 +193,24 @@ int adis16400_configure_ring(struct iio_dev *indio_dev)
194 ring->scan_timestamp = true; 193 ring->scan_timestamp = true;
195 ring->setup_ops = &adis16400_ring_setup_ops; 194 ring->setup_ops = &adis16400_ring_setup_ops;
196 ring->owner = THIS_MODULE; 195 ring->owner = THIS_MODULE;
196 /* Set default scan mode */
197 ring->scan_mask = st->variant->default_scan_mask; 197 ring->scan_mask = st->variant->default_scan_mask;
198 ring->scan_count = hweight_long(st->variant->default_scan_mask); 198 ring->scan_count = hweight_long(st->variant->default_scan_mask);
199 /* Set default scan mode */
200 199
201 indio_dev->pollfunc = kzalloc(sizeof(*indio_dev->pollfunc), GFP_KERNEL); 200 indio_dev->pollfunc = iio_alloc_pollfunc(&iio_pollfunc_store_time,
201 &adis16400_trigger_handler,
202 IRQF_ONESHOT,
203 indio_dev,
204 "%s_consumer%d",
205 indio_dev->name,
206 indio_dev->id);
202 if (indio_dev->pollfunc == NULL) { 207 if (indio_dev->pollfunc == NULL) {
203 ret = -ENOMEM; 208 ret = -ENOMEM;
204 goto error_iio_sw_rb_free; 209 goto error_iio_sw_rb_free;
205 } 210 }
206 indio_dev->pollfunc->private_data = indio_dev;
207 indio_dev->pollfunc->h = &iio_pollfunc_store_time;
208 indio_dev->pollfunc->thread = &adis16400_trigger_handler;
209 indio_dev->pollfunc->type = IRQF_ONESHOT;
210 indio_dev->pollfunc->name =
211 kasprintf(GFP_KERNEL, "adis16400_consumer%d", indio_dev->id);
212 if (ret)
213 goto error_iio_free_pollfunc;
214 211
215 indio_dev->modes |= INDIO_RING_TRIGGERED; 212 indio_dev->modes |= INDIO_RING_TRIGGERED;
216 return 0; 213 return 0;
217error_iio_free_pollfunc:
218 kfree(indio_dev->pollfunc);
219error_iio_sw_rb_free: 214error_iio_sw_rb_free:
220 iio_sw_rb_free(indio_dev->ring); 215 iio_sw_rb_free(indio_dev->ring);
221 return ret; 216 return ret;
diff --git a/drivers/staging/iio/industrialio-trigger.c b/drivers/staging/iio/industrialio-trigger.c
index e83edacaec89..615902333fb0 100644
--- a/drivers/staging/iio/industrialio-trigger.c
+++ b/drivers/staging/iio/industrialio-trigger.c
@@ -270,6 +270,42 @@ irqreturn_t iio_pollfunc_store_time(int irq, void *p)
270} 270}
271EXPORT_SYMBOL(iio_pollfunc_store_time); 271EXPORT_SYMBOL(iio_pollfunc_store_time);
272 272
273struct iio_poll_func
274*iio_alloc_pollfunc(irqreturn_t (*h)(int irq, void *p),
275 irqreturn_t (*thread)(int irq, void *p),
276 int type,
277 void *private,
278 const char *fmt,
279 ...)
280{
281 va_list vargs;
282 struct iio_poll_func *pf;
283
284 pf = kmalloc(sizeof *pf, GFP_KERNEL);
285 if (pf == NULL)
286 return NULL;
287 va_start(vargs, fmt);
288 pf->name = kvasprintf(GFP_KERNEL, fmt, vargs);
289 va_end(vargs);
290 if (pf->name == NULL) {
291 kfree(pf);
292 return NULL;
293 }
294 pf->h = h;
295 pf->thread = thread;
296 pf->type = type;
297
298 return pf;
299}
300EXPORT_SYMBOL_GPL(iio_alloc_pollfunc);
301
302void iio_dealloc_pollfunc(struct iio_poll_func *pf)
303{
304 kfree(pf->name);
305 kfree(pf);
306}
307EXPORT_SYMBOL_GPL(iio_dealloc_pollfunc);
308
273/** 309/**
274 * iio_trigger_read_currrent() - trigger consumer sysfs query which trigger 310 * iio_trigger_read_currrent() - trigger consumer sysfs query which trigger
275 * 311 *
diff --git a/drivers/staging/iio/trigger.h b/drivers/staging/iio/trigger.h
index 7faa31a2421e..f329fe10fa2f 100644
--- a/drivers/staging/iio/trigger.h
+++ b/drivers/staging/iio/trigger.h
@@ -160,6 +160,14 @@ struct iio_poll_func {
160 s64 timestamp; 160 s64 timestamp;
161}; 161};
162 162
163struct iio_poll_func
164*iio_alloc_pollfunc(irqreturn_t (*h)(int irq, void *p),
165 irqreturn_t (*thread)(int irq, void *p),
166 int type,
167 void *private,
168 const char *fmt,
169 ...);
170void iio_dealloc_pollfunc(struct iio_poll_func *pf);
163irqreturn_t iio_pollfunc_store_time(int irq, void *p); 171irqreturn_t iio_pollfunc_store_time(int irq, void *p);
164 172
165/* 173/*