| From ef77da8bfad0d08f80354483161ae90f2dd00e06 Mon Sep 17 00:00:00 2001 |
| From: Krzysztof Kozlowski <krzk@kernel.org> |
| Date: Mon, 22 Jun 2020 13:05:41 +0200 |
| Subject: [PATCH] spi: spi-fsl-dspi: Fix lockup if device is shutdown during |
| SPI transfer |
| |
| commit 3c525b69e8c1a9a6944e976603c7a1a713e728f9 upstream. |
| |
| During shutdown, the driver should unregister the SPI controller |
| and stop the hardware. Otherwise the dspi_transfer_one_message() could |
| wait on completion infinitely. |
| |
| Additionally, calling spi_unregister_controller() first in device |
| shutdown reverse-matches the probe function, where SPI controller is |
| registered at the end. |
| |
| Fixes: dc234825997e ("spi: spi-fsl-dspi: Adding shutdown hook") |
| Reported-by: Vladimir Oltean <olteanv@gmail.com> |
| Signed-off-by: Krzysztof Kozlowski <krzk@kernel.org> |
| Tested-by: Vladimir Oltean <vladimir.oltean@nxp.com> |
| Reviewed-by: Vladimir Oltean <vladimir.oltean@nxp.com> |
| Cc: <stable@vger.kernel.org> |
| Link: https://lore.kernel.org/r/20200622110543.5035-2-krzk@kernel.org |
| Signed-off-by: Mark Brown <broonie@kernel.org> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/spi/spi-fsl-dspi.c b/drivers/spi/spi-fsl-dspi.c |
| index a48c906c7c99..874d15555db5 100644 |
| --- a/drivers/spi/spi-fsl-dspi.c |
| +++ b/drivers/spi/spi-fsl-dspi.c |
| @@ -1169,20 +1169,7 @@ static int dspi_remove(struct platform_device *pdev) |
| |
| static void dspi_shutdown(struct platform_device *pdev) |
| { |
| - struct spi_controller *ctlr = platform_get_drvdata(pdev); |
| - struct fsl_dspi *dspi = spi_controller_get_devdata(ctlr); |
| - |
| - /* Disable RX and TX */ |
| - regmap_update_bits(dspi->regmap, SPI_MCR, |
| - SPI_MCR_DIS_TXF | SPI_MCR_DIS_RXF, |
| - SPI_MCR_DIS_TXF | SPI_MCR_DIS_RXF); |
| - |
| - /* Stop Running */ |
| - regmap_update_bits(dspi->regmap, SPI_MCR, SPI_MCR_HALT, SPI_MCR_HALT); |
| - |
| - dspi_release_dma(dspi); |
| - clk_disable_unprepare(dspi->clk); |
| - spi_unregister_controller(dspi->ctlr); |
| + dspi_remove(pdev); |
| } |
| |
| static struct platform_driver fsl_dspi_driver = { |
| -- |
| 2.27.0 |
| |