diff options
Diffstat (limited to 'drivers/staging')
-rw-r--r-- | drivers/staging/iio/Documentation/sysfs-bus-iio-light | 8 | ||||
-rw-r--r-- | drivers/staging/iio/light/isl29018.c | 35 |
2 files changed, 42 insertions, 1 deletions
diff --git a/drivers/staging/iio/Documentation/sysfs-bus-iio-light b/drivers/staging/iio/Documentation/sysfs-bus-iio-light index 21d27740581..edbf470e4e3 100644 --- a/drivers/staging/iio/Documentation/sysfs-bus-iio-light +++ b/drivers/staging/iio/Documentation/sysfs-bus-iio-light | |||
@@ -75,3 +75,11 @@ KernelVersion: 2.6.37 | |||
75 | Contact: linux-iio@vger.kernel.org | 75 | Contact: linux-iio@vger.kernel.org |
76 | Description: | 76 | Description: |
77 | This property gets/sets the sensors ADC analog integration time. | 77 | This property gets/sets the sensors ADC analog integration time. |
78 | |||
79 | What: /sys/bus/iio/devices/device[n]/illuminance0_calibscale | ||
80 | KernelVersion: 2.6.37 | ||
81 | Contact: linux-iio@vger.kernel.org | ||
82 | Description: | ||
83 | Hardware or software applied calibration scale factor assumed | ||
84 | to account for attenuation due to industrial design (glass | ||
85 | filters or aperture holes). | ||
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 @@ | |||
56 | struct isl29018_chip { | 56 | struct isl29018_chip { |
57 | struct i2c_client *client; | 57 | struct i2c_client *client; |
58 | struct mutex lock; | 58 | struct mutex lock; |
59 | unsigned int lux_scale; | ||
59 | unsigned int range; | 60 | unsigned int range; |
60 | unsigned int adc_bit; | 61 | unsigned int adc_bit; |
61 | int prox_scheme; | 62 | int prox_scheme; |
@@ -165,7 +166,7 @@ static int isl29018_read_lux(struct i2c_client *client, int *lux) | |||
165 | if (lux_data < 0) | 166 | if (lux_data < 0) |
166 | return lux_data; | 167 | return lux_data; |
167 | 168 | ||
168 | *lux = (lux_data * chip->range) >> chip->adc_bit; | 169 | *lux = (lux_data * chip->range * chip->lux_scale) >> chip->adc_bit; |
169 | 170 | ||
170 | return 0; | 171 | return 0; |
171 | } | 172 | } |
@@ -263,6 +264,34 @@ static ssize_t get_sensor_data(struct device *dev, char *buf, int mode) | |||
263 | } | 264 | } |
264 | 265 | ||
265 | /* Sysfs interface */ | 266 | /* Sysfs interface */ |
267 | /* lux_scale */ | ||
268 | static ssize_t show_lux_scale(struct device *dev, | ||
269 | struct device_attribute *attr, char *buf) | ||
270 | { | ||
271 | struct iio_dev *indio_dev = dev_get_drvdata(dev); | ||
272 | struct isl29018_chip *chip = indio_dev->dev_data; | ||
273 | |||
274 | return sprintf(buf, "%d\n", chip->lux_scale); | ||
275 | } | ||
276 | |||
277 | static ssize_t store_lux_scale(struct device *dev, | ||
278 | struct device_attribute *attr, const char *buf, size_t count) | ||
279 | { | ||
280 | struct iio_dev *indio_dev = dev_get_drvdata(dev); | ||
281 | struct isl29018_chip *chip = indio_dev->dev_data; | ||
282 | unsigned long lval; | ||
283 | |||
284 | lval = simple_strtoul(buf, NULL, 10); | ||
285 | if (lval == 0) | ||
286 | return -EINVAL; | ||
287 | |||
288 | mutex_lock(&chip->lock); | ||
289 | chip->lux_scale = lval; | ||
290 | mutex_unlock(&chip->lock); | ||
291 | |||
292 | return count; | ||
293 | } | ||
294 | |||
266 | /* range */ | 295 | /* range */ |
267 | static ssize_t show_range(struct device *dev, | 296 | static ssize_t show_range(struct device *dev, |
268 | struct device_attribute *attr, char *buf) | 297 | struct device_attribute *attr, char *buf) |
@@ -411,6 +440,8 @@ static IIO_DEVICE_ATTR(proximity_on_chip_ambient_infrared_supression, | |||
411 | show_prox_infrared_supression, | 440 | show_prox_infrared_supression, |
412 | store_prox_infrared_supression, 0); | 441 | store_prox_infrared_supression, 0); |
413 | static IIO_DEVICE_ATTR(illuminance0_input, S_IRUGO, show_lux, NULL, 0); | 442 | static IIO_DEVICE_ATTR(illuminance0_input, S_IRUGO, show_lux, NULL, 0); |
443 | static IIO_DEVICE_ATTR(illuminance0_calibscale, S_IRUGO | S_IWUSR, | ||
444 | show_lux_scale, store_lux_scale, 0); | ||
414 | static IIO_DEVICE_ATTR(intensity_infrared_raw, S_IRUGO, show_ir, NULL, 0); | 445 | static IIO_DEVICE_ATTR(intensity_infrared_raw, S_IRUGO, show_ir, NULL, 0); |
415 | static IIO_DEVICE_ATTR(proximity_raw, S_IRUGO, show_proxim_ir, NULL, 0); | 446 | static IIO_DEVICE_ATTR(proximity_raw, S_IRUGO, show_proxim_ir, NULL, 0); |
416 | 447 | ||
@@ -423,6 +454,7 @@ static struct attribute *isl29018_attributes[] = { | |||
423 | ISL29018_CONST_ATTR(adc_resolution_available), | 454 | ISL29018_CONST_ATTR(adc_resolution_available), |
424 | ISL29018_DEV_ATTR(proximity_on_chip_ambient_infrared_supression), | 455 | ISL29018_DEV_ATTR(proximity_on_chip_ambient_infrared_supression), |
425 | ISL29018_DEV_ATTR(illuminance0_input), | 456 | ISL29018_DEV_ATTR(illuminance0_input), |
457 | ISL29018_DEV_ATTR(illuminance0_calibscale), | ||
426 | ISL29018_DEV_ATTR(intensity_infrared_raw), | 458 | ISL29018_DEV_ATTR(intensity_infrared_raw), |
427 | ISL29018_DEV_ATTR(proximity_raw), | 459 | ISL29018_DEV_ATTR(proximity_raw), |
428 | NULL | 460 | NULL |
@@ -479,6 +511,7 @@ static int __devinit isl29018_probe(struct i2c_client *client, | |||
479 | 511 | ||
480 | mutex_init(&chip->lock); | 512 | mutex_init(&chip->lock); |
481 | 513 | ||
514 | chip->lux_scale = 1; | ||
482 | chip->range = 1000; | 515 | chip->range = 1000; |
483 | chip->adc_bit = 16; | 516 | chip->adc_bit = 16; |
484 | 517 | ||