|
@@ -31,6 +31,10 @@ struct dev_rot_state {
|
|
|
struct hid_sensor_common common_attributes;
|
|
|
struct hid_sensor_hub_attribute_info quaternion;
|
|
|
u32 sampled_vals[4];
|
|
|
+ int scale_pre_decml;
|
|
|
+ int scale_post_decml;
|
|
|
+ int scale_precision;
|
|
|
+ int value_offset;
|
|
|
};
|
|
|
|
|
|
/* Channel definitions */
|
|
@@ -41,6 +45,8 @@ static const struct iio_chan_spec dev_rot_channels[] = {
|
|
|
.channel2 = IIO_MOD_QUATERNION,
|
|
|
.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
|
|
|
.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SAMP_FREQ) |
|
|
|
+ BIT(IIO_CHAN_INFO_OFFSET) |
|
|
|
+ BIT(IIO_CHAN_INFO_SCALE) |
|
|
|
BIT(IIO_CHAN_INFO_HYSTERESIS)
|
|
|
}
|
|
|
};
|
|
@@ -80,6 +86,15 @@ static int dev_rot_read_raw(struct iio_dev *indio_dev,
|
|
|
} else
|
|
|
ret_type = -EINVAL;
|
|
|
break;
|
|
|
+ case IIO_CHAN_INFO_SCALE:
|
|
|
+ vals[0] = rot_state->scale_pre_decml;
|
|
|
+ vals[1] = rot_state->scale_post_decml;
|
|
|
+ return rot_state->scale_precision;
|
|
|
+
|
|
|
+ case IIO_CHAN_INFO_OFFSET:
|
|
|
+ *vals = rot_state->value_offset;
|
|
|
+ return IIO_VAL_INT;
|
|
|
+
|
|
|
case IIO_CHAN_INFO_SAMP_FREQ:
|
|
|
ret_type = hid_sensor_read_samp_freq_value(
|
|
|
&rot_state->common_attributes, &vals[0], &vals[1]);
|
|
@@ -199,6 +214,11 @@ static int dev_rot_parse_report(struct platform_device *pdev,
|
|
|
dev_dbg(&pdev->dev, "dev_rot: attrib size %d\n",
|
|
|
st->quaternion.size);
|
|
|
|
|
|
+ st->scale_precision = hid_sensor_format_scale(
|
|
|
+ hsdev->usage,
|
|
|
+ &st->quaternion,
|
|
|
+ &st->scale_pre_decml, &st->scale_post_decml);
|
|
|
+
|
|
|
/* Set Sensitivity field ids, when there is no individual modifier */
|
|
|
if (st->common_attributes.sensitivity.index < 0) {
|
|
|
sensor_hub_input_get_attribute_info(hsdev,
|