forked from mirrors/linux
		
	spi: imx: do not access registers while clocks disabled
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: 9e556dcc55 ("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>
Cc: stable@vger.kernel.org
			
			
This commit is contained in:
		
							parent
							
								
									4fbd8d194f
								
							
						
					
					
						commit
						d593574aff
					
				
					 1 changed files with 13 additions and 2 deletions
				
			
		| 
						 | 
				
			
			@ -1668,12 +1668,23 @@ static int spi_imx_remove(struct platform_device *pdev)
 | 
			
		|||
{
 | 
			
		||||
	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);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue