diff options
Diffstat (limited to 'drivers/spi/atmel-quadspi.c')
| -rw-r--r-- | drivers/spi/atmel-quadspi.c | 36 | 
1 files changed, 24 insertions, 12 deletions
diff --git a/drivers/spi/atmel-quadspi.c b/drivers/spi/atmel-quadspi.c index f4632cb07495..3d1252566134 100644 --- a/drivers/spi/atmel-quadspi.c +++ b/drivers/spi/atmel-quadspi.c @@ -700,25 +700,33 @@ disable_pclk:  	return err;  } -static int atmel_qspi_remove(struct platform_device *pdev) +static void atmel_qspi_remove(struct platform_device *pdev)  {  	struct spi_controller *ctrl = platform_get_drvdata(pdev);  	struct atmel_qspi *aq = spi_controller_get_devdata(ctrl);  	int ret; -	ret = pm_runtime_resume_and_get(&pdev->dev); -	if (ret < 0) -		return ret; -  	spi_unregister_controller(ctrl); -	atmel_qspi_write(QSPI_CR_QSPIDIS, aq, QSPI_CR); + +	ret = pm_runtime_get_sync(&pdev->dev); +	if (ret >= 0) { +		atmel_qspi_write(QSPI_CR_QSPIDIS, aq, QSPI_CR); +		clk_disable(aq->qspick); +		clk_disable(aq->pclk); +	} else { +		/* +		 * atmel_qspi_runtime_{suspend,resume} just disable and enable +		 * the two clks respectively. So after resume failed these are +		 * off, and we skip hardware access and disabling these clks again. +		 */ +		dev_warn(&pdev->dev, "Failed to resume device on remove\n"); +	} + +	clk_unprepare(aq->qspick); +	clk_unprepare(aq->pclk);  	pm_runtime_disable(&pdev->dev);  	pm_runtime_put_noidle(&pdev->dev); - -	clk_disable_unprepare(aq->qspick); -	clk_disable_unprepare(aq->pclk); -	return 0;  }  static int __maybe_unused atmel_qspi_suspend(struct device *dev) @@ -786,7 +794,11 @@ static int __maybe_unused atmel_qspi_runtime_resume(struct device *dev)  	if (ret)  		return ret; -	return clk_enable(aq->qspick); +	ret = clk_enable(aq->qspick); +	if (ret) +		clk_disable(aq->pclk); + +	return ret;  }  static const struct dev_pm_ops __maybe_unused atmel_qspi_pm_ops = { @@ -823,7 +835,7 @@ static struct platform_driver atmel_qspi_driver = {  		.pm	= pm_ptr(&atmel_qspi_pm_ops),  	},  	.probe		= atmel_qspi_probe, -	.remove		= atmel_qspi_remove, +	.remove_new	= atmel_qspi_remove,  };  module_platform_driver(atmel_qspi_driver);  |