ASoC: renesas: fsi: add fsi_clk_prepare/unprepare()

Add fsi_clk_prepare() and fsi_clk_unprepare() helpers and call them
from fsi_dai_startup() and fsi_dai_shutdown().
This ensures clk_prepare() and clk_unprepare() are executed from
sleepable contexts and keeps clocks prepared only while audio streams
are active.

Acked-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Suggested-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: bui duc phuc <phucduc.bui@gmail.com>
Link: https://patch.msgid.link/20260609113836.45079-11-phucduc.bui@gmail.com
Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
bui duc phuc 2026-06-09 18:38:35 +07:00 committed by Mark Brown
parent 39033b278f
commit 05e1ebfeb7
No known key found for this signature in database
GPG Key ID: 24D68B725D5487D0

View File

@ -730,6 +730,54 @@ static int fsi_clk_is_valid(struct fsi_priv *fsi)
fsi->clock.rate;
}
static int fsi_clk_prepare(struct fsi_priv *fsi)
{
struct fsi_clk *clock = &fsi->clock;
struct clk *spu = fsi->master->clk_spu;
struct clk *xck = clock->xck;
struct clk *ick = clock->ick;
struct clk *div = clock->div;
int ret;
ret = clk_prepare(spu);
if (ret)
return ret;
ret = clk_prepare(xck);
if (ret)
goto err_spu;
ret = clk_prepare(ick);
if (ret)
goto err_xck;
ret = clk_prepare(div);
if (ret)
goto err_ick;
return 0;
err_ick:
clk_unprepare(ick);
err_xck:
clk_unprepare(xck);
err_spu:
clk_unprepare(spu);
return ret;
}
static void fsi_clk_unprepare(struct fsi_priv *fsi)
{
struct fsi_clk *clock = &fsi->clock;
struct clk *spu = fsi->master->clk_spu;
struct clk *xck = clock->xck;
struct clk *ick = clock->ick;
struct clk *div = clock->div;
clk_unprepare(div);
clk_unprepare(ick);
clk_unprepare(xck);
clk_unprepare(spu);
}
static int fsi_clk_enable(struct device *dev,
struct fsi_priv *fsi)
{
@ -1580,7 +1628,7 @@ static int fsi_dai_startup(struct snd_pcm_substream *substream,
fsi_clk_invalid(fsi);
return 0;
return fsi_clk_prepare(fsi);
}
static void fsi_dai_shutdown(struct snd_pcm_substream *substream,
@ -1588,6 +1636,7 @@ static void fsi_dai_shutdown(struct snd_pcm_substream *substream,
{
struct fsi_priv *fsi = fsi_get_priv(substream);
fsi_clk_unprepare(fsi);
fsi_clk_invalid(fsi);
}