The return -ERANGE error paths need to call mutex_unlock(&priv->lock); before returning. Fixes: 25d21447d896 ("counter: Add Renesas RZ/G2L MTU3a counter driver") Signed-off-by: Dan Carpenter <dan.carpenter@xxxxxxxxxx> --- drivers/counter/rz-mtu3-cnt.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/drivers/counter/rz-mtu3-cnt.c b/drivers/counter/rz-mtu3-cnt.c index a371bab68499..aeadce5e2853 100644 --- a/drivers/counter/rz-mtu3-cnt.c +++ b/drivers/counter/rz-mtu3-cnt.c @@ -358,19 +358,23 @@ static int rz_mtu3_count_ceiling_write(struct counter_device *counter, switch (count->id) { case RZ_MTU3_16_BIT_MTU1_CH: case RZ_MTU3_16_BIT_MTU2_CH: - if (ceiling > U16_MAX) - return -ERANGE; + if (ceiling > U16_MAX) { + ret = -ERANGE; + goto unlock; + } priv->mtu_16bit_max[ch_id] = ceiling; break; case RZ_MTU3_32_BIT_CH: - if (ceiling > U32_MAX) - return -ERANGE; + if (ceiling > U32_MAX) { + ret = -ERANGE; + goto unlock; + } priv->mtu_32bit_max = ceiling; break; default: /* should never reach this path */ - mutex_unlock(&priv->lock); - return -EINVAL; + ret = -EINVAL; + goto unlock; } pm_runtime_get_sync(ch->dev); @@ -381,9 +385,9 @@ static int rz_mtu3_count_ceiling_write(struct counter_device *counter, rz_mtu3_8bit_ch_write(ch, RZ_MTU3_TCR, RZ_MTU3_TCR_CCLR_TGRA); pm_runtime_put(ch->dev); +unlock: mutex_unlock(&priv->lock); - - return 0; + return ret; } static void rz_mtu3_32bit_cnt_setting(struct counter_device *counter) -- 2.39.2