| From a32afbf903854ce2621578fe2fcc60f8d708e7a2 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 18 May 2021 15:58:47 +0800 |
| Subject: ASoC: rk3328: fix missing clk_disable_unprepare() on error in |
| rk3328_platform_probe() |
| |
| From: Yang Yingliang <yangyingliang@huawei.com> |
| |
| [ Upstream commit d14eece945a8068a017995f7512ea2beac21e34b ] |
| |
| Fix the missing clk_disable_unprepare() before return |
| from rk3328_platform_probe() in the error handling case. |
| |
| Fixes: c32759035ad2 ("ASoC: rockchip: support ACODEC for rk3328") |
| Reported-by: Hulk Robot <hulkci@huawei.com> |
| Signed-off-by: Yang Yingliang <yangyingliang@huawei.com> |
| Link: https://lore.kernel.org/r/20210518075847.1116983-1-yangyingliang@huawei.com |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| sound/soc/codecs/rk3328_codec.c | 28 ++++++++++++++++++++++------ |
| 1 file changed, 22 insertions(+), 6 deletions(-) |
| |
| diff --git a/sound/soc/codecs/rk3328_codec.c b/sound/soc/codecs/rk3328_codec.c |
| index 940a2fa933ed..aed18cbb9f68 100644 |
| --- a/sound/soc/codecs/rk3328_codec.c |
| +++ b/sound/soc/codecs/rk3328_codec.c |
| @@ -474,7 +474,8 @@ static int rk3328_platform_probe(struct platform_device *pdev) |
| rk3328->pclk = devm_clk_get(&pdev->dev, "pclk"); |
| if (IS_ERR(rk3328->pclk)) { |
| dev_err(&pdev->dev, "can't get acodec pclk\n"); |
| - return PTR_ERR(rk3328->pclk); |
| + ret = PTR_ERR(rk3328->pclk); |
| + goto err_unprepare_mclk; |
| } |
| |
| ret = clk_prepare_enable(rk3328->pclk); |
| @@ -484,19 +485,34 @@ static int rk3328_platform_probe(struct platform_device *pdev) |
| } |
| |
| base = devm_platform_ioremap_resource(pdev, 0); |
| - if (IS_ERR(base)) |
| - return PTR_ERR(base); |
| + if (IS_ERR(base)) { |
| + ret = PTR_ERR(base); |
| + goto err_unprepare_pclk; |
| + } |
| |
| rk3328->regmap = devm_regmap_init_mmio(&pdev->dev, base, |
| &rk3328_codec_regmap_config); |
| - if (IS_ERR(rk3328->regmap)) |
| - return PTR_ERR(rk3328->regmap); |
| + if (IS_ERR(rk3328->regmap)) { |
| + ret = PTR_ERR(rk3328->regmap); |
| + goto err_unprepare_pclk; |
| + } |
| |
| platform_set_drvdata(pdev, rk3328); |
| |
| - return devm_snd_soc_register_component(&pdev->dev, &soc_codec_rk3328, |
| + ret = devm_snd_soc_register_component(&pdev->dev, &soc_codec_rk3328, |
| rk3328_dai, |
| ARRAY_SIZE(rk3328_dai)); |
| + if (ret) |
| + goto err_unprepare_pclk; |
| + |
| + return 0; |
| + |
| +err_unprepare_pclk: |
| + clk_disable_unprepare(rk3328->pclk); |
| + |
| +err_unprepare_mclk: |
| + clk_disable_unprepare(rk3328->mclk); |
| + return ret; |
| } |
| |
| static const struct of_device_id rk3328_codec_of_match[] = { |
| -- |
| 2.30.2 |
| |