Received: by 2002:a05:6a10:8c0a:0:0:0:0 with SMTP id go10csp2824522pxb; Sat, 6 Feb 2021 08:55:57 -0800 (PST) X-Google-Smtp-Source: ABdhPJxGpEcYVE1KTXh69rabTIvO4bE3lEko/GyksFxa/kH4YBFpMezVByTnJJqEgVb3NnWRZyh4 X-Received: by 2002:a05:6402:3514:: with SMTP id b20mr8955955edd.100.1612630557444; Sat, 06 Feb 2021 08:55:57 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1612630557; cv=none; d=google.com; s=arc-20160816; b=hmV6+FpLSwzF/3iNtIXnIuHmFOZHM1hkhqG3I9W/r9+yGgcDOZ2PAkQTb7Ep7A1823 Romv73PMgEqvZvku+/u2Iq7358gJ2lEf7QOkTWs4tz33NjBBCYeBr6Qvh1gPUeW0HfZ/ cwERSC4kTbu96irrMdEaCvcXXcVdXY0iGqplLpsf64YlXus3sLOsFw7z9eTalHj2Axxk cib09Bf1Mvq4LucWqZQlCEC4iaPLYoNQEb4VZZP7z5GJWJJB4K5qrYhgyHIix+K7n9v9 VUxiaW6kYqt7F4Kn4B7GKmX/uscV+HPWD+Pa+9Lr/GZM9dW+Y070J8VzTTiIwKdzIq4l WJRA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:subject:cc:to:from:date; bh=sW7nmBFWw9FfB3OxEp19JvOWBnJpr9lQLJEAMGofl08=; b=GK2jP7RT5zvXAIejGpBJ1P/WndXKOM7PrblMBNyiJuHNmr8If388/5IZqrz0DxVxjj PCNIgRMo5ZbFPJVGc9GXutxzegqxd2LOjrSzREokk0bYTYfA9nch5JvU6mvz5qw2niug JU8fXGKTFMKTolxro5mvknmtd8UQqSN1avdjRy3ktaTT1hLMNRJZtjvrxc4FhvLlbVnN Afsu0znp0t7jc9UoDWLYiANpsrjr7c+CfqcpT4HHmRfrxiGxBEnygQbERK7JqdM/0v2a KpfMgVeh+n5dszu8+20Il1p/3OqgBTU6Q2q8Wj/PJVqMuSG5pbcsv5lC0rsxF3i47xf6 KU9g== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id uz17si7689360ejb.591.2021.02.06.08.55.31; Sat, 06 Feb 2021 08:55:57 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229939AbhBFQyl (ORCPT + 99 others); Sat, 6 Feb 2021 11:54:41 -0500 Received: from mail.kernel.org ([198.145.29.99]:55992 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229975AbhBFQwc (ORCPT ); Sat, 6 Feb 2021 11:52:32 -0500 Received: from archlinux (cpc108967-cmbg20-2-0-cust86.5-4.cable.virginm.net [81.101.6.87]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 4942764EBF; Sat, 6 Feb 2021 16:51:50 +0000 (UTC) Date: Sat, 6 Feb 2021 16:51:46 +0000 From: Jonathan Cameron To: Ye Xiang Cc: jikos@kernel.org, srinivas.pandruvada@linux.intel.com, linux-input@vger.kernel.org, linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH 1/3] iio: Add relative sensitivity support Message-ID: <20210206165146.5502332a@archlinux> In-Reply-To: <20210201074358.18435-2-xiang.ye@intel.com> References: <20210201074358.18435-1-xiang.ye@intel.com> <20210201074358.18435-2-xiang.ye@intel.com> X-Mailer: Claws Mail 3.17.8 (GTK+ 2.24.33; x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, 1 Feb 2021 15:43:56 +0800 Ye Xiang wrote: > 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 One trivial formatting thing inline + ideally I'd like an ack from Jiri for the HID related header changes. Otherwise look good to me! Jonathan > --- > .../hid-sensors/hid-sensor-attributes.c | 75 ++++++++++++++++++- > drivers/iio/industrialio-core.c | 1 + > include/linux/hid-sensor-hub.h | 5 ++ > include/linux/hid-sensor-ids.h | 1 + > include/linux/iio/types.h | 1 + > 5 files changed, 79 insertions(+), 4 deletions(-) > > diff --git a/drivers/iio/common/hid-sensors/hid-sensor-attributes.c b/drivers/iio/common/hid-sensors/hid-sensor-attributes.c > index d349ace2e33f..7a555262ff9a 100644 > --- a/drivers/iio/common/hid-sensors/hid-sensor-attributes.c > +++ b/drivers/iio/common/hid-sensors/hid-sensor-attributes.c > @@ -263,6 +263,30 @@ 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; > + } else { This isn't really an 'else' path given we've returned for the error path above. hence I'd just drop the indentation of this. That is if (ret < 0 || value < 0) { ... } convert_from_vtf... > + 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 +318,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 +533,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; > diff --git a/drivers/iio/industrialio-core.c b/drivers/iio/industrialio-core.c > index 7db761afa578..3da8fcec3c16 100644 > --- a/drivers/iio/industrialio-core.c > +++ b/drivers/iio/industrialio-core.c > @@ -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", > diff --git a/include/linux/hid-sensor-hub.h b/include/linux/hid-sensor-hub.h > index 8b2599348554..5e7bc309172e 100644 > --- a/include/linux/hid-sensor-hub.h > +++ b/include/linux/hid-sensor-hub.h > @@ -230,6 +230,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; > }; > @@ -252,8 +253,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, > diff --git a/include/linux/hid-sensor-ids.h b/include/linux/hid-sensor-ids.h > index 3bbdbccc5805..ac631159403a 100644 > --- a/include/linux/hid-sensor-ids.h > +++ b/include/linux/hid-sensor-ids.h > @@ -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 > diff --git a/include/linux/iio/types.h b/include/linux/iio/types.h > index 1e3ed6f55bca..5aa7f66d4345 100644 > --- a/include/linux/iio/types.h > +++ b/include/linux/iio/types.h > @@ -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,