Unverified Commit 312ec2f0 authored by Johan Hovold's avatar Johan Hovold Committed by Mark Brown
Browse files

ASoC: stm32: sai: fix clk prepare imbalance on probe failure



Make sure to unprepare the parent clock also on probe failures (e.g.
probe deferral).

Fixes: a14bf98c ("ASoC: stm32: sai: fix possible circular locking")
Cc: stable@vger.kernel.org	# 5.5
Cc: Olivier Moysan <olivier.moysan@st.com>
Signed-off-by: default avatarJohan Hovold <johan@kernel.org>
Reviewed-by: default avatarolivier moysan <olivier.moysan@foss.st.com>
Link: https://patch.msgid.link/20251124104908.15754-3-johan@kernel.org


Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent e26ff429
Loading
Loading
Loading
Loading
+21 −7
Original line number Diff line number Diff line
@@ -1634,14 +1634,21 @@ static int stm32_sai_sub_parse_of(struct platform_device *pdev,
	if (of_property_present(np, "#clock-cells")) {
		ret = stm32_sai_add_mclk_provider(sai);
		if (ret < 0)
			return ret;
			goto err_unprepare_pclk;
	} else {
		sai->sai_mclk = devm_clk_get_optional(&pdev->dev, "MCLK");
		if (IS_ERR(sai->sai_mclk))
			return PTR_ERR(sai->sai_mclk);
		if (IS_ERR(sai->sai_mclk)) {
			ret = PTR_ERR(sai->sai_mclk);
			goto err_unprepare_pclk;
		}
	}

	return 0;

err_unprepare_pclk:
	clk_unprepare(sai->pdata->pclk);

	return ret;
}

static int stm32_sai_sub_probe(struct platform_device *pdev)
@@ -1688,26 +1695,33 @@ static int stm32_sai_sub_probe(struct platform_device *pdev)
			       IRQF_SHARED, dev_name(&pdev->dev), sai);
	if (ret) {
		dev_err(&pdev->dev, "IRQ request returned %d\n", ret);
		return ret;
		goto err_unprepare_pclk;
	}

	if (STM_SAI_PROTOCOL_IS_SPDIF(sai))
		conf = &stm32_sai_pcm_config_spdif;

	ret = snd_dmaengine_pcm_register(&pdev->dev, conf, 0);
	if (ret)
		return dev_err_probe(&pdev->dev, ret, "Could not register pcm dma\n");
	if (ret) {
		ret = dev_err_probe(&pdev->dev, ret, "Could not register pcm dma\n");
		goto err_unprepare_pclk;
	}

	ret = snd_soc_register_component(&pdev->dev, &stm32_component,
					 &sai->cpu_dai_drv, 1);
	if (ret) {
		snd_dmaengine_pcm_unregister(&pdev->dev);
		return ret;
		goto err_unprepare_pclk;
	}

	pm_runtime_enable(&pdev->dev);

	return 0;

err_unprepare_pclk:
	clk_unprepare(sai->pdata->pclk);

	return ret;
}

static void stm32_sai_sub_remove(struct platform_device *pdev)