[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