[PATCH 23/34] iio: inkern: split of_iio_channel_get_by_name()
Andy Shevchenko
andy.shevchenko at gmail.com
Fri Jun 10 08:07:03 PDT 2022
On Fri, Jun 10, 2022 at 10:48 AM 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...
Reviewed-by: Andy Shevchenko <andy.shevchenko at gmail.com>
> Signed-off-by: Nuno Sá <nuno.sa at analog.com>
> ---
> drivers/iio/inkern.c | 69 ++++++++++++++++++++++++++++----------------
> 1 file changed, 44 insertions(+), 25 deletions(-)
>
> diff --git a/drivers/iio/inkern.c b/drivers/iio/inkern.c
> index 31d9c122199a..dde47324b826 100644
> --- a/drivers/iio/inkern.c
> +++ b/drivers/iio/inkern.c
> @@ -211,44 +211,63 @@ 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,
> + const char *name,
> + bool *parent_lookup)
> +{
> + 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) {
> + *parent_lookup = false;
> + } else if (name && index >= 0) {
> + pr_err("ERROR: could not get IIO channel %pOF:%s(%i)\n",
> + np, name ? name : "", index);
> + *parent_lookup = false;
> + }
> +
> + return chan;
> +}
> +
> struct iio_channel *of_iio_channel_get_by_name(struct device_node *np,
> const char *name)
> {
> struct iio_channel *chan;
> + bool parent_lookup = true;
>
> /* Walk up the tree of devices looking for a matching iio channel */
> + chan = __of_iio_channel_get_by_name(np, name, &parent_lookup);
> + if (!parent_lookup)
> + 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;
> -
> - /*
> - * 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)
> + if (!of_get_property(np, "io-channel-ranges", NULL))
> return chan;
> - if (name && index >= 0) {
> - pr_err("ERROR: could not get IIO channel %pOF:%s(%i)\n",
> - np, name ? name : "", index);
> +
> + chan = __of_iio_channel_get_by_name(np, name, &parent_lookup);
> + if (!parent_lookup)
> 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 chan;
> }
>
> - return ERR_PTR(-ENODEV);
> + return chan;
> }
> EXPORT_SYMBOL_GPL(of_iio_channel_get_by_name);
>
> --
> 2.36.1
>
--
With Best Regards,
Andy Shevchenko
More information about the Linux-mediatek
mailing list