iio: core : events ABI for specifying period
[cascardo/linux.git] / drivers / iio / industrialio-event.c
index ea6e06b..35a5b03 100644 (file)
@@ -209,6 +209,7 @@ static const char * const iio_ev_info_text[] = {
        [IIO_EV_INFO_ENABLE] = "en",
        [IIO_EV_INFO_VALUE] = "value",
        [IIO_EV_INFO_HYSTERESIS] = "hysteresis",
+       [IIO_EV_INFO_PERIOD] = "period",
 };
 
 static enum iio_event_direction iio_ev_attr_dir(struct iio_dev_attr *attr)
@@ -270,7 +271,7 @@ static ssize_t iio_ev_value_show(struct device *dev,
 {
        struct iio_dev *indio_dev = dev_to_iio_dev(dev);
        struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
-       int val, val2;
+       int val, val2, val_arr[2];
        int ret;
 
        ret = indio_dev->info->read_event_value(indio_dev,
@@ -279,7 +280,9 @@ static ssize_t iio_ev_value_show(struct device *dev,
                &val, &val2);
        if (ret < 0)
                return ret;
-       return iio_format_value(buf, ret, val, val2);
+       val_arr[0] = val;
+       val_arr[1] = val2;
+       return iio_format_value(buf, ret, 2, val_arr);
 }
 
 static ssize_t iio_ev_value_store(struct device *dev,
@@ -321,7 +324,9 @@ static int iio_device_add_event(struct iio_dev *indio_dev,
        char *postfix;
        int ret;
 
-       for_each_set_bit(i, mask, sizeof(*mask)) {
+       for_each_set_bit(i, mask, sizeof(*mask)*8) {
+               if (i >= ARRAY_SIZE(iio_ev_info_text))
+                       return -EINVAL;
                postfix = kasprintf(GFP_KERNEL, "%s_%s_%s",
                                iio_ev_type_text[type], iio_ev_dir_text[dir],
                                iio_ev_info_text[i]);