Merge branch 'upstream' of git://git.linux-mips.org/pub/scm/ralf/upstream-linus
[deliverable/linux.git] / drivers / iio / industrialio-core.c
index 70cb7eb0a75cacc43c8dcdce72fc0ecf74af5398..e6319a9346b2691e855cb5ea04920b8163f3692a 100644 (file)
@@ -25,6 +25,7 @@
 #include <linux/slab.h>
 #include <linux/anon_inodes.h>
 #include <linux/debugfs.h>
+#include <linux/mutex.h>
 #include <linux/iio/iio.h>
 #include "iio_core.h"
 #include "iio_core_trigger.h"
@@ -78,6 +79,7 @@ static const char * const iio_chan_type_name_spec[] = {
        [IIO_CONCENTRATION] = "concentration",
        [IIO_RESISTANCE] = "resistance",
        [IIO_PH] = "ph",
+       [IIO_UVINDEX] = "uvindex",
 };
 
 static const char * const iio_modifier_names[] = {
@@ -100,6 +102,7 @@ static const char * const iio_modifier_names[] = {
        [IIO_MOD_LIGHT_RED] = "red",
        [IIO_MOD_LIGHT_GREEN] = "green",
        [IIO_MOD_LIGHT_BLUE] = "blue",
+       [IIO_MOD_LIGHT_UV] = "uv",
        [IIO_MOD_QUATERNION] = "quaternion",
        [IIO_MOD_TEMP_AMBIENT] = "ambient",
        [IIO_MOD_TEMP_OBJECT] = "object",
@@ -409,6 +412,88 @@ ssize_t iio_enum_write(struct iio_dev *indio_dev,
 }
 EXPORT_SYMBOL_GPL(iio_enum_write);
 
+static const struct iio_mount_matrix iio_mount_idmatrix = {
+       .rotation = {
+               "1", "0", "0",
+               "0", "1", "0",
+               "0", "0", "1"
+       }
+};
+
+static int iio_setup_mount_idmatrix(const struct device *dev,
+                                   struct iio_mount_matrix *matrix)
+{
+       *matrix = iio_mount_idmatrix;
+       dev_info(dev, "mounting matrix not found: using identity...\n");
+       return 0;
+}
+
+ssize_t iio_show_mount_matrix(struct iio_dev *indio_dev, uintptr_t priv,
+                             const struct iio_chan_spec *chan, char *buf)
+{
+       const struct iio_mount_matrix *mtx = ((iio_get_mount_matrix_t *)
+                                             priv)(indio_dev, chan);
+
+       if (IS_ERR(mtx))
+               return PTR_ERR(mtx);
+
+       if (!mtx)
+               mtx = &iio_mount_idmatrix;
+
+       return snprintf(buf, PAGE_SIZE, "%s, %s, %s; %s, %s, %s; %s, %s, %s\n",
+                       mtx->rotation[0], mtx->rotation[1], mtx->rotation[2],
+                       mtx->rotation[3], mtx->rotation[4], mtx->rotation[5],
+                       mtx->rotation[6], mtx->rotation[7], mtx->rotation[8]);
+}
+EXPORT_SYMBOL_GPL(iio_show_mount_matrix);
+
+/**
+ * of_iio_read_mount_matrix() - retrieve iio device mounting matrix from
+ *                              device-tree "mount-matrix" property
+ * @dev:       device the mounting matrix property is assigned to
+ * @propname:  device specific mounting matrix property name
+ * @matrix:    where to store retrieved matrix
+ *
+ * If device is assigned no mounting matrix property, a default 3x3 identity
+ * matrix will be filled in.
+ *
+ * Return: 0 if success, or a negative error code on failure.
+ */
+#ifdef CONFIG_OF
+int of_iio_read_mount_matrix(const struct device *dev,
+                            const char *propname,
+                            struct iio_mount_matrix *matrix)
+{
+       if (dev->of_node) {
+               int err = of_property_read_string_array(dev->of_node,
+                               propname, matrix->rotation,
+                               ARRAY_SIZE(iio_mount_idmatrix.rotation));
+
+               if (err == ARRAY_SIZE(iio_mount_idmatrix.rotation))
+                       return 0;
+
+               if (err >= 0)
+                       /* Invalid number of matrix entries. */
+                       return -EINVAL;
+
+               if (err != -EINVAL)
+                       /* Invalid matrix declaration format. */
+                       return err;
+       }
+
+       /* Matrix was not declared at all: fallback to identity. */
+       return iio_setup_mount_idmatrix(dev, matrix);
+}
+#else
+int of_iio_read_mount_matrix(const struct device *dev,
+                            const char *propname,
+                            struct iio_mount_matrix *matrix)
+{
+       return iio_setup_mount_idmatrix(dev, matrix);
+}
+#endif
+EXPORT_SYMBOL(of_iio_read_mount_matrix);
+
 /**
  * iio_format_value() - Formats a IIO value into its string representation
  * @buf:       The buffer to which the formatted value gets written
@@ -1375,6 +1460,44 @@ void devm_iio_device_unregister(struct device *dev, struct iio_dev *indio_dev)
 }
 EXPORT_SYMBOL_GPL(devm_iio_device_unregister);
 
+/**
+ * iio_device_claim_direct_mode - Keep device in direct mode
+ * @indio_dev: the iio_dev associated with the device
+ *
+ * If the device is in direct mode it is guaranteed to stay
+ * that way until iio_device_release_direct_mode() is called.
+ *
+ * Use with iio_device_release_direct_mode()
+ *
+ * Returns: 0 on success, -EBUSY on failure
+ */
+int iio_device_claim_direct_mode(struct iio_dev *indio_dev)
+{
+       mutex_lock(&indio_dev->mlock);
+
+       if (iio_buffer_enabled(indio_dev)) {
+               mutex_unlock(&indio_dev->mlock);
+               return -EBUSY;
+       }
+       return 0;
+}
+EXPORT_SYMBOL_GPL(iio_device_claim_direct_mode);
+
+/**
+ * iio_device_release_direct_mode - releases claim on direct mode
+ * @indio_dev: the iio_dev associated with the device
+ *
+ * Release the claim. Device is no longer guaranteed to stay
+ * in direct mode.
+ *
+ * Use with iio_device_claim_direct_mode()
+ */
+void iio_device_release_direct_mode(struct iio_dev *indio_dev)
+{
+       mutex_unlock(&indio_dev->mlock);
+}
+EXPORT_SYMBOL_GPL(iio_device_release_direct_mode);
+
 subsys_initcall(iio_init);
 module_exit(iio_exit);
 
This page took 0.04186 seconds and 5 git commands to generate.