| From 7c067943b7b8a27f95d2b6bfd13791a46668f694 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 18 May 2021 12:45:14 +0800 |
| Subject: ASoC: hisilicon: fix missing clk_disable_unprepare() on error in |
| hi6210_i2s_startup() |
| |
| From: Yang Yingliang <yangyingliang@huawei.com> |
| |
| [ Upstream commit 375904e3931955fcf0a847f029b2492a117efc43 ] |
| |
| After calling clk_prepare_enable(), clk_disable_unprepare() need |
| be called when calling clk_set_rate() failed. |
| |
| Fixes: 0bf750f4cbe1 ("ASoC: hisilicon: Add hi6210 i2s audio driver") |
| Reported-by: Hulk Robot <hulkci@huawei.com> |
| Signed-off-by: Yang Yingliang <yangyingliang@huawei.com> |
| Link: https://lore.kernel.org/r/20210518044514.607010-1-yangyingliang@huawei.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| sound/soc/hisilicon/hi6210-i2s.c | 14 ++++++++------ |
| 1 file changed, 8 insertions(+), 6 deletions(-) |
| |
| diff --git a/sound/soc/hisilicon/hi6210-i2s.c b/sound/soc/hisilicon/hi6210-i2s.c |
| index 907f5f1f7b44..ff05b9779e4b 100644 |
| --- a/sound/soc/hisilicon/hi6210-i2s.c |
| +++ b/sound/soc/hisilicon/hi6210-i2s.c |
| @@ -102,18 +102,15 @@ static int hi6210_i2s_startup(struct snd_pcm_substream *substream, |
| |
| for (n = 0; n < i2s->clocks; n++) { |
| ret = clk_prepare_enable(i2s->clk[n]); |
| - if (ret) { |
| - while (n--) |
| - clk_disable_unprepare(i2s->clk[n]); |
| - return ret; |
| - } |
| + if (ret) |
| + goto err_unprepare_clk; |
| } |
| |
| ret = clk_set_rate(i2s->clk[CLK_I2S_BASE], 49152000); |
| if (ret) { |
| dev_err(i2s->dev, "%s: setting 49.152MHz base rate failed %d\n", |
| __func__, ret); |
| - return ret; |
| + goto err_unprepare_clk; |
| } |
| |
| /* enable clock before frequency division */ |
| @@ -165,6 +162,11 @@ static int hi6210_i2s_startup(struct snd_pcm_substream *substream, |
| hi6210_write_reg(i2s, HII2S_SW_RST_N, val); |
| |
| return 0; |
| + |
| +err_unprepare_clk: |
| + while (n--) |
| + clk_disable_unprepare(i2s->clk[n]); |
| + return ret; |
| } |
| |
| static void hi6210_i2s_shutdown(struct snd_pcm_substream *substream, |
| -- |
| 2.30.2 |
| |