These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / iio / industrialio-core.c
index 4df97f6..159ede6 100644 (file)
@@ -75,12 +75,22 @@ static const char * const iio_chan_type_name_spec[] = {
        [IIO_ENERGY] = "energy",
        [IIO_DISTANCE] = "distance",
        [IIO_VELOCITY] = "velocity",
+       [IIO_CONCENTRATION] = "concentration",
+       [IIO_RESISTANCE] = "resistance",
 };
 
 static const char * const iio_modifier_names[] = {
        [IIO_MOD_X] = "x",
        [IIO_MOD_Y] = "y",
        [IIO_MOD_Z] = "z",
+       [IIO_MOD_X_AND_Y] = "x&y",
+       [IIO_MOD_X_AND_Z] = "x&z",
+       [IIO_MOD_Y_AND_Z] = "y&z",
+       [IIO_MOD_X_AND_Y_AND_Z] = "x&y&z",
+       [IIO_MOD_X_OR_Y] = "x|y",
+       [IIO_MOD_X_OR_Z] = "x|z",
+       [IIO_MOD_Y_OR_Z] = "y|z",
+       [IIO_MOD_X_OR_Y_OR_Z] = "x|y|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",
@@ -101,6 +111,10 @@ static const char * const iio_modifier_names[] = {
        [IIO_MOD_WALKING] = "walking",
        [IIO_MOD_STILL] = "still",
        [IIO_MOD_ROOT_SUM_SQUARED_X_Y_Z] = "sqrt(x^2+y^2+z^2)",
+       [IIO_MOD_I] = "i",
+       [IIO_MOD_Q] = "q",
+       [IIO_MOD_CO2] = "co2",
+       [IIO_MOD_VOC] = "voc",
 };
 
 /* relies on pairs of these shared then separate */
@@ -117,6 +131,8 @@ static const char * const iio_chan_info_postfix[] = {
        [IIO_CHAN_INFO_AVERAGE_RAW] = "mean_raw",
        [IIO_CHAN_INFO_LOW_PASS_FILTER_3DB_FREQUENCY]
        = "filter_low_pass_3db_frequency",
+       [IIO_CHAN_INFO_HIGH_PASS_FILTER_3DB_FREQUENCY]
+       = "filter_high_pass_3db_frequency",
        [IIO_CHAN_INFO_SAMP_FREQ] = "sampling_frequency",
        [IIO_CHAN_INFO_FREQUENCY] = "frequency",
        [IIO_CHAN_INFO_PHASE] = "phase",
@@ -128,6 +144,8 @@ static const char * const iio_chan_info_postfix[] = {
        [IIO_CHAN_INFO_CALIBWEIGHT] = "calibweight",
        [IIO_CHAN_INFO_DEBOUNCE_COUNT] = "debounce_count",
        [IIO_CHAN_INFO_DEBOUNCE_TIME] = "debounce_time",
+       [IIO_CHAN_INFO_CALIBEMISSIVITY] = "calibemissivity",
+       [IIO_CHAN_INFO_OVERSAMPLING_RATIO] = "oversampling_ratio",
 };
 
 /**
@@ -392,10 +410,16 @@ EXPORT_SYMBOL_GPL(iio_enum_write);
 
 /**
  * iio_format_value() - Formats a IIO value into its string representation
- * @buf: The buffer to which the formated value gets written
- * @type: One of the IIO_VAL_... constants. This decides how the val and val2
- *        parameters are formatted.
- * @vals: pointer to the values, exact meaning depends on the type parameter.
+ * @buf:       The buffer to which the formatted value gets written
+ * @type:      One of the IIO_VAL_... constants. This decides how the val
+ *             and val2 parameters are formatted.
+ * @size:      Number of IIO value entries contained in vals
+ * @vals:      Pointer to the values, exact meaning depends on the
+ *             type parameter.
+ *
+ * Return: 0 by default, a negative number on failure or the
+ *        total number of characters written for a type that belongs
+ *        to the IIO_VAL_... constant.
  */
 ssize_t iio_format_value(char *buf, unsigned int type, int size, int *vals)
 {
@@ -631,7 +655,7 @@ int __iio_device_attr_init(struct device_attribute *dev_attr,
                        break;
                case IIO_SEPARATE:
                        if (!chan->indexed) {
-                               WARN_ON("Differential channels must be indexed\n");
+                               WARN(1, "Differential channels must be indexed\n");
                                ret = -EINVAL;
                                goto error_free_full_postfix;
                        }
@@ -942,7 +966,7 @@ static void iio_device_unregister_sysfs(struct iio_dev *indio_dev)
 static void iio_dev_release(struct device *device)
 {
        struct iio_dev *indio_dev = dev_to_iio_dev(device);
-       if (indio_dev->modes & INDIO_BUFFER_TRIGGERED)
+       if (indio_dev->modes & (INDIO_BUFFER_TRIGGERED | INDIO_EVENT_TRIGGERED))
                iio_device_unregister_trigger_consumer(indio_dev);
        iio_device_unregister_eventset(indio_dev);
        iio_device_unregister_sysfs(indio_dev);
@@ -1082,6 +1106,11 @@ EXPORT_SYMBOL_GPL(devm_iio_device_free);
 
 /**
  * iio_chrdev_open() - chrdev file open for buffer access and ioctls
+ * @inode:     Inode structure for identifying the device in the file system
+ * @filp:      File structure for iio device used to keep and later access
+ *             private data
+ *
+ * Return: 0 on success or -EBUSY if the device is already opened
  **/
 static int iio_chrdev_open(struct inode *inode, struct file *filp)
 {
@@ -1100,7 +1129,11 @@ static int iio_chrdev_open(struct inode *inode, struct file *filp)
 
 /**
  * iio_chrdev_release() - chrdev file close buffer access and ioctls
- **/
+ * @inode:     Inode structure pointer for the char device
+ * @filp:      File structure pointer for the char device
+ *
+ * Return: 0 for successful release
+ */
 static int iio_chrdev_release(struct inode *inode, struct file *filp)
 {
        struct iio_dev *indio_dev = container_of(inode->i_cdev,
@@ -1124,6 +1157,8 @@ static long iio_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
 
        if (cmd == IIO_GET_EVENT_FD_IOCTL) {
                fd = iio_event_getfd(indio_dev);
+               if (fd < 0)
+                       return fd;
                if (copy_to_user(ip, &fd, sizeof(fd)))
                        return -EFAULT;
                return 0;
@@ -1212,7 +1247,7 @@ int iio_device_register(struct iio_dev *indio_dev)
                        "Failed to register event set\n");
                goto error_free_sysfs;
        }
-       if (indio_dev->modes & INDIO_BUFFER_TRIGGERED)
+       if (indio_dev->modes & (INDIO_BUFFER_TRIGGERED | INDIO_EVENT_TRIGGERED))
                iio_device_register_trigger_consumer(indio_dev);
 
        if ((indio_dev->modes & INDIO_ALL_BUFFER_MODES) &&