diff options
Diffstat (limited to 'drivers/iio/orientation/hid-sensor-rotation.c')
| -rw-r--r-- | drivers/iio/orientation/hid-sensor-rotation.c | 37 | 
1 files changed, 20 insertions, 17 deletions
| diff --git a/drivers/iio/orientation/hid-sensor-rotation.c b/drivers/iio/orientation/hid-sensor-rotation.c index 18e4ef060096..cf7f57a47681 100644 --- a/drivers/iio/orientation/hid-sensor-rotation.c +++ b/drivers/iio/orientation/hid-sensor-rotation.c @@ -21,7 +21,7 @@ struct dev_rot_state {  	struct hid_sensor_common common_attributes;  	struct hid_sensor_hub_attribute_info quaternion;  	struct { -		u32 sampled_vals[4] __aligned(16); +		s32 sampled_vals[4] __aligned(16);  		u64 timestamp __aligned(8);  	} scan;  	int scale_pre_decml; @@ -31,6 +31,11 @@ struct dev_rot_state {  	s64 timestamp;  }; +static const u32 rotation_sensitivity_addresses[] = { +	HID_USAGE_SENSOR_DATA_ORIENTATION, +	HID_USAGE_SENSOR_ORIENT_QUATERNION, +}; +  /* Channel definitions */  static const struct iio_chan_spec dev_rot_channels[] = {  	{ @@ -170,8 +175,15 @@ static int dev_rot_capture_sample(struct hid_sensor_hub_device *hsdev,  	struct dev_rot_state *rot_state = iio_priv(indio_dev);  	if (usage_id == HID_USAGE_SENSOR_ORIENT_QUATERNION) { -		memcpy(&rot_state->scan.sampled_vals, raw_data, -		       sizeof(rot_state->scan.sampled_vals)); +		if (raw_len / 4 == sizeof(s16)) { +			rot_state->scan.sampled_vals[0] = ((s16 *)raw_data)[0]; +			rot_state->scan.sampled_vals[1] = ((s16 *)raw_data)[1]; +			rot_state->scan.sampled_vals[2] = ((s16 *)raw_data)[2]; +			rot_state->scan.sampled_vals[3] = ((s16 *)raw_data)[3]; +		} else { +			memcpy(&rot_state->scan.sampled_vals, raw_data, +			       sizeof(rot_state->scan.sampled_vals)); +		}  		dev_dbg(&indio_dev->dev, "Recd Quat len:%zu::%zu\n", raw_len,  			sizeof(rot_state->scan.sampled_vals)); @@ -214,18 +226,6 @@ static int dev_rot_parse_report(struct platform_device *pdev,  				&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, -			HID_FEATURE_REPORT, usage_id, -			HID_USAGE_SENSOR_DATA_MOD_CHANGE_SENSITIVITY_ABS | -			HID_USAGE_SENSOR_DATA_ORIENTATION, -			&st->common_attributes.sensitivity); -		dev_dbg(&pdev->dev, "Sensitivity index:report %d:%d\n", -			st->common_attributes.sensitivity.index, -			st->common_attributes.sensitivity.report_id); -	} -  	return 0;  } @@ -263,8 +263,11 @@ static int hid_dev_rot_probe(struct platform_device *pdev)  		return -EINVAL;  	} -	ret = hid_sensor_parse_common_attributes(hsdev, hsdev->usage, -				&rot_state->common_attributes); +	ret = hid_sensor_parse_common_attributes(hsdev, +						 hsdev->usage, +						 &rot_state->common_attributes, +						 rotation_sensitivity_addresses, +						 ARRAY_SIZE(rotation_sensitivity_addresses));  	if (ret) {  		dev_err(&pdev->dev, "failed to setup common attributes\n");  		return ret; | 
