]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
staging:iio: fix removal path to allow correct freeing.
authorJonathan Cameron <jic23@cam.ac.uk>
Fri, 14 Oct 2011 13:46:58 +0000 (14:46 +0100)
committerGreg Kroah-Hartman <gregkh@suse.de>
Mon, 17 Oct 2011 22:34:53 +0000 (15:34 -0700)
Fix a dumb lack of consideration of the effect of combining
the iio_device_unregister and iio_free_device calls into
one.  There is no valid place to free some of the sysfs
array elements.

Signed-off-by: Jonathan Cameron <jic23@cam.ac.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
60 files changed:
drivers/staging/iio/accel/adis16201_core.c
drivers/staging/iio/accel/adis16203_core.c
drivers/staging/iio/accel/adis16204_core.c
drivers/staging/iio/accel/adis16209_core.c
drivers/staging/iio/accel/adis16220_core.c
drivers/staging/iio/accel/adis16240_core.c
drivers/staging/iio/accel/kxsd9.c
drivers/staging/iio/accel/lis3l02dq_core.c
drivers/staging/iio/accel/sca3000_core.c
drivers/staging/iio/adc/ad7150.c
drivers/staging/iio/adc/ad7152.c
drivers/staging/iio/adc/ad7192.c
drivers/staging/iio/adc/ad7280a.c
drivers/staging/iio/adc/ad7291.c
drivers/staging/iio/adc/ad7298_core.c
drivers/staging/iio/adc/ad7476_core.c
drivers/staging/iio/adc/ad7606_core.c
drivers/staging/iio/adc/ad7746.c
drivers/staging/iio/adc/ad7780.c
drivers/staging/iio/adc/ad7793.c
drivers/staging/iio/adc/ad7816.c
drivers/staging/iio/adc/ad7887_core.c
drivers/staging/iio/adc/ad799x_core.c
drivers/staging/iio/adc/adt7310.c
drivers/staging/iio/adc/adt7410.c
drivers/staging/iio/adc/max1363_core.c
drivers/staging/iio/addac/adt7316.c
drivers/staging/iio/dac/ad5446.c
drivers/staging/iio/dac/ad5504.c
drivers/staging/iio/dac/ad5624r_spi.c
drivers/staging/iio/dac/ad5686.c
drivers/staging/iio/dac/ad5791.c
drivers/staging/iio/dds/ad5930.c
drivers/staging/iio/dds/ad9832.c
drivers/staging/iio/dds/ad9834.c
drivers/staging/iio/dds/ad9850.c
drivers/staging/iio/dds/ad9852.c
drivers/staging/iio/dds/ad9910.c
drivers/staging/iio/dds/ad9951.c
drivers/staging/iio/gyro/adis16060_core.c
drivers/staging/iio/gyro/adis16080_core.c
drivers/staging/iio/gyro/adis16130_core.c
drivers/staging/iio/gyro/adis16260_core.c
drivers/staging/iio/gyro/adxrs450_core.c
drivers/staging/iio/impedance-analyzer/ad5933.c
drivers/staging/iio/imu/adis16400_core.c
drivers/staging/iio/industrialio-core.c
drivers/staging/iio/light/isl29018.c
drivers/staging/iio/light/tsl2563.c
drivers/staging/iio/light/tsl2583.c
drivers/staging/iio/magnetometer/ak8975.c
drivers/staging/iio/magnetometer/hmc5843.c
drivers/staging/iio/meter/ade7753.c
drivers/staging/iio/meter/ade7754.c
drivers/staging/iio/meter/ade7758_core.c
drivers/staging/iio/meter/ade7759.c
drivers/staging/iio/meter/ade7854.c
drivers/staging/iio/resolver/ad2s1200.c
drivers/staging/iio/resolver/ad2s1210.c
drivers/staging/iio/resolver/ad2s90.c

index d7ec50529052d495adfe3f000b58a2c429769df6..1c5dad537844879e811b850a756344d02a6c6e09 100644 (file)
@@ -532,10 +532,11 @@ static int adis16201_remove(struct spi_device *spi)
 {
        struct iio_dev *indio_dev = spi_get_drvdata(spi);
 
+       iio_device_unregister(indio_dev);
        adis16201_remove_trigger(indio_dev);
        iio_buffer_unregister(indio_dev);
        adis16201_unconfigure_ring(indio_dev);
-       iio_device_unregister(indio_dev);
+       iio_free_device(indio_dev);
 
        return 0;
 }
index 2ffcf4ed3dd171d1c1ce3c1ce7be14c58bc3e1a1..8a3337442afde851d4e98f9772aeef83194e7f8f 100644 (file)
@@ -487,10 +487,11 @@ static int adis16203_remove(struct spi_device *spi)
 {
        struct iio_dev *indio_dev = spi_get_drvdata(spi);
 
+       iio_device_unregister(indio_dev);
        adis16203_remove_trigger(indio_dev);
        iio_buffer_unregister(indio_dev);
        adis16203_unconfigure_ring(indio_dev);
-       iio_device_unregister(indio_dev);
+       iio_free_device(indio_dev);
 
        return 0;
 }
index 1b8b594089577d447b28d39f1d5d8505af84a3ea..644ac8e4d2aa3cce8931518d2a5cb87082401d64 100644 (file)
@@ -560,10 +560,11 @@ static int adis16204_remove(struct spi_device *spi)
 {
        struct iio_dev *indio_dev = spi_get_drvdata(spi);
 
+       iio_device_unregister(indio_dev);
        adis16204_remove_trigger(indio_dev);
        iio_buffer_unregister(indio_dev);
        adis16204_unconfigure_ring(indio_dev);
-       iio_device_unregister(indio_dev);
+       iio_free_device(indio_dev);
 
        return 0;
 }
index d03ac01c8d5212c7922f4c281fe3396d2036618d..0a8571b18b393a0161bacfc15c75d224670c1e5f 100644 (file)
@@ -536,10 +536,11 @@ static int adis16209_remove(struct spi_device *spi)
 
        flush_scheduled_work();
 
+       iio_device_unregister(indio_dev);
        adis16209_remove_trigger(indio_dev);
        iio_buffer_unregister(indio_dev);
        adis16209_unconfigure_ring(indio_dev);
-       iio_device_unregister(indio_dev);
+       iio_free_device(indio_dev);
 
        return 0;
 }
index 15f5f301068f0a9193776d87b1f97df8d3dd02e9..6d4503de192d0da88fe918fd753367bfd5a7b5dd 100644 (file)
@@ -624,7 +624,7 @@ static const struct iio_info adis16220_info = {
 
 static int __devinit adis16220_probe(struct spi_device *spi)
 {
-       int ret, regdone = 0;
+       int ret;
        struct adis16220_state *st;
        struct iio_dev *indio_dev;
 
@@ -652,11 +652,10 @@ static int __devinit adis16220_probe(struct spi_device *spi)
        ret = iio_device_register(indio_dev);
        if (ret)
                goto error_free_dev;
-       regdone = 1;
 
        ret = sysfs_create_bin_file(&indio_dev->dev.kobj, &accel_bin);
        if (ret)
-               goto error_free_dev;
+               goto error_unregister_dev;
 
        ret = sysfs_create_bin_file(&indio_dev->dev.kobj, &adc1_bin);
        if (ret)
@@ -678,11 +677,10 @@ error_rm_adc1_bin:
        sysfs_remove_bin_file(&indio_dev->dev.kobj, &adc1_bin);
 error_rm_accel_bin:
        sysfs_remove_bin_file(&indio_dev->dev.kobj, &accel_bin);
+error_unregister_dev:
+       iio_device_unregister(indio_dev);
 error_free_dev:
-       if (regdone)
-               iio_device_unregister(indio_dev);
-       else
-               iio_free_device(indio_dev);
+       iio_free_device(indio_dev);
 error_ret:
        return ret;
 }
@@ -697,6 +695,7 @@ static int adis16220_remove(struct spi_device *spi)
        sysfs_remove_bin_file(&indio_dev->dev.kobj, &adc1_bin);
        sysfs_remove_bin_file(&indio_dev->dev.kobj, &accel_bin);
        iio_device_unregister(indio_dev);
+       iio_free_device(indio_dev);
 
        return 0;
 }
index ee1e873f17767c0e0cb03521ad3348438ba44923..b8be2925d61c1ae468bdbfa847a8a1fdc7888809 100644 (file)
@@ -589,10 +589,11 @@ static int adis16240_remove(struct spi_device *spi)
 
        flush_scheduled_work();
 
+       iio_device_unregister(indio_dev);
        adis16240_remove_trigger(indio_dev);
        iio_buffer_unregister(indio_dev);
        adis16240_unconfigure_ring(indio_dev);
-       iio_device_unregister(indio_dev);
+       iio_free_device(indio_dev);
 
        return 0;
 }
index eeee808f7f0ca4b9b8254ca13d8f470f11d3b4a6..5238503f68059c440d82ce05d6578c87758ebf58 100644 (file)
@@ -262,6 +262,7 @@ error_ret:
 static int __devexit kxsd9_remove(struct spi_device *spi)
 {
        iio_device_unregister(spi_get_drvdata(spi));
+       iio_free_device(spi_get_drvdata(spi));
 
        return 0;
 }
index 737dd97f44a2e19349b9cb8270a3326648ea49fd..559545a423335261e3d64139f8ff7bc0ef6980e9 100644 (file)
@@ -736,7 +736,7 @@ error_uninitialize_buffer:
 error_unreg_buffer_funcs:
        lis3l02dq_unconfigure_buffer(indio_dev);
 error_free_dev:
-               iio_free_device(indio_dev);
+       iio_free_device(indio_dev);
 error_ret:
        return ret;
 }
@@ -774,6 +774,8 @@ static int lis3l02dq_remove(struct spi_device *spi)
        struct iio_dev *indio_dev = spi_get_drvdata(spi);
        struct lis3l02dq_state *st = iio_priv(indio_dev);
 
+       iio_device_unregister(indio_dev);
+
        ret = lis3l02dq_disable_all_events(indio_dev);
        if (ret)
                goto err_ret;
@@ -789,8 +791,7 @@ static int lis3l02dq_remove(struct spi_device *spi)
        iio_buffer_unregister(indio_dev);
        lis3l02dq_unconfigure_buffer(indio_dev);
 
-       iio_device_unregister(indio_dev);
-
+       iio_free_device(indio_dev);
 err_ret:
        return ret;
 }
index edc62eeddcd5bb506cedfb6a19229976d3ab4318..a44a70589db9eb026b08e92f5de9b505167393bb 100644 (file)
@@ -1122,7 +1122,7 @@ static const struct iio_info sca3000_info_with_temp = {
 
 static int __devinit sca3000_probe(struct spi_device *spi)
 {
-       int ret, regdone = 0;
+       int ret;
        struct sca3000_state *st;
        struct iio_dev *indio_dev;
 
@@ -1154,7 +1154,7 @@ static int __devinit sca3000_probe(struct spi_device *spi)
        ret = iio_device_register(indio_dev);
        if (ret < 0)
                goto error_free_dev;
-       regdone = 1;
+
        ret = iio_buffer_register(indio_dev,
                                  sca3000_channels,
                                  ARRAY_SIZE(sca3000_channels));
@@ -1188,11 +1188,9 @@ error_free_irq:
 error_unregister_ring:
        iio_buffer_unregister(indio_dev);
 error_unregister_dev:
+       iio_device_unregister(indio_dev);
 error_free_dev:
-       if (regdone)
-               iio_device_unregister(indio_dev);
-       else
-               iio_free_device(indio_dev);
+       iio_free_device(indio_dev);
 
 error_ret:
        return ret;
@@ -1227,9 +1225,10 @@ static int sca3000_remove(struct spi_device *spi)
                return ret;
        if (spi->irq)
                free_irq(spi->irq, indio_dev);
+       iio_device_unregister(indio_dev);
        iio_buffer_unregister(indio_dev);
        sca3000_unconfigure_ring(indio_dev);
-       iio_device_unregister(indio_dev);
+       iio_free_device(indio_dev);
 
        return 0;
 }
index 7d0509682fb2ca75036010068cbddda509b821fa..e185f0e052a3b2f6d69861fe4bf2efa408865f16 100644 (file)
@@ -628,13 +628,14 @@ static int __devexit ad7150_remove(struct i2c_client *client)
 {
        struct iio_dev *indio_dev = i2c_get_clientdata(client);
 
+       iio_device_unregister(indio_dev);
        if (client->irq)
                free_irq(client->irq, indio_dev);
 
        if (client->dev.platform_data)
                free_irq(*(unsigned int *)client->dev.platform_data, indio_dev);
 
-       iio_device_unregister(indio_dev);
+       iio_free_device(indio_dev);
 
        return 0;
 }
index f980a093882a4c692c1ae361756b05b7428de949..662584d72a74d7339e1bae66b4af1820da649663 100644 (file)
@@ -519,6 +519,7 @@ static int __devexit ad7152_remove(struct i2c_client *client)
        struct iio_dev *indio_dev = i2c_get_clientdata(client);
 
        iio_device_unregister(indio_dev);
+       iio_free_device(indio_dev);
 
        return 0;
 }
