Re: [PATCH v5 2/4] iio: backend: add devm_iio_backend_get_by_index()
From: Jonathan Cameron
Date: Sat Mar 07 2026 - 06:55:29 EST
On Thu, 5 Mar 2026 13:37:28 +0200
Antoniu Miclaus <antoniu.miclaus@xxxxxxxxxx> wrote:
> Add a new function to get an IIO backend by its index in the
> io-backends device tree property. This is useful for multi-channel
> devices that have multiple backends, where looking up by index is
> more straightforward than using named backends.
>
> Extract __devm_iio_backend_fwnode_get_by_index() from the existing
> __devm_iio_backend_fwnode_get(), taking the index directly as a
> parameter. The new public API devm_iio_backend_get_by_index() uses
> the index to find the backend reference in the io-backends property,
> avoiding the need for io-backend-names.
>
> Reviewed-by: Nuno Sá <nuno.sa@xxxxxxxxxx>
> Signed-off-by: Antoniu Miclaus <antoniu.miclaus@xxxxxxxxxx>
One comment on unwanted code movement. Putting the lines highlighted
back where they were will also make the break up into the previous patch
and this one more sensible wrt to the diff.
Thanks,
Jonathan
> ---
> Changes in v5:
> - Split __free(fwnode_handle) cleanup into a separate patch
> - Fix "Get's" -> "Gets" typo in kernel-doc
>
> drivers/iio/industrialio-backend.c | 60 +++++++++++++++++++++---------
> include/linux/iio/backend.h | 2 +
> 2 files changed, 45 insertions(+), 17 deletions(-)
>
> diff --git a/drivers/iio/industrialio-backend.c b/drivers/iio/industrialio-backend.c
> index 58f7e1426095..ab56e964bce4 100644
> --- a/drivers/iio/industrialio-backend.c
> +++ b/drivers/iio/industrialio-backend.c
> @@ -949,25 +949,16 @@ int iio_backend_data_transfer_addr(struct iio_backend *back, u32 address)
> }
> EXPORT_SYMBOL_NS_GPL(iio_backend_data_transfer_addr, "IIO_BACKEND");
>
> -static struct iio_backend *__devm_iio_backend_fwnode_get(struct device *dev, const char *name,
> - struct fwnode_handle *fwnode)
> +static struct iio_backend *
> +__devm_iio_backend_fwnode_get_by_index(struct device *dev,
> + struct fwnode_handle *fwnode,
> + unsigned int index)
> {
> + struct fwnode_handle *fwnode_back __free(fwnode_handle) =
> + fwnode_find_reference(fwnode, "io-backends", index);
Keep this where it was. So just above the check on whether it succeeded.
Absolutely fine to have uses of __free() declared inline with the code.
> struct iio_backend *back;
> - unsigned int index;
> int ret;
>
> - if (name) {
> - ret = device_property_match_string(dev, "io-backend-names",
> - name);
> - if (ret < 0)
> - return ERR_PTR(ret);
> - index = ret;
> - } else {
> - index = 0;
> - }
> -
> - struct fwnode_handle *fwnode_back __free(fwnode_handle) =
> - fwnode_find_reference(fwnode, "io-backends", index);
> if (IS_ERR(fwnode_back))
> return dev_err_cast_probe(dev, fwnode_back,
> "Cannot get Firmware reference\n");
> @@ -981,8 +972,7 @@ static struct iio_backend *__devm_iio_backend_fwnode_get(struct device *dev, con
> if (ret)
> return ERR_PTR(ret);
>
> - if (name)
> - back->idx = index;
> + back->idx = index;
>
> return back;