ASoC: Fix mixed goto and guard() usage

bui duc phuc <phucduc.bui@gmail.com> says:

These two patches fix the remaining cases of mixed goto-based error
handling and cleanup helpers introduced by the recent guard() conversion
patches that have already been merged for the 7.2 development cycle.

The cleanup.h guidelines explicitly recommend not mixing goto with
cleanup helpers in the same function. Only two functions were left in
this state:

 - sound/soc/samsung/i2s.c: remove the goto-based error path and rely
   on guard(pm_runtime) for automatic cleanup.
 - sound/soc/ti/j721e-evm.c: restore mutex_lock()/mutex_unlock() to
   preserve the existing goto-based error handling.

Although these cases do not trigger any build warnings or errors with
Clang (W=1), they still violate the cleanup.h guidelines. These
patches address those remaining cases and add the appropriate Fixes:
tags for the commits that introduced them.

Link: https://patch.msgid.link/20260701041310.230725-1-phucduc.bui@gmail.com
This commit is contained in:
Mark Brown 2026-07-01 16:34:51 +01:00
commit e487b00d70
No known key found for this signature in database
GPG Key ID: 24D68B725D5487D0
2 changed files with 12 additions and 17 deletions

View File

@ -8,6 +8,7 @@
#include <dt-bindings/sound/samsung-i2s.h>
#include <linux/delay.h>
#include <linux/slab.h>
#include <linux/cleanup.h>
#include <linux/clk.h>
#include <linux/clk-provider.h>
#include <linux/io.h>
@ -512,7 +513,7 @@ static int i2s_set_sysclk(struct snd_soc_dai *dai, int clk_id, unsigned int rfs,
u32 mod, mask, val = 0;
int ret = 0;
pm_runtime_get_sync(dai->dev);
guard(pm_runtime_active)(dai->dev);
scoped_guard(spinlock_irqsave, &priv->lock)
mod = readl(priv->addr + I2SMOD);
@ -537,8 +538,7 @@ static int i2s_set_sysclk(struct snd_soc_dai *dai, int clk_id, unsigned int rfs,
&& (mod & cdcon_mask))))) {
dev_err(&i2s->pdev->dev,
"%s:%d Other DAI busy\n", __func__, __LINE__);
ret = -EAGAIN;
goto err;
return -EAGAIN;
}
if (dir == SND_SOC_CLOCK_IN)
@ -566,7 +566,7 @@ static int i2s_set_sysclk(struct snd_soc_dai *dai, int clk_id, unsigned int rfs,
} else {
priv->rclk_srcrate =
clk_get_rate(priv->op_clk);
goto done;
return 0;
}
}
@ -580,14 +580,14 @@ static int i2s_set_sysclk(struct snd_soc_dai *dai, int clk_id, unsigned int rfs,
if (WARN_ON(IS_ERR(priv->op_clk))) {
ret = PTR_ERR(priv->op_clk);
priv->op_clk = NULL;
goto err;
return ret;
}
ret = clk_prepare_enable(priv->op_clk);
if (ret) {
clk_put(priv->op_clk);
priv->op_clk = NULL;
goto err;
return ret;
}
priv->rclk_srcrate = clk_get_rate(priv->op_clk);
@ -595,11 +595,10 @@ static int i2s_set_sysclk(struct snd_soc_dai *dai, int clk_id, unsigned int rfs,
|| (clk_id && !(mod & rsrc_mask))) {
dev_err(&i2s->pdev->dev,
"%s:%d Other DAI busy\n", __func__, __LINE__);
ret = -EAGAIN;
goto err;
return -EAGAIN;
} else {
/* Call can't be on the active DAI */
goto done;
return 0;
}
if (clk_id == 1)
@ -607,8 +606,7 @@ static int i2s_set_sysclk(struct snd_soc_dai *dai, int clk_id, unsigned int rfs,
break;
default:
dev_err(&i2s->pdev->dev, "We don't serve that!\n");
ret = -EINVAL;
goto err;
return -EINVAL;
}
scoped_guard(spinlock_irqsave, &priv->lock) {
@ -616,13 +614,8 @@ static int i2s_set_sysclk(struct snd_soc_dai *dai, int clk_id, unsigned int rfs,
mod = (mod & ~mask) | val;
writel(mod, priv->addr + I2SMOD);
}
done:
pm_runtime_put(dai->dev);
return 0;
err:
pm_runtime_put(dai->dev);
return ret;
}
static int i2s_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)

View File

@ -4,6 +4,7 @@
* Author: Peter Ujfalusi <peter.ujfalusi@ti.com>
*/
#include <linux/cleanup.h>
#include <linux/clk.h>
#include <linux/module.h>
#include <linux/of.h>
@ -263,7 +264,7 @@ static int j721e_audio_startup(struct snd_pcm_substream *substream)
int ret = 0;
int i;
guard(mutex)(&priv->mutex);
mutex_lock(&priv->mutex);
domain->active++;
@ -303,6 +304,7 @@ static int j721e_audio_startup(struct snd_pcm_substream *substream)
out:
if (ret)
domain->active--;
mutex_unlock(&priv->mutex);
return ret;
}