Re: [PATCH v2 2/4] iio: backend: add devm_iio_backend_get_by_index()
From: Nuno Sá <hidden>
Date: 2026-02-09 17:47:31
Also in:
linux-iio, linux-spi, lkml
On Mon, 2026-02-09 at 16:47 +0000, Nuno Sá wrote:
On Mon, 2026-02-09 at 09:28 -0600, David Lechner wrote:quoted
On 2/8/26 3:24 AM, Nuno Sá wrote:quoted
On Fri, 2026-02-06 at 18:07 +0200, Antoniu Miclaus wrote:quoted
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. The new function directly uses the index to find the backend reference in the io-backends property, avoiding the need for io-backend-names. Signed-off-by: Antoniu Miclaus <antoniu.miclaus@analog.com> --- drivers/iio/industrialio-backend.c | 51 ++++++++++++++++++++++++++++++ include/linux/iio/backend.h | 2 ++ 2 files changed, 53 insertions(+)diff --git a/drivers/iio/industrialio-backend.c b/drivers/iio/industrialio-backend.c index 447b694d6d5f..3b692d48481e 100644--- a/drivers/iio/industrialio-backend.c +++ b/drivers/iio/industrialio-backend.c@@ -1008,6 +1008,57 @@ struct iio_backend *devm_iio_backend_get(struct device *dev,const char *name) } EXPORT_SYMBOL_NS_GPL(devm_iio_backend_get, "IIO_BACKEND"); +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; + struct iio_backend *back; + int ret; + + fwnode_back = fwnode_find_reference(fwnode, "", index); + if (IS_ERR(fwnode_back)) + return dev_err_cast_probe(dev, fwnode_back, + "Cannot get Firmware reference\n"); + + guard(mutex)(&iio_back_lock); + list_for_each_entry(back, &iio_back_list, entry) { + if (!device_match_fwnode(back->dev, fwnode_back)) + continue; + + fwnode_handle_put(fwnode_back); + ret = __devm_iio_backend_get(dev, back); + if (ret) + return ERR_PTR(ret); + + back->idx = index; + + return back; + } + + fwnode_handle_put(fwnode_back); + return ERR_PTR(-EPROBE_DEFER); +}I believe we don't necessarily need this. Why can't we use io-backend-names? I get that in here we just want something matching the number of channels we have so giving names is probably does not add much added value. But still, I would prefer t have more simplicity in the API and it should be fairly easy for the frontend to use the names argument. _ Nuno SáIMHO, using names in this case would just be annoying because we would have to sprintf the string to add the index to the string. And also have to spend time coming up with more complex DT bindings. Using the index seems much simpler. If you really feel strongly about it though, maybe we could make a devm_iio_backend_fwnode_get_fmt() function instead that handles the sprintf() part so that we only have to write that once?uHu? Maybe I'm completely missing your point but what I had in mind was just something like: // from the frontend: static const char * const names[] = { "adc1", "adc2" } for (c = 0; c < ARRAY_SIZE(names); c++) { back = devm_iio_backend_get(dev, names[c]); } So yes, I agree we would have a bit more complex bindings and more complexity in the frontend. But on the bright side, no need to change backend code at all. And the -names property is already used like the above fairly often If I'm not mistaken. But again, I can agree that for this usecase getting things by index makes sense. Given that we just want n backends for n channels, the name does not add much.
Given Krzysztof's feedback, let's not do the above. So, Antoniu, disregard my comments about using io-backend-name. - Nuno Sá