staging: iio: tsl2583: convert illuminance0_calibscale sysfs attr to use iio_chan_spec

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>
This commit is contained in:
Brian Masney 2016-10-28 06:00:18 -04:00 committed by Jonathan Cameron
parent b3d941550d
commit 143c30f4a5
1 changed files with 25 additions and 64 deletions

View 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)) {