diff options
author | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2013-12-03 16:24:58 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2013-12-03 16:24:58 -0500 |
commit | 55ef003e4ae684d5660f984eb2352df12572d9df (patch) | |
tree | c22f2098485b1f373b52e6d253df5a521a5287bb | |
parent | 559c71fe5dc3bf2ecc55afb336145db7f0abf810 (diff) | |
parent | 419a4aaeb0f7a96359f7e937201b004f23e61976 (diff) |
Merge tag 'iio-fixes-for-3.13b' of git://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio into staging-linus
Jonathan writes:
Second round of IIO fixes for the 3.13 cycle.
2 fixes here.
* The gp2ap020a00f is a simple missing kconfig dependency.
* The hid sensors hub fix is a work around for an issue introduced by hardware
changes due to a certain large software vendor having an 'interesting'
interpretation of the specification and hence indexing some arrays from 1
rather than 0. The fix takes advantage of the logical min and max reading
facilities introduced by the precursor patch to figure out whether we have
a 0 indexed or 1 indexed device and to adjust appropriately. It also
drops a previous kconfig option that allowed this issue to be worked around
at build time.
-rw-r--r-- | drivers/hid/hid-sensor-hub.c | 20 | ||||
-rw-r--r-- | drivers/iio/common/hid-sensors/Kconfig | 9 | ||||
-rw-r--r-- | drivers/iio/common/hid-sensors/hid-sensor-trigger.c | 20 | ||||
-rw-r--r-- | drivers/iio/light/Kconfig | 1 | ||||
-rw-r--r-- | include/linux/hid-sensor-hub.h | 2 | ||||
-rw-r--r-- | include/linux/hid-sensor-ids.h | 12 |
6 files changed, 38 insertions, 26 deletions
diff --git a/drivers/hid/hid-sensor-hub.c b/drivers/hid/hid-sensor-hub.c index a184e1921c11..d87f7cb4bee5 100644 --- a/drivers/hid/hid-sensor-hub.c +++ b/drivers/hid/hid-sensor-hub.c | |||
@@ -112,13 +112,15 @@ static int sensor_hub_get_physical_device_count( | |||
112 | 112 | ||
113 | static void sensor_hub_fill_attr_info( | 113 | static void sensor_hub_fill_attr_info( |
114 | struct hid_sensor_hub_attribute_info *info, | 114 | struct hid_sensor_hub_attribute_info *info, |
115 | s32 index, s32 report_id, s32 units, s32 unit_expo, s32 size) | 115 | s32 index, s32 report_id, struct hid_field *field) |
116 | { | 116 | { |
117 | info->index = index; | 117 | info->index = index; |
118 | info->report_id = report_id; | 118 | info->report_id = report_id; |
119 | info->units = units; | 119 | info->units = field->unit; |
120 | info->unit_expo = unit_expo; | 120 | info->unit_expo = field->unit_exponent; |
121 | info->size = size/8; | 121 | info->size = (field->report_size * field->report_count)/8; |
122 | info->logical_minimum = field->logical_minimum; | ||
123 | info->logical_maximum = field->logical_maximum; | ||
122 | } | 124 | } |
123 | 125 | ||
124 | static struct hid_sensor_hub_callbacks *sensor_hub_get_callback( | 126 | static struct hid_sensor_hub_callbacks *sensor_hub_get_callback( |
@@ -325,9 +327,7 @@ int sensor_hub_input_get_attribute_info(struct hid_sensor_hub_device *hsdev, | |||
325 | if (field->physical == usage_id && | 327 | if (field->physical == usage_id && |
326 | field->logical == attr_usage_id) { | 328 | field->logical == attr_usage_id) { |
327 | sensor_hub_fill_attr_info(info, i, report->id, | 329 | sensor_hub_fill_attr_info(info, i, report->id, |
328 | field->unit, field->unit_exponent, | 330 | field); |
329 | field->report_size * | ||
330 | field->report_count); | ||
331 | ret = 0; | 331 | ret = 0; |
332 | } else { | 332 | } else { |
333 | for (j = 0; j < field->maxusage; ++j) { | 333 | for (j = 0; j < field->maxusage; ++j) { |
@@ -336,11 +336,7 @@ int sensor_hub_input_get_attribute_info(struct hid_sensor_hub_device *hsdev, | |||
336 | field->usage[j].collection_index == | 336 | field->usage[j].collection_index == |
337 | collection_index) { | 337 | collection_index) { |
338 | sensor_hub_fill_attr_info(info, | 338 | sensor_hub_fill_attr_info(info, |
339 | i, report->id, | 339 | i, report->id, field); |
340 | field->unit, | ||
341 | field->unit_exponent, | ||
342 | field->report_size * | ||
343 | field->report_count); | ||
344 | ret = 0; | 340 | ret = 0; |
345 | break; | 341 | break; |
346 | } | 342 | } |
diff --git a/drivers/iio/common/hid-sensors/Kconfig b/drivers/iio/common/hid-sensors/Kconfig index 1178121b55b0..39188b72cd3b 100644 --- a/drivers/iio/common/hid-sensors/Kconfig +++ b/drivers/iio/common/hid-sensors/Kconfig | |||
@@ -25,13 +25,4 @@ config HID_SENSOR_IIO_TRIGGER | |||
25 | If this driver is compiled as a module, it will be named | 25 | If this driver is compiled as a module, it will be named |
26 | hid-sensor-trigger. | 26 | hid-sensor-trigger. |
27 | 27 | ||
28 | config HID_SENSOR_ENUM_BASE_QUIRKS | ||
29 | bool "ENUM base quirks for HID Sensor IIO drivers" | ||
30 | depends on HID_SENSOR_IIO_COMMON | ||
31 | help | ||
32 | Say yes here to build support for sensor hub FW using | ||
33 | enumeration, which is using 1 as base instead of 0. | ||
34 | Since logical minimum is still set 0 instead of 1, | ||
35 | there is no easy way to differentiate. | ||
36 | |||
37 | endmenu | 28 | endmenu |
diff --git a/drivers/iio/common/hid-sensors/hid-sensor-trigger.c b/drivers/iio/common/hid-sensors/hid-sensor-trigger.c index bbd6426c9726..7dcf83998e6f 100644 --- a/drivers/iio/common/hid-sensors/hid-sensor-trigger.c +++ b/drivers/iio/common/hid-sensors/hid-sensor-trigger.c | |||
@@ -33,24 +33,34 @@ static int hid_sensor_data_rdy_trigger_set_state(struct iio_trigger *trig, | |||
33 | { | 33 | { |
34 | struct hid_sensor_common *st = iio_trigger_get_drvdata(trig); | 34 | struct hid_sensor_common *st = iio_trigger_get_drvdata(trig); |
35 | int state_val; | 35 | int state_val; |
36 | int report_val; | ||
36 | 37 | ||
37 | if (state) { | 38 | if (state) { |
38 | if (sensor_hub_device_open(st->hsdev)) | 39 | if (sensor_hub_device_open(st->hsdev)) |
39 | return -EIO; | 40 | return -EIO; |
40 | } else | 41 | state_val = |
42 | HID_USAGE_SENSOR_PROP_POWER_STATE_D0_FULL_POWER_ENUM; | ||
43 | report_val = | ||
44 | HID_USAGE_SENSOR_PROP_REPORTING_STATE_ALL_EVENTS_ENUM; | ||
45 | |||
46 | } else { | ||
41 | sensor_hub_device_close(st->hsdev); | 47 | sensor_hub_device_close(st->hsdev); |
48 | state_val = | ||
49 | HID_USAGE_SENSOR_PROP_POWER_STATE_D4_POWER_OFF_ENUM; | ||
50 | report_val = | ||
51 | HID_USAGE_SENSOR_PROP_REPORTING_STATE_NO_EVENTS_ENUM; | ||
52 | } | ||
42 | 53 | ||
43 | state_val = state ? 1 : 0; | ||
44 | if (IS_ENABLED(CONFIG_HID_SENSOR_ENUM_BASE_QUIRKS)) | ||
45 | ++state_val; | ||
46 | st->data_ready = state; | 54 | st->data_ready = state; |
55 | state_val += st->power_state.logical_minimum; | ||
56 | report_val += st->report_state.logical_minimum; | ||
47 | sensor_hub_set_feature(st->hsdev, st->power_state.report_id, | 57 | sensor_hub_set_feature(st->hsdev, st->power_state.report_id, |
48 | st->power_state.index, | 58 | st->power_state.index, |
49 | (s32)state_val); | 59 | (s32)state_val); |
50 | 60 | ||
51 | sensor_hub_set_feature(st->hsdev, st->report_state.report_id, | 61 | sensor_hub_set_feature(st->hsdev, st->report_state.report_id, |
52 | st->report_state.index, | 62 | st->report_state.index, |
53 | (s32)state_val); | 63 | (s32)report_val); |
54 | 64 | ||
55 | return 0; | 65 | return 0; |
56 | } | 66 | } |
diff --git a/drivers/iio/light/Kconfig b/drivers/iio/light/Kconfig index b0d65df3ede2..a022f27c6690 100644 --- a/drivers/iio/light/Kconfig +++ b/drivers/iio/light/Kconfig | |||
@@ -43,6 +43,7 @@ config GP2AP020A00F | |||
43 | depends on I2C | 43 | depends on I2C |
44 | select IIO_BUFFER | 44 | select IIO_BUFFER |
45 | select IIO_TRIGGERED_BUFFER | 45 | select IIO_TRIGGERED_BUFFER |
46 | select IRQ_WORK | ||
46 | help | 47 | help |
47 | Say Y here if you have a Sharp GP2AP020A00F proximity/ALS combo-chip | 48 | Say Y here if you have a Sharp GP2AP020A00F proximity/ALS combo-chip |
48 | hooked to an I2C bus. | 49 | hooked to an I2C bus. |
diff --git a/include/linux/hid-sensor-hub.h b/include/linux/hid-sensor-hub.h index 206a2af6b62b..b914ca3f57ba 100644 --- a/include/linux/hid-sensor-hub.h +++ b/include/linux/hid-sensor-hub.h | |||
@@ -42,6 +42,8 @@ struct hid_sensor_hub_attribute_info { | |||
42 | s32 units; | 42 | s32 units; |
43 | s32 unit_expo; | 43 | s32 unit_expo; |
44 | s32 size; | 44 | s32 size; |
45 | s32 logical_minimum; | ||
46 | s32 logical_maximum; | ||
45 | }; | 47 | }; |
46 | 48 | ||
47 | /** | 49 | /** |
diff --git a/include/linux/hid-sensor-ids.h b/include/linux/hid-sensor-ids.h index 4f945d3ed49f..8323775ac21d 100644 --- a/include/linux/hid-sensor-ids.h +++ b/include/linux/hid-sensor-ids.h | |||
@@ -117,4 +117,16 @@ | |||
117 | #define HID_USAGE_SENSOR_PROP_REPORT_STATE 0x200316 | 117 | #define HID_USAGE_SENSOR_PROP_REPORT_STATE 0x200316 |
118 | #define HID_USAGE_SENSOR_PROY_POWER_STATE 0x200319 | 118 | #define HID_USAGE_SENSOR_PROY_POWER_STATE 0x200319 |
119 | 119 | ||
120 | /* Power state enumerations */ | ||
121 | #define HID_USAGE_SENSOR_PROP_POWER_STATE_UNDEFINED_ENUM 0x00 | ||
122 | #define HID_USAGE_SENSOR_PROP_POWER_STATE_D0_FULL_POWER_ENUM 0x01 | ||
123 | #define HID_USAGE_SENSOR_PROP_POWER_STATE_D1_LOW_POWER_ENUM 0x02 | ||
124 | #define HID_USAGE_SENSOR_PROP_POWER_STATE_D2_STANDBY_WITH_WAKE_ENUM 0x03 | ||
125 | #define HID_USAGE_SENSOR_PROP_POWER_STATE_D3_SLEEP_WITH_WAKE_ENUM 0x04 | ||
126 | #define HID_USAGE_SENSOR_PROP_POWER_STATE_D4_POWER_OFF_ENUM 0x05 | ||
127 | |||
128 | /* Report State enumerations */ | ||
129 | #define HID_USAGE_SENSOR_PROP_REPORTING_STATE_NO_EVENTS_ENUM 0x00 | ||
130 | #define HID_USAGE_SENSOR_PROP_REPORTING_STATE_ALL_EVENTS_ENUM 0x01 | ||
131 | |||
120 | #endif | 132 | #endif |