diff options
author | Etienne Carriere <etienne.carriere@st.com> | 2020-01-28 12:41:56 +0300 |
---|---|---|
committer | Vinod Koul <vkoul@kernel.org> | 2020-02-24 19:52:43 +0300 |
commit | 57e9f3666a1ba54500b1f61b279f994ac2f23de9 (patch) | |
tree | 74cd52c889a978fd307b924040b6dfe5a29a4696 | |
parent | f65c2e14b096736585aa04cb7a43d5d54d287ddd (diff) | |
download | linux-57e9f3666a1ba54500b1f61b279f994ac2f23de9.tar.xz |
dmaengine: stm32-dmamux: fix clock handling in probe sequence
This change ensures the DMAMUX device is reset only once it is clocked
and that clock is released in a safe state when probe operation fails.
Signed-off-by: Etienne Carriere <etienne.carriere@st.com>
Signed-off-by: Amelie Delaunay <amelie.delaunay@st.com>
Link: https://lore.kernel.org/r/20200128094158.20361-3-amelie.delaunay@st.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>
-rw-r--r-- | drivers/dma/stm32-dmamux.c | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/drivers/dma/stm32-dmamux.c b/drivers/dma/stm32-dmamux.c index 08d2395c8943..a862d3339fb7 100644 --- a/drivers/dma/stm32-dmamux.c +++ b/drivers/dma/stm32-dmamux.c @@ -259,6 +259,12 @@ static int stm32_dmamux_probe(struct platform_device *pdev) return ret; } + ret = clk_prepare_enable(stm32_dmamux->clk); + if (ret < 0) { + dev_err(&pdev->dev, "clk_prep_enable error: %d\n", ret); + return ret; + } + stm32_dmamux->rst = devm_reset_control_get(&pdev->dev, NULL); if (!IS_ERR(stm32_dmamux->rst)) { reset_control_assert(stm32_dmamux->rst); @@ -274,14 +280,6 @@ static int stm32_dmamux_probe(struct platform_device *pdev) pm_runtime_set_active(&pdev->dev); pm_runtime_enable(&pdev->dev); - if (!IS_ERR(stm32_dmamux->clk)) { - ret = clk_prepare_enable(stm32_dmamux->clk); - if (ret < 0) { - dev_err(&pdev->dev, "clk_prep_enable error: %d\n", ret); - return ret; - } - } - pm_runtime_get_noresume(&pdev->dev); /* Reset the dmamux */ @@ -290,8 +288,12 @@ static int stm32_dmamux_probe(struct platform_device *pdev) pm_runtime_put(&pdev->dev); - return of_dma_router_register(node, stm32_dmamux_route_allocate, + ret = of_dma_router_register(node, stm32_dmamux_route_allocate, &stm32_dmamux->dmarouter); + if (ret) + clk_disable_unprepare(stm32_dmamux->clk); + + return ret; } #ifdef CONFIG_PM |