diff options
| author | Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com> | 2014-04-18 19:22:00 -0400 |
|---|---|---|
| committer | Jonathan Cameron <jic23@kernel.org> | 2014-05-05 05:59:47 -0400 |
| commit | 92463fdab5d8e5f97d96478383c3d3e5385e867b (patch) | |
| tree | 3f124e75e87c681c173df897c9b79831491cc1dc /drivers/iio/magnetometer | |
| parent | 36783d09f1a5c0fdfe9c0d177b5491f0ed0509ce (diff) | |
iio: hid-sensors: Compass 3D: adjust scale and offset
Using units and unit exponent to calculate scale which is compliant
to IIO ABI.
Signed-off-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
Diffstat (limited to 'drivers/iio/magnetometer')
| -rw-r--r-- | drivers/iio/magnetometer/hid-sensor-magn-3d.c | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/drivers/iio/magnetometer/hid-sensor-magn-3d.c b/drivers/iio/magnetometer/hid-sensor-magn-3d.c index 6d162b7e7af5..131ced0dcb1c 100644 --- a/drivers/iio/magnetometer/hid-sensor-magn-3d.c +++ b/drivers/iio/magnetometer/hid-sensor-magn-3d.c | |||
| @@ -42,6 +42,10 @@ struct magn_3d_state { | |||
| 42 | struct hid_sensor_common common_attributes; | 42 | struct hid_sensor_common common_attributes; |
| 43 | struct hid_sensor_hub_attribute_info magn[MAGN_3D_CHANNEL_MAX]; | 43 | struct hid_sensor_hub_attribute_info magn[MAGN_3D_CHANNEL_MAX]; |
| 44 | u32 magn_val[MAGN_3D_CHANNEL_MAX]; | 44 | u32 magn_val[MAGN_3D_CHANNEL_MAX]; |
| 45 | int scale_pre_decml; | ||
| 46 | int scale_post_decml; | ||
| 47 | int scale_precision; | ||
| 48 | int value_offset; | ||
| 45 | }; | 49 | }; |
| 46 | 50 | ||
| 47 | static const u32 magn_3d_addresses[MAGN_3D_CHANNEL_MAX] = { | 51 | static const u32 magn_3d_addresses[MAGN_3D_CHANNEL_MAX] = { |
| @@ -124,12 +128,12 @@ static int magn_3d_read_raw(struct iio_dev *indio_dev, | |||
| 124 | ret_type = IIO_VAL_INT; | 128 | ret_type = IIO_VAL_INT; |
| 125 | break; | 129 | break; |
| 126 | case IIO_CHAN_INFO_SCALE: | 130 | case IIO_CHAN_INFO_SCALE: |
| 127 | *val = magn_state->magn[CHANNEL_SCAN_INDEX_X].units; | 131 | *val = magn_state->scale_pre_decml; |
| 128 | ret_type = IIO_VAL_INT; | 132 | *val2 = magn_state->scale_post_decml; |
| 133 | ret_type = magn_state->scale_precision; | ||
| 129 | break; | 134 | break; |
| 130 | case IIO_CHAN_INFO_OFFSET: | 135 | case IIO_CHAN_INFO_OFFSET: |
| 131 | *val = hid_sensor_convert_exponent( | 136 | *val = magn_state->value_offset; |
| 132 | magn_state->magn[CHANNEL_SCAN_INDEX_X].unit_expo); | ||
| 133 | ret_type = IIO_VAL_INT; | 137 | ret_type = IIO_VAL_INT; |
| 134 | break; | 138 | break; |
| 135 | case IIO_CHAN_INFO_SAMP_FREQ: | 139 | case IIO_CHAN_INFO_SAMP_FREQ: |
| @@ -263,6 +267,11 @@ static int magn_3d_parse_report(struct platform_device *pdev, | |||
| 263 | st->magn[1].index, st->magn[1].report_id, | 267 | st->magn[1].index, st->magn[1].report_id, |
| 264 | st->magn[2].index, st->magn[2].report_id); | 268 | st->magn[2].index, st->magn[2].report_id); |
| 265 | 269 | ||
| 270 | st->scale_precision = hid_sensor_format_scale( | ||
| 271 | HID_USAGE_SENSOR_COMPASS_3D, | ||
| 272 | &st->magn[CHANNEL_SCAN_INDEX_X], | ||
| 273 | &st->scale_pre_decml, &st->scale_post_decml); | ||
| 274 | |||
| 266 | /* Set Sensitivity field ids, when there is no individual modifier */ | 275 | /* Set Sensitivity field ids, when there is no individual modifier */ |
| 267 | if (st->common_attributes.sensitivity.index < 0) { | 276 | if (st->common_attributes.sensitivity.index < 0) { |
| 268 | sensor_hub_input_get_attribute_info(hsdev, | 277 | sensor_hub_input_get_attribute_info(hsdev, |
