- patches.arch/x86_mce_intel_decode_physical_address.patch:
[linux-flexiantxendom0-3.2.10.git] / drivers / staging / iio / accel / kxsd9.c
index db2dd53..ae7ffe1 100644 (file)
@@ -26,6 +26,7 @@
 #include <linux/rtc.h>
 #include <linux/delay.h>
 #include <linux/slab.h>
+#include <linux/string.h>
 
 #include "../iio.h"
 #include "../sysfs.h"
 #define KXSD9_READ(a) (0x80 | (a))
 #define KXSD9_WRITE(a) (a)
 
-#define IIO_DEV_ATTR_ACCEL_SET_RANGE(_mode, _show, _store)     \
-       IIO_DEVICE_ATTR(accel_range, _mode, _show, _store, 0)
+#define KXSD9_SCALE_2G "0.011978"
+#define KXSD9_SCALE_4G "0.023927"
+#define KXSD9_SCALE_6G "0.035934"
+#define KXSD9_SCALE_8G "0.047853"
 
 #define KXSD9_STATE_RX_SIZE 2
 #define KXSD9_STATE_TX_SIZE 4
@@ -73,9 +76,9 @@ struct kxsd9_state {
 };
 
 /* This may want to move to mili g to allow for non integer ranges */
-static ssize_t kxsd9_read_accel_range(struct device *dev,
-                                     struct device_attribute *attr,
-                                     char *buf)
+static ssize_t kxsd9_read_scale(struct device *dev,
+                               struct device_attribute *attr,
+                               char *buf)
 {
        int ret;
        ssize_t len = 0;
@@ -101,16 +104,16 @@ static ssize_t kxsd9_read_accel_range(struct device *dev,
 
        switch (st->rx[1] & KXSD9_FS_MASK) {
        case KXSD9_FS_8:
-               len += sprintf(buf, "8\n");
+               len += sprintf(buf, "%s\n", KXSD9_SCALE_8G);
                break;
        case KXSD9_FS_6:
-               len += sprintf(buf, "6\n");
+               len += sprintf(buf, "%s\n", KXSD9_SCALE_6G);
                break;
        case KXSD9_FS_4:
-               len += sprintf(buf, "4\n");
+               len += sprintf(buf, "%s\n", KXSD9_SCALE_4G);
                break;
        case KXSD9_FS_2:
-               len += sprintf(buf, "2\n");
+               len += sprintf(buf, "%s\n", KXSD9_SCALE_2G);
                break;
        }
 
@@ -119,12 +122,12 @@ error_ret:
 
        return ret ? ret : len;
 }
-static ssize_t kxsd9_write_accel_range(struct device *dev,
-                                     struct device_attribute *attr,
-                                     const char *buf,
-                                     size_t len)
+static ssize_t kxsd9_write_scale(struct device *dev,
+                                struct device_attribute *attr,
+                                const char *buf,
+                                size_t len)
 {
-       long readin;
+
        struct spi_message msg;
        int ret;
        struct iio_dev *indio_dev = dev_get_drvdata(dev);
@@ -145,25 +148,25 @@ static ssize_t kxsd9_write_accel_range(struct device *dev,
                },
        };
 
-       ret = strict_strtol(buf, 10, &readin);
-       if (ret)
-               return ret;
-       switch (readin) {
-       case 8:
+       if (!strncmp(buf, KXSD9_SCALE_8G,
+                    strlen(buf) < strlen(KXSD9_SCALE_8G)
+                    ? strlen(buf) : strlen(KXSD9_SCALE_8G)))
                val = KXSD9_FS_8;
-               break;
-       case 6:
+       else if (!strncmp(buf, KXSD9_SCALE_6G,
+                         strlen(buf) < strlen(KXSD9_SCALE_6G)
+                         ? strlen(buf) : strlen(KXSD9_SCALE_6G)))
                val = KXSD9_FS_6;
-               break;
-       case 4:
+       else if (!strncmp(buf, KXSD9_SCALE_4G,
+                         strlen(buf) < strlen(KXSD9_SCALE_4G)
+                         ? strlen(buf) : strlen(KXSD9_SCALE_4G)))
                val = KXSD9_FS_4;
-               break;
-       case 2:
+       else if (!strncmp(buf, KXSD9_SCALE_2G,
+                         strlen(buf) < strlen(KXSD9_SCALE_2G)
+                         ? strlen(buf) : strlen(KXSD9_SCALE_2G)))
                val = KXSD9_FS_2;
-               break;
-       default:
+       else
                return -EINVAL;
-       }
+
        mutex_lock(&st->buf_lock);
        st->tx[0] = KXSD9_READ(KXSD9_REG_CTRL_C);
        st->tx[1] = 0;
@@ -182,6 +185,7 @@ error_ret:
        mutex_unlock(&st->buf_lock);
        return ret ? ret : len;
 }
+
 static ssize_t kxsd9_read_accel(struct device *dev,
                                struct device_attribute *attr,
                                char *buf)
@@ -227,17 +231,27 @@ error_ret:
 static IIO_DEV_ATTR_ACCEL_X(kxsd9_read_accel, KXSD9_REG_X);
 static IIO_DEV_ATTR_ACCEL_Y(kxsd9_read_accel, KXSD9_REG_Y);
 static IIO_DEV_ATTR_ACCEL_Z(kxsd9_read_accel, KXSD9_REG_Z);
-static IIO_DEV_ATTR_ADC(0, kxsd9_read_accel, KXSD9_REG_AUX);
-static IIO_DEV_ATTR_ACCEL_SET_RANGE(S_IRUGO | S_IWUSR,
-                                   kxsd9_read_accel_range,
-                                   kxsd9_write_accel_range);
+static IIO_DEV_ATTR_IN_RAW(0, kxsd9_read_accel, KXSD9_REG_AUX);
+
+static IIO_DEVICE_ATTR(accel_scale,
+               S_IRUGO | S_IWUSR,
+               kxsd9_read_scale,
+               kxsd9_write_scale,
+               0);
+
+static IIO_CONST_ATTR(accel_scale_available,
+               KXSD9_SCALE_2G " "
+               KXSD9_SCALE_4G " "
+               KXSD9_SCALE_6G " "
+               KXSD9_SCALE_8G);
 
 static struct attribute *kxsd9_attributes[] = {
-       &iio_dev_attr_accel_x.dev_attr.attr,
-       &iio_dev_attr_accel_y.dev_attr.attr,
-       &iio_dev_attr_accel_z.dev_attr.attr,
-       &iio_dev_attr_adc_0.dev_attr.attr,
-       &iio_dev_attr_accel_range.dev_attr.attr,
+       &iio_dev_attr_accel_x_raw.dev_attr.attr,
+       &iio_dev_attr_accel_y_raw.dev_attr.attr,
+       &iio_dev_attr_accel_z_raw.dev_attr.attr,
+       &iio_dev_attr_in0_raw.dev_attr.attr,
+       &iio_dev_attr_accel_scale.dev_attr.attr,
+       &iio_const_attr_accel_scale_available.dev_attr.attr,
        NULL,
 };