staging:iio: fix removal path to allow correct freeing.
[deliverable/linux.git] / drivers / staging / iio / dac / ad5504.c
index 1915f459868b304da85eb54c6d2e764721c9c11f..60dd6404d689d2dafa0805eb132432588475fc79 100644 (file)
@@ -7,7 +7,6 @@
  */
 
 #include <linux/interrupt.h>
-#include <linux/gpio.h>
 #include <linux/fs.h>
 #include <linux/device.h>
 #include <linux/kernel.h>
@@ -15,6 +14,7 @@
 #include <linux/slab.h>
 #include <linux/sysfs.h>
 #include <linux/regulator/consumer.h>
+#include <linux/module.h>
 
 #include "../iio.h"
 #include "../sysfs.h"
@@ -168,10 +168,10 @@ static ssize_t ad5504_show_scale(struct device *dev,
 
        return sprintf(buf, "%d.%03d\n", scale_uv / 1000, scale_uv % 1000);
 }
-static IIO_DEVICE_ATTR(out_scale, S_IRUGO, ad5504_show_scale, NULL, 0);
+static IIO_DEVICE_ATTR(out_voltage_scale, S_IRUGO, ad5504_show_scale, NULL, 0);
 
 #define IIO_DEV_ATTR_OUT_RW_RAW(_num, _show, _store, _addr)            \
-       IIO_DEVICE_ATTR(out##_num##_raw,                                \
+       IIO_DEVICE_ATTR(out_voltage##_num##_raw,                        \
                        S_IRUGO | S_IWUSR, _show, _store, _addr)
 
 static IIO_DEV_ATTR_OUT_RW_RAW(0, ad5504_read_dac,
@@ -183,17 +183,16 @@ static IIO_DEV_ATTR_OUT_RW_RAW(2, ad5504_read_dac,
 static IIO_DEV_ATTR_OUT_RW_RAW(3, ad5504_read_dac,
        ad5504_write_dac, AD5504_ADDR_DAC3);
 
-static IIO_DEVICE_ATTR(out_powerdown_mode, S_IRUGO |
+static IIO_DEVICE_ATTR(out_voltage_powerdown_mode, S_IRUGO |
                        S_IWUSR, ad5504_read_powerdown_mode,
                        ad5504_write_powerdown_mode, 0);
 
-static IIO_CONST_ATTR(out_powerdown_mode_available,
+static IIO_CONST_ATTR(out_voltage_powerdown_mode_available,
                        "20kohm_to_gnd three_state");
 
 #define IIO_DEV_ATTR_DAC_POWERDOWN(_num, _show, _store, _addr)         \
-       IIO_DEVICE_ATTR(out##_num##_powerdown,                          \
+       IIO_DEVICE_ATTR(out_voltage##_num##_powerdown,                  \
                        S_IRUGO | S_IWUSR, _show, _store, _addr)
-
 static IIO_DEV_ATTR_DAC_POWERDOWN(0, ad5504_read_dac_powerdown,
                                   ad5504_write_dac_powerdown, 0);
 static IIO_DEV_ATTR_DAC_POWERDOWN(1, ad5504_read_dac_powerdown,
@@ -204,17 +203,17 @@ static IIO_DEV_ATTR_DAC_POWERDOWN(3, ad5504_read_dac_powerdown,
                                   ad5504_write_dac_powerdown, 3);
 
 static struct attribute *ad5504_attributes[] = {
-       &iio_dev_attr_out0_raw.dev_attr.attr,
-       &iio_dev_attr_out1_raw.dev_attr.attr,
-       &iio_dev_attr_out2_raw.dev_attr.attr,
-       &iio_dev_attr_out3_raw.dev_attr.attr,
-       &iio_dev_attr_out0_powerdown.dev_attr.attr,
-       &iio_dev_attr_out1_powerdown.dev_attr.attr,
-       &iio_dev_attr_out2_powerdown.dev_attr.attr,
-       &iio_dev_attr_out3_powerdown.dev_attr.attr,
-       &iio_dev_attr_out_powerdown_mode.dev_attr.attr,
-       &iio_const_attr_out_powerdown_mode_available.dev_attr.attr,
-       &iio_dev_attr_out_scale.dev_attr.attr,
+       &iio_dev_attr_out_voltage0_raw.dev_attr.attr,
+       &iio_dev_attr_out_voltage1_raw.dev_attr.attr,
+       &iio_dev_attr_out_voltage2_raw.dev_attr.attr,
+       &iio_dev_attr_out_voltage3_raw.dev_attr.attr,
+       &iio_dev_attr_out_voltage0_powerdown.dev_attr.attr,
+       &iio_dev_attr_out_voltage1_powerdown.dev_attr.attr,
+       &iio_dev_attr_out_voltage2_powerdown.dev_attr.attr,
+       &iio_dev_attr_out_voltage3_powerdown.dev_attr.attr,
+       &iio_dev_attr_out_voltage_powerdown_mode.dev_attr.attr,
+       &iio_const_attr_out_voltage_powerdown_mode_available.dev_attr.attr,
+       &iio_dev_attr_out_voltage_scale.dev_attr.attr,
        NULL,
 };
 
@@ -223,11 +222,11 @@ static const struct attribute_group ad5504_attribute_group = {
 };
 
 static struct attribute *ad5501_attributes[] = {
-       &iio_dev_attr_out0_raw.dev_attr.attr,
-       &iio_dev_attr_out0_powerdown.dev_attr.attr,
-       &iio_dev_attr_out_powerdown_mode.dev_attr.attr,
-       &iio_const_attr_out_powerdown_mode_available.dev_attr.attr,
-       &iio_dev_attr_out_scale.dev_attr.attr,
+       &iio_dev_attr_out_voltage0_raw.dev_attr.attr,
+       &iio_dev_attr_out_voltage0_powerdown.dev_attr.attr,
+       &iio_dev_attr_out_voltage_powerdown_mode.dev_attr.attr,
+       &iio_const_attr_out_voltage_powerdown_mode_available.dev_attr.attr,
+       &iio_dev_attr_out_voltage_scale.dev_attr.attr,
        NULL,
 };
 
@@ -246,12 +245,13 @@ static struct attribute *ad5504_ev_attributes[] = {
 
 static struct attribute_group ad5504_ev_attribute_group = {
        .attrs = ad5504_ev_attributes,
+       .name = "events",
 };
 
 static irqreturn_t ad5504_event_handler(int irq, void *private)
 {
-       iio_push_event(private, 0,
-                      IIO_UNMOD_EVENT_CODE(IIO_EV_CLASS_TEMP,
+       iio_push_event(private,
+                      IIO_UNMOD_EVENT_CODE(IIO_TEMP,
                                            0,
                                            IIO_EV_TYPE_THRESH,
                                            IIO_EV_DIR_RISING),
@@ -262,14 +262,12 @@ static irqreturn_t ad5504_event_handler(int irq, void *private)
 
 static const struct iio_info ad5504_info = {
        .attrs = &ad5504_attribute_group,
-       .num_interrupt_lines = 1,
        .event_attrs = &ad5504_ev_attribute_group,
        .driver_module = THIS_MODULE,
 };
 
 static const struct iio_info ad5501_info = {
        .attrs = &ad5501_attribute_group,
-       .num_interrupt_lines = 1,
        .event_attrs = &ad5504_ev_attribute_group,
        .driver_module = THIS_MODULE,
 };
@@ -282,6 +280,11 @@ static int __devinit ad5504_probe(struct spi_device *spi)
        struct regulator *reg;
        int ret, voltage_uv = 0;
 
+       indio_dev = iio_allocate_device(sizeof(*st));
+       if (indio_dev == NULL) {
+               ret = -ENOMEM;
+               goto error_ret;
+       }
        reg = regulator_get(&spi->dev, "vcc");
        if (!IS_ERR(reg)) {
                ret = regulator_enable(reg);
@@ -291,11 +294,6 @@ static int __devinit ad5504_probe(struct spi_device *spi)
                voltage_uv = regulator_get_voltage(reg);
        }
 
-       indio_dev = iio_allocate_device(sizeof(*st));
-       if (indio_dev == NULL) {
-               ret = -ENOMEM;
-               goto error_disable_reg;
-       }
        spi_set_drvdata(spi, indio_dev);
        st = iio_priv(indio_dev);
        if (voltage_uv)
@@ -315,10 +313,6 @@ static int __devinit ad5504_probe(struct spi_device *spi)
                indio_dev->info = &ad5504_info;
        indio_dev->modes = INDIO_DIRECT_MODE;
 
-       ret = iio_device_register(indio_dev);
-       if (ret)
-               goto error_free_dev;
-
        if (spi->irq) {
                ret = request_threaded_irq(spi->irq,
                                           NULL,
@@ -327,22 +321,26 @@ static int __devinit ad5504_probe(struct spi_device *spi)
                                           spi_get_device_id(st->spi)->name,
                                           indio_dev);
                if (ret)
-                       goto error_unreg_iio_device;
+                       goto error_disable_reg;
        }
 
+       ret = iio_device_register(indio_dev);
+       if (ret)
+               goto error_free_irq;
+
        return 0;
 
-error_unreg_iio_device:
-       iio_device_unregister(indio_dev);
-error_free_dev:
-       iio_free_device(indio_dev);
+error_free_irq:
+       free_irq(spi->irq, indio_dev);
 error_disable_reg:
        if (!IS_ERR(reg))
-               regulator_disable(st->reg);
+               regulator_disable(reg);
 error_put_reg:
        if (!IS_ERR(reg))
                regulator_put(reg);
 
+       iio_free_device(indio_dev);
+error_ret:
        return ret;
 }
 
@@ -350,16 +348,16 @@ 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);
-       struct regulator *reg = st->reg;
-       if (spi->irq)
-               free_irq(spi->irq, indio_dev);
 
        iio_device_unregister(indio_dev);
+       if (spi->irq)
+               free_irq(spi->irq, 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;
 }
This page took 0.027593 seconds and 5 git commands to generate.