Skip to content

Commit

Permalink
iio: Add relative sensitivity support
Browse files Browse the repository at this point in the history
Some hid sensors may use relative sensitivity such as als sensor.
This patch adds relative sensitivity checking for all hid sensors.

Signed-off-by: Ye Xiang <xiang.ye@intel.com>
Acked-by: Jiri Kosina <jkosina@suse.cz>
Link: https://lore.kernel.org/r/20210207070048.23935-2-xiang.ye@intel.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
  • Loading branch information
Ye Xiang authored and Jonathan Cameron committed Mar 11, 2021
1 parent 4efd13c commit 1c71a28
Show file tree
Hide file tree
Showing 5 changed files with 78 additions and 4 deletions.
74 changes: 70 additions & 4 deletions drivers/iio/common/hid-sensors/hid-sensor-attributes.c
Original file line number Diff line number Diff line change
Expand Up @@ -263,6 +263,29 @@ int hid_sensor_read_raw_hyst_value(struct hid_sensor_common *st,
}
EXPORT_SYMBOL(hid_sensor_read_raw_hyst_value);

int hid_sensor_read_raw_hyst_rel_value(struct hid_sensor_common *st, int *val1,
int *val2)
{
s32 value;
int ret;

ret = sensor_hub_get_feature(st->hsdev,
st->sensitivity_rel.report_id,
st->sensitivity_rel.index, sizeof(value),
&value);
if (ret < 0 || value < 0) {
*val1 = *val2 = 0;
return -EINVAL;
}

convert_from_vtf_format(value, st->sensitivity_rel.size,
st->sensitivity_rel.unit_expo, val1, val2);

return IIO_VAL_INT_PLUS_MICRO;
}
EXPORT_SYMBOL(hid_sensor_read_raw_hyst_rel_value);


int hid_sensor_write_raw_hyst_value(struct hid_sensor_common *st,
int val1, int val2)
{
Expand Down Expand Up @@ -294,6 +317,37 @@ int hid_sensor_write_raw_hyst_value(struct hid_sensor_common *st,
}
EXPORT_SYMBOL(hid_sensor_write_raw_hyst_value);

int hid_sensor_write_raw_hyst_rel_value(struct hid_sensor_common *st,
int val1, int val2)
{
s32 value;
int ret;

if (val1 < 0 || val2 < 0)
return -EINVAL;

value = convert_to_vtf_format(st->sensitivity_rel.size,
st->sensitivity_rel.unit_expo,
val1, val2);
ret = sensor_hub_set_feature(st->hsdev, st->sensitivity_rel.report_id,
st->sensitivity_rel.index, sizeof(value),
&value);
if (ret < 0 || value < 0)
return -EINVAL;

ret = sensor_hub_get_feature(st->hsdev,
st->sensitivity_rel.report_id,
st->sensitivity_rel.index, sizeof(value),
&value);
if (ret < 0 || value < 0)
return -EINVAL;

st->raw_hystersis = value;

return 0;
}
EXPORT_SYMBOL(hid_sensor_write_raw_hyst_rel_value);

/*
* This fuction applies the unit exponent to the scale.
* For example:
Expand Down Expand Up @@ -478,16 +532,28 @@ int hid_sensor_parse_common_attributes(struct hid_sensor_hub_device *hsdev,
HID_USAGE_SENSOR_PROP_SENSITIVITY_ABS,
&st->sensitivity);

sensor_hub_input_get_attribute_info(hsdev,
HID_FEATURE_REPORT, usage_id,
HID_USAGE_SENSOR_PROP_SENSITIVITY_REL_PCT,
&st->sensitivity_rel);
/*
* Set Sensitivity field ids, when there is no individual modifier, will
* check absolute sensitivity of data field
* check absolute sensitivity and relative 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,
for (i = 0; i < sensitivity_addresses_len; i++) {
if (st->sensitivity.index < 0)
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);

if (st->sensitivity_rel.index < 0)
sensor_hub_input_get_attribute_info(
hsdev, HID_FEATURE_REPORT, usage_id,
HID_USAGE_SENSOR_DATA_MOD_CHANGE_SENSITIVITY_REL_PCT |
sensitivity_addresses[i],
&st->sensitivity_rel);
}

st->raw_hystersis = -1;
Expand Down
1 change: 1 addition & 0 deletions drivers/iio/industrialio-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,7 @@ static const char * const iio_chan_info_postfix[] = {
[IIO_CHAN_INFO_PHASE] = "phase",
[IIO_CHAN_INFO_HARDWAREGAIN] = "hardwaregain",
[IIO_CHAN_INFO_HYSTERESIS] = "hysteresis",
[IIO_CHAN_INFO_HYSTERESIS_RELATIVE] = "hysteresis_relative",
[IIO_CHAN_INFO_INT_TIME] = "integration_time",
[IIO_CHAN_INFO_ENABLE] = "en",
[IIO_CHAN_INFO_CALIBHEIGHT] = "calibheight",
Expand Down
5 changes: 5 additions & 0 deletions include/linux/hid-sensor-hub.h
Original file line number Diff line number Diff line change
Expand Up @@ -231,6 +231,7 @@ struct hid_sensor_common {
struct hid_sensor_hub_attribute_info report_state;
struct hid_sensor_hub_attribute_info power_state;
struct hid_sensor_hub_attribute_info sensitivity;
struct hid_sensor_hub_attribute_info sensitivity_rel;
struct hid_sensor_hub_attribute_info report_latency;
struct work_struct work;
};
Expand All @@ -253,8 +254,12 @@ int hid_sensor_parse_common_attributes(struct hid_sensor_hub_device *hsdev,
u32 sensitivity_addresses_len);
int hid_sensor_write_raw_hyst_value(struct hid_sensor_common *st,
int val1, int val2);
int hid_sensor_write_raw_hyst_rel_value(struct hid_sensor_common *st, int val1,
int val2);
int hid_sensor_read_raw_hyst_value(struct hid_sensor_common *st,
int *val1, int *val2);
int hid_sensor_read_raw_hyst_rel_value(struct hid_sensor_common *st,
int *val1, int *val2);
int hid_sensor_write_samp_freq_value(struct hid_sensor_common *st,
int val1, int val2);
int hid_sensor_read_samp_freq_value(struct hid_sensor_common *st,
Expand Down
1 change: 1 addition & 0 deletions include/linux/hid-sensor-ids.h
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,7 @@
/* Per data field properties */
#define HID_USAGE_SENSOR_DATA_MOD_NONE 0x00
#define HID_USAGE_SENSOR_DATA_MOD_CHANGE_SENSITIVITY_ABS 0x1000
#define HID_USAGE_SENSOR_DATA_MOD_CHANGE_SENSITIVITY_REL_PCT 0xE000

/* Power state enumerations */
#define HID_USAGE_SENSOR_PROP_POWER_STATE_UNDEFINED_ENUM 0x200850
Expand Down
1 change: 1 addition & 0 deletions include/linux/iio/types.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ enum iio_chan_info_enum {
IIO_CHAN_INFO_PHASE,
IIO_CHAN_INFO_HARDWAREGAIN,
IIO_CHAN_INFO_HYSTERESIS,
IIO_CHAN_INFO_HYSTERESIS_RELATIVE,
IIO_CHAN_INFO_INT_TIME,
IIO_CHAN_INFO_ENABLE,
IIO_CHAN_INFO_CALIBHEIGHT,
Expand Down

0 comments on commit 1c71a28

Please sign in to comment.