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 /drivers | |
| 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.
Diffstat (limited to 'drivers')
| -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 |
4 files changed, 24 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. |
