[PATCH v3 04/15] iio: inkern: split of_iio_channel_get_by_name()
Jonathan Cameron
jic23 at kernel.org
Sat Aug 6 11:30:16 PDT 2022
On Fri, 15 Jul 2022 14:28:52 +0200
Nuno Sá <nuno.sa at analog.com> wrote:
> This change splits of_iio_channel_get_by_name() so that it decouples
> looking for channels in the current node from looking in it's parents
> nodes. This will be helpful when moving to fwnode properties where we
> need to release the handles when looking for channels in parent's nodes.
>
> No functional change intended...
>
> Signed-off-by: Nuno Sá <nuno.sa at analog.com>
> Reviewed-by: Andy Shevchenko <andy.shevchenko at gmail.com>
A few things from a build test (after hand applying this because of
issues with the comment thing following through the series).
Seem obvious so I fixed them up.
> ---
> drivers/iio/inkern.c | 109 ++++++++++++++++++++++++++-----------------
> 1 file changed, 65 insertions(+), 44 deletions(-)
>
> diff --git a/drivers/iio/inkern.c b/drivers/iio/inkern.c
> index c6f1cfe09bd3..f97b7967d3d9 100644
> --- a/drivers/iio/inkern.c
> +++ b/drivers/iio/inkern.c
> @@ -211,61 +211,82 @@ static struct iio_channel *of_iio_channel_get(struct device_node *np, int index)
> return ERR_PTR(err);
> }
>
> +struct iio_channel *__of_iio_channel_get_by_name(struct device_node *np,
static
> + const char *name)
> +{
> + struct iio_channel *chan;
> + int index = 0;
> +
> + /*
> + * For named iio channels, first look up the name in the
> + * "io-channel-names" property. If it cannot be found, the
> + * index will be an error code, and of_iio_channel_get()
> + * will fail.
> + */
> + if (name)
> + index = of_property_match_string(np, "io-channel-names", name);
> +
> + chan = of_iio_channel_get(np, index);
> + if (!IS_ERR(chan) || PTR_ERR(chan) == -EPROBE_DEFER)
> + return chan;
> + if (name) {
> + if (index >= 0) {
> + pr_err("ERROR: could not get IIO channel %pOF:%s(%i)\n",
> + np, name, index);
> + /*
> + * In this case, we found 'name' in 'io-channel-names'
> + * but somehow we still fail so that we should not proceed
> + * with any other lookup. Hence, explicitly return -EINVAL
> + * (maybe not the better error code) so that the caller
> + * won't do a system lookup.
> + */
> + return ERR_PTR(-EINVAL);
> + }
> + /* If index < 0, then of_parse_phandle_with_args() fails
> + * with -EINVAL which is expected. We should not proceed
> + * if we get any other error.
> + */
> + if (PTR_ERR(chan) != -EINVAL)
> + return chan;
> + } else if (PTR_ERR(chan) != -ENOENT) {
> + /*
> + * if !name, then we should only proceed the lookup if
> + * of_parse_phandle_with_args() returns -ENOENT.
> + */
> + return chan;
> + }
> +
> + /* so we continue the lookup */
> + return ERR_PTR(-ENODEV);
> +}
> +
> struct iio_channel *of_iio_channel_get_by_name(struct device_node *np,
> const char *name)
> {
> struct iio_channel *chan;
>
> /* Walk up the tree of devices looking for a matching iio channel */
> + chan = __of_iio_channel_get_by_name(np, name);
> + if (!IS_ERR(chan) || PTR_ERR(chan) != -ENODEV)
> + return chan;
> +
> + /*
> + * No matching IIO channel found on this node.
> + * If the parent node has a "io-channel-ranges" property,
> + * then we can try one of its channels.
> + */
> + np = np->parent;
> while (np) {
> int index = 0;
Not used.
>
> - /*
> - * For named iio channels, first look up the name in the
> - * "io-channel-names" property. If it cannot be found, the
> - * index will be an error code, and of_iio_channel_get()
> - * will fail.
> - */
> - if (name)
> - index = of_property_match_string(np, "io-channel-names",
> - name);
> - chan = of_iio_channel_get(np, index);
> - if (!IS_ERR(chan) || PTR_ERR(chan) == -EPROBE_DEFER)
> - return chan;
> - if (name) {
> - if (index >= 0) {
> - pr_err("ERROR: could not get IIO channel %pOF:%s(%i)\n",
> - np, name, index);
> - /*
> - * In this case, we found 'name' in 'io-channel-names'
> - * but somehow we still fail so that we should not proceed
> - * with any other lookup. Hence, explicitly return -EINVAL
> - * (maybe not the better error code) so that the caller
> - * won't do a system lookup.
> - */
> - return ERR_PTR(-EINVAL);
> - }
> - /* If index < 0, then of_parse_phandle_with_args() fails
> - * with -EINVAL which is expected. We should not proceed
> - * if we get any other error.
> - */
> - if (PTR_ERR(chan) != -EINVAL)
> - return chan;
> - } else if (PTR_ERR(chan) != -ENOENT) {
> - /*
> - * if !name, then we should only proceed the lookup if
> - * of_parse_phandle_with_args() returns -ENOENT.
> - */
> + if (!of_get_property(np, "io-channel-ranges", NULL))
> + return ERR_PTR(-ENODEV);
> +
> + chan = __of_iio_channel_get_by_name(np, name);
> + if (!IS_ERR(chan) || PTR_ERR(chan) != -ENODEV)
> return chan;
> - }
> - /*
> - * No matching IIO channel found on this node.
> - * If the parent node has a "io-channel-ranges" property,
> - * then we can try one of its channels.
> - */
> +
> np = np->parent;
> - if (np && !of_get_property(np, "io-channel-ranges", NULL))
> - return ERR_PTR(-ENODEV);
> }
>
> return ERR_PTR(-ENODEV);
More information about the Linux-mediatek
mailing list