staging:iio:ad7291: Use event spec for threshold hysteresis
authorLars-Peter Clausen <lars@metafoo.de>
Mon, 7 Oct 2013 14:11:00 +0000 (15:11 +0100)
committerJonathan Cameron <jic23@kernel.org>
Sat, 12 Oct 2013 12:04:22 +0000 (13:04 +0100)
Register the event threshold hysteresis attributes by using the new
IIO_EV_INFO_HYSTERESIS event spec type. This allows us to throw away a good
portion of boiler-plate code.

Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
drivers/staging/iio/adc/ad7291.c

index be4d93a..d13f8ae 100644 (file)
@@ -164,92 +164,8 @@ static irqreturn_t ad7291_event_handler(int irq, void *private)
        return IRQ_HANDLED;
 }
 
-static inline ssize_t ad7291_show_hyst(struct device *dev,
-               struct device_attribute *attr,
-               char *buf)
-{
-       struct iio_dev *indio_dev = dev_to_iio_dev(dev);
-       struct ad7291_chip_info *chip = iio_priv(indio_dev);
-       struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
-       u16 data;
-       int ret;
-
-       ret = ad7291_i2c_read(chip, this_attr->address, &data);
-       if (ret < 0)
-               return ret;
-
-       return sprintf(buf, "%d\n", data & AD7291_VALUE_MASK);
-}
-
-static inline ssize_t ad7291_set_hyst(struct device *dev,
-                                     struct device_attribute *attr,
-                                     const char *buf,
-                                     size_t len)
-{
-       struct iio_dev *indio_dev = dev_to_iio_dev(dev);
-       struct ad7291_chip_info *chip = iio_priv(indio_dev);
-       struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
-       u16 data;
-       int ret;
-
-       ret = kstrtou16(buf, 10, &data);
-
-       if (ret < 0)
-               return ret;
-       if (data > AD7291_VALUE_MASK)
-               return -EINVAL;
-
-       ret = ad7291_i2c_write(chip, this_attr->address, data);
-       if (ret < 0)
-               return ret;
-
-       return len;
-}
-
-static IIO_DEVICE_ATTR(in_temp0_thresh_both_hyst_raw,
-                      S_IRUGO | S_IWUSR,
-                      ad7291_show_hyst, ad7291_set_hyst,
-                      AD7291_HYST(8));
-static IIO_DEVICE_ATTR(in_voltage0_thresh_both_hyst_raw,
-                      S_IRUGO | S_IWUSR,
-                      ad7291_show_hyst, ad7291_set_hyst, AD7291_HYST(0));
-static IIO_DEVICE_ATTR(in_voltage1_thresh_both_hyst_raw,
-                      S_IRUGO | S_IWUSR,
-                      ad7291_show_hyst, ad7291_set_hyst, AD7291_HYST(1));
-static IIO_DEVICE_ATTR(in_voltage2_thresh_both_hyst_raw,
-                      S_IRUGO | S_IWUSR,
-                      ad7291_show_hyst, ad7291_set_hyst, AD7291_HYST(2));
-static IIO_DEVICE_ATTR(in_voltage3_thresh_both_hyst_raw,
-                      S_IRUGO | S_IWUSR,
-                      ad7291_show_hyst, ad7291_set_hyst, AD7291_HYST(3));
-static IIO_DEVICE_ATTR(in_voltage4_thresh_both_hyst_raw,
-                      S_IRUGO | S_IWUSR,
-                      ad7291_show_hyst, ad7291_set_hyst, AD7291_HYST(4));
-static IIO_DEVICE_ATTR(in_voltage5_thresh_both_hyst_raw,
-                      S_IRUGO | S_IWUSR,
-                      ad7291_show_hyst, ad7291_set_hyst, AD7291_HYST(5));
-static IIO_DEVICE_ATTR(in_voltage6_thresh_both_hyst_raw,
-                      S_IRUGO | S_IWUSR,
-                      ad7291_show_hyst, ad7291_set_hyst, AD7291_HYST(6));
-static IIO_DEVICE_ATTR(in_voltage7_thresh_both_hyst_raw,
-                      S_IRUGO | S_IWUSR,
-                      ad7291_show_hyst, ad7291_set_hyst, AD7291_HYST(7));
-
-static struct attribute *ad7291_event_attributes[] = {
-       &iio_dev_attr_in_temp0_thresh_both_hyst_raw.dev_attr.attr,
-       &iio_dev_attr_in_voltage0_thresh_both_hyst_raw.dev_attr.attr,
-       &iio_dev_attr_in_voltage1_thresh_both_hyst_raw.dev_attr.attr,
-       &iio_dev_attr_in_voltage2_thresh_both_hyst_raw.dev_attr.attr,
-       &iio_dev_attr_in_voltage3_thresh_both_hyst_raw.dev_attr.attr,
-       &iio_dev_attr_in_voltage4_thresh_both_hyst_raw.dev_attr.attr,
-       &iio_dev_attr_in_voltage5_thresh_both_hyst_raw.dev_attr.attr,
-       &iio_dev_attr_in_voltage6_thresh_both_hyst_raw.dev_attr.attr,
-       &iio_dev_attr_in_voltage7_thresh_both_hyst_raw.dev_attr.attr,
-       NULL,
-};
-
 static unsigned int ad7291_threshold_reg(const struct iio_chan_spec *chan,
-       enum iio_event_direction dir)
+       enum iio_event_direction dir, enum iio_event_info info)
 {
        unsigned int offset;
 
@@ -264,10 +180,18 @@ static unsigned int ad7291_threshold_reg(const struct iio_chan_spec *chan,
            return 0;
        }
 
-       if (dir == IIO_EV_DIR_FALLING)
-               return AD7291_DATA_LOW(offset);
-       else
-               return AD7291_DATA_HIGH(offset);
+       switch (info) {
+       case IIO_EV_INFO_VALUE:
+                       if (dir == IIO_EV_DIR_FALLING)
+                                       return AD7291_DATA_HIGH(offset);
+                       else
+                                       return AD7291_DATA_LOW(offset);
+       case IIO_EV_INFO_HYSTERESIS:
+                       return AD7291_HYST(offset);
+       default:
+                       break;
+       }
+       return 0;
 }
 
 static int ad7291_read_event_value(struct iio_dev *indio_dev,
@@ -281,20 +205,18 @@ static int ad7291_read_event_value(struct iio_dev *indio_dev,
        int ret;
        u16 uval;
 
-       ret = ad7291_i2c_read(chip, ad7291_threshold_reg(chan, dir), &uval);
+       ret = ad7291_i2c_read(chip, ad7291_threshold_reg(chan, dir, info),
+               &uval);
        if (ret < 0)
                return ret;
 
-       switch (chan->type) {
-       case IIO_VOLTAGE:
+       if (info == IIO_EV_INFO_HYSTERESIS || chan->type == IIO_VOLTAGE)
                *val = uval & AD7291_VALUE_MASK;
-               return IIO_VAL_INT;
-       case IIO_TEMP:
+
+       else
                *val = sign_extend32(uval, 11);
-               return IIO_VAL_INT;
-       default:
-               return -EINVAL;
-       };
+
+       return IIO_VAL_INT;
 }
 
 static int ad7291_write_event_value(struct iio_dev *indio_dev,
@@ -306,20 +228,16 @@ static int ad7291_write_event_value(struct iio_dev *indio_dev,
 {
        struct ad7291_chip_info *chip = iio_priv(indio_dev);
 
-       switch (chan->type) {
-       case IIO_VOLTAGE:
+       if (info == IIO_EV_INFO_HYSTERESIS || chan->type == IIO_VOLTAGE) {
                if (val > AD7291_VALUE_MASK || val < 0)
                        return -EINVAL;
-               break;
-       case IIO_TEMP:
+       } else {
                if (val > 2047 || val < -2048)
                        return -EINVAL;
-               break;
-       default:
-               return -EINVAL;
        }
 
-       return ad7291_i2c_write(chip, ad7291_threshold_reg(chan, dir), val);
+       return ad7291_i2c_write(chip, ad7291_threshold_reg(chan, dir, info),
+               val);
 }
 
 static int ad7291_read_event_config(struct iio_dev *indio_dev,
@@ -493,6 +411,10 @@ static const struct iio_event_spec ad7291_events[] = {
                .dir = IIO_EV_DIR_FALLING,
                .mask_separate = BIT(IIO_EV_INFO_VALUE) |
                        BIT(IIO_EV_INFO_ENABLE),
+       }, {
+               .type = IIO_EV_TYPE_THRESH,
+               .dir = IIO_EV_DIR_EITHER,
+               .mask_separate = BIT(IIO_EV_INFO_HYSTERESIS),
        },
 };
 
@@ -528,17 +450,12 @@ static const struct iio_chan_spec ad7291_channels[] = {
        }
 };
 
-static struct attribute_group ad7291_event_attribute_group = {
-       .attrs = ad7291_event_attributes,
-};
-
 static const struct iio_info ad7291_info = {
        .read_raw = &ad7291_read_raw,
        .read_event_config_new = &ad7291_read_event_config,
        .write_event_config_new = &ad7291_write_event_config,
        .read_event_value_new = &ad7291_read_event_value,
        .write_event_value_new = &ad7291_write_event_value,
-       .event_attrs = &ad7291_event_attribute_group,
        .driver_module = THIS_MODULE,
 };