staging:iio: prevent removal of module connected to trigger.
authorJonathan Cameron <jic23@cam.ac.uk>
Wed, 24 Aug 2011 16:28:37 +0000 (17:28 +0100)
committerGreg Kroah-Hartman <gregkh@suse.de>
Wed, 24 Aug 2011 21:23:42 +0000 (14:23 -0700)
Signed-off-by: Jonathan Cameron <jic23@cam.ac.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/staging/iio/adc/ad7192.c
drivers/staging/iio/adc/ad7298_ring.c
drivers/staging/iio/adc/ad7476_ring.c
drivers/staging/iio/adc/ad7606_ring.c
drivers/staging/iio/adc/ad7793.c
drivers/staging/iio/adc/ad7887_ring.c
drivers/staging/iio/adc/ad799x_ring.c
drivers/staging/iio/adc/max1363_ring.c
drivers/staging/iio/industrialio-trigger.c
drivers/staging/iio/meter/ade7758_ring.c

index 1b07b63..fd37908 100644 (file)
@@ -605,12 +605,6 @@ error_ret:
 
 static void ad7192_ring_cleanup(struct iio_dev *indio_dev)
 {
-       /* ensure that the trigger has been detached */
-       if (indio_dev->trig) {
-               iio_put_trigger(indio_dev->trig);
-               iio_trigger_dettach_poll_func(indio_dev->trig,
-                                             indio_dev->pollfunc);
-       }
        iio_dealloc_pollfunc(indio_dev->pollfunc);
        iio_sw_rb_free(indio_dev->ring);
 }
index ab828a9..5b87926 100644 (file)
@@ -189,11 +189,6 @@ error_ret:
 
 void ad7298_ring_cleanup(struct iio_dev *indio_dev)
 {
-       if (indio_dev->trig) {
-               iio_put_trigger(indio_dev->trig);
-               iio_trigger_dettach_poll_func(indio_dev->trig,
-                                             indio_dev->pollfunc);
-       }
        iio_dealloc_pollfunc(indio_dev->pollfunc);
        iio_sw_rb_free(indio_dev->ring);
 }
index 2597fda..41d6b8d 100644 (file)
@@ -152,12 +152,6 @@ error_ret:
 
 void ad7476_ring_cleanup(struct iio_dev *indio_dev)
 {
-       /* ensure that the trigger has been detached */
-       if (indio_dev->trig) {
-               iio_put_trigger(indio_dev->trig);
-               iio_trigger_dettach_poll_func(indio_dev->trig,
-                                             indio_dev->pollfunc);
-       }
        iio_dealloc_pollfunc(indio_dev->pollfunc);
        iio_sw_rb_free(indio_dev->ring);
 }
index 52b0c1d..1c563ec 100644 (file)
@@ -197,11 +197,6 @@ error_ret:
 
 void ad7606_ring_cleanup(struct iio_dev *indio_dev)
 {
-       if (indio_dev->trig) {
-               iio_put_trigger(indio_dev->trig);
-               iio_trigger_dettach_poll_func(indio_dev->trig,
-                                             indio_dev->pollfunc);
-       }
        iio_dealloc_pollfunc(indio_dev->pollfunc);
        iio_sw_rb_free(indio_dev->ring);
 }
index aab7528..8a5857c 100644 (file)
@@ -469,12 +469,6 @@ error_ret:
 
 static void ad7793_ring_cleanup(struct iio_dev *indio_dev)
 {
-       /* ensure that the trigger has been detached */
-       if (indio_dev->trig) {
-               iio_put_trigger(indio_dev->trig);
-               iio_trigger_dettach_poll_func(indio_dev->trig,
-                                             indio_dev->pollfunc);
-       }
        iio_dealloc_pollfunc(indio_dev->pollfunc);
        iio_sw_rb_free(indio_dev->ring);
 }
index 05ae4a0..cc39eee 100644 (file)
@@ -188,12 +188,6 @@ error_ret:
 
 void ad7887_ring_cleanup(struct iio_dev *indio_dev)
 {
-       /* ensure that the trigger has been detached */
-       if (indio_dev->trig) {
-               iio_put_trigger(indio_dev->trig);
-               iio_trigger_dettach_poll_func(indio_dev->trig,
-                                             indio_dev->pollfunc);
-       }
        iio_dealloc_pollfunc(indio_dev->pollfunc);
        iio_sw_rb_free(indio_dev->ring);
 }
index 7980fe5..e268a61 100644 (file)
@@ -204,12 +204,6 @@ error_ret:
 
 void ad799x_ring_cleanup(struct iio_dev *indio_dev)
 {
-       /* ensure that the trigger has been detached */
-       if (indio_dev->trig) {
-               iio_put_trigger(indio_dev->trig);
-               iio_trigger_dettach_poll_func(indio_dev->trig,
-                                             indio_dev->pollfunc);
-       }
        iio_dealloc_pollfunc(indio_dev->pollfunc);
        iio_sw_rb_free(indio_dev->ring);
 }
index caa63cb..d4db91d 100644 (file)
@@ -195,11 +195,6 @@ error_ret:
 void max1363_ring_cleanup(struct iio_dev *indio_dev)
 {
        /* ensure that the trigger has been detached */
-       if (indio_dev->trig) {
-               iio_put_trigger(indio_dev->trig);
-               iio_trigger_dettach_poll_func(indio_dev->trig,
-                                             indio_dev->pollfunc);
-       }
        iio_dealloc_pollfunc(indio_dev->pollfunc);
        iio_sw_rb_free(indio_dev->ring);
 }
index ccfd558..7012f8c 100644 (file)
@@ -230,6 +230,8 @@ int iio_trigger_attach_poll_func(struct iio_trigger *trig,
        bool notinuse
                = bitmap_empty(trig->pool, CONFIG_IIO_CONSUMERS_PER_TRIGGER);
 
+       /* Prevent the module being removed whilst attached to a trigger */
+       __module_get(pf->indio_dev->info->driver_module);
        pf->irq = iio_trigger_get_irq(trig);
        ret = request_threaded_irq(pf->irq, pf->h, pf->thread,
                                   pf->type, pf->name,
@@ -256,6 +258,7 @@ int iio_trigger_dettach_poll_func(struct iio_trigger *trig,
        }
        iio_trigger_put_irq(trig, pf->irq);
        free_irq(pf->irq, pf);
+       module_put(pf->indio_dev->info->driver_module);
 
 error_ret:
        return ret;
index c29beec..2dec532 100644 (file)
@@ -127,12 +127,6 @@ static const struct iio_ring_setup_ops ade7758_ring_setup_ops = {
 
 void ade7758_unconfigure_ring(struct iio_dev *indio_dev)
 {
-       /* ensure that the trigger has been detached */
-       if (indio_dev->trig) {
-               iio_put_trigger(indio_dev->trig);
-               iio_trigger_dettach_poll_func(indio_dev->trig,
-                                             indio_dev->pollfunc);
-       }
        iio_dealloc_pollfunc(indio_dev->pollfunc);
        iio_sw_rb_free(indio_dev->ring);
 }