mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	spi: spi-fsl-dspi: Adding shutdown hook
We need to ensure dspi controller could be stopped in order for kexec to start the next kernel. So add the shutdown operation support. Signed-off-by: Peng Ma <peng.ma@nxp.com> Link: https://lore.kernel.org/r/20200424061216.27445-1-peng.ma@nxp.com Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
		
							parent
							
								
									80300a7d5f
								
							
						
					
					
						commit
						dc23482599
					
				
					 1 changed files with 23 additions and 0 deletions
				
			
		| 
						 | 
					@ -1,6 +1,7 @@
 | 
				
			||||||
// SPDX-License-Identifier: GPL-2.0+
 | 
					// SPDX-License-Identifier: GPL-2.0+
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// Copyright 2013 Freescale Semiconductor, Inc.
 | 
					// Copyright 2013 Freescale Semiconductor, Inc.
 | 
				
			||||||
 | 
					// Copyright 2020 NXP
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// Freescale DSPI driver
 | 
					// Freescale DSPI driver
 | 
				
			||||||
// This file contains a driver for the Freescale DSPI
 | 
					// This file contains a driver for the Freescale DSPI
 | 
				
			||||||
| 
						 | 
					@ -26,6 +27,9 @@
 | 
				
			||||||
#define SPI_MCR_CLR_TXF			BIT(11)
 | 
					#define SPI_MCR_CLR_TXF			BIT(11)
 | 
				
			||||||
#define SPI_MCR_CLR_RXF			BIT(10)
 | 
					#define SPI_MCR_CLR_RXF			BIT(10)
 | 
				
			||||||
#define SPI_MCR_XSPI			BIT(3)
 | 
					#define SPI_MCR_XSPI			BIT(3)
 | 
				
			||||||
 | 
					#define SPI_MCR_DIS_TXF			BIT(13)
 | 
				
			||||||
 | 
					#define SPI_MCR_DIS_RXF			BIT(12)
 | 
				
			||||||
 | 
					#define SPI_MCR_HALT			BIT(0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SPI_TCR				0x08
 | 
					#define SPI_TCR				0x08
 | 
				
			||||||
#define SPI_TCR_GET_TCNT(x)		(((x) & GENMASK(31, 16)) >> 16)
 | 
					#define SPI_TCR_GET_TCNT(x)		(((x) & GENMASK(31, 16)) >> 16)
 | 
				
			||||||
| 
						 | 
					@ -1417,6 +1421,24 @@ static int dspi_remove(struct platform_device *pdev)
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct platform_driver fsl_dspi_driver = {
 | 
					static struct platform_driver fsl_dspi_driver = {
 | 
				
			||||||
	.driver.name		= DRIVER_NAME,
 | 
						.driver.name		= DRIVER_NAME,
 | 
				
			||||||
	.driver.of_match_table	= fsl_dspi_dt_ids,
 | 
						.driver.of_match_table	= fsl_dspi_dt_ids,
 | 
				
			||||||
| 
						 | 
					@ -1424,6 +1446,7 @@ static struct platform_driver fsl_dspi_driver = {
 | 
				
			||||||
	.driver.pm		= &dspi_pm,
 | 
						.driver.pm		= &dspi_pm,
 | 
				
			||||||
	.probe			= dspi_probe,
 | 
						.probe			= dspi_probe,
 | 
				
			||||||
	.remove			= dspi_remove,
 | 
						.remove			= dspi_remove,
 | 
				
			||||||
 | 
						.shutdown		= dspi_shutdown,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
module_platform_driver(fsl_dspi_driver);
 | 
					module_platform_driver(fsl_dspi_driver);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue