| From d593574aff0ab846136190b1729c151c736727ec Mon Sep 17 00:00:00 2001 |
| From: Stefan Agner <stefan@agner.ch> |
| Date: Sun, 7 Jan 2018 15:05:49 +0100 |
| Subject: spi: imx: do not access registers while clocks disabled |
| |
| From: Stefan Agner <stefan@agner.ch> |
| |
| commit d593574aff0ab846136190b1729c151c736727ec upstream. |
| |
| Since clocks are disabled except during message transfer clocks |
| are also disabled when spi_imx_remove gets called. Accessing |
| registers leads to a freeeze at least on a i.MX 6ULL. Enable |
| clocks before disabling accessing the MXC_CSPICTRL register. |
| |
| Fixes: 9e556dcc55774 ("spi: spi-imx: only enable the clocks when we start to transfer a message") |
| Signed-off-by: Stefan Agner <stefan@agner.ch> |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/spi/spi-imx.c | 15 +++++++++++++-- |
| 1 file changed, 13 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/spi/spi-imx.c |
| +++ b/drivers/spi/spi-imx.c |
| @@ -1307,12 +1307,23 @@ static int spi_imx_remove(struct platfor |
| { |
| struct spi_master *master = platform_get_drvdata(pdev); |
| struct spi_imx_data *spi_imx = spi_master_get_devdata(master); |
| + int ret; |
| |
| spi_bitbang_stop(&spi_imx->bitbang); |
| |
| + ret = clk_enable(spi_imx->clk_per); |
| + if (ret) |
| + return ret; |
| + |
| + ret = clk_enable(spi_imx->clk_ipg); |
| + if (ret) { |
| + clk_disable(spi_imx->clk_per); |
| + return ret; |
| + } |
| + |
| writel(0, spi_imx->base + MXC_CSPICTRL); |
| - clk_unprepare(spi_imx->clk_ipg); |
| - clk_unprepare(spi_imx->clk_per); |
| + clk_disable_unprepare(spi_imx->clk_ipg); |
| + clk_disable_unprepare(spi_imx->clk_per); |
| spi_imx_sdma_exit(spi_imx); |
| spi_master_put(master); |
| |