]> Pileus Git - ~andy/linux/blobdiff - drivers/iio/industrialio-core.c
Merge tag 'char-misc-3.6-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh...
[~andy/linux] / drivers / iio / industrialio-core.c
index 4f947e4377eff4fb6cfbec8d29fd18230e446555..2ec266ef41a38c7d2092041d931c872410fc5999 100644 (file)
@@ -64,14 +64,21 @@ static const char * const iio_chan_type_name_spec[] = {
        [IIO_TIMESTAMP] = "timestamp",
        [IIO_CAPACITANCE] = "capacitance",
        [IIO_ALTVOLTAGE] = "altvoltage",
+       [IIO_CCT] = "cct",
 };
 
 static const char * const iio_modifier_names[] = {
        [IIO_MOD_X] = "x",
        [IIO_MOD_Y] = "y",
        [IIO_MOD_Z] = "z",
+       [IIO_MOD_ROOT_SUM_SQUARED_X_Y] = "sqrt(x^2+y^2)",
+       [IIO_MOD_SUM_SQUARED_X_Y_Z] = "x^2+y^2+z^2",
        [IIO_MOD_LIGHT_BOTH] = "both",
        [IIO_MOD_LIGHT_IR] = "ir",
+       [IIO_MOD_LIGHT_CLEAR] = "clear",
+       [IIO_MOD_LIGHT_RED] = "red",
+       [IIO_MOD_LIGHT_GREEN] = "green",
+       [IIO_MOD_LIGHT_BLUE] = "blue",
 };
 
 /* relies on pairs of these shared then separate */
@@ -289,6 +296,69 @@ static ssize_t iio_write_channel_ext_info(struct device *dev,
                               this_attr->c, buf, len);
 }
 
+ssize_t iio_enum_available_read(struct iio_dev *indio_dev,
+       uintptr_t priv, const struct iio_chan_spec *chan, char *buf)
+{
+       const struct iio_enum *e = (const struct iio_enum *)priv;
+       unsigned int i;
+       size_t len = 0;
+
+       if (!e->num_items)
+               return 0;
+
+       for (i = 0; i < e->num_items; ++i)
+               len += scnprintf(buf + len, PAGE_SIZE - len, "%s ", e->items[i]);
+
+       /* replace last space with a newline */
+       buf[len - 1] = '\n';
+
+       return len;
+}
+EXPORT_SYMBOL_GPL(iio_enum_available_read);
+
+ssize_t iio_enum_read(struct iio_dev *indio_dev,
+       uintptr_t priv, const struct iio_chan_spec *chan, char *buf)
+{
+       const struct iio_enum *e = (const struct iio_enum *)priv;
+       int i;
+
+       if (!e->get)
+               return -EINVAL;
+
+       i = e->get(indio_dev, chan);
+       if (i < 0)
+               return i;
+       else if (i >= e->num_items)
+               return -EINVAL;
+
+       return sprintf(buf, "%s\n", e->items[i]);
+}
+EXPORT_SYMBOL_GPL(iio_enum_read);
+
+ssize_t iio_enum_write(struct iio_dev *indio_dev,
+       uintptr_t priv, const struct iio_chan_spec *chan, const char *buf,
+       size_t len)
+{
+       const struct iio_enum *e = (const struct iio_enum *)priv;
+       unsigned int i;
+       int ret;
+
+       if (!e->set)
+               return -EINVAL;
+
+       for (i = 0; i < e->num_items; i++) {
+               if (sysfs_streq(buf, e->items[i]))
+                       break;
+       }
+
+       if (i == e->num_items)
+               return -EINVAL;
+
+       ret = e->set(indio_dev, chan, i);
+       return ret ? ret : len;
+}
+EXPORT_SYMBOL_GPL(iio_enum_write);
+
 static ssize_t iio_read_channel_info(struct device *dev,
                                     struct device_attribute *attr,
                                     char *buf)