diff options
Diffstat (limited to 'drivers/iio/industrialio-trigger.c')
-rw-r--r-- | drivers/iio/industrialio-trigger.c | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/drivers/iio/industrialio-trigger.c b/drivers/iio/industrialio-trigger.c index ae2806aafb72..0c52dfe64977 100644 --- a/drivers/iio/industrialio-trigger.c +++ b/drivers/iio/industrialio-trigger.c | |||
@@ -210,22 +210,35 @@ static int iio_trigger_attach_poll_func(struct iio_trigger *trig, | |||
210 | 210 | ||
211 | /* Prevent the module from being removed whilst attached to a trigger */ | 211 | /* Prevent the module from being removed whilst attached to a trigger */ |
212 | __module_get(pf->indio_dev->info->driver_module); | 212 | __module_get(pf->indio_dev->info->driver_module); |
213 | |||
214 | /* Get irq number */ | ||
213 | pf->irq = iio_trigger_get_irq(trig); | 215 | pf->irq = iio_trigger_get_irq(trig); |
216 | if (pf->irq < 0) | ||
217 | goto out_put_module; | ||
218 | |||
219 | /* Request irq */ | ||
214 | ret = request_threaded_irq(pf->irq, pf->h, pf->thread, | 220 | ret = request_threaded_irq(pf->irq, pf->h, pf->thread, |
215 | pf->type, pf->name, | 221 | pf->type, pf->name, |
216 | pf); | 222 | pf); |
217 | if (ret < 0) { | 223 | if (ret < 0) |
218 | module_put(pf->indio_dev->info->driver_module); | 224 | goto out_put_irq; |
219 | return ret; | ||
220 | } | ||
221 | 225 | ||
226 | /* Enable trigger in driver */ | ||
222 | if (trig->ops && trig->ops->set_trigger_state && notinuse) { | 227 | if (trig->ops && trig->ops->set_trigger_state && notinuse) { |
223 | ret = trig->ops->set_trigger_state(trig, true); | 228 | ret = trig->ops->set_trigger_state(trig, true); |
224 | if (ret < 0) | 229 | if (ret < 0) |
225 | module_put(pf->indio_dev->info->driver_module); | 230 | goto out_free_irq; |
226 | } | 231 | } |
227 | 232 | ||
228 | return ret; | 233 | return ret; |
234 | |||
235 | out_free_irq: | ||
236 | free_irq(pf->irq, pf); | ||
237 | out_put_irq: | ||
238 | iio_trigger_put_irq(trig, pf->irq); | ||
239 | out_put_module: | ||
240 | module_put(pf->indio_dev->info->driver_module); | ||
241 | return ret; | ||
229 | } | 242 | } |
230 | 243 | ||
231 | static int iio_trigger_detach_poll_func(struct iio_trigger *trig, | 244 | static int iio_trigger_detach_poll_func(struct iio_trigger *trig, |