* [PATCH] iio: light: iqs621-als: use lock guards
@ 2026-04-19 21:31 Pedro Barletta Gennari
2026-04-20 8:45 ` Andy Shevchenko
0 siblings, 1 reply; 2+ messages in thread
From: Pedro Barletta Gennari @ 2026-04-19 21:31 UTC (permalink / raw)
To: jic23, dlechner, nuno.sa, andy; +Cc: pedro.pbg, linux-iio
Use guard(mutex)() for handling mutex lock instead of
manually locking and unlocking the mutex. This prevents forgotten
locks due to early exits and remove the need of gotos.
Signed-off-by: Pedro Barletta Gennari <pedro.pbg@usp.br>
---
drivers/iio/light/iqs621-als.c | 83 ++++++++++++----------------------
1 file changed, 28 insertions(+), 55 deletions(-)
diff --git a/drivers/iio/light/iqs621-als.c b/drivers/iio/light/iqs621-als.c
index b9f230210f07..222a42036799 100644
--- a/drivers/iio/light/iqs621-als.c
+++ b/drivers/iio/light/iqs621-als.c
@@ -15,6 +15,7 @@
#include <linux/notifier.h>
#include <linux/platform_device.h>
#include <linux/regmap.h>
+#include <linux/cleanup.h>
#define IQS621_ALS_FLAGS_LIGHT BIT(7)
#define IQS621_ALS_FLAGS_RANGE GENMASK(3, 0)
@@ -107,25 +108,22 @@ static int iqs621_als_notifier(struct notifier_block *notifier,
indio_dev = iqs621_als->indio_dev;
timestamp = iio_get_time_ns(indio_dev);
- mutex_lock(&iqs621_als->lock);
+ guard(mutex)(&iqs621_als->lock);
if (event_flags & BIT(IQS62X_EVENT_SYS_RESET)) {
ret = iqs621_als_init(iqs621_als);
if (ret) {
dev_err(indio_dev->dev.parent,
"Failed to re-initialize device: %d\n", ret);
- ret = NOTIFY_BAD;
+ return NOTIFY_BAD;
} else {
- ret = NOTIFY_OK;
+ return NOTIFY_OK;
}
-
- goto err_mutex;
}
if (!iqs621_als->light_en && !iqs621_als->range_en &&
!iqs621_als->prox_en) {
- ret = NOTIFY_DONE;
- goto err_mutex;
+ return NOTIFY_DONE;
}
/* IQS621 only */
@@ -181,12 +179,7 @@ static int iqs621_als_notifier(struct notifier_block *notifier,
iqs621_als->als_flags = event_data->als_flags;
iqs621_als->ir_flags = event_data->ir_flags;
- ret = NOTIFY_OK;
-
-err_mutex:
- mutex_unlock(&iqs621_als->lock);
-
- return ret;
+ return NOTIFY_OK;
}
static void iqs621_als_notifier_unregister(void *context)
@@ -241,30 +234,22 @@ static int iqs621_als_read_event_config(struct iio_dev *indio_dev,
enum iio_event_direction dir)
{
struct iqs621_als_private *iqs621_als = iio_priv(indio_dev);
- int ret;
- mutex_lock(&iqs621_als->lock);
+ guard(mutex)(&iqs621_als->lock);
switch (chan->type) {
case IIO_LIGHT:
- ret = iqs621_als->light_en;
- break;
+ return iqs621_als->light_en;
case IIO_INTENSITY:
- ret = iqs621_als->range_en;
- break;
+ return iqs621_als->range_en;
case IIO_PROXIMITY:
- ret = iqs621_als->prox_en;
- break;
+ return iqs621_als->prox_en;
default:
- ret = -EINVAL;
+ return -EINVAL;
}
-
- mutex_unlock(&iqs621_als->lock);
-
- return ret;
}
static int iqs621_als_write_event_config(struct iio_dev *indio_dev,
@@ -278,11 +263,11 @@ static int iqs621_als_write_event_config(struct iio_dev *indio_dev,
unsigned int val;
int ret;
- mutex_lock(&iqs621_als->lock);
+ guard(mutex)(&iqs621_als->lock);
ret = regmap_read(iqs62x->regmap, iqs62x->dev_desc->als_flags, &val);
if (ret)
- goto err_mutex;
+ return ret;
iqs621_als->als_flags = val;
switch (chan->type) {
@@ -293,7 +278,7 @@ static int iqs621_als_write_event_config(struct iio_dev *indio_dev,
0xFF);
if (!ret)
iqs621_als->light_en = state;
- break;
+ return ret;
case IIO_INTENSITY:
ret = regmap_update_bits(iqs62x->regmap, IQS620_GLBL_EVENT_MASK,
@@ -302,12 +287,12 @@ static int iqs621_als_write_event_config(struct iio_dev *indio_dev,
0xFF);
if (!ret)
iqs621_als->range_en = state;
- break;
+ return ret;
case IIO_PROXIMITY:
ret = regmap_read(iqs62x->regmap, IQS622_IR_FLAGS, &val);
if (ret)
- goto err_mutex;
+ return ret;
iqs621_als->ir_flags = val;
ret = regmap_update_bits(iqs62x->regmap, IQS620_GLBL_EVENT_MASK,
@@ -315,16 +300,11 @@ static int iqs621_als_write_event_config(struct iio_dev *indio_dev,
state ? 0 : 0xFF);
if (!ret)
iqs621_als->prox_en = state;
- break;
+ return ret;
default:
- ret = -EINVAL;
+ return -EINVAL;
}
-
-err_mutex:
- mutex_unlock(&iqs621_als->lock);
-
- return ret;
}
static int iqs621_als_read_event_value(struct iio_dev *indio_dev,
@@ -337,31 +317,27 @@ static int iqs621_als_read_event_value(struct iio_dev *indio_dev,
struct iqs621_als_private *iqs621_als = iio_priv(indio_dev);
int ret = IIO_VAL_INT;
- mutex_lock(&iqs621_als->lock);
+ guard(mutex)(&iqs621_als->lock);
switch (dir) {
case IIO_EV_DIR_RISING:
*val = iqs621_als->thresh_light * 16;
- break;
+ return ret;
case IIO_EV_DIR_FALLING:
*val = iqs621_als->thresh_dark * 4;
- break;
+ return ret;
case IIO_EV_DIR_EITHER:
if (iqs621_als->ir_flags_mask == IQS622_IR_FLAGS_TOUCH)
*val = iqs621_als->thresh_prox * 4;
else
*val = iqs621_als->thresh_prox;
- break;
+ return ret;
default:
- ret = -EINVAL;
+ return -EINVAL;
}
-
- mutex_unlock(&iqs621_als->lock);
-
- return ret;
}
static int iqs621_als_write_event_value(struct iio_dev *indio_dev,
@@ -377,7 +353,7 @@ static int iqs621_als_write_event_value(struct iio_dev *indio_dev,
u8 ir_flags_mask, *thresh_cache;
int ret = -EINVAL;
- mutex_lock(&iqs621_als->lock);
+ guard(mutex)(&iqs621_als->lock);
switch (dir) {
case IIO_EV_DIR_RISING:
@@ -426,29 +402,26 @@ static int iqs621_als_write_event_value(struct iio_dev *indio_dev,
break;
default:
- goto err_mutex;
+ return ret;
}
thresh_cache = &iqs621_als->thresh_prox;
break;
default:
- goto err_mutex;
+ return ret;
}
if (thresh_val > 0xFF)
- goto err_mutex;
+ return ret;
ret = regmap_write(iqs62x->regmap, thresh_reg, thresh_val);
if (ret)
- goto err_mutex;
+ return ret;
*thresh_cache = thresh_val;
iqs621_als->ir_flags_mask = ir_flags_mask;
-err_mutex:
- mutex_unlock(&iqs621_als->lock);
-
return ret;
}
--
2.51.0
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH] iio: light: iqs621-als: use lock guards
2026-04-19 21:31 [PATCH] iio: light: iqs621-als: use lock guards Pedro Barletta Gennari
@ 2026-04-20 8:45 ` Andy Shevchenko
0 siblings, 0 replies; 2+ messages in thread
From: Andy Shevchenko @ 2026-04-20 8:45 UTC (permalink / raw)
To: Pedro Barletta Gennari; +Cc: jic23, dlechner, nuno.sa, andy, linux-iio
On Sun, Apr 19, 2026 at 06:31:23PM -0300, Pedro Barletta Gennari wrote:
> Use guard(mutex)() for handling mutex lock instead of
> manually locking and unlocking the mutex. This prevents forgotten
> locks due to early exits and remove the need of gotos.
...
> @@ -15,6 +15,7 @@
> #include <linux/notifier.h>
> #include <linux/platform_device.h>
> #include <linux/regmap.h>
> +#include <linux/cleanup.h>
Keep the list ordered.
...
> ret = iqs621_als_init(iqs621_als);
> if (ret) {
> dev_err(indio_dev->dev.parent,
> "Failed to re-initialize device: %d\n", ret);
> - ret = NOTIFY_BAD;
> + return NOTIFY_BAD;
> } else {
Now 'else' is redundant.
> - ret = NOTIFY_OK;
> + return NOTIFY_OK;
> }
> -
> - goto err_mutex;
...
> struct iqs621_als_private *iqs621_als = iio_priv(indio_dev);
> int ret = IIO_VAL_INT;
Drop it, use the value explicitly inline in each of the cases below.
>
> - mutex_lock(&iqs621_als->lock);
> + guard(mutex)(&iqs621_als->lock);
>
> switch (dir) {
> case IIO_EV_DIR_RISING:
> *val = iqs621_als->thresh_light * 16;
> - break;
> + return ret;
>
> case IIO_EV_DIR_FALLING:
> *val = iqs621_als->thresh_dark * 4;
> - break;
> + return ret;
>
> case IIO_EV_DIR_EITHER:
> if (iqs621_als->ir_flags_mask == IQS622_IR_FLAGS_TOUCH)
> *val = iqs621_als->thresh_prox * 4;
> else
> *val = iqs621_als->thresh_prox;
> - break;
> + return ret;
>
> default:
> - ret = -EINVAL;
> + return -EINVAL;
> }
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2026-04-20 8:45 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-04-19 21:31 [PATCH] iio: light: iqs621-als: use lock guards Pedro Barletta Gennari
2026-04-20 8:45 ` Andy Shevchenko
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox