Commit 1c71a286 authored by Ye Xiang's avatar Ye Xiang Committed by Jonathan Cameron

iio: Add relative sensitivity support

Some hid sensors may use relative sensitivity such as als sensor.
This patch adds relative sensitivity checking for all hid sensors.
Signed-off-by: default avatarYe Xiang <xiang.ye@intel.com>
Acked-by: default avatarJiri Kosina <jkosina@suse.cz>
Link: https://lore.kernel.org/r/20210207070048.23935-2-xiang.ye@intel.comSigned-off-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
parent 4efd13c3
...@@ -263,6 +263,29 @@ int hid_sensor_read_raw_hyst_value(struct hid_sensor_common *st, ...@@ -263,6 +263,29 @@ int hid_sensor_read_raw_hyst_value(struct hid_sensor_common *st,
} }
EXPORT_SYMBOL(hid_sensor_read_raw_hyst_value); 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 hid_sensor_write_raw_hyst_value(struct hid_sensor_common *st,
int val1, int val2) int val1, int val2)
{ {
...@@ -294,6 +317,37 @@ int hid_sensor_write_raw_hyst_value(struct hid_sensor_common *st, ...@@ -294,6 +317,37 @@ int hid_sensor_write_raw_hyst_value(struct hid_sensor_common *st,
} }
EXPORT_SYMBOL(hid_sensor_write_raw_hyst_value); 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. * This fuction applies the unit exponent to the scale.
* For example: * For example:
...@@ -478,16 +532,28 @@ int hid_sensor_parse_common_attributes(struct hid_sensor_hub_device *hsdev, ...@@ -478,16 +532,28 @@ int hid_sensor_parse_common_attributes(struct hid_sensor_hub_device *hsdev,
HID_USAGE_SENSOR_PROP_SENSITIVITY_ABS, HID_USAGE_SENSOR_PROP_SENSITIVITY_ABS,
&st->sensitivity); &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 * 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++) { for (i = 0; i < sensitivity_addresses_len; i++) {
sensor_hub_input_get_attribute_info(hsdev, if (st->sensitivity.index < 0)
HID_FEATURE_REPORT, usage_id, sensor_hub_input_get_attribute_info(
hsdev, HID_FEATURE_REPORT, usage_id,
HID_USAGE_SENSOR_DATA_MOD_CHANGE_SENSITIVITY_ABS | HID_USAGE_SENSOR_DATA_MOD_CHANGE_SENSITIVITY_ABS |
sensitivity_addresses[i], sensitivity_addresses[i],
&st->sensitivity); &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; st->raw_hystersis = -1;
......
...@@ -157,6 +157,7 @@ static const char * const iio_chan_info_postfix[] = { ...@@ -157,6 +157,7 @@ static const char * const iio_chan_info_postfix[] = {
[IIO_CHAN_INFO_PHASE] = "phase", [IIO_CHAN_INFO_PHASE] = "phase",
[IIO_CHAN_INFO_HARDWAREGAIN] = "hardwaregain", [IIO_CHAN_INFO_HARDWAREGAIN] = "hardwaregain",
[IIO_CHAN_INFO_HYSTERESIS] = "hysteresis", [IIO_CHAN_INFO_HYSTERESIS] = "hysteresis",
[IIO_CHAN_INFO_HYSTERESIS_RELATIVE] = "hysteresis_relative",
[IIO_CHAN_INFO_INT_TIME] = "integration_time", [IIO_CHAN_INFO_INT_TIME] = "integration_time",
[IIO_CHAN_INFO_ENABLE] = "en", [IIO_CHAN_INFO_ENABLE] = "en",
[IIO_CHAN_INFO_CALIBHEIGHT] = "calibheight", [IIO_CHAN_INFO_CALIBHEIGHT] = "calibheight",
......
...@@ -231,6 +231,7 @@ struct hid_sensor_common { ...@@ -231,6 +231,7 @@ struct hid_sensor_common {
struct hid_sensor_hub_attribute_info report_state; struct hid_sensor_hub_attribute_info report_state;
struct hid_sensor_hub_attribute_info power_state; struct hid_sensor_hub_attribute_info power_state;
struct hid_sensor_hub_attribute_info sensitivity; struct hid_sensor_hub_attribute_info sensitivity;
struct hid_sensor_hub_attribute_info sensitivity_rel;
struct hid_sensor_hub_attribute_info report_latency; struct hid_sensor_hub_attribute_info report_latency;
struct work_struct work; struct work_struct work;
}; };
...@@ -253,8 +254,12 @@ int hid_sensor_parse_common_attributes(struct hid_sensor_hub_device *hsdev, ...@@ -253,8 +254,12 @@ int hid_sensor_parse_common_attributes(struct hid_sensor_hub_device *hsdev,
u32 sensitivity_addresses_len); u32 sensitivity_addresses_len);
int hid_sensor_write_raw_hyst_value(struct hid_sensor_common *st, int hid_sensor_write_raw_hyst_value(struct hid_sensor_common *st,
int val1, int val2); 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 hid_sensor_read_raw_hyst_value(struct hid_sensor_common *st,
int *val1, int *val2); 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 hid_sensor_write_samp_freq_value(struct hid_sensor_common *st,
int val1, int val2); int val1, int val2);
int hid_sensor_read_samp_freq_value(struct hid_sensor_common *st, int hid_sensor_read_samp_freq_value(struct hid_sensor_common *st,
......
...@@ -149,6 +149,7 @@ ...@@ -149,6 +149,7 @@
/* Per data field properties */ /* Per data field properties */
#define HID_USAGE_SENSOR_DATA_MOD_NONE 0x00 #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_ABS 0x1000
#define HID_USAGE_SENSOR_DATA_MOD_CHANGE_SENSITIVITY_REL_PCT 0xE000
/* Power state enumerations */ /* Power state enumerations */
#define HID_USAGE_SENSOR_PROP_POWER_STATE_UNDEFINED_ENUM 0x200850 #define HID_USAGE_SENSOR_PROP_POWER_STATE_UNDEFINED_ENUM 0x200850
......
...@@ -50,6 +50,7 @@ enum iio_chan_info_enum { ...@@ -50,6 +50,7 @@ enum iio_chan_info_enum {
IIO_CHAN_INFO_PHASE, IIO_CHAN_INFO_PHASE,
IIO_CHAN_INFO_HARDWAREGAIN, IIO_CHAN_INFO_HARDWAREGAIN,
IIO_CHAN_INFO_HYSTERESIS, IIO_CHAN_INFO_HYSTERESIS,
IIO_CHAN_INFO_HYSTERESIS_RELATIVE,
IIO_CHAN_INFO_INT_TIME, IIO_CHAN_INFO_INT_TIME,
IIO_CHAN_INFO_ENABLE, IIO_CHAN_INFO_ENABLE,
IIO_CHAN_INFO_CALIBHEIGHT, IIO_CHAN_INFO_CALIBHEIGHT,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment