aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJonas Gorski <jogo@openwrt.org>2013-12-17 15:44:48 -0500
committerMark Brown <broonie@linaro.org>2013-12-17 17:32:17 -0500
commit937ebf9cd34ab3bc4ca26a4adf9c759fc58cc5e2 (patch)
tree154741cd34d94623092037f4c13680b5ae8a7719
parent7d255695804fbe7b2c30bcd54c1faf1d0918443c (diff)
spi/bcm63xx-hsspi: fix pm sleep support
Use the right CONFIG symbol to guard, properly (un)preprare clocks on suspend/resume, and check the result of it. Signed-off-by: Jonas Gorski <jogo@openwrt.org> Signed-off-by: Mark Brown <broonie@linaro.org>
-rw-r--r--drivers/spi/spi-bcm63xx-hsspi.c23
1 files changed, 10 insertions, 13 deletions
diff --git a/drivers/spi/spi-bcm63xx-hsspi.c b/drivers/spi/spi-bcm63xx-hsspi.c
index 1721ea99d688..b528f9fc8bc0 100644
--- a/drivers/spi/spi-bcm63xx-hsspi.c
+++ b/drivers/spi/spi-bcm63xx-hsspi.c
@@ -425,14 +425,14 @@ static int bcm63xx_hsspi_remove(struct platform_device *pdev)
425 return 0; 425 return 0;
426} 426}
427 427
428#ifdef CONFIG_PM 428#ifdef CONFIG_PM_SLEEP
429static int bcm63xx_hsspi_suspend(struct device *dev) 429static int bcm63xx_hsspi_suspend(struct device *dev)
430{ 430{
431 struct spi_master *master = dev_get_drvdata(dev); 431 struct spi_master *master = dev_get_drvdata(dev);
432 struct bcm63xx_hsspi *bs = spi_master_get_devdata(master); 432 struct bcm63xx_hsspi *bs = spi_master_get_devdata(master);
433 433
434 spi_master_suspend(master); 434 spi_master_suspend(master);
435 clk_disable(bs->clk); 435 clk_disable_unprepare(bs->clk);
436 436
437 return 0; 437 return 0;
438} 438}
@@ -441,30 +441,27 @@ static int bcm63xx_hsspi_resume(struct device *dev)
441{ 441{
442 struct spi_master *master = dev_get_drvdata(dev); 442 struct spi_master *master = dev_get_drvdata(dev);
443 struct bcm63xx_hsspi *bs = spi_master_get_devdata(master); 443 struct bcm63xx_hsspi *bs = spi_master_get_devdata(master);
444 int ret;
445
446 ret = clk_prepare_enable(bs->clk);
447 if (ret)
448 return ret;
444 449
445 clk_enable(bs->clk);
446 spi_master_resume(master); 450 spi_master_resume(master);
447 451
448 return 0; 452 return 0;
449} 453}
454#endif
450 455
451static const struct dev_pm_ops bcm63xx_hsspi_pm_ops = { 456static const struct dev_pm_ops bcm63xx_hsspi_pm_ops = {
452 .suspend = bcm63xx_hsspi_suspend, 457 SET_SYSTEM_SLEEP_PM_OPS(bcm63xx_hsspi_suspend, bcm63xx_hsspi_resume)
453 .resume = bcm63xx_hsspi_resume,
454}; 458};
455 459
456#define BCM63XX_HSSPI_PM_OPS (&bcm63xx_hsspi_pm_ops)
457#else
458#define BCM63XX_HSSPI_PM_OPS NULL
459#endif
460
461
462
463static struct platform_driver bcm63xx_hsspi_driver = { 460static struct platform_driver bcm63xx_hsspi_driver = {
464 .driver = { 461 .driver = {
465 .name = "bcm63xx-hsspi", 462 .name = "bcm63xx-hsspi",
466 .owner = THIS_MODULE, 463 .owner = THIS_MODULE,
467 .pm = BCM63XX_HSSPI_PM_OPS, 464 .pm = &bcm63xx_hsspi_pm_ops,
468 }, 465 },
469 .probe = bcm63xx_hsspi_probe, 466 .probe = bcm63xx_hsspi_probe,
470 .remove = bcm63xx_hsspi_remove, 467 .remove = bcm63xx_hsspi_remove,