aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/iio
diff options
context:
space:
mode:
authorSrinivas Pandruvada <srinivas.pandruvada@linux.intel.com>2014-04-18 19:22:00 -0400
committerJonathan Cameron <jic23@kernel.org>2014-05-05 05:59:51 -0400
commit371a12339a210561ca43f1ebcbc01fbdbcab9435 (patch)
treede33d8270bcd24c73780c2a47d879b3d5668d38a /drivers/iio
parent0964f706dc7feed8b676cba2dc28937a88e5c4f8 (diff)
iio: hid-sensors: ALS: Raw read support
Added support for raw reading of channel. If the sensor is powered off, it will turn on for reading value. Signed-off-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com> Signed-off-by: Jonathan Cameron <jic23@kernel.org>
Diffstat (limited to 'drivers/iio')
-rw-r--r--drivers/iio/light/hid-sensor-als.c24
1 files changed, 19 insertions, 5 deletions
diff --git a/drivers/iio/light/hid-sensor-als.c b/drivers/iio/light/hid-sensor-als.c
index e124b395f320..f34c94380b41 100644
--- a/drivers/iio/light/hid-sensor-als.c
+++ b/drivers/iio/light/hid-sensor-als.c
@@ -22,6 +22,7 @@
22#include <linux/interrupt.h> 22#include <linux/interrupt.h>
23#include <linux/irq.h> 23#include <linux/irq.h>
24#include <linux/slab.h> 24#include <linux/slab.h>
25#include <linux/delay.h>
25#include <linux/hid-sensor-hub.h> 26#include <linux/hid-sensor-hub.h>
26#include <linux/iio/iio.h> 27#include <linux/iio/iio.h>
27#include <linux/iio/sysfs.h> 28#include <linux/iio/sysfs.h>
@@ -49,6 +50,7 @@ static const struct iio_chan_spec als_channels[] = {
49 .type = IIO_INTENSITY, 50 .type = IIO_INTENSITY,
50 .modified = 1, 51 .modified = 1,
51 .channel2 = IIO_MOD_LIGHT_BOTH, 52 .channel2 = IIO_MOD_LIGHT_BOTH,
53 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
52 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_OFFSET) | 54 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_OFFSET) |
53 BIT(IIO_CHAN_INFO_SCALE) | 55 BIT(IIO_CHAN_INFO_SCALE) |
54 BIT(IIO_CHAN_INFO_SAMP_FREQ) | 56 BIT(IIO_CHAN_INFO_SAMP_FREQ) |
@@ -79,6 +81,7 @@ static int als_read_raw(struct iio_dev *indio_dev,
79 u32 address; 81 u32 address;
80 int ret; 82 int ret;
81 int ret_type; 83 int ret_type;
84 s32 poll_value;
82 85
83 *val = 0; 86 *val = 0;
84 *val2 = 0; 87 *val2 = 0;
@@ -94,12 +97,23 @@ static int als_read_raw(struct iio_dev *indio_dev,
94 report_id = -1; 97 report_id = -1;
95 break; 98 break;
96 } 99 }
97 if (report_id >= 0) 100 if (report_id >= 0) {
101 poll_value = hid_sensor_read_poll_value(
102 &als_state->common_attributes);
103 if (poll_value < 0)
104 return -EINVAL;
105
106 hid_sensor_power_state(&als_state->common_attributes,
107 true);
108 msleep_interruptible(poll_value * 2);
109
98 *val = sensor_hub_input_attr_get_raw_value( 110 *val = sensor_hub_input_attr_get_raw_value(
99 als_state->common_attributes.hsdev, 111 als_state->common_attributes.hsdev,
100 HID_USAGE_SENSOR_ALS, address, 112 HID_USAGE_SENSOR_ALS, address,
101 report_id); 113 report_id);
102 else { 114 hid_sensor_power_state(&als_state->common_attributes,
115 false);
116 } else {
103 *val = 0; 117 *val = 0;
104 return -EINVAL; 118 return -EINVAL;
105 } 119 }