浏览代码

iio:trigger: add resource managed (un)register

Add resource managed devm_iio_trigger_register() and
devm_iio_triger_unregister() to automatically clean up registered triggers
allocated by IIO drivers, thus leading to simplified IIO drivers code.

Signed-off-by: Gregor Boirie <gregor.boirie@parrot.com>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>
Gregor Boirie 9 年之前
父节点
当前提交
9083325f11
共有 3 个文件被更改,包括 67 次插入0 次删除
  1. 2 0
      Documentation/driver-model/devres.txt
  2. 59 0
      drivers/iio/industrialio-trigger.c
  3. 6 0
      include/linux/iio/trigger.h

+ 2 - 0
Documentation/driver-model/devres.txt

@@ -268,6 +268,8 @@ IIO
   devm_iio_kfifo_free()
   devm_iio_kfifo_free()
   devm_iio_trigger_alloc()
   devm_iio_trigger_alloc()
   devm_iio_trigger_free()
   devm_iio_trigger_free()
+  devm_iio_trigger_register()
+  devm_iio_trigger_unregister()
   devm_iio_channel_get()
   devm_iio_channel_get()
   devm_iio_channel_release()
   devm_iio_channel_release()
   devm_iio_channel_get_all()
   devm_iio_channel_get_all()

+ 59 - 0
drivers/iio/industrialio-trigger.c

@@ -642,6 +642,65 @@ void devm_iio_trigger_free(struct device *dev, struct iio_trigger *iio_trig)
 }
 }
 EXPORT_SYMBOL_GPL(devm_iio_trigger_free);
 EXPORT_SYMBOL_GPL(devm_iio_trigger_free);
 
 
+static void devm_iio_trigger_unreg(struct device *dev, void *res)
+{
+	iio_trigger_unregister(*(struct iio_trigger **)res);
+}
+
+/**
+ * devm_iio_trigger_register - Resource-managed iio_trigger_register()
+ * @dev:	device this trigger was allocated for
+ * @trig_info:	trigger to register
+ *
+ * Managed iio_trigger_register().  The IIO trigger registered with this
+ * function is automatically unregistered on driver detach. This function
+ * calls iio_trigger_register() internally. Refer to that function for more
+ * information.
+ *
+ * If an iio_trigger registered with this function needs to be unregistered
+ * separately, devm_iio_trigger_unregister() must be used.
+ *
+ * RETURNS:
+ * 0 on success, negative error number on failure.
+ */
+int devm_iio_trigger_register(struct device *dev, struct iio_trigger *trig_info)
+{
+	struct iio_trigger **ptr;
+	int ret;
+
+	ptr = devres_alloc(devm_iio_trigger_unreg, sizeof(*ptr), GFP_KERNEL);
+	if (!ptr)
+		return -ENOMEM;
+
+	*ptr = trig_info;
+	ret = iio_trigger_register(trig_info);
+	if (!ret)
+		devres_add(dev, ptr);
+	else
+		devres_free(ptr);
+
+	return ret;
+}
+EXPORT_SYMBOL_GPL(devm_iio_trigger_register);
+
+/**
+ * devm_iio_trigger_unregister - Resource-managed iio_trigger_unregister()
+ * @dev:	device this iio_trigger belongs to
+ * @trig_info:	the trigger associated with the device
+ *
+ * Unregister trigger registered with devm_iio_trigger_register().
+ */
+void devm_iio_trigger_unregister(struct device *dev,
+				 struct iio_trigger *trig_info)
+{
+	int rc;
+
+	rc = devres_release(dev, devm_iio_trigger_unreg, devm_iio_trigger_match,
+			    trig_info);
+	WARN_ON(rc);
+}
+EXPORT_SYMBOL_GPL(devm_iio_trigger_unregister);
+
 void iio_device_register_trigger_consumer(struct iio_dev *indio_dev)
 void iio_device_register_trigger_consumer(struct iio_dev *indio_dev)
 {
 {
 	indio_dev->groups[indio_dev->groupcounter++] =
 	indio_dev->groups[indio_dev->groupcounter++] =

+ 6 - 0
include/linux/iio/trigger.h

@@ -125,12 +125,18 @@ static inline void *iio_trigger_get_drvdata(struct iio_trigger *trig)
  **/
  **/
 int iio_trigger_register(struct iio_trigger *trig_info);
 int iio_trigger_register(struct iio_trigger *trig_info);
 
 
+int devm_iio_trigger_register(struct device *dev,
+			      struct iio_trigger *trig_info);
+
 /**
 /**
  * iio_trigger_unregister() - unregister a trigger from the core
  * iio_trigger_unregister() - unregister a trigger from the core
  * @trig_info:	trigger to be unregistered
  * @trig_info:	trigger to be unregistered
  **/
  **/
 void iio_trigger_unregister(struct iio_trigger *trig_info);
 void iio_trigger_unregister(struct iio_trigger *trig_info);
 
 
+void devm_iio_trigger_unregister(struct device *dev,
+				 struct iio_trigger *trig_info);
+
 /**
 /**
  * iio_trigger_set_immutable() - set an immutable trigger on destination
  * iio_trigger_set_immutable() - set an immutable trigger on destination
  *
  *