Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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: a14bf98c045b ("ASoC: stm32: sai: fix possible circular locking")
Cc: stable@vger.kernel.org # 5.5
Cc: Olivier Moysan <olivier.moysan@st.com>
Signed-off-by: Johan Hovold <johan@kernel.org>
Reviewed-by: olivier moysan <olivier.moysan@foss.st.com>
Link: https://patch.msgid.link/20251124104908.15754-3-johan@kernel.org
Signed-off-by: Mark Brown <broonie@kernel.org>

authored by

Johan Hovold and committed by
Mark Brown
312ec2f0 e26ff429

+21 -7
+21 -7
sound/soc/stm/stm32_sai_sub.c
··· 1634 1634 if (of_property_present(np, "#clock-cells")) { 1635 1635 ret = stm32_sai_add_mclk_provider(sai); 1636 1636 if (ret < 0) 1637 - return ret; 1637 + goto err_unprepare_pclk; 1638 1638 } else { 1639 1639 sai->sai_mclk = devm_clk_get_optional(&pdev->dev, "MCLK"); 1640 - if (IS_ERR(sai->sai_mclk)) 1641 - return PTR_ERR(sai->sai_mclk); 1640 + if (IS_ERR(sai->sai_mclk)) { 1641 + ret = PTR_ERR(sai->sai_mclk); 1642 + goto err_unprepare_pclk; 1643 + } 1642 1644 } 1643 1645 1644 1646 return 0; 1647 + 1648 + err_unprepare_pclk: 1649 + clk_unprepare(sai->pdata->pclk); 1650 + 1651 + return ret; 1645 1652 } 1646 1653 1647 1654 static int stm32_sai_sub_probe(struct platform_device *pdev) ··· 1695 1688 IRQF_SHARED, dev_name(&pdev->dev), sai); 1696 1689 if (ret) { 1697 1690 dev_err(&pdev->dev, "IRQ request returned %d\n", ret); 1698 - return ret; 1691 + goto err_unprepare_pclk; 1699 1692 } 1700 1693 1701 1694 if (STM_SAI_PROTOCOL_IS_SPDIF(sai)) 1702 1695 conf = &stm32_sai_pcm_config_spdif; 1703 1696 1704 1697 ret = snd_dmaengine_pcm_register(&pdev->dev, conf, 0); 1705 - if (ret) 1706 - return dev_err_probe(&pdev->dev, ret, "Could not register pcm dma\n"); 1698 + if (ret) { 1699 + ret = dev_err_probe(&pdev->dev, ret, "Could not register pcm dma\n"); 1700 + goto err_unprepare_pclk; 1701 + } 1707 1702 1708 1703 ret = snd_soc_register_component(&pdev->dev, &stm32_component, 1709 1704 &sai->cpu_dai_drv, 1); 1710 1705 if (ret) { 1711 1706 snd_dmaengine_pcm_unregister(&pdev->dev); 1712 - return ret; 1707 + goto err_unprepare_pclk; 1713 1708 } 1714 1709 1715 1710 pm_runtime_enable(&pdev->dev); 1716 1711 1717 1712 return 0; 1713 + 1714 + err_unprepare_pclk: 1715 + clk_unprepare(sai->pdata->pclk); 1716 + 1717 + return ret; 1718 1718 } 1719 1719 1720 1720 static void stm32_sai_sub_remove(struct platform_device *pdev)