summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoshua Crofts <joshua.crofts1@gmail.com>2026-06-14 15:19:03 +0200
committerJonathan Cameron <jic23@kernel.org>2026-06-30 00:15:54 +0100
commita3ed4362d3d902f0adf4e187eed15ccbe230fc7a (patch)
treefb19afafcf5c4e0963d779db86797fc231466540
parentec034d09813213634f3abf6eaa1880bef2584090 (diff)
downloadlinux-stable-a3ed4362d3d902f0adf4e187eed15ccbe230fc7a.tar.gz
linux-stable-a3ed4362d3d902f0adf4e187eed15ccbe230fc7a.zip
iio: light: opt3001: move device registration to end of probe()
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. Also, add iio_device_unregister() to remove() function to correctly handle teardown. Suggested-by: Jonathan Cameron <jic23@kernel.org> Signed-off-by: Joshua Crofts <joshua.crofts1@gmail.com> Reviewed-by: Andy Shevchenko <andriy.shevchenko@intel.com> Signed-off-by: Jonathan Cameron <jic23@kernel.org>
-rw-r--r--drivers/iio/light/opt3001.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/drivers/iio/light/opt3001.c b/drivers/iio/light/opt3001.c
index 0743e16f2a8f..0423c6de5321 100644
--- a/drivers/iio/light/opt3001.c
+++ b/drivers/iio/light/opt3001.c
@@ -876,12 +876,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,
@@ -896,7 +890,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)
@@ -906,6 +910,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);