]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
iio: add child nodes support in iio backend framework
authorOlivier Moysan <olivier.moysan@foss.st.com>
Tue, 30 Jul 2024 08:46:33 +0000 (10:46 +0200)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Sat, 10 Aug 2024 10:17:34 +0000 (11:17 +0100)
Add an API to support IIO generic channels binding:
http://devicetree.org/schemas/iio/adc/adc.yaml#
This new API is needed, as generic channel DT node isn't populated as a
device.
Add devm_iio_backend_fwnode_get() to allow an IIO device backend
consumer to reference backend phandles in its child nodes.

Signed-off-by: Olivier Moysan <olivier.moysan@foss.st.com>
Reviewed-by: Nuno Sa <nuno.sa@analog.com>
Link: https://patch.msgid.link/20240730084640.1307938-4-olivier.moysan@foss.st.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/industrialio-backend.c
include/linux/iio/backend.h

index 8a7ff783ae29afe8d9e7f7751eeb00370f7a0d8c..a52a6b61c8b57841b1cf893c7efc95cc5f699c1f 100644 (file)
@@ -718,19 +718,10 @@ static int __devm_iio_backend_get(struct device *dev, struct iio_backend *back)
        return 0;
 }
 
-/**
- * devm_iio_backend_get - Device managed backend device get
- * @dev: Consumer device for the backend
- * @name: Backend name
- *
- * Get's the backend associated with @dev.
- *
- * RETURNS:
- * A backend pointer, negative error pointer otherwise.
- */
-struct iio_backend *devm_iio_backend_get(struct device *dev, const char *name)
+static struct iio_backend *__devm_iio_backend_fwnode_get(struct device *dev, const char *name,
+                                                        struct fwnode_handle *fwnode)
 {
-       struct fwnode_handle *fwnode;
+       struct fwnode_handle *fwnode_back;
        struct iio_backend *back;
        unsigned int index;
        int ret;
@@ -745,17 +736,17 @@ struct iio_backend *devm_iio_backend_get(struct device *dev, const char *name)
                index = 0;
        }
 
-       fwnode = fwnode_find_reference(dev_fwnode(dev), "io-backends", index);
+       fwnode_back = fwnode_find_reference(fwnode, "io-backends", index);
        if (IS_ERR(fwnode))
                return dev_err_cast_probe(dev, fwnode,
                                          "Cannot get Firmware reference\n");
 
        guard(mutex)(&iio_back_lock);
        list_for_each_entry(back, &iio_back_list, entry) {
-               if (!device_match_fwnode(back->dev, fwnode))
+               if (!device_match_fwnode(back->dev, fwnode_back))
                        continue;
 
-               fwnode_handle_put(fwnode);
+               fwnode_handle_put(fwnode_back);
                ret = __devm_iio_backend_get(dev, back);
                if (ret)
                        return ERR_PTR(ret);
@@ -766,11 +757,45 @@ struct iio_backend *devm_iio_backend_get(struct device *dev, const char *name)
                return back;
        }
 
-       fwnode_handle_put(fwnode);
+       fwnode_handle_put(fwnode_back);
        return ERR_PTR(-EPROBE_DEFER);
 }
+
+/**
+ * devm_iio_backend_get - Device managed backend device get
+ * @dev: Consumer device for the backend
+ * @name: Backend name
+ *
+ * Get's the backend associated with @dev.
+ *
+ * RETURNS:
+ * A backend pointer, negative error pointer otherwise.
+ */
+struct iio_backend *devm_iio_backend_get(struct device *dev, const char *name)
+{
+       return __devm_iio_backend_fwnode_get(dev, name, dev_fwnode(dev));
+}
 EXPORT_SYMBOL_NS_GPL(devm_iio_backend_get, IIO_BACKEND);
 
+/**
+ * devm_iio_backend_fwnode_get - Device managed backend firmware node get
+ * @dev: Consumer device for the backend
+ * @name: Backend name
+ * @fwnode: Firmware node of the backend consumer
+ *
+ * Get's the backend associated with a firmware node.
+ *
+ * RETURNS:
+ * A backend pointer, negative error pointer otherwise.
+ */
+struct iio_backend *devm_iio_backend_fwnode_get(struct device *dev,
+                                               const char *name,
+                                               struct fwnode_handle *fwnode)
+{
+       return __devm_iio_backend_fwnode_get(dev, name, fwnode);
+}
+EXPORT_SYMBOL_NS_GPL(devm_iio_backend_fwnode_get, IIO_BACKEND);
+
 /**
  * __devm_iio_backend_get_from_fwnode_lookup - Device managed fwnode backend device get
  * @dev: Consumer device for the backend
index b0b663163ff447cea5e0a7aabd1dc4d4a5df7c34..37d56914d4857f77958800968241a3cde00656af 100644 (file)
@@ -176,6 +176,9 @@ int iio_backend_extend_chan_spec(struct iio_backend *back,
                                 struct iio_chan_spec *chan);
 void *iio_backend_get_priv(const struct iio_backend *conv);
 struct iio_backend *devm_iio_backend_get(struct device *dev, const char *name);
+struct iio_backend *devm_iio_backend_fwnode_get(struct device *dev,
+                                               const char *name,
+                                               struct fwnode_handle *fwnode);
 struct iio_backend *
 __devm_iio_backend_get_from_fwnode_lookup(struct device *dev,
                                          struct fwnode_handle *fwnode);