index 29258f4a0955e2c129f6f8e0f241afaf8c74a976..31c376b9d5eb1ec57fb826c1004f5e6f52031257 100644 (file)
@@ -1032,7 +1032,7 @@ static int __devinit ad7192_probe(struct spi_device *spi)
        struct ad7192_platform_data *pdata = spi->dev.platform_data;
        struct ad7192_state *st;
        struct iio_dev *indio_dev;
-       int ret, i , voltage_uv = 0, regdone = 0;
+       int ret, i , voltage_uv = 0;
 
        if (!pdata) {
                dev_err(&spi->dev, "no platform data?\n");
@@ -1090,14 +1090,9 @@ static int __devinit ad7192_probe(struct spi_device *spi)
        if (ret)
                goto error_disable_reg;
 
-       ret = iio_device_register(indio_dev);
-       if (ret)
-               goto error_unreg_ring;
-       regdone = 1;
-
        ret = ad7192_probe_trigger(indio_dev);
        if (ret)
-               goto error_unreg_ring;
+               goto error_ring_cleanup;
 
        ret = iio_buffer_register(indio_dev,
                                  indio_dev->channels,
@@ -1107,15 +1102,18 @@ static int __devinit ad7192_probe(struct spi_device *spi)
 
        ret = ad7192_setup(st);
        if (ret)
-               goto error_uninitialize_ring;
+               goto error_unreg_ring;
 
+       ret = iio_device_register(indio_dev);
+       if (ret < 0)
+               goto error_unreg_ring;
        return 0;
 
-error_uninitialize_ring:
+error_unreg_ring:
        iio_buffer_unregister(indio_dev);
 error_remove_trigger:
        ad7192_remove_trigger(indio_dev);
-error_unreg_ring:
+error_ring_cleanup:
        ad7192_ring_cleanup(indio_dev);
 error_disable_reg:
        if (!IS_ERR(st->reg))
@@ -1124,10 +1122,7 @@ error_put_reg:
        if (!IS_ERR(st->reg))
                regulator_put(st->reg);
 
-       if (regdone)
-               iio_device_unregister(indio_dev);
-       else
-               iio_free_device(indio_dev);
+       iio_free_device(indio_dev);
 
        return ret;
 }
@@ -1137,6 +1132,7 @@ static int ad7192_remove(struct spi_device *spi)
        struct iio_dev *indio_dev = spi_get_drvdata(spi);
        struct ad7192_state *st = iio_priv(indio_dev);
 
+       iio_device_unregister(indio_dev);
        iio_buffer_unregister(indio_dev);
        ad7192_remove_trigger(indio_dev);
        ad7192_ring_cleanup(indio_dev);
@@ -1146,8 +1142,6 @@ static int ad7192_remove(struct spi_device *spi)
                regulator_put(st->reg);
        }
 
-       iio_device_unregister(indio_dev);
-
        return 0;
 }
 
index 386834a9b69d43a07b652d422afa7c488227a969..372d059042f9bbbd456615b4236826032aa7cbe6 100644 (file)
@@ -831,7 +831,7 @@ static int __devinit ad7280_probe(struct spi_device *spi)
 {
        const struct ad7280_platform_data *pdata = spi->dev.platform_data;
        struct ad7280_state *st;
-       int ret, regdone = 0;
+       int ret;
        const unsigned short tACQ_ns[4] = {465, 1010, 1460, 1890};
        const unsigned short nAVG[4] = {1, 2, 4, 8};
        struct iio_dev *indio_dev = iio_allocate_device(sizeof(*st));
@@ -903,21 +903,20 @@ static int __devinit ad7280_probe(struct spi_device *spi)
        ret = iio_device_register(indio_dev);
        if (ret)
                goto error_free_attr;
-       regdone = 1;
 
        if (spi->irq > 0) {
                ret = ad7280_write(st, AD7280A_DEVADDR_MASTER,
                                   AD7280A_ALERT, 1,
                                   AD7280A_ALERT_RELAY_SIG_CHAIN_DOWN);
                if (ret)
-                       goto error_free_attr;
+                       goto error_unregister;
 
                ret = ad7280_write(st, AD7280A_DEVADDR(st->slave_num),
                                   AD7280A_ALERT, 0,
                                   AD7280A_ALERT_GEN_STATIC_HIGH |
                                   (pdata->chain_last_alert_ignore & 0xF));
                if (ret)
-                       goto error_free_attr;
+                       goto error_unregister;
 
                ret = request_threaded_irq(spi->irq,
                                           NULL,
@@ -927,10 +926,12 @@ static int __devinit ad7280_probe(struct spi_device *spi)
                                           indio_dev->name,
                                           indio_dev);
                if (ret)
-                       goto error_free_attr;
+                       goto error_unregister;
        }
 
        return 0;
+error_unregister:
+       iio_device_unregister(indio_dev);
 
 error_free_attr:
        kfree(st->iio_attr);
@@ -939,10 +940,7 @@ error_free_channels:
        kfree(st->channels);
 
 error_free_device:
-       if (regdone)
-               iio_device_unregister(indio_dev);
-       else
-               iio_free_device(indio_dev);
+       iio_free_device(indio_dev);
 
        return ret;
 }
@@ -954,13 +952,14 @@ static int __devexit ad7280_remove(struct spi_device *spi)
 
        if (spi->irq > 0)
                free_irq(spi->irq, indio_dev);
+       iio_device_unregister(indio_dev);
 
        ad7280_write(st, AD7280A_DEVADDR_MASTER, AD7280A_CONTROL_HB, 1,
                        AD7280A_CTRL_HB_PWRDN_SW | st->ctrl_hb);
 
        kfree(st->channels);
        kfree(st->iio_attr);
-       iio_device_unregister(indio_dev);
+       iio_free_device(indio_dev);
 
        return 0;
 }
