Message ID | 20210201054921.18214-2-xiang.ye@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | resolve read hystersis return invalid argument issue for hid sensors | expand |
On 01/02/2021 13:49:20+0800, Ye Xiang wrote: > No functional change has been made with this patch. The main intent here > is to reduce code repetition of getting sensitivity attribute. > > In the current implementation, sensor_hub_input_get_attribute_info() is > called from multiple drivers to get attribute info for sensitivity > field. Moving this to common place will avoid code repetition. > > Signed-off-by: Ye Xiang <xiang.ye@intel.com> Acked-by: Alexandre Belloni <alexandre.belloni@bootlin.com> > --- > drivers/iio/accel/hid-sensor-accel-3d.c | 23 ++++++------- > .../hid-sensors/hid-sensor-attributes.c | 17 +++++++++- > drivers/iio/gyro/hid-sensor-gyro-3d.c | 19 ++++------- > drivers/iio/humidity/hid-sensor-humidity.c | 16 ++++------ > drivers/iio/light/hid-sensor-als.c | 19 ++++------- > drivers/iio/light/hid-sensor-prox.c | 27 +++++----------- > drivers/iio/magnetometer/hid-sensor-magn-3d.c | 32 ++++++------------- > drivers/iio/orientation/hid-sensor-incl-3d.c | 19 ++++------- > drivers/iio/orientation/hid-sensor-rotation.c | 23 ++++++------- > .../position/hid-sensor-custom-intel-hinge.c | 20 ++++-------- > drivers/iio/pressure/hid-sensor-press.c | 19 ++++------- > .../iio/temperature/hid-sensor-temperature.c | 16 ++++------ > drivers/rtc/rtc-hid-sensor-time.c | 4 ++- > include/linux/hid-sensor-hub.h | 4 ++- > 14 files changed, 107 insertions(+), 151 deletions(-) > > diff --git a/drivers/iio/accel/hid-sensor-accel-3d.c b/drivers/iio/accel/hid-sensor-accel-3d.c > index 5d63ed19e6e2..2f9465cb382f 100644 > --- a/drivers/iio/accel/hid-sensor-accel-3d.c > +++ b/drivers/iio/accel/hid-sensor-accel-3d.c > @@ -43,6 +43,10 @@ static const u32 accel_3d_addresses[ACCEL_3D_CHANNEL_MAX] = { > HID_USAGE_SENSOR_ACCEL_Z_AXIS > }; > > +static const u32 accel_3d_sensitivity_addresses[] = { > + HID_USAGE_SENSOR_DATA_ACCELERATION, > +}; > + > /* Channel definitions */ > static const struct iio_chan_spec accel_3d_channels[] = { > { > @@ -317,18 +321,6 @@ static int accel_3d_parse_report(struct platform_device *pdev, > &st->accel[CHANNEL_SCAN_INDEX_X], > &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_ACCELERATION, > - &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 ret; > } > > @@ -366,8 +358,11 @@ static int hid_accel_3d_probe(struct platform_device *pdev) > channel_size = sizeof(gravity_channels); > indio_dev->num_channels = ARRAY_SIZE(gravity_channels); > } > - ret = hid_sensor_parse_common_attributes(hsdev, hsdev->usage, > - &accel_state->common_attributes); > + ret = hid_sensor_parse_common_attributes(hsdev, > + hsdev->usage, > + &accel_state->common_attributes, > + accel_3d_sensitivity_addresses, > + ARRAY_SIZE(accel_3d_sensitivity_addresses)); > if (ret) { > dev_err(&pdev->dev, "failed to setup common attributes\n"); > return ret; > diff --git a/drivers/iio/common/hid-sensors/hid-sensor-attributes.c b/drivers/iio/common/hid-sensors/hid-sensor-attributes.c > index 5b822a4298a0..d349ace2e33f 100644 > --- a/drivers/iio/common/hid-sensors/hid-sensor-attributes.c > +++ b/drivers/iio/common/hid-sensors/hid-sensor-attributes.c > @@ -448,12 +448,15 @@ EXPORT_SYMBOL(hid_sensor_batch_mode_supported); > > int hid_sensor_parse_common_attributes(struct hid_sensor_hub_device *hsdev, > u32 usage_id, > - struct hid_sensor_common *st) > + struct hid_sensor_common *st, > + const u32 *sensitivity_addresses, > + u32 sensitivity_addresses_len) > { > > struct hid_sensor_hub_attribute_info timestamp; > s32 value; > int ret; > + int i; > > hid_sensor_get_reporting_interval(hsdev, usage_id, st); > > @@ -475,6 +478,18 @@ int hid_sensor_parse_common_attributes(struct hid_sensor_hub_device *hsdev, > HID_USAGE_SENSOR_PROP_SENSITIVITY_ABS, > &st->sensitivity); > > + /* > + * Set Sensitivity field ids, when there is no individual modifier, will > + * check absolute sensitivity of data field > + */ > + for (i = 0; i < sensitivity_addresses_len && st->sensitivity.index < 0; i++) { > + sensor_hub_input_get_attribute_info(hsdev, > + HID_FEATURE_REPORT, usage_id, > + HID_USAGE_SENSOR_DATA_MOD_CHANGE_SENSITIVITY_ABS | > + sensitivity_addresses[i], > + &st->sensitivity); > + } > + > st->raw_hystersis = -1; > > sensor_hub_input_get_attribute_info(hsdev, > diff --git a/drivers/iio/gyro/hid-sensor-gyro-3d.c b/drivers/iio/gyro/hid-sensor-gyro-3d.c > index fb0d678ece1a..dad26ee4fd1f 100644 > --- a/drivers/iio/gyro/hid-sensor-gyro-3d.c > +++ b/drivers/iio/gyro/hid-sensor-gyro-3d.c > @@ -45,6 +45,10 @@ static const u32 gyro_3d_addresses[GYRO_3D_CHANNEL_MAX] = { > HID_USAGE_SENSOR_ANGL_VELOCITY_Z_AXIS > }; > > +static const u32 gryo_3d_sensitivity_addresses[] = { > + HID_USAGE_SENSOR_DATA_ANGL_VELOCITY, > +}; > + > /* Channel definitions */ > static const struct iio_chan_spec gyro_3d_channels[] = { > { > @@ -271,17 +275,6 @@ static int gyro_3d_parse_report(struct platform_device *pdev, > &st->gyro[CHANNEL_SCAN_INDEX_X], > &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_ANGL_VELOCITY, > - &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 ret; > } > > @@ -305,7 +298,9 @@ static int hid_gyro_3d_probe(struct platform_device *pdev) > > ret = hid_sensor_parse_common_attributes(hsdev, > HID_USAGE_SENSOR_GYRO_3D, > - &gyro_state->common_attributes); > + &gyro_state->common_attributes, > + gryo_3d_sensitivity_addresses, > + ARRAY_SIZE(gryo_3d_sensitivity_addresses)); > if (ret) { > dev_err(&pdev->dev, "failed to setup common attributes\n"); > return ret; > diff --git a/drivers/iio/humidity/hid-sensor-humidity.c b/drivers/iio/humidity/hid-sensor-humidity.c > index 52f605114ef7..ec88ae3f233d 100644 > --- a/drivers/iio/humidity/hid-sensor-humidity.c > +++ b/drivers/iio/humidity/hid-sensor-humidity.c > @@ -22,6 +22,10 @@ struct hid_humidity_state { > int value_offset; > }; > > +static const u32 humidity_sensitivity_addresses[] = { > + HID_USAGE_SENSOR_ATMOSPHERIC_HUMIDITY, > +}; > + > /* Channel definitions */ > static const struct iio_chan_spec humidity_channels[] = { > { > @@ -174,14 +178,6 @@ static int humidity_parse_report(struct platform_device *pdev, > &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_ATMOSPHERIC_HUMIDITY, > - &st->common_attributes.sensitivity); > - > return ret; > } > > @@ -210,7 +206,9 @@ static int hid_humidity_probe(struct platform_device *pdev) > > ret = hid_sensor_parse_common_attributes(hsdev, > HID_USAGE_SENSOR_HUMIDITY, > - &humid_st->common_attributes); > + &humid_st->common_attributes, > + humidity_sensitivity_addresses, > + ARRAY_SIZE(humidity_sensitivity_addresses)); > if (ret) > return ret; > > diff --git a/drivers/iio/light/hid-sensor-als.c b/drivers/iio/light/hid-sensor-als.c > index 4093f2353d95..8bf6e9e0a0e0 100644 > --- a/drivers/iio/light/hid-sensor-als.c > +++ b/drivers/iio/light/hid-sensor-als.c > @@ -39,6 +39,10 @@ struct als_state { > s64 timestamp; > }; > > +static const u32 als_sensitivity_addresses[] = { > + HID_USAGE_SENSOR_DATA_LIGHT, > +}; > + > /* Channel definitions */ > static const struct iio_chan_spec als_channels[] = { > { > @@ -252,17 +256,6 @@ static int als_parse_report(struct platform_device *pdev, > &st->als_illum, > &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_LIGHT, > - &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 ret; > } > > @@ -285,7 +278,9 @@ static int hid_als_probe(struct platform_device *pdev) > als_state->common_attributes.pdev = pdev; > > ret = hid_sensor_parse_common_attributes(hsdev, HID_USAGE_SENSOR_ALS, > - &als_state->common_attributes); > + &als_state->common_attributes, > + als_sensitivity_addresses, > + ARRAY_SIZE(als_sensitivity_addresses)); > if (ret) { > dev_err(&pdev->dev, "failed to setup common attributes\n"); > return ret; > diff --git a/drivers/iio/light/hid-sensor-prox.c b/drivers/iio/light/hid-sensor-prox.c > index 330cf359e0b8..4ab285a418d5 100644 > --- a/drivers/iio/light/hid-sensor-prox.c > +++ b/drivers/iio/light/hid-sensor-prox.c > @@ -25,6 +25,11 @@ struct prox_state { > u32 human_presence; > }; > > +static const u32 prox_sensitivity_addresses[] = { > + HID_USAGE_SENSOR_HUMAN_PRESENCE, > + HID_USAGE_SENSOR_DATA_PRESENCE, > +}; > + > /* Channel definitions */ > static const struct iio_chan_spec prox_channels[] = { > { > @@ -216,24 +221,6 @@ static int prox_parse_report(struct platform_device *pdev, > dev_dbg(&pdev->dev, "prox %x:%x\n", st->prox_attr.index, > st->prox_attr.report_id); > > - /* 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_PRESENCE, > - &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); > - } > - 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_HUMAN_PRESENCE, > - &st->common_attributes.sensitivity); > - > return ret; > } > > @@ -257,7 +244,9 @@ static int hid_prox_probe(struct platform_device *pdev) > prox_state->common_attributes.pdev = pdev; > > ret = hid_sensor_parse_common_attributes(hsdev, HID_USAGE_SENSOR_PROX, > - &prox_state->common_attributes); > + &prox_state->common_attributes, > + prox_sensitivity_addresses, > + ARRAY_SIZE(prox_sensitivity_addresses)); > if (ret) { > dev_err(&pdev->dev, "failed to setup common attributes\n"); > return ret; > diff --git a/drivers/iio/magnetometer/hid-sensor-magn-3d.c b/drivers/iio/magnetometer/hid-sensor-magn-3d.c > index fa48044b7f5b..b78691523dd4 100644 > --- a/drivers/iio/magnetometer/hid-sensor-magn-3d.c > +++ b/drivers/iio/magnetometer/hid-sensor-magn-3d.c > @@ -62,6 +62,11 @@ static const u32 magn_3d_addresses[MAGN_3D_CHANNEL_MAX] = { > HID_USAGE_SENSOR_TIME_TIMESTAMP, > }; > > +static const u32 magn_3d_sensitivity_addresses[] = { > + HID_USAGE_SENSOR_DATA_ORIENTATION, > + HID_USAGE_SENSOR_ORIENT_MAGN_FLUX, > +}; > + > /* Channel definitions */ > static const struct iio_chan_spec magn_3d_channels[] = { > { > @@ -448,27 +453,6 @@ static int magn_3d_parse_report(struct platform_device *pdev, > &st->rot_attr.scale_pre_decml, > &st->rot_attr.scale_post_decml); > > - /* Set Sensitivity field ids, when there is no individual modifier */ > - if (st->magn_flux_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->magn_flux_attributes.sensitivity); > - dev_dbg(&pdev->dev, "Sensitivity index:report %d:%d\n", > - st->magn_flux_attributes.sensitivity.index, > - st->magn_flux_attributes.sensitivity.report_id); > - } > - if (st->magn_flux_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_ORIENT_MAGN_FLUX, > - &st->magn_flux_attributes.sensitivity); > - dev_dbg(&pdev->dev, "Sensitivity index:report %d:%d\n", > - st->magn_flux_attributes.sensitivity.index, > - st->magn_flux_attributes.sensitivity.report_id); > - } > if (st->rot_attributes.sensitivity.index < 0) { > sensor_hub_input_get_attribute_info(hsdev, > HID_FEATURE_REPORT, usage_id, > @@ -507,12 +491,16 @@ static int hid_magn_3d_probe(struct platform_device *pdev) > > ret = hid_sensor_parse_common_attributes(hsdev, > HID_USAGE_SENSOR_COMPASS_3D, > - &magn_state->magn_flux_attributes); > + &magn_state->magn_flux_attributes, > + magn_3d_sensitivity_addresses, > + ARRAY_SIZE(magn_3d_sensitivity_addresses)); > if (ret) { > dev_err(&pdev->dev, "failed to setup common attributes\n"); > return ret; > } > magn_state->rot_attributes = magn_state->magn_flux_attributes; > + /* sensitivity of rot_attribute is not the same as magn_flux_attributes */ > + magn_state->rot_attributes.sensitivity.index = -1; > > ret = magn_3d_parse_report(pdev, hsdev, > &channels, &chan_count, > diff --git a/drivers/iio/orientation/hid-sensor-incl-3d.c b/drivers/iio/orientation/hid-sensor-incl-3d.c > index 52ebef30f9be..6e69f6e673cc 100644 > --- a/drivers/iio/orientation/hid-sensor-incl-3d.c > +++ b/drivers/iio/orientation/hid-sensor-incl-3d.c > @@ -47,6 +47,10 @@ static const u32 incl_3d_addresses[INCLI_3D_CHANNEL_MAX] = { > HID_USAGE_SENSOR_ORIENT_TILT_Z > }; > > +static const u32 incl_3d_sensitivity_addresses[] = { > + HID_USAGE_SENSOR_DATA_ORIENTATION, > +}; > + > /* Channel definitions */ > static const struct iio_chan_spec incl_3d_channels[] = { > { > @@ -291,17 +295,6 @@ static int incl_3d_parse_report(struct platform_device *pdev, > &st->incl[CHANNEL_SCAN_INDEX_X], > &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 ret; > } > > @@ -327,7 +320,9 @@ static int hid_incl_3d_probe(struct platform_device *pdev) > > ret = hid_sensor_parse_common_attributes(hsdev, > HID_USAGE_SENSOR_INCLINOMETER_3D, > - &incl_state->common_attributes); > + &incl_state->common_attributes, > + incl_3d_sensitivity_addresses, > + ARRAY_SIZE(incl_3d_sensitivity_addresses)); > if (ret) { > dev_err(&pdev->dev, "failed to setup common attributes\n"); > return ret; > diff --git a/drivers/iio/orientation/hid-sensor-rotation.c b/drivers/iio/orientation/hid-sensor-rotation.c > index 18e4ef060096..03d2845a7b2c 100644 > --- a/drivers/iio/orientation/hid-sensor-rotation.c > +++ b/drivers/iio/orientation/hid-sensor-rotation.c > @@ -31,6 +31,10 @@ struct dev_rot_state { > s64 timestamp; > }; > > +static const u32 rotation_sensitivity_addresses[] = { > + HID_USAGE_SENSOR_DATA_ORIENTATION, > +}; > + > /* Channel definitions */ > static const struct iio_chan_spec dev_rot_channels[] = { > { > @@ -214,18 +218,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 +255,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; > diff --git a/drivers/iio/position/hid-sensor-custom-intel-hinge.c b/drivers/iio/position/hid-sensor-custom-intel-hinge.c > index 64a7fa7db6af..fd77e7ee87f3 100644 > --- a/drivers/iio/position/hid-sensor-custom-intel-hinge.c > +++ b/drivers/iio/position/hid-sensor-custom-intel-hinge.c > @@ -47,6 +47,10 @@ struct hinge_state { > u64 timestamp; > }; > > +static const u32 hinge_sensitivity_addresses[] = { > + HID_USAGE_SENSOR_DATA_FIELD_CUSTOM_VALUE(1), > +}; > + > /* Channel definitions */ > static const struct iio_chan_spec hinge_channels[] = { > { > @@ -251,18 +255,6 @@ static int hinge_parse_report(struct platform_device *pdev, > &st->hinge[CHANNEL_SCAN_INDEX_HINGE_ANGLE], > &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_FIELD_CUSTOM_VALUE(1), > - &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 ret; > } > > @@ -289,7 +281,9 @@ static int hid_hinge_probe(struct platform_device *pdev) > st->labels[i] = hinge_labels[i]; > > ret = hid_sensor_parse_common_attributes(hsdev, hsdev->usage, > - &st->common_attributes); > + &st->common_attributes, > + hinge_sensitivity_addresses, > + ARRAY_SIZE(hinge_sensitivity_addresses)); > if (ret) { > dev_err(&pdev->dev, "failed to setup common attributes\n"); > return ret; > diff --git a/drivers/iio/pressure/hid-sensor-press.c b/drivers/iio/pressure/hid-sensor-press.c > index 5c458788f346..8cac2c94e75a 100644 > --- a/drivers/iio/pressure/hid-sensor-press.c > +++ b/drivers/iio/pressure/hid-sensor-press.c > @@ -29,6 +29,10 @@ struct press_state { > int value_offset; > }; > > +static const u32 press_sensitivity_addresses[] = { > + HID_USAGE_SENSOR_DATA_ATMOSPHERIC_PRESSURE, > +}; > + > /* Channel definitions */ > static const struct iio_chan_spec press_channels[] = { > { > @@ -225,17 +229,6 @@ static int press_parse_report(struct platform_device *pdev, > &st->press_attr, > &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_ATMOSPHERIC_PRESSURE, > - &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 ret; > } > > @@ -260,7 +253,9 @@ static int hid_press_probe(struct platform_device *pdev) > > ret = hid_sensor_parse_common_attributes(hsdev, > HID_USAGE_SENSOR_PRESSURE, > - &press_state->common_attributes); > + &press_state->common_attributes, > + press_sensitivity_addresses, > + ARRAY_SIZE(press_sensitivity_addresses)); > if (ret) { > dev_err(&pdev->dev, "failed to setup common attributes\n"); > return ret; > diff --git a/drivers/iio/temperature/hid-sensor-temperature.c b/drivers/iio/temperature/hid-sensor-temperature.c > index 81688f1b932f..e3d38cbcf354 100644 > --- a/drivers/iio/temperature/hid-sensor-temperature.c > +++ b/drivers/iio/temperature/hid-sensor-temperature.c > @@ -22,6 +22,10 @@ struct temperature_state { > int value_offset; > }; > > +static const u32 temperature_sensitivity_addresses[] = { > + HID_USAGE_SENSOR_DATA_ENVIRONMENTAL_TEMPERATURE, > +}; > + > /* Channel definitions */ > static const struct iio_chan_spec temperature_channels[] = { > { > @@ -171,14 +175,6 @@ static int temperature_parse_report(struct platform_device *pdev, > &st->temperature_attr, > &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_ENVIRONMENTAL_TEMPERATURE, > - &st->common_attributes.sensitivity); > - > return ret; > } > > @@ -207,7 +203,9 @@ static int hid_temperature_probe(struct platform_device *pdev) > > ret = hid_sensor_parse_common_attributes(hsdev, > HID_USAGE_SENSOR_TEMPERATURE, > - &temp_st->common_attributes); > + &temp_st->common_attributes, > + temperature_sensitivity_addresses, > + ARRAY_SIZE(temperature_sensitivity_addresses)); > if (ret) > return ret; > > diff --git a/drivers/rtc/rtc-hid-sensor-time.c b/drivers/rtc/rtc-hid-sensor-time.c > index 1b42ee0758d2..47cd12db2356 100644 > --- a/drivers/rtc/rtc-hid-sensor-time.c > +++ b/drivers/rtc/rtc-hid-sensor-time.c > @@ -238,7 +238,9 @@ static int hid_time_probe(struct platform_device *pdev) > > ret = hid_sensor_parse_common_attributes(hsdev, > HID_USAGE_SENSOR_TIME, > - &time_state->common_attributes); > + &time_state->common_attributes, > + NULL, > + 0); > if (ret) { > dev_err(&pdev->dev, "failed to setup common attributes!\n"); > return ret; > diff --git a/include/linux/hid-sensor-hub.h b/include/linux/hid-sensor-hub.h > index 46bcef380446..8b2599348554 100644 > --- a/include/linux/hid-sensor-hub.h > +++ b/include/linux/hid-sensor-hub.h > @@ -247,7 +247,9 @@ static inline int hid_sensor_convert_exponent(int unit_expo) > > int hid_sensor_parse_common_attributes(struct hid_sensor_hub_device *hsdev, > u32 usage_id, > - struct hid_sensor_common *st); > + struct hid_sensor_common *st, > + const u32 *sensitivity_addresses, > + u32 sensitivity_addresses_len); > int hid_sensor_write_raw_hyst_value(struct hid_sensor_common *st, > int val1, int val2); > int hid_sensor_read_raw_hyst_value(struct hid_sensor_common *st, > -- > 2.17.1 >
diff --git a/drivers/iio/accel/hid-sensor-accel-3d.c b/drivers/iio/accel/hid-sensor-accel-3d.c index 5d63ed19e6e2..2f9465cb382f 100644 --- a/drivers/iio/accel/hid-sensor-accel-3d.c +++ b/drivers/iio/accel/hid-sensor-accel-3d.c @@ -43,6 +43,10 @@ static const u32 accel_3d_addresses[ACCEL_3D_CHANNEL_MAX] = { HID_USAGE_SENSOR_ACCEL_Z_AXIS }; +static const u32 accel_3d_sensitivity_addresses[] = { + HID_USAGE_SENSOR_DATA_ACCELERATION, +}; + /* Channel definitions */ static const struct iio_chan_spec accel_3d_channels[] = { { @@ -317,18 +321,6 @@ static int accel_3d_parse_report(struct platform_device *pdev, &st->accel[CHANNEL_SCAN_INDEX_X], &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_ACCELERATION, - &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 ret; } @@ -366,8 +358,11 @@ static int hid_accel_3d_probe(struct platform_device *pdev) channel_size = sizeof(gravity_channels); indio_dev->num_channels = ARRAY_SIZE(gravity_channels); } - ret = hid_sensor_parse_common_attributes(hsdev, hsdev->usage, - &accel_state->common_attributes); + ret = hid_sensor_parse_common_attributes(hsdev, + hsdev->usage, + &accel_state->common_attributes, + accel_3d_sensitivity_addresses, + ARRAY_SIZE(accel_3d_sensitivity_addresses)); if (ret) { dev_err(&pdev->dev, "failed to setup common attributes\n"); return ret; diff --git a/drivers/iio/common/hid-sensors/hid-sensor-attributes.c b/drivers/iio/common/hid-sensors/hid-sensor-attributes.c index 5b822a4298a0..d349ace2e33f 100644 --- a/drivers/iio/common/hid-sensors/hid-sensor-attributes.c +++ b/drivers/iio/common/hid-sensors/hid-sensor-attributes.c @@ -448,12 +448,15 @@ EXPORT_SYMBOL(hid_sensor_batch_mode_supported); int hid_sensor_parse_common_attributes(struct hid_sensor_hub_device *hsdev, u32 usage_id, - struct hid_sensor_common *st) + struct hid_sensor_common *st, + const u32 *sensitivity_addresses, + u32 sensitivity_addresses_len) { struct hid_sensor_hub_attribute_info timestamp; s32 value; int ret; + int i; hid_sensor_get_reporting_interval(hsdev, usage_id, st); @@ -475,6 +478,18 @@ int hid_sensor_parse_common_attributes(struct hid_sensor_hub_device *hsdev, HID_USAGE_SENSOR_PROP_SENSITIVITY_ABS, &st->sensitivity); + /* + * Set Sensitivity field ids, when there is no individual modifier, will + * check absolute sensitivity of data field + */ + for (i = 0; i < sensitivity_addresses_len && st->sensitivity.index < 0; i++) { + sensor_hub_input_get_attribute_info(hsdev, + HID_FEATURE_REPORT, usage_id, + HID_USAGE_SENSOR_DATA_MOD_CHANGE_SENSITIVITY_ABS | + sensitivity_addresses[i], + &st->sensitivity); + } + st->raw_hystersis = -1; sensor_hub_input_get_attribute_info(hsdev, diff --git a/drivers/iio/gyro/hid-sensor-gyro-3d.c b/drivers/iio/gyro/hid-sensor-gyro-3d.c index fb0d678ece1a..dad26ee4fd1f 100644 --- a/drivers/iio/gyro/hid-sensor-gyro-3d.c +++ b/drivers/iio/gyro/hid-sensor-gyro-3d.c @@ -45,6 +45,10 @@ static const u32 gyro_3d_addresses[GYRO_3D_CHANNEL_MAX] = { HID_USAGE_SENSOR_ANGL_VELOCITY_Z_AXIS }; +static const u32 gryo_3d_sensitivity_addresses[] = { + HID_USAGE_SENSOR_DATA_ANGL_VELOCITY, +}; + /* Channel definitions */ static const struct iio_chan_spec gyro_3d_channels[] = { { @@ -271,17 +275,6 @@ static int gyro_3d_parse_report(struct platform_device *pdev, &st->gyro[CHANNEL_SCAN_INDEX_X], &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_ANGL_VELOCITY, - &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 ret; } @@ -305,7 +298,9 @@ static int hid_gyro_3d_probe(struct platform_device *pdev) ret = hid_sensor_parse_common_attributes(hsdev, HID_USAGE_SENSOR_GYRO_3D, - &gyro_state->common_attributes); + &gyro_state->common_attributes, + gryo_3d_sensitivity_addresses, + ARRAY_SIZE(gryo_3d_sensitivity_addresses)); if (ret) { dev_err(&pdev->dev, "failed to setup common attributes\n"); return ret; diff --git a/drivers/iio/humidity/hid-sensor-humidity.c b/drivers/iio/humidity/hid-sensor-humidity.c index 52f605114ef7..ec88ae3f233d 100644 --- a/drivers/iio/humidity/hid-sensor-humidity.c +++ b/drivers/iio/humidity/hid-sensor-humidity.c @@ -22,6 +22,10 @@ struct hid_humidity_state { int value_offset; }; +static const u32 humidity_sensitivity_addresses[] = { + HID_USAGE_SENSOR_ATMOSPHERIC_HUMIDITY, +}; + /* Channel definitions */ static const struct iio_chan_spec humidity_channels[] = { { @@ -174,14 +178,6 @@ static int humidity_parse_report(struct platform_device *pdev, &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_ATMOSPHERIC_HUMIDITY, - &st->common_attributes.sensitivity); - return ret; } @@ -210,7 +206,9 @@ static int hid_humidity_probe(struct platform_device *pdev) ret = hid_sensor_parse_common_attributes(hsdev, HID_USAGE_SENSOR_HUMIDITY, - &humid_st->common_attributes); + &humid_st->common_attributes, + humidity_sensitivity_addresses, + ARRAY_SIZE(humidity_sensitivity_addresses)); if (ret) return ret; diff --git a/drivers/iio/light/hid-sensor-als.c b/drivers/iio/light/hid-sensor-als.c index 4093f2353d95..8bf6e9e0a0e0 100644 --- a/drivers/iio/light/hid-sensor-als.c +++ b/drivers/iio/light/hid-sensor-als.c @@ -39,6 +39,10 @@ struct als_state { s64 timestamp; }; +static const u32 als_sensitivity_addresses[] = { + HID_USAGE_SENSOR_DATA_LIGHT, +}; + /* Channel definitions */ static const struct iio_chan_spec als_channels[] = { { @@ -252,17 +256,6 @@ static int als_parse_report(struct platform_device *pdev, &st->als_illum, &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_LIGHT, - &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 ret; } @@ -285,7 +278,9 @@ static int hid_als_probe(struct platform_device *pdev) als_state->common_attributes.pdev = pdev; ret = hid_sensor_parse_common_attributes(hsdev, HID_USAGE_SENSOR_ALS, - &als_state->common_attributes); + &als_state->common_attributes, + als_sensitivity_addresses, + ARRAY_SIZE(als_sensitivity_addresses)); if (ret) { dev_err(&pdev->dev, "failed to setup common attributes\n"); return ret; diff --git a/drivers/iio/light/hid-sensor-prox.c b/drivers/iio/light/hid-sensor-prox.c index 330cf359e0b8..4ab285a418d5 100644 --- a/drivers/iio/light/hid-sensor-prox.c +++ b/drivers/iio/light/hid-sensor-prox.c @@ -25,6 +25,11 @@ struct prox_state { u32 human_presence; }; +static const u32 prox_sensitivity_addresses[] = { + HID_USAGE_SENSOR_HUMAN_PRESENCE, + HID_USAGE_SENSOR_DATA_PRESENCE, +}; + /* Channel definitions */ static const struct iio_chan_spec prox_channels[] = { { @@ -216,24 +221,6 @@ static int prox_parse_report(struct platform_device *pdev, dev_dbg(&pdev->dev, "prox %x:%x\n", st->prox_attr.index, st->prox_attr.report_id); - /* 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_PRESENCE, - &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); - } - 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_HUMAN_PRESENCE, - &st->common_attributes.sensitivity); - return ret; } @@ -257,7 +244,9 @@ static int hid_prox_probe(struct platform_device *pdev) prox_state->common_attributes.pdev = pdev; ret = hid_sensor_parse_common_attributes(hsdev, HID_USAGE_SENSOR_PROX, - &prox_state->common_attributes); + &prox_state->common_attributes, + prox_sensitivity_addresses, + ARRAY_SIZE(prox_sensitivity_addresses)); if (ret) { dev_err(&pdev->dev, "failed to setup common attributes\n"); return ret; diff --git a/drivers/iio/magnetometer/hid-sensor-magn-3d.c b/drivers/iio/magnetometer/hid-sensor-magn-3d.c index fa48044b7f5b..b78691523dd4 100644 --- a/drivers/iio/magnetometer/hid-sensor-magn-3d.c +++ b/drivers/iio/magnetometer/hid-sensor-magn-3d.c @@ -62,6 +62,11 @@ static const u32 magn_3d_addresses[MAGN_3D_CHANNEL_MAX] = { HID_USAGE_SENSOR_TIME_TIMESTAMP, }; +static const u32 magn_3d_sensitivity_addresses[] = { + HID_USAGE_SENSOR_DATA_ORIENTATION, + HID_USAGE_SENSOR_ORIENT_MAGN_FLUX, +}; + /* Channel definitions */ static const struct iio_chan_spec magn_3d_channels[] = { { @@ -448,27 +453,6 @@ static int magn_3d_parse_report(struct platform_device *pdev, &st->rot_attr.scale_pre_decml, &st->rot_attr.scale_post_decml); - /* Set Sensitivity field ids, when there is no individual modifier */ - if (st->magn_flux_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->magn_flux_attributes.sensitivity); - dev_dbg(&pdev->dev, "Sensitivity index:report %d:%d\n", - st->magn_flux_attributes.sensitivity.index, - st->magn_flux_attributes.sensitivity.report_id); - } - if (st->magn_flux_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_ORIENT_MAGN_FLUX, - &st->magn_flux_attributes.sensitivity); - dev_dbg(&pdev->dev, "Sensitivity index:report %d:%d\n", - st->magn_flux_attributes.sensitivity.index, - st->magn_flux_attributes.sensitivity.report_id); - } if (st->rot_attributes.sensitivity.index < 0) { sensor_hub_input_get_attribute_info(hsdev, HID_FEATURE_REPORT, usage_id, @@ -507,12 +491,16 @@ static int hid_magn_3d_probe(struct platform_device *pdev) ret = hid_sensor_parse_common_attributes(hsdev, HID_USAGE_SENSOR_COMPASS_3D, - &magn_state->magn_flux_attributes); + &magn_state->magn_flux_attributes, + magn_3d_sensitivity_addresses, + ARRAY_SIZE(magn_3d_sensitivity_addresses)); if (ret) { dev_err(&pdev->dev, "failed to setup common attributes\n"); return ret; } magn_state->rot_attributes = magn_state->magn_flux_attributes; + /* sensitivity of rot_attribute is not the same as magn_flux_attributes */ + magn_state->rot_attributes.sensitivity.index = -1; ret = magn_3d_parse_report(pdev, hsdev, &channels, &chan_count, diff --git a/drivers/iio/orientation/hid-sensor-incl-3d.c b/drivers/iio/orientation/hid-sensor-incl-3d.c index 52ebef30f9be..6e69f6e673cc 100644 --- a/drivers/iio/orientation/hid-sensor-incl-3d.c +++ b/drivers/iio/orientation/hid-sensor-incl-3d.c @@ -47,6 +47,10 @@ static const u32 incl_3d_addresses[INCLI_3D_CHANNEL_MAX] = { HID_USAGE_SENSOR_ORIENT_TILT_Z }; +static const u32 incl_3d_sensitivity_addresses[] = { + HID_USAGE_SENSOR_DATA_ORIENTATION, +}; + /* Channel definitions */ static const struct iio_chan_spec incl_3d_channels[] = { { @@ -291,17 +295,6 @@ static int incl_3d_parse_report(struct platform_device *pdev, &st->incl[CHANNEL_SCAN_INDEX_X], &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 ret; } @@ -327,7 +320,9 @@ static int hid_incl_3d_probe(struct platform_device *pdev) ret = hid_sensor_parse_common_attributes(hsdev, HID_USAGE_SENSOR_INCLINOMETER_3D, - &incl_state->common_attributes); + &incl_state->common_attributes, + incl_3d_sensitivity_addresses, + ARRAY_SIZE(incl_3d_sensitivity_addresses)); if (ret) { dev_err(&pdev->dev, "failed to setup common attributes\n"); return ret; diff --git a/drivers/iio/orientation/hid-sensor-rotation.c b/drivers/iio/orientation/hid-sensor-rotation.c index 18e4ef060096..03d2845a7b2c 100644 --- a/drivers/iio/orientation/hid-sensor-rotation.c +++ b/drivers/iio/orientation/hid-sensor-rotation.c @@ -31,6 +31,10 @@ struct dev_rot_state { s64 timestamp; }; +static const u32 rotation_sensitivity_addresses[] = { + HID_USAGE_SENSOR_DATA_ORIENTATION, +}; + /* Channel definitions */ static const struct iio_chan_spec dev_rot_channels[] = { { @@ -214,18 +218,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 +255,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; diff --git a/drivers/iio/position/hid-sensor-custom-intel-hinge.c b/drivers/iio/position/hid-sensor-custom-intel-hinge.c index 64a7fa7db6af..fd77e7ee87f3 100644 --- a/drivers/iio/position/hid-sensor-custom-intel-hinge.c +++ b/drivers/iio/position/hid-sensor-custom-intel-hinge.c @@ -47,6 +47,10 @@ struct hinge_state { u64 timestamp; }; +static const u32 hinge_sensitivity_addresses[] = { + HID_USAGE_SENSOR_DATA_FIELD_CUSTOM_VALUE(1), +}; + /* Channel definitions */ static const struct iio_chan_spec hinge_channels[] = { { @@ -251,18 +255,6 @@ static int hinge_parse_report(struct platform_device *pdev, &st->hinge[CHANNEL_SCAN_INDEX_HINGE_ANGLE], &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_FIELD_CUSTOM_VALUE(1), - &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 ret; } @@ -289,7 +281,9 @@ static int hid_hinge_probe(struct platform_device *pdev) st->labels[i] = hinge_labels[i]; ret = hid_sensor_parse_common_attributes(hsdev, hsdev->usage, - &st->common_attributes); + &st->common_attributes, + hinge_sensitivity_addresses, + ARRAY_SIZE(hinge_sensitivity_addresses)); if (ret) { dev_err(&pdev->dev, "failed to setup common attributes\n"); return ret; diff --git a/drivers/iio/pressure/hid-sensor-press.c b/drivers/iio/pressure/hid-sensor-press.c index 5c458788f346..8cac2c94e75a 100644 --- a/drivers/iio/pressure/hid-sensor-press.c +++ b/drivers/iio/pressure/hid-sensor-press.c @@ -29,6 +29,10 @@ struct press_state { int value_offset; }; +static const u32 press_sensitivity_addresses[] = { + HID_USAGE_SENSOR_DATA_ATMOSPHERIC_PRESSURE, +}; + /* Channel definitions */ static const struct iio_chan_spec press_channels[] = { { @@ -225,17 +229,6 @@ static int press_parse_report(struct platform_device *pdev, &st->press_attr, &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_ATMOSPHERIC_PRESSURE, - &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 ret; } @@ -260,7 +253,9 @@ static int hid_press_probe(struct platform_device *pdev) ret = hid_sensor_parse_common_attributes(hsdev, HID_USAGE_SENSOR_PRESSURE, - &press_state->common_attributes); + &press_state->common_attributes, + press_sensitivity_addresses, + ARRAY_SIZE(press_sensitivity_addresses)); if (ret) { dev_err(&pdev->dev, "failed to setup common attributes\n"); return ret; diff --git a/drivers/iio/temperature/hid-sensor-temperature.c b/drivers/iio/temperature/hid-sensor-temperature.c index 81688f1b932f..e3d38cbcf354 100644 --- a/drivers/iio/temperature/hid-sensor-temperature.c +++ b/drivers/iio/temperature/hid-sensor-temperature.c @@ -22,6 +22,10 @@ struct temperature_state { int value_offset; }; +static const u32 temperature_sensitivity_addresses[] = { + HID_USAGE_SENSOR_DATA_ENVIRONMENTAL_TEMPERATURE, +}; + /* Channel definitions */ static const struct iio_chan_spec temperature_channels[] = { { @@ -171,14 +175,6 @@ static int temperature_parse_report(struct platform_device *pdev, &st->temperature_attr, &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_ENVIRONMENTAL_TEMPERATURE, - &st->common_attributes.sensitivity); - return ret; } @@ -207,7 +203,9 @@ static int hid_temperature_probe(struct platform_device *pdev) ret = hid_sensor_parse_common_attributes(hsdev, HID_USAGE_SENSOR_TEMPERATURE, - &temp_st->common_attributes); + &temp_st->common_attributes, + temperature_sensitivity_addresses, + ARRAY_SIZE(temperature_sensitivity_addresses)); if (ret) return ret; diff --git a/drivers/rtc/rtc-hid-sensor-time.c b/drivers/rtc/rtc-hid-sensor-time.c index 1b42ee0758d2..47cd12db2356 100644 --- a/drivers/rtc/rtc-hid-sensor-time.c +++ b/drivers/rtc/rtc-hid-sensor-time.c @@ -238,7 +238,9 @@ static int hid_time_probe(struct platform_device *pdev) ret = hid_sensor_parse_common_attributes(hsdev, HID_USAGE_SENSOR_TIME, - &time_state->common_attributes); + &time_state->common_attributes, + NULL, + 0); if (ret) { dev_err(&pdev->dev, "failed to setup common attributes!\n"); return ret; diff --git a/include/linux/hid-sensor-hub.h b/include/linux/hid-sensor-hub.h index 46bcef380446..8b2599348554 100644 --- a/include/linux/hid-sensor-hub.h +++ b/include/linux/hid-sensor-hub.h @@ -247,7 +247,9 @@ static inline int hid_sensor_convert_exponent(int unit_expo) int hid_sensor_parse_common_attributes(struct hid_sensor_hub_device *hsdev, u32 usage_id, - struct hid_sensor_common *st); + struct hid_sensor_common *st, + const u32 *sensitivity_addresses, + u32 sensitivity_addresses_len); int hid_sensor_write_raw_hyst_value(struct hid_sensor_common *st, int val1, int val2); int hid_sensor_read_raw_hyst_value(struct hid_sensor_common *st,
No functional change has been made with this patch. The main intent here is to reduce code repetition of getting sensitivity attribute. In the current implementation, sensor_hub_input_get_attribute_info() is called from multiple drivers to get attribute info for sensitivity field. Moving this to common place will avoid code repetition. Signed-off-by: Ye Xiang <xiang.ye@intel.com> --- drivers/iio/accel/hid-sensor-accel-3d.c | 23 ++++++------- .../hid-sensors/hid-sensor-attributes.c | 17 +++++++++- drivers/iio/gyro/hid-sensor-gyro-3d.c | 19 ++++------- drivers/iio/humidity/hid-sensor-humidity.c | 16 ++++------ drivers/iio/light/hid-sensor-als.c | 19 ++++------- drivers/iio/light/hid-sensor-prox.c | 27 +++++----------- drivers/iio/magnetometer/hid-sensor-magn-3d.c | 32 ++++++------------- drivers/iio/orientation/hid-sensor-incl-3d.c | 19 ++++------- drivers/iio/orientation/hid-sensor-rotation.c | 23 ++++++------- .../position/hid-sensor-custom-intel-hinge.c | 20 ++++-------- drivers/iio/pressure/hid-sensor-press.c | 19 ++++------- .../iio/temperature/hid-sensor-temperature.c | 16 ++++------ drivers/rtc/rtc-hid-sensor-time.c | 4 ++- include/linux/hid-sensor-hub.h | 4 ++- 14 files changed, 107 insertions(+), 151 deletions(-)