Thread (8 messages) flat view 8 messages, 3 authors, 2025-06-18

Re: [PATCH] HID: amd_sfh: Enable operating mode

From: Mario Limonciello <mario.limonciello@amd.com>
Date: 2025-06-09 22:21:19

+Denis

On 5/27/2025 4:10 AM, Basavaraj Natikar wrote:
Add changes to enable operating modes in the driver to allow the FW to
activate and retrieve data from relevant sensors. This enables the FW to
take necessary actions based on the operating modes.

Co-developed-by: Akshata MukundShetty <redacted>
Signed-off-by: Akshata MukundShetty <redacted>
Signed-off-by: Basavaraj Natikar <Basavaraj.Natikar@amd.com>
Comparing this to the series that was submitted by Denis [1] I notice 
that the main tangible difference is that this isn't exported into the 
HID descriptor.  So how does userspace know the current operating mode 
with this patch?

Link: 
https://lore.kernel.org/linux-input/20250309194934.1759953-2-benato.denis96@gmail.com/ (local) 
[1]
quoted hunk ↗ jump to hunk
---
  drivers/hid/amd-sfh-hid/amd_sfh_client.c | 23 +++++++++++++++++++++++
  drivers/hid/amd-sfh-hid/amd_sfh_pcie.c   |  4 ++++
  drivers/hid/amd-sfh-hid/amd_sfh_pcie.h   |  1 +
  3 files changed, 28 insertions(+)
diff --git a/drivers/hid/amd-sfh-hid/amd_sfh_client.c b/drivers/hid/amd-sfh-hid/amd_sfh_client.c
index 3438d392920f..0f2cbae39b2b 100644
--- a/drivers/hid/amd-sfh-hid/amd_sfh_client.c
+++ b/drivers/hid/amd-sfh-hid/amd_sfh_client.c
@@ -146,6 +146,8 @@ static const char *get_sensor_name(int idx)
  		return "gyroscope";
  	case mag_idx:
  		return "magnetometer";
+	case op_idx:
+		return "operating-mode";
  	case als_idx:
  	case ACS_IDX: /* ambient color sensor */
  		return "ALS";
@@ -243,6 +245,20 @@ int amd_sfh_hid_client_init(struct amd_mp2_dev *privdata)
  			rc = -ENOMEM;
  			goto cleanup;
  		}
+
+		if (cl_data->sensor_idx[i] == op_idx) {
+			info.period = AMD_SFH_IDLE_LOOP;
+			info.sensor_idx = cl_data->sensor_idx[i];
+			info.dma_address = cl_data->sensor_dma_addr[i];
+			mp2_ops->start(privdata, info);
+			cl_data->sensor_sts[i] = amd_sfh_wait_for_response(privdata,
+									   cl_data->sensor_idx[i],
+									   SENSOR_ENABLED);
+			if (cl_data->sensor_sts[i] == SENSOR_ENABLED)
+				cl_data->is_any_sensor_enabled = true;
+			continue;
+		}
+
  		cl_data->sensor_sts[i] = SENSOR_DISABLED;
  		cl_data->sensor_requested_cnt[i] = 0;
  		cl_data->cur_hid_dev = i;
@@ -303,6 +319,13 @@ int amd_sfh_hid_client_init(struct amd_mp2_dev *privdata)
  
  	for (i = 0; i < cl_data->num_hid_devices; i++) {
  		cl_data->cur_hid_dev = i;
+		if (cl_data->sensor_idx[i] == op_idx) {
+			dev_dbg(dev, "sid 0x%x (%s) status 0x%x\n",
+				cl_data->sensor_idx[i], get_sensor_name(cl_data->sensor_idx[i]),
+				cl_data->sensor_sts[i]);
+			continue;
+		}
+
  		if (cl_data->sensor_sts[i] == SENSOR_ENABLED) {
  			rc = amdtp_hid_probe(i, cl_data);
  			if (rc)
diff --git a/drivers/hid/amd-sfh-hid/amd_sfh_pcie.c b/drivers/hid/amd-sfh-hid/amd_sfh_pcie.c
index 1c1fd63330c9..2983af969579 100644
--- a/drivers/hid/amd-sfh-hid/amd_sfh_pcie.c
+++ b/drivers/hid/amd-sfh-hid/amd_sfh_pcie.c
@@ -29,6 +29,7 @@
  #define ACEL_EN		BIT(0)
  #define GYRO_EN		BIT(1)
  #define MAGNO_EN	BIT(2)
+#define OP_EN		BIT(15)
  #define HPD_EN		BIT(16)
  #define ALS_EN		BIT(19)
  #define ACS_EN		BIT(22)
@@ -232,6 +233,9 @@ int amd_mp2_get_sensor_num(struct amd_mp2_dev *privdata, u8 *sensor_id)
  	if (MAGNO_EN & activestatus)
  		sensor_id[num_of_sensors++] = mag_idx;
  
+	if (OP_EN & activestatus)
+		sensor_id[num_of_sensors++] = op_idx;
+
  	if (ALS_EN & activestatus)
  		sensor_id[num_of_sensors++] = als_idx;
  
diff --git a/drivers/hid/amd-sfh-hid/amd_sfh_pcie.h b/drivers/hid/amd-sfh-hid/amd_sfh_pcie.h
index 05e400a4a83e..2eb61f4e8434 100644
--- a/drivers/hid/amd-sfh-hid/amd_sfh_pcie.h
+++ b/drivers/hid/amd-sfh-hid/amd_sfh_pcie.h
@@ -79,6 +79,7 @@ enum sensor_idx {
  	accel_idx = 0,
  	gyro_idx = 1,
  	mag_idx = 2,
+	op_idx = 15,
  	als_idx = 19
  };
  
  
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help