]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - drivers/staging/iio/accel/adis16240_core.c
staging:iio: fix removal path to allow correct freeing.
[karo-tx-linux.git] / drivers / staging / iio / accel / adis16240_core.c
index 2c6ced0366d351ae8371d667807e25a74600e129..b8be2925d61c1ae468bdbfa847a8a1fdc7888809 100644 (file)
@@ -21,7 +21,7 @@
 
 #include "../iio.h"
 #include "../sysfs.h"
-#include "../ring_generic.h"
+#include "../buffer_generic.h"
 
 #include "adis16240.h"
 
@@ -325,7 +325,7 @@ err_ret:
        return ret;
 }
 
-static IIO_DEVICE_ATTR(accel_xyz_squared_peak_raw, S_IRUGO,
+static IIO_DEVICE_ATTR(in_accel_xyz_squared_peak_raw, S_IRUGO,
                       adis16240_read_12bit_signed, NULL,
                       ADIS16240_XYZPEAK_OUT);
 
@@ -392,7 +392,7 @@ static int adis16240_read_raw(struct iio_dev *indio_dev,
        case (1 << IIO_CHAN_INFO_SCALE_SEPARATE):
        case (1 << IIO_CHAN_INFO_SCALE_SHARED):
                switch (chan->type) {
-               case IIO_IN:
+               case IIO_VOLTAGE:
                        *val = 0;
                        if (chan->channel == 0)
                                *val2 = 4880;
@@ -469,11 +469,11 @@ static int adis16240_write_raw(struct iio_dev *indio_dev,
 }
 
 static struct iio_chan_spec adis16240_channels[] = {
-       IIO_CHAN(IIO_IN, 0, 1, 0, "supply", 0, 0,
+       IIO_CHAN(IIO_VOLTAGE, 0, 1, 0, "supply", 0, 0,
                 (1 << IIO_CHAN_INFO_SCALE_SEPARATE),
                 in_supply, ADIS16240_SCAN_SUPPLY,
                 IIO_ST('u', 10, 16, 0), 0),
-       IIO_CHAN(IIO_IN, 0, 1, 0, NULL, 1, 0,
+       IIO_CHAN(IIO_VOLTAGE, 0, 1, 0, NULL, 1, 0,
                 0,
                 in_aux, ADIS16240_SCAN_AUX_ADC,
                 IIO_ST('u', 10, 16, 0), 0),
@@ -500,7 +500,7 @@ static struct iio_chan_spec adis16240_channels[] = {
 };
 
 static struct attribute *adis16240_attributes[] = {
-       &iio_dev_attr_accel_xyz_squared_peak_raw.dev_attr.attr,
+       &iio_dev_attr_in_accel_xyz_squared_peak_raw.dev_attr.attr,
        &iio_const_attr_sampling_frequency_available.dev_attr.attr,
        &iio_dev_attr_reset.dev_attr.attr,
        NULL
@@ -519,7 +519,7 @@ static const struct iio_info adis16240_info = {
 
 static int __devinit adis16240_probe(struct spi_device *spi)
 {
-       int ret, regdone = 0;
+       int ret;
        struct adis16240_state *st;
        struct iio_dev *indio_dev;
 
@@ -547,14 +547,9 @@ static int __devinit adis16240_probe(struct spi_device *spi)
        if (ret)
                goto error_free_dev;
 
-       ret = iio_device_register(indio_dev);
-       if (ret)
-               goto error_unreg_ring_funcs;
-       regdone = 1;
-
-       ret = iio_ring_buffer_register_ex(indio_dev, 0,
-                                         adis16240_channels,
-                                         ARRAY_SIZE(adis16240_channels));
+       ret = iio_buffer_register(indio_dev,
+                                 adis16240_channels,
+                                 ARRAY_SIZE(adis16240_channels));
        if (ret) {
                printk(KERN_ERR "failed to initialize the ring\n");
                goto error_unreg_ring_funcs;
@@ -568,6 +563,9 @@ static int __devinit adis16240_probe(struct spi_device *spi)
 
        /* Get the device into a sane initial state */
        ret = adis16240_initial_setup(indio_dev);
+       if (ret)
+               goto error_remove_trigger;
+       ret = iio_device_register(indio_dev);
        if (ret)
                goto error_remove_trigger;
        return 0;
@@ -575,14 +573,11 @@ static int __devinit adis16240_probe(struct spi_device *spi)
 error_remove_trigger:
        adis16240_remove_trigger(indio_dev);
 error_uninitialize_ring:
-       iio_ring_buffer_unregister(indio_dev);
+       iio_buffer_unregister(indio_dev);
 error_unreg_ring_funcs:
        adis16240_unconfigure_ring(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;
 }
@@ -594,10 +589,11 @@ static int adis16240_remove(struct spi_device *spi)
 
        flush_scheduled_work();
 
-       adis16240_remove_trigger(indio_dev);
-       iio_ring_buffer_unregister(indio_dev);
        iio_device_unregister(indio_dev);
+       adis16240_remove_trigger(indio_dev);
+       iio_buffer_unregister(indio_dev);
        adis16240_unconfigure_ring(indio_dev);
+       iio_free_device(indio_dev);
 
        return 0;
 }