diff options
Diffstat (limited to 'drivers/hid/hid-sensor-hub.c')
-rw-r--r-- | drivers/hid/hid-sensor-hub.c | 13 |
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); | |||
299 | int sensor_hub_input_attr_get_raw_value(struct hid_sensor_hub_device *hsdev, | 299 | int 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; |