staging: iio: tsl2583: convert illuminance0_calibscale sysfs attr to use iio_chan_spec
authorBrian Masney <masneyb@onstation.org>
Fri, 28 Oct 2016 10:00:18 +0000 (06:00 -0400)
committerJonathan Cameron <jic23@kernel.org>
Tue, 1 Nov 2016 18:50:07 +0000 (18:50 +0000)
The illuminance0_calibscale sysfs attribute is not currently created by
the IIO core. This patch adds the appropriate mask to iio_chan_spec,
along with the appropriate data handling in the read_raw() and
write_raw() functions, so that the sysfs attribute is created by the IIO
core. With this change, this sysfs entry will have its prefix changed
from illuminance0_ to in_illuminance_.

Signed-off-by: Brian Masney <masneyb@onstation.org>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
drivers/staging/iio/light/tsl2583.c

index 6a61a86d0d403b7e077dfbf4a3f88559efbdaac2..bfff6ca54fe5b9b6562bad35d22b2040d9eaeb93 100644 (file)
@@ -124,14 +124,15 @@ static struct taos_lux taos_device_lux[11] = {
 struct gainadj {
        s16 ch0;
        s16 ch1;
+       s16 mean;
 };
 
 /* Index = (0 - 3) Used to validate the gain selection index */
 static const struct gainadj gainadj[] = {
-       { 1, 1 },
-       { 8, 8 },
-       { 16, 16 },
-       { 107, 115 }
+       { 1, 1, 1 },
+       { 8, 8, 8 },
+       { 16, 16, 16 },
+       { 107, 115, 111 }
 };
 
 /*
@@ -505,63 +506,6 @@ static int taos_chip_off(struct iio_dev *indio_dev)
 
 /* Sysfs Interface Functions */
 
-static ssize_t taos_gain_show(struct device *dev,
-                             struct device_attribute *attr, char *buf)
-{
-       struct iio_dev *indio_dev = dev_to_iio_dev(dev);
-       struct tsl2583_chip *chip = iio_priv(indio_dev);
-       char gain[4] = {0};
-
-       switch (chip->taos_settings.als_gain) {
-       case 0:
-               strcpy(gain, "001");
-               break;
-       case 1:
-               strcpy(gain, "008");
-               break;
-       case 2:
-               strcpy(gain, "016");
-               break;
-       case 3:
-               strcpy(gain, "111");
-               break;
-       }
-
-       return sprintf(buf, "%s\n", gain);
-}
-
-static ssize_t taos_gain_store(struct device *dev,
-                              struct device_attribute *attr,
-                              const char *buf, size_t len)
-{
-       struct iio_dev *indio_dev = dev_to_iio_dev(dev);
-       struct tsl2583_chip *chip = iio_priv(indio_dev);
-       int value;
-
-       if (kstrtoint(buf, 0, &value))
-               return -EINVAL;
-
-       switch (value) {
-       case 1:
-               chip->taos_settings.als_gain = 0;
-               break;
-       case 8:
-               chip->taos_settings.als_gain = 1;
-               break;
-       case 16:
-               chip->taos_settings.als_gain = 2;
-               break;
-       case 111:
-               chip->taos_settings.als_gain = 3;
-               break;
-       default:
-               dev_err(dev, "Invalid Gain Index (must be 1,8,16,111)\n");
-               return -1;
-       }
-
-       return len;
-}
-
 static ssize_t taos_gain_available_show(struct device *dev,
                                        struct device_attribute *attr,
                                        char *buf)
@@ -691,8 +635,6 @@ done:
        return ret;
 }
 
-static DEVICE_ATTR(illuminance0_calibscale, S_IRUGO | S_IWUSR,
-               taos_gain_show, taos_gain_store);
 static DEVICE_ATTR(illuminance0_calibscale_available, S_IRUGO,
                taos_gain_available_show, NULL);
 
@@ -707,7 +649,6 @@ static DEVICE_ATTR(illuminance0_lux_table, S_IRUGO | S_IWUSR,
                taos_luxtable_show, taos_luxtable_store);
 
 static struct attribute *sysfs_attrs_ctrl[] = {
-       &dev_attr_illuminance0_calibscale.attr,                 /* Gain  */
        &dev_attr_illuminance0_calibscale_available.attr,
        &dev_attr_illuminance0_integration_time_available.attr,
        &dev_attr_illuminance0_input_target.attr,
@@ -743,6 +684,7 @@ static const struct iio_chan_spec tsl2583_channels[] = {
                .type = IIO_LIGHT,
                .info_mask_separate = BIT(IIO_CHAN_INFO_PROCESSED) |
                                      BIT(IIO_CHAN_INFO_CALIBBIAS) |
+                                     BIT(IIO_CHAN_INFO_CALIBSCALE) |
                                      BIT(IIO_CHAN_INFO_INT_TIME),
        },
 };
@@ -801,6 +743,12 @@ static int tsl2583_read_raw(struct iio_dev *indio_dev,
                        ret = IIO_VAL_INT;
                }
                break;
+       case IIO_CHAN_INFO_CALIBSCALE:
+               if (chan->type == IIO_LIGHT) {
+                       *val = gainadj[chip->taos_settings.als_gain].mean;
+                       ret = IIO_VAL_INT;
+               }
+               break;
        case IIO_CHAN_INFO_INT_TIME:
                if (chan->type == IIO_LIGHT) {
                        *val = 0;
@@ -839,6 +787,19 @@ static int tsl2583_write_raw(struct iio_dev *indio_dev,
                        ret = 0;
                }
                break;
+       case IIO_CHAN_INFO_CALIBSCALE:
+               if (chan->type == IIO_LIGHT) {
+                       int i;
+
+                       for (i = 0; i < ARRAY_SIZE(gainadj); i++) {
+                               if (gainadj[i].mean == val) {
+                                       chip->taos_settings.als_gain = i;
+                                       ret = 0;
+                                       break;
+                               }
+                       }
+               }
+               break;
        case IIO_CHAN_INFO_INT_TIME:
                if (chan->type == IIO_LIGHT && !val && val2 >= 50 &&
                    val2 <= 650 && !(val2 % 50)) {