Re: [PATCH v4 1/8] iio: light: opt3001: move device registration to end of probe()

From: Jonathan Cameron

Date: Wed May 27 2026 - 14:26:39 EST


On Mon, 25 May 2026 10:20:15 +0200
Joshua Crofts via B4 Relay <devnull+joshua.crofts1.gmail.com@xxxxxxxxxx> wrote:

> From: Joshua Crofts <joshua.crofts1@xxxxxxxxx>
>
> Move IIO device registration to the end of the probe() function to
> follow standard driver teardown/setup ordering and improve driver
> logic. Additionally, switch devm_iio_device_register() to its
> unmanaged counterpart as current driver implementation mixes managed
> and unmanaged resources, causing potential resource leaks.
Not so much resource leaks, more that it is harder to review as
we have to reason about non trivial life time interactions.

Otherwise LGTM

Jonathan

>
> Also, add iio_device_unregister() to remove() function to correctly
> handle teardown.
>
> Suggested-by: Jonathan Cameron <jic23@xxxxxxxxxx>
> Signed-off-by: Joshua Crofts <joshua.crofts1@xxxxxxxxx>
> ---
> drivers/iio/light/opt3001.c | 18 ++++++++++++------
> 1 file changed, 12 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/iio/light/opt3001.c b/drivers/iio/light/opt3001.c
> index 03c7a87b4a8eef13bbdcf48dcaf969781aa76bd1..6a39f116f9312b6933e86d72aefbaaaf1769aca5 100644
> --- a/drivers/iio/light/opt3001.c
> +++ b/drivers/iio/light/opt3001.c
> @@ -874,12 +874,6 @@ static int opt3001_probe(struct i2c_client *client)
> iio->modes = INDIO_DIRECT_MODE;
> iio->info = &opt3001_info;
>
> - ret = devm_iio_device_register(dev, iio);
> - if (ret) {
> - dev_err(dev, "failed to register IIO device\n");
> - return ret;
> - }
> -
> /* Make use of INT pin only if valid IRQ no. is given */
> if (irq > 0) {
> ret = request_threaded_irq(irq, NULL, opt3001_irq,
> @@ -894,7 +888,17 @@ static int opt3001_probe(struct i2c_client *client)
> dev_dbg(opt->dev, "enabling interrupt-less operation\n");
> }
>
> + ret = iio_device_register(iio);
> + if (ret)
> + goto free_irq;
> +
> return 0;
> +
> +free_irq:
> + if (irq > 0)
> + free_irq(irq, iio);
> +
> + return ret;
> }
>
> static void opt3001_remove(struct i2c_client *client)
> @@ -904,6 +908,8 @@ static void opt3001_remove(struct i2c_client *client)
> int ret;
> u16 reg;
>
> + iio_device_unregister(iio);
> +
> if (opt->use_irq)
> free_irq(client->irq, iio);
>
>