diff options
author | Bryan Freed <bfreed@chromium.org> | 2011-06-28 16:46:33 -0700 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2011-07-05 20:29:17 -0700 |
commit | 6d1ad0f8aa9d3caf6e3f26ad39b43c687abd9c82 (patch) | |
tree | 70ed94defa401d31d618e0f34442286761eef55e /drivers/staging/iio/light | |
parent | 03bda05d9ced3a80b2265d9da611c6670840abc7 (diff) |
staging: iio: light sensor: Add a calibscale file to the isl29018 light sensor driver.
Defaulting to 1, this gives a way to amplify the lux value before being
reduced by the programmed adc_bit shift.
Only support whole numbers right now. When this driver is converted to the new
IIO_CHAN framework, it will be easy to support the framework's pseudo float.
Add illuminance0_calibscale documentation to sysfs-bus-iio-light.
Signed-off-by: Bryan Freed <bfreed@chromium.org>
Acked-by: Rhyland Klein <rklein@nvidia.com>
Acked-by: Jonathan Cameron <jic23@cam.ac.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/staging/iio/light')
-rw-r--r-- | drivers/staging/iio/light/isl29018.c | 35 |
1 files changed, 34 insertions, 1 deletions
diff --git a/drivers/staging/iio/light/isl29018.c b/drivers/staging/iio/light/isl29018.c index fc5712ab126..cc6d71837e1 100644 --- a/drivers/staging/iio/light/isl29018.c +++ b/drivers/staging/iio/light/isl29018.c @@ -56,6 +56,7 @@ struct isl29018_chip { struct i2c_client *client; struct mutex lock; + unsigned int lux_scale; unsigned int range; unsigned int adc_bit; int prox_scheme; @@ -165,7 +166,7 @@ static int isl29018_read_lux(struct i2c_client *client, int *lux) if (lux_data < 0) return lux_data; - *lux = (lux_data * chip->range) >> chip->adc_bit; + *lux = (lux_data * chip->range * chip->lux_scale) >> chip->adc_bit; return 0; } @@ -263,6 +264,34 @@ static ssize_t get_sensor_data(struct device *dev, char *buf, int mode) } /* Sysfs interface */ +/* lux_scale */ +static ssize_t show_lux_scale(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct iio_dev *indio_dev = dev_get_drvdata(dev); + struct isl29018_chip *chip = indio_dev->dev_data; + + return sprintf(buf, "%d\n", chip->lux_scale); +} + +static ssize_t store_lux_scale(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + struct iio_dev *indio_dev = dev_get_drvdata(dev); + struct isl29018_chip *chip = indio_dev->dev_data; + unsigned long lval; + + lval = simple_strtoul(buf, NULL, 10); + if (lval == 0) + return -EINVAL; + + mutex_lock(&chip->lock); + chip->lux_scale = lval; + mutex_unlock(&chip->lock); + + return count; +} + /* range */ static ssize_t show_range(struct device *dev, struct device_attribute *attr, char *buf) @@ -411,6 +440,8 @@ static IIO_DEVICE_ATTR(proximity_on_chip_ambient_infrared_supression, show_prox_infrared_supression, store_prox_infrared_supression, 0); static IIO_DEVICE_ATTR(illuminance0_input, S_IRUGO, show_lux, NULL, 0); +static IIO_DEVICE_ATTR(illuminance0_calibscale, S_IRUGO | S_IWUSR, + show_lux_scale, store_lux_scale, 0); static IIO_DEVICE_ATTR(intensity_infrared_raw, S_IRUGO, show_ir, NULL, 0); static IIO_DEVICE_ATTR(proximity_raw, S_IRUGO, show_proxim_ir, NULL, 0); @@ -423,6 +454,7 @@ static struct attribute *isl29018_attributes[] = { ISL29018_CONST_ATTR(adc_resolution_available), ISL29018_DEV_ATTR(proximity_on_chip_ambient_infrared_supression), ISL29018_DEV_ATTR(illuminance0_input), + ISL29018_DEV_ATTR(illuminance0_calibscale), ISL29018_DEV_ATTR(intensity_infrared_raw), ISL29018_DEV_ATTR(proximity_raw), NULL @@ -479,6 +511,7 @@ static int __devinit isl29018_probe(struct i2c_client *client, mutex_init(&chip->lock); + chip->lux_scale = 1; chip->range = 1000; chip->adc_bit = 16; |