mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +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+
 | 
			
		||||
//
 | 
			
		||||
// Copyright 2013 Freescale Semiconductor, Inc.
 | 
			
		||||
// Copyright 2020 NXP
 | 
			
		||||
//
 | 
			
		||||
// Freescale DSPI driver
 | 
			
		||||
// This file contains a driver for the Freescale DSPI
 | 
			
		||||
| 
						 | 
				
			
			@ -26,6 +27,9 @@
 | 
			
		|||
#define SPI_MCR_CLR_TXF			BIT(11)
 | 
			
		||||
#define SPI_MCR_CLR_RXF			BIT(10)
 | 
			
		||||
#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_GET_TCNT(x)		(((x) & GENMASK(31, 16)) >> 16)
 | 
			
		||||
| 
						 | 
				
			
			@ -1417,6 +1421,24 @@ static int dspi_remove(struct platform_device *pdev)
 | 
			
		|||
	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 = {
 | 
			
		||||
	.driver.name		= DRIVER_NAME,
 | 
			
		||||
	.driver.of_match_table	= fsl_dspi_dt_ids,
 | 
			
		||||
| 
						 | 
				
			
			@ -1424,6 +1446,7 @@ static struct platform_driver fsl_dspi_driver = {
 | 
			
		|||
	.driver.pm		= &dspi_pm,
 | 
			
		||||
	.probe			= dspi_probe,
 | 
			
		||||
	.remove			= dspi_remove,
 | 
			
		||||
	.shutdown		= dspi_shutdown,
 | 
			
		||||
};
 | 
			
		||||
module_platform_driver(fsl_dspi_driver);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue