i2c: stm32f7: fix & reorder remove & probe error handling
authorAlain Volmat <alain.volmat@st.com>
Fri, 25 Oct 2019 14:04:24 +0000 (16:04 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 4 Jan 2020 18:17:27 +0000 (19:17 +0100)
[ Upstream commit 53aaaa5d9b1e95eb40e877fbffa6f964a8394bb7 ]

Add missing dma channels free calls in case of error during probe
and reorder the remove function so that dma channels are freed after
the i2c adapter is deleted.
Overall, reorder the remove function so that probe error handling order
and remove function order are same.

Fixes: 7ecc8cfde553 ("i2c: i2c-stm32f7: Add DMA support")
Signed-off-by: Alain Volmat <alain.volmat@st.com>
Reviewed-by: Pierre-Yves MORDRET <pierre-yves.mordret@st.com>
Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/i2c/busses/i2c-stm32f7.c

index b24e7b937f210bbb9fc5279f386c1f0e6044f528..84cfed17ff4f5309dcfc47cd2480b4e1b56d4250 100644 (file)
@@ -1985,6 +1985,11 @@ pm_disable:
        pm_runtime_set_suspended(i2c_dev->dev);
        pm_runtime_dont_use_autosuspend(i2c_dev->dev);
 
+       if (i2c_dev->dma) {
+               stm32_i2c_dma_free(i2c_dev->dma);
+               i2c_dev->dma = NULL;
+       }
+
 clk_free:
        clk_disable_unprepare(i2c_dev->clk);
 
@@ -1995,21 +2000,21 @@ static int stm32f7_i2c_remove(struct platform_device *pdev)
 {
        struct stm32f7_i2c_dev *i2c_dev = platform_get_drvdata(pdev);
 
-       if (i2c_dev->dma) {
-               stm32_i2c_dma_free(i2c_dev->dma);
-               i2c_dev->dma = NULL;
-       }
-
        i2c_del_adapter(&i2c_dev->adap);
        pm_runtime_get_sync(i2c_dev->dev);
 
-       clk_disable_unprepare(i2c_dev->clk);
-
        pm_runtime_put_noidle(i2c_dev->dev);
        pm_runtime_disable(i2c_dev->dev);
        pm_runtime_set_suspended(i2c_dev->dev);
        pm_runtime_dont_use_autosuspend(i2c_dev->dev);
 
+       if (i2c_dev->dma) {
+               stm32_i2c_dma_free(i2c_dev->dma);
+               i2c_dev->dma = NULL;
+       }
+
+       clk_disable_unprepare(i2c_dev->clk);
+
        return 0;
 }