aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/hid/hid-sensor-hub.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/hid/hid-sensor-hub.c')
-rw-r--r--drivers/hid/hid-sensor-hub.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/drivers/hid/hid-sensor-hub.c b/drivers/hid/hid-sensor-hub.c
index 2b63487057c2..4256fdc5cd6d 100644
--- a/drivers/hid/hid-sensor-hub.c
+++ b/drivers/hid/hid-sensor-hub.c
@@ -299,7 +299,8 @@ EXPORT_SYMBOL_GPL(sensor_hub_get_feature);
299int sensor_hub_input_attr_get_raw_value(struct hid_sensor_hub_device *hsdev, 299int sensor_hub_input_attr_get_raw_value(struct hid_sensor_hub_device *hsdev,
300 u32 usage_id, 300 u32 usage_id,
301 u32 attr_usage_id, u32 report_id, 301 u32 attr_usage_id, u32 report_id,
302 enum sensor_hub_read_flags flag) 302 enum sensor_hub_read_flags flag,
303 bool is_signed)
303{ 304{
304 struct sensor_hub_data *data = hid_get_drvdata(hsdev->hdev); 305 struct sensor_hub_data *data = hid_get_drvdata(hsdev->hdev);
305 unsigned long flags; 306 unsigned long flags;
@@ -331,10 +332,16 @@ int sensor_hub_input_attr_get_raw_value(struct hid_sensor_hub_device *hsdev,
331 &hsdev->pending.ready, HZ*5); 332 &hsdev->pending.ready, HZ*5);
332 switch (hsdev->pending.raw_size) { 333 switch (hsdev->pending.raw_size) {
333 case 1: 334 case 1:
334 ret_val = *(u8 *)hsdev->pending.raw_data; 335 if (is_signed)
336 ret_val = *(s8 *)hsdev->pending.raw_data;
337 else
338 ret_val = *(u8 *)hsdev->pending.raw_data;
335 break; 339 break;
336 case 2: 340 case 2:
337 ret_val = *(u16 *)hsdev->pending.raw_data; 341 if (is_signed)
342 ret_val = *(s16 *)hsdev->pending.raw_data;
343 else
344 ret_val = *(u16 *)hsdev->pending.raw_data;
338 break; 345 break;
339 case 4: 346 case 4:
340 ret_val = *(u32 *)hsdev->pending.raw_data; 347 ret_val = *(u32 *)hsdev->pending.raw_data;