[PATCH v5 03/13] HID: hid-sensor-hub: introduce device managed API

From: Sanjay Chitroda via B4 Relay

Date: Thu Aug 06 2026 - 08:35:33 EST


From: Sanjay Chitroda <sanjayembeddedse@xxxxxxxxx>

sensor_hub_register_callback() is common API used for the HID IIO drivers,
prepare devm API devm_sensor_hub_register_callback() to acquire resource
during setup and release using device managed framework during drivers
fail, unbind or remove path.

store the required callback removal context (hsdev and usage_id) in a
dedicated struct sensor_hub_cb_devres, and register a devres action to
handle to release resource with devres framework and helper API.

Signed-off-by: Sanjay Chitroda <sanjayembeddedse@xxxxxxxxx>
---
drivers/hid/hid-sensor-hub.c | 32 ++++++++++++++++++++++++++++++++
include/linux/hid-sensor-hub.h | 24 ++++++++++++++++++++++++
2 files changed, 56 insertions(+)

diff --git a/drivers/hid/hid-sensor-hub.c b/drivers/hid/hid-sensor-hub.c
index 90666ff629de..31dbdce27dc6 100644
--- a/drivers/hid/hid-sensor-hub.c
+++ b/drivers/hid/hid-sensor-hub.c
@@ -187,6 +187,38 @@ int sensor_hub_remove_callback(struct hid_sensor_hub_device *hsdev,
}
EXPORT_SYMBOL_GPL(sensor_hub_remove_callback);

+static void sensor_hub_remove_callback_helper(void *ptr)
+{
+ struct sensor_hub_cb_devres *res = ptr;
+
+ sensor_hub_remove_callback(res->hsdev, res->usage_id);
+}
+
+int devm_sensor_hub_register_callback(struct device *dev,
+ struct hid_sensor_hub_device *hsdev,
+ u32 usage_id,
+ struct hid_sensor_hub_callbacks *usage_callback)
+{
+ struct sensor_hub_cb_devres *res;
+ int ret;
+
+ ret = sensor_hub_register_callback(hsdev, usage_id, usage_callback);
+ if (ret)
+ return ret;
+
+ res = devm_kmalloc(dev, sizeof(*res), GFP_KERNEL);
+ if (!res) {
+ sensor_hub_remove_callback(hsdev, usage_id);
+ return -ENOMEM;
+ }
+
+ res->hsdev = hsdev;
+ res->usage_id = usage_id;
+
+ return devm_add_action_or_reset(dev, sensor_hub_remove_callback_helper, res);
+}
+EXPORT_SYMBOL_GPL(devm_sensor_hub_register_callback);
+
int sensor_hub_set_feature(struct hid_sensor_hub_device *hsdev, u32 report_id,
u32 field_index, int buffer_size, void *buffer)
{
diff --git a/include/linux/hid-sensor-hub.h b/include/linux/hid-sensor-hub.h
index e71056553108..c00347b15513 100644
--- a/include/linux/hid-sensor-hub.h
+++ b/include/linux/hid-sensor-hub.h
@@ -75,6 +75,16 @@ struct hid_sensor_hub_device {
struct sensor_hub_pending pending;
};

+/**
+ * struct sensor_hub_cb_devres - devres data for sensor hub callbacks
+ * @hsdev: Hub device instance.
+ * @usage_id: Usage ID associated with registered callback
+ */
+struct sensor_hub_cb_devres {
+ struct hid_sensor_hub_device *hsdev;
+ u32 usage_id;
+};
+
/**
* struct hid_sensor_hub_callbacks - Client callback functions
* @pdev: Platform device instance of the client driver.
@@ -139,6 +149,20 @@ int sensor_hub_register_callback(struct hid_sensor_hub_device *hsdev,
int sensor_hub_remove_callback(struct hid_sensor_hub_device *hsdev,
u32 usage_id);

+/**
+ * devm_sensor_hub_register_callback() - Managed register client callbacks
+ * @dev: Device for resource management
+ * @hsdev: Hub device instance
+ * @usage_id: Usage id of the client (e.g. 0x200076 for Gyro)
+ * @usage_callback: Callback function storage
+ *
+ * This is the devres (managed) version of sensor_hub_register_callback().
+ * The callback will be automatically unregistered when the device is detached.
+ */
+int devm_sensor_hub_register_callback(struct device *dev,
+ struct hid_sensor_hub_device *hsdev,
+ u32 usage_id,
+ struct hid_sensor_hub_callbacks *usage_callback);

/* Hid sensor hub core interfaces */


--
2.34.1