mirror of
https://github.com/torvalds/linux.git
synced 2026-05-26 08:02:27 +02:00
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: 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>
This commit is contained in:
parent
2530d7d44c
commit
c464cc610f
|
|
@ -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)
|
||||||
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)
|
||||||
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,
|
||||||
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);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user