Commit c464cc61 authored by Olivier Moysan's avatar Olivier Moysan Committed by Jonathan Cameron

iio: add child nodes support in iio backend framework

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: default avatarOlivier Moysan <olivier.moysan@foss.st.com>
Reviewed-by: default avatarNuno Sa <nuno.sa@analog.com>
Link: https://patch.msgid.link/20240730084640.1307938-4-olivier.moysan@foss.st.comSigned-off-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
parent 2530d7d4
...@@ -718,19 +718,10 @@ static int __devm_iio_backend_get(struct device *dev, struct iio_backend *back) ...@@ -718,19 +718,10 @@ static int __devm_iio_backend_get(struct device *dev, struct iio_backend *back)
return 0; return 0;
} }
/** static struct iio_backend *__devm_iio_backend_fwnode_get(struct device *dev, const char *name,
* devm_iio_backend_get - Device managed backend device get struct fwnode_handle *fwnode)
* @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)
{ {
struct fwnode_handle *fwnode; struct fwnode_handle *fwnode_back;
struct iio_backend *back; struct iio_backend *back;
unsigned int index; unsigned int index;
int ret; int ret;
...@@ -745,17 +736,17 @@ struct iio_backend *devm_iio_backend_get(struct device *dev, const char *name) ...@@ -745,17 +736,17 @@ struct iio_backend *devm_iio_backend_get(struct device *dev, const char *name)
index = 0; 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)) if (IS_ERR(fwnode))
return dev_err_cast_probe(dev, fwnode, return dev_err_cast_probe(dev, fwnode,
"Cannot get Firmware reference\n"); "Cannot get Firmware reference\n");
guard(mutex)(&iio_back_lock); guard(mutex)(&iio_back_lock);
list_for_each_entry(back, &iio_back_list, entry) { 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; continue;
fwnode_handle_put(fwnode); fwnode_handle_put(fwnode_back);
ret = __devm_iio_backend_get(dev, back); ret = __devm_iio_backend_get(dev, back);
if (ret) if (ret)
return ERR_PTR(ret); return ERR_PTR(ret);
...@@ -766,11 +757,45 @@ struct iio_backend *devm_iio_backend_get(struct device *dev, const char *name) ...@@ -766,11 +757,45 @@ struct iio_backend *devm_iio_backend_get(struct device *dev, const char *name)
return back; return back;
} }
fwnode_handle_put(fwnode); fwnode_handle_put(fwnode_back);
return ERR_PTR(-EPROBE_DEFER); 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); 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 * __devm_iio_backend_get_from_fwnode_lookup - Device managed fwnode backend device get
* @dev: Consumer device for the backend * @dev: Consumer device for the backend
......
...@@ -176,6 +176,9 @@ int iio_backend_extend_chan_spec(struct iio_backend *back, ...@@ -176,6 +176,9 @@ int iio_backend_extend_chan_spec(struct iio_backend *back,
struct iio_chan_spec *chan); struct iio_chan_spec *chan);
void *iio_backend_get_priv(const struct iio_backend *conv); 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_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 * struct iio_backend *
__devm_iio_backend_get_from_fwnode_lookup(struct device *dev, __devm_iio_backend_get_from_fwnode_lookup(struct device *dev,
struct fwnode_handle *fwnode); struct fwnode_handle *fwnode);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment