[PATCH] media: i2c: ds90ub960: use scope-based guard(mutex)
From: Laurian Iacob
Date: Fri Nov 06 2026 - 07:00:40 EST
Modernize the locking in the ds90ub960 driver by converting manual
mutex_lock() and mutex_unlock() operations to the scope-based
guard(mutex) and scoped_guard(mutex) macros from <linux/cleanup.h>.
This simplifies error handling by allowing the removal of multiple
'out_unlock' goto labels and ensuring locks are safely released upon
function exit or block termination.
Signed-off-by: Laurian Iacob <laurian.iacob@xxxxxxxxx>
---
drivers/media/i2c/ds90ub960.c | 171 +++++++++++++---------------------
1 file changed, 67 insertions(+), 104 deletions(-)
diff --git a/drivers/media/i2c/ds90ub960.c b/drivers/media/i2c/ds90ub960.c
index 7d7ba6d349fc..d603d12f026f 100644
--- a/drivers/media/i2c/ds90ub960.c
+++ b/drivers/media/i2c/ds90ub960.c
@@ -748,24 +748,19 @@ static int ub960_read(struct ub960_data *priv, u8 reg, u8 *val, int *err)
if (err && *err)
return *err;
- mutex_lock(&priv->reg_lock);
+ guard(mutex)(&priv->reg_lock);
ret = regmap_read(priv->regmap, reg, &v);
if (ret) {
dev_err(dev, "%s: cannot read register 0x%02x (%d)!\n",
__func__, reg, ret);
- goto out_unlock;
+ if (err)
+ *err = ret;
+ return ret;
}
*val = v;
-
-out_unlock:
- mutex_unlock(&priv->reg_lock);
-
- if (ret && err)
- *err = ret;
-
- return ret;
+ return 0;
}
static int ub960_write(struct ub960_data *priv, u8 reg, u8 val, int *err)
@@ -776,19 +771,19 @@ static int ub960_write(struct ub960_data *priv, u8 reg, u8 val, int *err)
if (err && *err)
return *err;
- mutex_lock(&priv->reg_lock);
+ guard(mutex)(&priv->reg_lock);
ret = regmap_write(priv->regmap, reg, val);
- if (ret)
+ if (ret) {
dev_err(dev, "%s: cannot write register 0x%02x (%d)!\n",
__func__, reg, ret);
- mutex_unlock(&priv->reg_lock);
-
- if (ret && err)
- *err = ret;
+ if (err)
+ *err = ret;
+ return ret;
+ }
- return ret;
+ return 0;
}
static int ub960_update_bits(struct ub960_data *priv, u8 reg, u8 mask, u8 val,
@@ -800,19 +795,18 @@ static int ub960_update_bits(struct ub960_data *priv, u8 reg, u8 mask, u8 val,
if (err && *err)
return *err;
- mutex_lock(&priv->reg_lock);
+ guard(mutex)(&priv->reg_lock);
ret = regmap_update_bits(priv->regmap, reg, mask, val);
- if (ret)
+ if (ret) {
dev_err(dev, "%s: cannot update register 0x%02x (%d)!\n",
__func__, reg, ret);
- mutex_unlock(&priv->reg_lock);
-
- if (ret && err)
- *err = ret;
+ if (err)
+ *err = ret;
+ }
- return ret;
+ return 0;
}
static int ub960_read16(struct ub960_data *priv, u8 reg, u16 *val, int *err)
@@ -824,24 +818,20 @@ static int ub960_read16(struct ub960_data *priv, u8 reg, u16 *val, int *err)
if (err && *err)
return *err;
- mutex_lock(&priv->reg_lock);
+ guard(mutex)(&priv->reg_lock);
ret = regmap_bulk_read(priv->regmap, reg, &__v, sizeof(__v));
if (ret) {
dev_err(dev, "%s: cannot read register 0x%02x (%d)!\n",
__func__, reg, ret);
- goto out_unlock;
+ if (err)
+ *err = ret;
+
+ return ret;
}
*val = be16_to_cpu(__v);
-
-out_unlock:
- mutex_unlock(&priv->reg_lock);
-
- if (ret && err)
- *err = ret;
-
- return ret;
+ return 0;
}
static int ub960_rxport_select(struct ub960_data *priv, u8 nport)
@@ -877,24 +867,22 @@ static int ub960_rxport_read(struct ub960_data *priv, u8 nport, u8 reg,
if (err && *err)
return *err;
- mutex_lock(&priv->reg_lock);
+ guard(mutex)(&priv->reg_lock);
ret = ub960_rxport_select(priv, nport);
if (ret)
- goto out_unlock;
+ goto out;
ret = regmap_read(priv->regmap, reg, &v);
if (ret) {
dev_err(dev, "%s: cannot read register 0x%02x (%d)!\n",
__func__, reg, ret);
- goto out_unlock;
+ goto out;
}
*val = v;
-out_unlock:
- mutex_unlock(&priv->reg_lock);
-
+out:
if (ret && err)
*err = ret;
@@ -910,23 +898,19 @@ static int ub960_rxport_write(struct ub960_data *priv, u8 nport, u8 reg,
if (err && *err)
return *err;
- mutex_lock(&priv->reg_lock);
+ guard(mutex)(&priv->reg_lock);
ret = ub960_rxport_select(priv, nport);
if (ret)
- goto out_unlock;
+ goto out;
ret = regmap_write(priv->regmap, reg, val);
if (ret)
dev_err(dev, "%s: cannot write register 0x%02x (%d)!\n",
__func__, reg, ret);
-
-out_unlock:
- mutex_unlock(&priv->reg_lock);
-
+out:
if (ret && err)
*err = ret;
-
return ret;
}
@@ -939,23 +923,20 @@ static int ub960_rxport_update_bits(struct ub960_data *priv, u8 nport, u8 reg,
if (err && *err)
return *err;
- mutex_lock(&priv->reg_lock);
+ guard(mutex)(&priv->reg_lock);
ret = ub960_rxport_select(priv, nport);
if (ret)
- goto out_unlock;
+ goto out;
ret = regmap_update_bits(priv->regmap, reg, mask, val);
if (ret)
dev_err(dev, "%s: cannot update register 0x%02x (%d)!\n",
__func__, reg, ret);
-out_unlock:
- mutex_unlock(&priv->reg_lock);
-
+out:
if (ret && err)
*err = ret;
-
return ret;
}
@@ -969,27 +950,24 @@ static int ub960_rxport_read16(struct ub960_data *priv, u8 nport, u8 reg,
if (err && *err)
return *err;
- mutex_lock(&priv->reg_lock);
+ guard(mutex)(&priv->reg_lock);
ret = ub960_rxport_select(priv, nport);
if (ret)
- goto out_unlock;
+ goto out;
ret = regmap_bulk_read(priv->regmap, reg, &__v, sizeof(__v));
if (ret) {
dev_err(dev, "%s: cannot read register 0x%02x (%d)!\n",
__func__, reg, ret);
- goto out_unlock;
+ goto out;
}
*val = be16_to_cpu(__v);
-out_unlock:
- mutex_unlock(&priv->reg_lock);
-
+out:
if (ret && err)
*err = ret;
-
return ret;
}
@@ -1030,24 +1008,22 @@ static int ub960_txport_read(struct ub960_data *priv, u8 nport, u8 reg,
if (err && *err)
return *err;
- mutex_lock(&priv->reg_lock);
+ guard(mutex)(&priv->reg_lock);
ret = ub960_txport_select(priv, nport);
if (ret)
- goto out_unlock;
+ goto out;
ret = regmap_read(priv->regmap, reg, &v);
if (ret) {
dev_err(dev, "%s: cannot read register 0x%02x (%d)!\n",
__func__, reg, ret);
- goto out_unlock;
+ goto out;
}
*val = v;
-out_unlock:
- mutex_unlock(&priv->reg_lock);
-
+out:
if (ret && err)
*err = ret;
@@ -1063,23 +1039,20 @@ static int ub960_txport_write(struct ub960_data *priv, u8 nport, u8 reg,
if (err && *err)
return *err;
- mutex_lock(&priv->reg_lock);
+ guard(mutex)(&priv->reg_lock);
ret = ub960_txport_select(priv, nport);
if (ret)
- goto out_unlock;
+ goto out;
ret = regmap_write(priv->regmap, reg, val);
if (ret)
dev_err(dev, "%s: cannot write register 0x%02x (%d)!\n",
__func__, reg, ret);
-out_unlock:
- mutex_unlock(&priv->reg_lock);
-
+out:
if (ret && err)
*err = ret;
-
return ret;
}
@@ -1092,20 +1065,18 @@ static int ub960_txport_update_bits(struct ub960_data *priv, u8 nport, u8 reg,
if (err && *err)
return *err;
- mutex_lock(&priv->reg_lock);
+ guard(mutex)(&priv->reg_lock);
ret = ub960_txport_select(priv, nport);
if (ret)
- goto out_unlock;
+ goto out;
ret = regmap_update_bits(priv->regmap, reg, mask, val);
if (ret)
dev_err(dev, "%s: cannot update register 0x%02x (%d)!\n",
__func__, reg, ret);
-out_unlock:
- mutex_unlock(&priv->reg_lock);
-
+out:
if (ret && err)
*err = ret;
@@ -1144,18 +1115,18 @@ static int ub960_read_ind(struct ub960_data *priv, u8 block, u8 reg, u8 *val,
if (err && *err)
return *err;
- mutex_lock(&priv->reg_lock);
+ guard(mutex)(&priv->reg_lock);
ret = ub960_select_ind_reg_block(priv, block);
if (ret)
- goto out_unlock;
+ goto out;
ret = regmap_write(priv->regmap, UB960_SR_IND_ACC_ADDR, reg);
if (ret) {
dev_err(dev,
"Write to IND_ACC_ADDR failed when reading %u:%x02x: %d\n",
block, reg, ret);
- goto out_unlock;
+ goto out;
}
ret = regmap_read(priv->regmap, UB960_SR_IND_ACC_DATA, &v);
@@ -1163,14 +1134,12 @@ static int ub960_read_ind(struct ub960_data *priv, u8 block, u8 reg, u8 *val,
dev_err(dev,
"Write to IND_ACC_DATA failed when reading %u:%x02x: %d\n",
block, reg, ret);
- goto out_unlock;
+ goto out;
}
*val = v;
-out_unlock:
- mutex_unlock(&priv->reg_lock);
-
+out:
if (ret && err)
*err = ret;
@@ -1186,18 +1155,18 @@ static int ub960_write_ind(struct ub960_data *priv, u8 block, u8 reg, u8 val,
if (err && *err)
return *err;
- mutex_lock(&priv->reg_lock);
+ guard(mutex)(&priv->reg_lock);
ret = ub960_select_ind_reg_block(priv, block);
if (ret)
- goto out_unlock;
+ goto out;
ret = regmap_write(priv->regmap, UB960_SR_IND_ACC_ADDR, reg);
if (ret) {
dev_err(dev,
"Write to IND_ACC_ADDR failed when writing %u:%x02x: %d\n",
block, reg, ret);
- goto out_unlock;
+ goto out;
}
ret = regmap_write(priv->regmap, UB960_SR_IND_ACC_DATA, val);
@@ -1205,12 +1174,10 @@ static int ub960_write_ind(struct ub960_data *priv, u8 block, u8 reg, u8 val,
dev_err(dev,
"Write to IND_ACC_DATA failed when writing %u:%x02x: %d\n",
block, reg, ret);
- goto out_unlock;
+ goto out;
}
-out_unlock:
- mutex_unlock(&priv->reg_lock);
-
+out:
if (ret && err)
*err = ret;
@@ -1226,18 +1193,18 @@ static int ub960_ind_update_bits(struct ub960_data *priv, u8 block, u8 reg,
if (err && *err)
return *err;
- mutex_lock(&priv->reg_lock);
+ guard(mutex)(&priv->reg_lock);
ret = ub960_select_ind_reg_block(priv, block);
if (ret)
- goto out_unlock;
+ goto out;
ret = regmap_write(priv->regmap, UB960_SR_IND_ACC_ADDR, reg);
if (ret) {
dev_err(dev,
"Write to IND_ACC_ADDR failed when updating %u:%x02x: %d\n",
block, reg, ret);
- goto out_unlock;
+ goto out;
}
ret = regmap_update_bits(priv->regmap, UB960_SR_IND_ACC_DATA, mask,
@@ -1246,12 +1213,10 @@ static int ub960_ind_update_bits(struct ub960_data *priv, u8 block, u8 reg,
dev_err(dev,
"Write to IND_ACC_DATA failed when updating %u:%x02x: %d\n",
block, reg, ret);
- goto out_unlock;
+ goto out;
}
-out_unlock:
- mutex_unlock(&priv->reg_lock);
-
+out:
if (ret && err)
*err = ret;
@@ -1272,12 +1237,10 @@ static int ub960_reset(struct ub960_data *priv, bool reset_regs)
if (ret)
return ret;
- mutex_lock(&priv->reg_lock);
-
- ret = regmap_read_poll_timeout(priv->regmap, UB960_SR_RESET, v,
- (v & bit) == 0, 2000, 100000);
-
- mutex_unlock(&priv->reg_lock);
+ scoped_guard(mutex, &priv->reg_lock) {
+ ret = regmap_read_poll_timeout(priv->regmap, UB960_SR_RESET, v,
+ (v & bit) == 0, 2000, 100000);
+ }
if (ret)
dev_err(dev, "reset failed: %d\n", ret);
--
2.43.0