index acdce8c5092fd8b920793e4537106d27c28933d1..10e79e8ee64d98922f3adb3f75d141843a5ad81a 100644 (file)
@@ -670,6 +670,8 @@ static int __devexit ad7291_remove(struct i2c_client *client)
        struct iio_dev *indio_dev = i2c_get_clientdata(client);
        struct ad7291_chip_info *chip = iio_priv(indio_dev);
 
+       iio_device_unregister(indio_dev);
+
        if (client->irq)
                free_irq(client->irq, indio_dev);
 
@@ -678,7 +680,7 @@ static int __devexit ad7291_remove(struct i2c_client *client)
                regulator_put(chip->reg);
        }
 
-       iio_device_unregister(indio_dev);
+       iio_free_device(indio_dev);
 
        return 0;
 }
index b77272722f5016a791fa1c7bdb2abc32d4bf67f8..c1de73a1ca912d735fa10f414dc729918a7256ce 100644 (file)
@@ -249,14 +249,14 @@ static int __devexit ad7298_remove(struct spi_device *spi)
        struct iio_dev *indio_dev = spi_get_drvdata(spi);
        struct ad7298_state *st = iio_priv(indio_dev);
 
+       iio_device_unregister(indio_dev);
        iio_buffer_unregister(indio_dev);
        ad7298_ring_cleanup(indio_dev);
-       iio_device_unregister(indio_dev);
        if (!IS_ERR(st->reg)) {
                regulator_disable(st->reg);
                regulator_put(st->reg);
        }
-       iio_device_unregister(indio_dev);
+       iio_free_device(indio_dev);
 
        return 0;
 }
index 1953dbf2cbd3dac82dfab506c7ea3fb67a27523b..fd79facc6cae0a9baaa4685c29f6fd36e0fadcc3 100644 (file)
@@ -211,13 +211,14 @@ static int ad7476_remove(struct spi_device *spi)
        struct iio_dev *indio_dev = spi_get_drvdata(spi);
        struct ad7476_state *st = iio_priv(indio_dev);
 
+       iio_device_unregister(indio_dev);
        iio_buffer_unregister(indio_dev);
        ad7476_ring_cleanup(indio_dev);
        if (!IS_ERR(st->reg)) {
                regulator_disable(st->reg);
                regulator_put(st->reg);
        }
-       iio_device_unregister(indio_dev);
+       iio_free_device(indio_dev);
 
        return 0;
 }
index 3c0fb729891a38b5f9c91edc17b583a7dc2149f0..54423ab196fe244517c683fcfa2278d7416851ca 100644 (file)
@@ -545,6 +545,7 @@ int ad7606_remove(struct iio_dev *indio_dev, int irq)
 {
        struct ad7606_state *st = iio_priv(indio_dev);
 
+       iio_device_unregister(indio_dev);
        iio_buffer_unregister(indio_dev);
        ad7606_ring_cleanup(indio_dev);
 
@@ -555,7 +556,7 @@ int ad7606_remove(struct iio_dev *indio_dev, int irq)
        }
 
        ad7606_free_gpios(st);
-       iio_device_unregister(indio_dev);
+       iio_free_device(indio_dev);
 
        return 0;
 }
index 3fe0c1715dce4af055a4b2a6099b6bf266874139..2867943309cc9145f3c36adccfe3c79a31d9a5eb 100644 (file)
@@ -766,6 +766,7 @@ static int __devexit ad7746_remove(struct i2c_client *client)
        struct iio_dev *indio_dev = i2c_get_clientdata(client);
 
        iio_device_unregister(indio_dev);
+       iio_free_device(indio_dev);
 
        return 0;
 }
index a8103c06e749bd406d67fd04c2850082f8f6f0e7..7a579a1fd696e9427e57218a4bf61c83eba8f78b 100644 (file)
@@ -255,13 +255,14 @@ static int ad7780_remove(struct spi_device *spi)
        struct iio_dev *indio_dev = spi_get_drvdata(spi);
        struct ad7780_state *st = iio_priv(indio_dev);
 
+       iio_device_unregister(indio_dev);
        free_irq(spi->irq, st);
        gpio_free(st->pdata->gpio_pdrst);
        if (!IS_ERR(st->reg)) {
                regulator_disable(st->reg);
                regulator_put(st->reg);
        }
-       iio_device_unregister(indio_dev);
+       iio_free_device(indio_dev);
 
        return 0;
 }
index 0a536c5ff36b7791dd1cee643c1a10d3b452425f..a831b92cd08250707cdaf1ff0783f19f00cf87ff 100644 (file)
@@ -1013,6 +1013,7 @@ static int ad7793_remove(struct spi_device *spi)
        struct iio_dev *indio_dev = spi_get_drvdata(spi);
        struct ad7793_state *st = iio_priv(indio_dev);
 
+       iio_device_unregister(indio_dev);
        iio_buffer_unregister(indio_dev);
        ad7793_remove_trigger(indio_dev);
        ad7793_ring_cleanup(indio_dev);
@@ -1022,7 +1023,7 @@ static int ad7793_remove(struct spi_device *spi)
                regulator_put(st->reg);
        }
 
-       iio_device_unregister(indio_dev);
+       iio_free_device(indio_dev);
 
        return 0;
 }
index 1440619d74e025ff43a9f65814f2ed84379c271d..bdb90492b8a54514e8bb61b53c130dfc0f042e0f 100644 (file)
@@ -435,13 +435,14 @@ static int __devexit ad7816_remove(struct spi_device *spi_dev)
        struct iio_dev *indio_dev = dev_get_drvdata(&spi_dev->dev);
        struct ad7816_chip_info *chip = iio_priv(indio_dev);
 
+       iio_device_unregister(indio_dev);
        dev_set_drvdata(&spi_dev->dev, NULL);
        if (spi_dev->irq)
                free_irq(spi_dev->irq, indio_dev);
        gpio_free(chip->busy_pin);
        gpio_free(chip->convert_pin);
        gpio_free(chip->rdwr_pin);
-       iio_device_unregister(indio_dev);
+       iio_free_device(indio_dev);
 
        return 0;
 }
index 9456c032c05362c3e5061fc7ca98f57de57c8037..609dcd5f2ddca796e255638114e8598bfeb58bba 100644 (file)
@@ -230,13 +230,14 @@ static int ad7887_remove(struct spi_device *spi)
        struct iio_dev *indio_dev = spi_get_drvdata(spi);
        struct ad7887_state *st = iio_priv(indio_dev);
 
+       iio_device_unregister(indio_dev);
        iio_buffer_unregister(indio_dev);
        ad7887_ring_cleanup(indio_dev);
        if (!IS_ERR(st->reg)) {
                regulator_disable(st->reg);
                regulator_put(st->reg);
        }
-       iio_device_unregister(indio_dev);
+       iio_free_device(indio_dev);
 
        return 0;
 }
index 2d60539b4e4c8ed7876afe85ddf89e6f366f6564..ee6cd792bec8ab2b2f5a341bbc135d96586fd9d5 100644 (file)
@@ -892,6 +892,7 @@ static __devexit int ad799x_remove(struct i2c_client *client)
        struct iio_dev *indio_dev = i2c_get_clientdata(client);
        struct ad799x_state *st = iio_priv(indio_dev);
 
+       iio_device_unregister(indio_dev);
        if (client->irq > 0)
                free_irq(client->irq, indio_dev);
 
@@ -901,7 +902,7 @@ static __devexit int ad799x_remove(struct i2c_client *client)
                regulator_disable(st->reg);
                regulator_put(st->reg);
        }
-       iio_device_unregister(indio_dev);
+       iio_free_device(indio_dev);
 
        return 0;
 }
index cbbd34922d4083961f0fdb5c5059e4c6bd7be00e..c9e0be3b1cf316fc0b7cdb2ce585ccd8a91c2258 100644 (file)
@@ -856,12 +856,13 @@ static int __devexit adt7310_remove(struct spi_device *spi_dev)
        struct iio_dev *indio_dev = dev_get_drvdata(&spi_dev->dev);
        unsigned long *adt7310_platform_data = spi_dev->dev.platform_data;
 
+       iio_device_unregister(indio_dev);
        dev_set_drvdata(&spi_dev->dev, NULL);
        if (adt7310_platform_data[0])
                free_irq(adt7310_platform_data[0], indio_dev);
        if (spi_dev->irq)
                free_irq(spi_dev->irq, indio_dev);
-       iio_device_unregister(indio_dev);
+       iio_free_device(indio_dev);
 
        return 0;
 }
index cc913bc35108d4f30ec72bb8ee41f88b43f52558..a289e429dc419418e6eae55f544f6fb1736fc372 100644 (file)
@@ -819,11 +819,12 @@ static int __devexit adt7410_remove(struct i2c_client *client)
        struct iio_dev *indio_dev = i2c_get_clientdata(client);
        unsigned long *adt7410_platform_data = client->dev.platform_data;
 
+       iio_device_unregister(indio_dev);
        if (adt7410_platform_data[0])
                free_irq(adt7410_platform_data[0], indio_dev);
        if (client->irq)
                free_irq(client->irq, indio_dev);
-       iio_device_unregister(indio_dev);
+       iio_free_device(indio_dev);
 
        return 0;
 }
index e962f8412d373d64663e5af8b9a25c245095a34b..12db93efaf84d80ed4cd95604ac5431cdde14030 100644 (file)
@@ -1347,6 +1347,7 @@ static int max1363_remove(struct i2c_client *client)
        struct max1363_state *st = iio_priv(indio_dev);
        struct regulator *reg = st->reg;
 
+       iio_device_unregister(indio_dev);
        if (client->irq)
                free_irq(st->client->irq, indio_dev);
        iio_buffer_unregister(indio_dev);
@@ -1356,7 +1357,7 @@ static int max1363_remove(struct i2c_client *client)
                regulator_disable(reg);
                regulator_put(reg);
        }
-       iio_device_unregister(indio_dev);
+       iio_free_device(indio_dev);
 
        return 0;
 }
index d37726e5bde7b897320538f43d5bc96c50a29451..8df24704ff2648439ad5db7b103adc450e1d7729 100644 (file)
@@ -2219,9 +2219,10 @@ int __devexit adt7316_remove(struct device *dev)
        struct iio_dev *indio_dev = dev_get_drvdata(dev);
        struct adt7316_chip_info *chip = iio_priv(indio_dev);
 
+       iio_device_unregister(indio_dev);
        if (chip->bus.irq)
                free_irq(chip->bus.irq, indio_dev);
-       iio_device_unregister(indio_dev);
+       iio_free_device(indio_dev);
 
        return 0;
 }
index dc98867a1605b5d6bd582a4c5cd6f310b8dca3e3..e1c204d51d8c56f55a00ac35b128d88363fb6a56 100644 (file)
@@ -424,13 +424,14 @@ static int ad5446_remove(struct spi_device *spi)
 {
        struct iio_dev *indio_dev = spi_get_drvdata(spi);
        struct ad5446_state *st = iio_priv(indio_dev);
-       struct regulator *reg = st->reg;
 
        iio_device_unregister(indio_dev);
-       if (!IS_ERR(reg)) {
-               regulator_disable(reg);
-               regulator_put(reg);
+       if (!IS_ERR(st->reg)) {
+               regulator_disable(st->reg);
+               regulator_put(st->reg);
        }
+       iio_free_device(indio_dev);
+
        return 0;
 }
 
index c33643f28cb00aeb647ca78fa5ce279e677a3509..60dd6404d689d2dafa0805eb132432588475fc79 100644 (file)
@@ -349,6 +349,7 @@ static int __devexit ad5504_remove(struct spi_device *spi)
        struct iio_dev *indio_dev = spi_get_drvdata(spi);
        struct ad5504_state *st = iio_priv(indio_dev);
 
+       iio_device_unregister(indio_dev);
        if (spi->irq)
                free_irq(spi->irq, indio_dev);
 
@@ -356,8 +357,7 @@ static int __devexit ad5504_remove(struct spi_device *spi)
                regulator_disable(st->reg);
                regulator_put(st->reg);
        }
-
-       iio_device_unregister(indio_dev);
+       iio_free_device(indio_dev);
 
        return 0;
 }
index 2d2c946ba807f5b295dd189b168dee29fb0272f9..284d879003627cd6b78ee4fd2aaccfb3fb2433f2 100644 (file)
@@ -288,11 +288,12 @@ static int __devexit ad5624r_remove(struct spi_device *spi)
        struct iio_dev *indio_dev = spi_get_drvdata(spi);
        struct ad5624r_state *st = iio_priv(indio_dev);
 
+       iio_device_unregister(indio_dev);
        if (!IS_ERR(st->reg)) {
                regulator_disable(st->reg);
                regulator_put(st->reg);
        }
-       iio_device_unregister(indio_dev);
+       iio_free_device(indio_dev);
 
        return 0;
 }
index fa59bfc9bc5fa364431fb5c981f5cef70c6b9dd8..1d50dd17621569434af62906ab3f49b94d00e2b7 100644 (file)
@@ -420,12 +420,12 @@ static int __devexit ad5686_remove(struct spi_device *spi)
        struct iio_dev *indio_dev = spi_get_drvdata(spi);
        struct ad5686_state *st = iio_priv(indio_dev);
 
+       iio_device_unregister(indio_dev);
        if (!IS_ERR(st->reg)) {
                regulator_disable(st->reg);
                regulator_put(st->reg);
        }
-
-       iio_device_unregister(indio_dev);
+       iio_free_device(indio_dev);
 
        return 0;
 }
index 8b1b1b543a88fd62713ddef897e63f6bb7cc1942..fbf446d567171d9654c12cc7ddbc4d0f88e781ba 100644 (file)
@@ -370,6 +370,7 @@ static int __devexit ad5791_remove(struct spi_device *spi)
        struct iio_dev *indio_dev = spi_get_drvdata(spi);
        struct ad5791_state *st = iio_priv(indio_dev);
 
+       iio_device_unregister(indio_dev);
        if (!IS_ERR(st->reg_vdd)) {
                regulator_disable(st->reg_vdd);
                regulator_put(st->reg_vdd);
@@ -379,9 +380,7 @@ static int __devexit ad5791_remove(struct spi_device *spi)
                regulator_disable(st->reg_vss);
                regulator_put(st->reg_vss);
        }
-       iio_device_unregister(indio_dev);
-
-       iio_device_unregister(indio_dev);
+       iio_free_device(indio_dev);
 
        return 0;
 }
index 4847ea2941d4536002b22a5006d2230f76b23c67..f5e368b5665072ea0d58afa897160da40269b2d1 100644 (file)
@@ -130,6 +130,7 @@ error_ret:
 static int __devexit ad5930_remove(struct spi_device *spi)
 {
        iio_device_unregister(spi_get_drvdata(spi));
+       iio_free_device(spi_get_drvdata(spi));
 
        return 0;
 }
index aefcab1c3fe90fc65c2a9e97debf7e6f407b04bd..0db0b3a8c8552f9561bc5171f4cd936082dcf158 100644 (file)
@@ -328,13 +328,14 @@ static int __devexit ad9832_remove(struct spi_device *spi)
 {
        struct iio_dev *indio_dev = spi_get_drvdata(spi);
        struct ad9832_state *st = iio_priv(indio_dev);
-       struct regulator *reg = st->reg;
 
        iio_device_unregister(indio_dev);
-       if (!IS_ERR(reg)) {
-               regulator_disable(reg);
-               regulator_put(reg);
+       if (!IS_ERR(st->reg)) {
+               regulator_disable(st->reg);
+               regulator_put(st->reg);
        }
+       iio_free_device(indio_dev);
+
        return 0;
 }
 
index fe461199801edcb7d7bd2d2fa88646037d6b415f..c468f696fe2584d92da0108e812d06603f9d3948 100644 (file)
@@ -417,13 +417,13 @@ static int __devexit ad9834_remove(struct spi_device *spi)
 {
        struct iio_dev *indio_dev = spi_get_drvdata(spi);
        struct ad9834_state *st = iio_priv(indio_dev);
-       struct regulator *reg = st->reg;
 
        iio_device_unregister(indio_dev);
-       if (!IS_ERR(reg)) {
-               regulator_disable(reg);
-               regulator_put(reg);
+       if (!IS_ERR(st->reg)) {
+               regulator_disable(st->reg);
+               regulator_put(st->reg);
        }
+       iio_free_device(indio_dev);
 
        return 0;
 }
index 7f2dd47334f304bfe87d3ff6c187c5bfde6ad73b..a14771b24c505567e33a1e755993298a3665152d 100644 (file)
@@ -116,6 +116,7 @@ error_ret:
 static int __devexit ad9850_remove(struct spi_device *spi)
 {
        iio_device_unregister(spi_get_drvdata(spi));
+       iio_free_device(spi_get_drvdata(spi));
 
        return 0;
 }
index 7f65b92598d5c43708b58d4496e94c984cfffb97..cfceaa64a53a9e9e086427f7915b5526f96b389d 100644 (file)
@@ -267,6 +267,7 @@ error_ret:
 static int __devexit ad9852_remove(struct spi_device *spi)
 {
        iio_device_unregister(spi_get_drvdata(spi));
+       iio_free_device(spi_get_drvdata(spi));
 
        return 0;
 }
index b72df8ca7235877b99cbac94e6717687c9d47c20..da83d2b88c4ad3d6190eb8973c5204e9fc1cc280 100644 (file)
@@ -400,6 +400,7 @@ error_ret:
 static int __devexit ad9910_remove(struct spi_device *spi)
 {
        iio_device_unregister(spi_get_drvdata(spi));
+       iio_free_device(spi_get_drvdata(spi));
 
        return 0;
 }
index 3d478e7a48fc409328893929da2a4970966b9c59..20c182576deff6474708ba3f6ff598cd4907f0f6 100644 (file)
@@ -211,6 +211,7 @@ error_ret:
 static int __devexit ad9951_remove(struct spi_device *spi)
 {
        iio_device_unregister(spi_get_drvdata(spi));
+       iio_free_device(spi_get_drvdata(spi));
 
        return 0;
 }
index abb6f05ce3db49ff99a418d5c841463e48a57e7b..38cf3f4bf726c582900af9f4940fadf524c51ffc 100644 (file)
@@ -183,6 +183,7 @@ error_ret:
 static int adis16060_r_remove(struct spi_device *spi)
 {
        iio_device_unregister(spi_get_drvdata(spi));
+       iio_free_device(spi_get_drvdata(spi));
 
        return 0;
 }
index 1ca4506a6667f9467d0ec0a829f1898602720d72..5d7a906fec78a2363d9d2de8259e5b6cc1010b84 100644 (file)
@@ -176,6 +176,7 @@ error_ret:
 static int adis16080_remove(struct spi_device *spi)
 {
        iio_device_unregister(spi_get_drvdata(spi));
+       iio_free_device(spi_get_drvdata(spi));
 
        return 0;
 }
index 87670c01f88df83ee1e1db42f8b8f8e54834ebd6..749240d0d8cba74ce2cb588051db35ed46f4e962 100644 (file)
@@ -155,6 +155,7 @@ error_ret:
 static int adis16130_remove(struct spi_device *spi)
 {
        iio_device_unregister(spi_get_drvdata(spi));
+       iio_free_device(spi_get_drvdata(spi));
 
        return 0;
 }
index ccbf2262c4c7222beaf985ae1d1853b5130c1da8..aaa3967f8c03c562a67bf0a346a10a73d1a3ffda 100644 (file)
@@ -672,6 +672,8 @@ static int adis16260_remove(struct spi_device *spi)
        int ret;
        struct iio_dev *indio_dev = spi_get_drvdata(spi);
 
+       iio_device_unregister(indio_dev);
+
        ret = adis16260_stop_device(indio_dev);
        if (ret)
                goto err_ret;
@@ -681,7 +683,7 @@ static int adis16260_remove(struct spi_device *spi)
        adis16260_remove_trigger(indio_dev);
        iio_buffer_unregister(indio_dev);
        adis16260_unconfigure_ring(indio_dev);
-       iio_device_unregister(indio_dev);
+       iio_free_device(indio_dev);
 
 err_ret:
        return ret;
index 912baa15c8c26b51f0f611deb19e0a3f8da46c83..3c3ef796d48e6085b4c8499543e9d7c707db2502 100644 (file)
@@ -324,7 +324,7 @@ static const struct iio_info adxrs450_info = {
 
 static int __devinit adxrs450_probe(struct spi_device *spi)
 {
-       int ret, regdone = 0;
+       int ret;
        struct adxrs450_state *st;
        struct iio_dev *indio_dev;
 
@@ -350,20 +350,16 @@ static int __devinit adxrs450_probe(struct spi_device *spi)
        ret = iio_device_register(indio_dev);
        if (ret)
                goto error_free_dev;
-       regdone = 1;
 
        /* Get the device into a sane initial state */
        ret = adxrs450_initial_setup(indio_dev);
        if (ret)
                goto error_initial;
        return 0;
-
 error_initial:
+       iio_device_unregister(indio_dev);
 error_free_dev:
-       if (regdone)
-               iio_device_unregister(indio_dev);
-       else
-               iio_free_device(indio_dev);
+       iio_free_device(indio_dev);
 
 error_ret:
        return ret;
@@ -372,6 +368,7 @@ error_ret:
 static int adxrs450_remove(struct spi_device *spi)
 {
        iio_device_unregister(spi_get_drvdata(spi));
+       iio_free_device(spi_get_drvdata(spi));
 
        return 0;
 }
index e7ef3b27388b01f68886823bd917dea5dee90779..1086e0befc2872e219302f26ecff082da90daa57 100644 (file)
@@ -768,13 +768,14 @@ static __devexit int ad5933_remove(struct i2c_client *client)
        struct iio_dev *indio_dev = i2c_get_clientdata(client);
        struct ad5933_state *st = iio_priv(indio_dev);
 
+       iio_device_unregister(indio_dev);
        iio_buffer_unregister(indio_dev);
        iio_sw_rb_free(indio_dev->buffer);
        if (!IS_ERR(st->reg)) {
                regulator_disable(st->reg);
                regulator_put(st->reg);
        }
-       iio_device_unregister(indio_dev);
+       iio_free_device(indio_dev);
 
        return 0;
 }
index 365f99ae86e653a4fd468e78e1fc8349f55990be..d082a37c4fb75433d5643cc1f3af83952000e0b6 100644 (file)
@@ -1088,6 +1088,7 @@ static int adis16400_remove(struct spi_device *spi)
        int ret;
        struct iio_dev *indio_dev =  spi_get_drvdata(spi);
 
+       iio_device_unregister(indio_dev);
        ret = adis16400_stop_device(indio_dev);
        if (ret)
                goto err_ret;
@@ -1095,7 +1096,7 @@ static int adis16400_remove(struct spi_device *spi)
        adis16400_remove_trigger(indio_dev);
        iio_buffer_unregister(indio_dev);
        adis16400_unconfigure_ring(indio_dev);
-       iio_device_unregister(indio_dev);
+       iio_free_device(indio_dev);
 
        return 0;
 
index f52fa3a38874d6fdd84e98a830482b6601b6d96a..326e967d54ef035258e7d4c325c4d6c26d731edc 100644 (file)
@@ -971,7 +971,6 @@ static int iio_device_register_eventset(struct iio_dev *indio_dev)
                            l)
                indio_dev->event_interface->group.attrs[attrn++] =
                        &p->dev_attr.attr;
-
        indio_dev->groups[indio_dev->groupcounter++] =
                &indio_dev->event_interface->group;
 
@@ -1002,8 +1001,6 @@ static void iio_dev_release(struct device *device)
                iio_device_unregister_trigger_consumer(indio_dev);
        iio_device_unregister_eventset(indio_dev);
        iio_device_unregister_sysfs(indio_dev);
-       ida_simple_remove(&iio_ida, indio_dev->id);
-       kfree(indio_dev);
 }
 
 static struct device_type iio_dev_type = {
index 6958aa5809ad1498db6394cfbc014853e20f671b..9dc9e6358394e73a727937556c5b99b84b92d48d 100644 (file)
@@ -581,6 +581,7 @@ static int __devexit isl29018_remove(struct i2c_client *client)
 
        dev_dbg(&client->dev, "%s()\n", __func__);
        iio_device_unregister(indio_dev);
+       iio_free_device(indio_dev);
 
        return 0;
 }
index a5e08b32e42c7df4e70725f41727e24cdb611b89..7e984bcf8d7ed505dff5ceea4d411b85b8f57b6c 100644 (file)
@@ -789,6 +789,8 @@ static int tsl2563_remove(struct i2c_client *client)
 {
        struct tsl2563_chip *chip = i2c_get_clientdata(client);
        struct iio_dev *indio_dev = iio_priv_to_dev(chip);
+
+       iio_device_unregister(indio_dev);
        if (!chip->int_enabled)
                cancel_delayed_work(&chip->poweroff_work);
        /* Ensure that interrupts are disabled - then flush any bottom halves */
@@ -799,7 +801,8 @@ static int tsl2563_remove(struct i2c_client *client)
        tsl2563_set_power(chip, 0);
        if (client->irq)
                free_irq(client->irq, indio_dev);
-       iio_device_unregister(indio_dev);
+
+       iio_free_device(indio_dev);
 
        return 0;
 }
index c7daa2fcecf33dc0cefbbfb8d13ffb6f7289a890..80f77cf8e9c22441bc97f1a9ed34086989a01ba5 100644 (file)
@@ -909,6 +909,7 @@ static int taos_resume(struct i2c_client *client)
 static int __devexit taos_remove(struct i2c_client *client)
 {
        iio_device_unregister(i2c_get_clientdata(client));
+       iio_free_device(i2c_get_clientdata(client));
 
        return 0;
 }
index ab0e26cbdba0353694f98d144d2caea4925ab826..8b017127fd4d983fd392b702d10383935126f549 100644 (file)
@@ -546,12 +546,13 @@ static int ak8975_remove(struct i2c_client *client)
 {
        struct iio_dev *indio_dev = i2c_get_clientdata(client);
        struct ak8975_data *data = iio_priv(indio_dev);
-       int eoc_gpio = data->eoc_gpio;
 
        iio_device_unregister(indio_dev);
 
-       if (gpio_is_valid(eoc_gpio))
-               gpio_free(eoc_gpio);
+       if (gpio_is_valid(data->eoc_gpio))
+               gpio_free(data->eoc_gpio);
+
+       iio_free_device(indio_dev);
 
        return 0;
 }
index 04c7ab015b806cf4c63069af3e1a005151314123..fc9ee970888d08886f6baf350c2928b090b15fc6 100644 (file)
@@ -579,9 +579,11 @@ exit:
 static int hmc5843_remove(struct i2c_client *client)
 {
        struct iio_dev *indio_dev = i2c_get_clientdata(client);
+
+       iio_device_unregister(indio_dev);
         /*  sleep mode to save power */
        hmc5843_configure(client, MODE_SLEEP);
-       iio_device_unregister(indio_dev);
+       iio_free_device(indio_dev);
 
        return 0;
 }
index 3be88f28ef92d6aafb5972c2e5229a38a6a22a2b..940fef602b186b4b706158cc04b91830c59309c8 100644 (file)
@@ -558,12 +558,13 @@ static int ade7753_remove(struct spi_device *spi)
        int ret;
        struct iio_dev *indio_dev = spi_get_drvdata(spi);
 
+       iio_device_unregister(indio_dev);
+
        ret = ade7753_stop_device(&(indio_dev->dev));
        if (ret)
                goto err_ret;
 
-       iio_device_unregister(indio_dev);
-
+       iio_free_device(indio_dev);
 err_ret:
        return ret;
 }
index f7b20a22082768765dd9d6fe09d76b5e39ef0167..33f0d327c9fae9126708980a158177cada28a727 100644 (file)
@@ -580,11 +580,12 @@ static int ade7754_remove(struct spi_device *spi)
        int ret;
        struct iio_dev *indio_dev = spi_get_drvdata(spi);
 
+       iio_device_unregister(indio_dev);
        ret = ade7754_stop_device(&(indio_dev->dev));
        if (ret)
                goto err_ret;
 
-       iio_device_unregister(indio_dev);
+       iio_free_device(indio_dev);
 
 err_ret:
        return ret;
index 6ea5c740f7851c02ccfa0f0715f029228dba62e5..c5dafbdf3bda604bbf928316ab88923ef3ff37fe 100644 (file)
@@ -822,6 +822,7 @@ static int ade7758_remove(struct spi_device *spi)
        struct ade7758_state *st = iio_priv(indio_dev);
        int ret;
 
+       iio_device_unregister(indio_dev);
        ret = ade7758_stop_device(&indio_dev->dev);
        if (ret)
                goto err_ret;
@@ -831,9 +832,9 @@ static int ade7758_remove(struct spi_device *spi)
        ade7758_unconfigure_ring(indio_dev);
        kfree(st->tx);
        kfree(st->rx);
-       iio_device_unregister(indio_dev);
 
-       return 0;
+       iio_free_device(indio_dev);
+
 err_ret:
        return ret;
 }
index 511a60500d93ecb8940d6b1b7f5ea4ac097d30bd..b691f10ce988c90c7974d527b085a5defb122d6b 100644 (file)
@@ -502,11 +502,12 @@ static int ade7759_remove(struct spi_device *spi)
        int ret;
        struct iio_dev *indio_dev = spi_get_drvdata(spi);
 
+       iio_device_unregister(indio_dev);
        ret = ade7759_stop_device(&(indio_dev->dev));
        if (ret)
                goto err_ret;
 
-       iio_device_unregister(indio_dev);
+       iio_free_device(indio_dev);
 
 err_ret:
        return ret;
index d438c038e0067b1f5b9d811d8dcbc0835d1bcdc6..49c01c5c1b590a95b6947893c0a14ead61a1bba7 100644 (file)
@@ -590,6 +590,7 @@ EXPORT_SYMBOL(ade7854_probe);
 int ade7854_remove(struct iio_dev *indio_dev)
 {
        iio_device_unregister(indio_dev);
+       iio_free_device(indio_dev);
 
        return 0;
 }
index 26268bfccffe68e61d6727db0f6f4a1203609bef..d7ad46aed0ffc0c374dd93201999fa6185036341 100644 (file)
@@ -150,6 +150,7 @@ error_ret:
 static int __devexit ad2s1200_remove(struct spi_device *spi)
 {
        iio_device_unregister(spi_get_drvdata(spi));
+       iio_free_device(spi_get_drvdata(spi));
 
        return 0;
 }
index 8a6fcb669775d92fb507d2cd0a5934a13498857e..6401a627362540db2450547c552b587e3738da77 100644 (file)
@@ -737,10 +737,10 @@ error_ret:
 static int __devexit ad2s1210_remove(struct spi_device *spi)
 {
        struct iio_dev *indio_dev = spi_get_drvdata(spi);
-       struct ad2s1210_state *st = iio_priv(indio_dev);
 
-       ad2s1210_free_gpios(st);
        iio_device_unregister(indio_dev);
+       ad2s1210_free_gpios(iio_priv(indio_dev));
+       iio_free_device(indio_dev);
 
        return 0;
 }
index 8b3d34dbe23f984a8e9dc2d4d9ab7d32c7962158..a9200d949dcd51f0413c6da6dba68afd6fb12450 100644 (file)
@@ -100,6 +100,7 @@ error_ret:
 static int __devexit ad2s90_remove(struct spi_device *spi)
 {
        iio_device_unregister(spi_get_drvdata(spi));
+       iio_free_device(spi_get_drvdata(spi));
 
        return 0;
 }