aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/iio/magnetometer/hid-sensor-magn-3d.c
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:52 -0400
commit8009c594a5b523444a18cfb65211d38a5e459a8a (patch)
tree702a358c838a77036817df86712f4184b9a67482 /drivers/iio/magnetometer/hid-sensor-magn-3d.c
parent1eef062042751822e9f9de418b0f712c6f9b93e8 (diff)
iio: hid-sensors: Compass 3D: 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/magnetometer/hid-sensor-magn-3d.c')
-rw-r--r--drivers/iio/magnetometer/hid-sensor-magn-3d.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/drivers/iio/magnetometer/hid-sensor-magn-3d.c b/drivers/iio/magnetometer/hid-sensor-magn-3d.c
index 54eea6a17061..41cf29e2a371 100644
--- a/drivers/iio/magnetometer/hid-sensor-magn-3d.c
+++ b/drivers/iio/magnetometer/hid-sensor-magn-3d.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>
@@ -60,6 +61,7 @@ static const struct iio_chan_spec magn_3d_channels[] = {
60 .type = IIO_MAGN, 61 .type = IIO_MAGN,
61 .modified = 1, 62 .modified = 1,
62 .channel2 = IIO_MOD_X, 63 .channel2 = IIO_MOD_X,
64 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
63 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_OFFSET) | 65 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_OFFSET) |
64 BIT(IIO_CHAN_INFO_SCALE) | 66 BIT(IIO_CHAN_INFO_SCALE) |
65 BIT(IIO_CHAN_INFO_SAMP_FREQ) | 67 BIT(IIO_CHAN_INFO_SAMP_FREQ) |
@@ -69,6 +71,7 @@ static const struct iio_chan_spec magn_3d_channels[] = {
69 .type = IIO_MAGN, 71 .type = IIO_MAGN,
70 .modified = 1, 72 .modified = 1,
71 .channel2 = IIO_MOD_Y, 73 .channel2 = IIO_MOD_Y,
74 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
72 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_OFFSET) | 75 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_OFFSET) |
73 BIT(IIO_CHAN_INFO_SCALE) | 76 BIT(IIO_CHAN_INFO_SCALE) |
74 BIT(IIO_CHAN_INFO_SAMP_FREQ) | 77 BIT(IIO_CHAN_INFO_SAMP_FREQ) |
@@ -78,6 +81,7 @@ static const struct iio_chan_spec magn_3d_channels[] = {
78 .type = IIO_MAGN, 81 .type = IIO_MAGN,
79 .modified = 1, 82 .modified = 1,
80 .channel2 = IIO_MOD_Z, 83 .channel2 = IIO_MOD_Z,
84 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
81 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_OFFSET) | 85 .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_OFFSET) |
82 BIT(IIO_CHAN_INFO_SCALE) | 86 BIT(IIO_CHAN_INFO_SCALE) |
83 BIT(IIO_CHAN_INFO_SAMP_FREQ) | 87 BIT(IIO_CHAN_INFO_SAMP_FREQ) |
@@ -108,11 +112,20 @@ static int magn_3d_read_raw(struct iio_dev *indio_dev,
108 u32 address; 112 u32 address;
109 int ret; 113 int ret;
110 int ret_type; 114 int ret_type;
115 s32 poll_value;
111 116
112 *val = 0; 117 *val = 0;
113 *val2 = 0; 118 *val2 = 0;
114 switch (mask) { 119 switch (mask) {
115 case 0: 120 case 0:
121 poll_value = hid_sensor_read_poll_value(
122 &magn_state->common_attributes);
123 if (poll_value < 0)
124 return -EINVAL;
125
126 hid_sensor_power_state(&magn_state->common_attributes, true);
127 msleep_interruptible(poll_value * 2);
128
116 report_id = 129 report_id =
117 magn_state->magn[chan->scan_index].report_id; 130 magn_state->magn[chan->scan_index].report_id;
118 address = magn_3d_addresses[chan->scan_index]; 131 address = magn_3d_addresses[chan->scan_index];
@@ -123,8 +136,11 @@ static int magn_3d_read_raw(struct iio_dev *indio_dev,
123 report_id); 136 report_id);
124 else { 137 else {
125 *val = 0; 138 *val = 0;
139 hid_sensor_power_state(&magn_state->common_attributes,
140 false);
126 return -EINVAL; 141 return -EINVAL;
127 } 142 }
143 hid_sensor_power_state(&magn_state->common_attributes, false);
128 ret_type = IIO_VAL_INT; 144 ret_type = IIO_VAL_INT;
129 break; 145 break;
130 case IIO_CHAN_INFO_SCALE: 146 case IIO_CHAN_INFO_SCALE: