spi: rspi: Fix invalid SPI use during system suspend
If the SPI queue is running during system suspend, the system may lock up. Fix this by stopping/restarting the queue during system suspend/resume, by calling spi_master_suspend()/spi_master_resume() from the PM callbacks. In-kernel users will receive an -ESHUTDOWN error while system suspend/resume is in progress. Based on a patch for sh-msiof by Gaku Inami. Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be> Signed-off-by: Mark Brown <broonie@kernel.org> Cc: stable@vger.kernel.org
This commit is contained in:
parent
31a5fae4c5
commit
c1ca59c22c
@ -1350,12 +1350,36 @@ static const struct platform_device_id spi_driver_ids[] = {
|
|||||||
|
|
||||||
MODULE_DEVICE_TABLE(platform, spi_driver_ids);
|
MODULE_DEVICE_TABLE(platform, spi_driver_ids);
|
||||||
|
|
||||||
|
#ifdef CONFIG_PM_SLEEP
|
||||||
|
static int rspi_suspend(struct device *dev)
|
||||||
|
{
|
||||||
|
struct platform_device *pdev = to_platform_device(dev);
|
||||||
|
struct rspi_data *rspi = platform_get_drvdata(pdev);
|
||||||
|
|
||||||
|
return spi_master_suspend(rspi->master);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int rspi_resume(struct device *dev)
|
||||||
|
{
|
||||||
|
struct platform_device *pdev = to_platform_device(dev);
|
||||||
|
struct rspi_data *rspi = platform_get_drvdata(pdev);
|
||||||
|
|
||||||
|
return spi_master_resume(rspi->master);
|
||||||
|
}
|
||||||
|
|
||||||
|
static SIMPLE_DEV_PM_OPS(rspi_pm_ops, rspi_suspend, rspi_resume);
|
||||||
|
#define DEV_PM_OPS &rspi_pm_ops
|
||||||
|
#else
|
||||||
|
#define DEV_PM_OPS NULL
|
||||||
|
#endif /* CONFIG_PM_SLEEP */
|
||||||
|
|
||||||
static struct platform_driver rspi_driver = {
|
static struct platform_driver rspi_driver = {
|
||||||
.probe = rspi_probe,
|
.probe = rspi_probe,
|
||||||
.remove = rspi_remove,
|
.remove = rspi_remove,
|
||||||
.id_table = spi_driver_ids,
|
.id_table = spi_driver_ids,
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = "renesas_spi",
|
.name = "renesas_spi",
|
||||||
|
.pm = DEV_PM_OPS,
|
||||||
.of_match_table = of_match_ptr(rspi_of_match),
|
.of_match_table = of_match_ptr(rspi_of_match),
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user