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: 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>
This commit is contained in:
Родитель
4efd13c3c2
Коммит
1c71a2863a
|
@ -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)
|
||||
{
|
||||
|
@ -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:
|
||||
|
@ -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;
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
Загрузка…
Ссылка в новой задаче