0136-mtd-mtk-nor-add-suspend-resume-support.patch 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. From 8947f8cd407a55db816cd03fc03b59096210978e Mon Sep 17 00:00:00 2001
  2. From: Guochun Mao <[email protected]>
  3. Date: Thu, 21 Sep 2017 20:45:06 +0800
  4. Subject: [PATCH 136/224] mtd: mtk-nor: add suspend/resume support
  5. Abstract functions of clock setting, to avoid duplicated code,
  6. these functions been used in new feature.
  7. Implement suspend/resume functions.
  8. Signed-off-by: Guochun Mao <[email protected]>
  9. Signed-off-by: Cyrille Pitchen <[email protected]>
  10. ---
  11. drivers/mtd/spi-nor/mtk-quadspi.c | 70 ++++++++++++++++++++++++++++++++-------
  12. 1 file changed, 58 insertions(+), 12 deletions(-)
  13. diff --git a/drivers/mtd/spi-nor/mtk-quadspi.c b/drivers/mtd/spi-nor/mtk-quadspi.c
  14. index c258c7adf1c5..abe455ccd68b 100644
  15. --- a/drivers/mtd/spi-nor/mtk-quadspi.c
  16. +++ b/drivers/mtd/spi-nor/mtk-quadspi.c
  17. @@ -404,6 +404,29 @@ static int mt8173_nor_write_reg(struct spi_nor *nor, u8 opcode, u8 *buf,
  18. return ret;
  19. }
  20. +static void mt8173_nor_disable_clk(struct mt8173_nor *mt8173_nor)
  21. +{
  22. + clk_disable_unprepare(mt8173_nor->spi_clk);
  23. + clk_disable_unprepare(mt8173_nor->nor_clk);
  24. +}
  25. +
  26. +static int mt8173_nor_enable_clk(struct mt8173_nor *mt8173_nor)
  27. +{
  28. + int ret;
  29. +
  30. + ret = clk_prepare_enable(mt8173_nor->spi_clk);
  31. + if (ret)
  32. + return ret;
  33. +
  34. + ret = clk_prepare_enable(mt8173_nor->nor_clk);
  35. + if (ret) {
  36. + clk_disable_unprepare(mt8173_nor->spi_clk);
  37. + return ret;
  38. + }
  39. +
  40. + return 0;
  41. +}
  42. +
  43. static int mtk_nor_init(struct mt8173_nor *mt8173_nor,
  44. struct device_node *flash_node)
  45. {
  46. @@ -468,15 +491,11 @@ static int mtk_nor_drv_probe(struct platform_device *pdev)
  47. return PTR_ERR(mt8173_nor->nor_clk);
  48. mt8173_nor->dev = &pdev->dev;
  49. - ret = clk_prepare_enable(mt8173_nor->spi_clk);
  50. +
  51. + ret = mt8173_nor_enable_clk(mt8173_nor);
  52. if (ret)
  53. return ret;
  54. - ret = clk_prepare_enable(mt8173_nor->nor_clk);
  55. - if (ret) {
  56. - clk_disable_unprepare(mt8173_nor->spi_clk);
  57. - return ret;
  58. - }
  59. /* only support one attached flash */
  60. flash_np = of_get_next_available_child(pdev->dev.of_node, NULL);
  61. if (!flash_np) {
  62. @@ -487,10 +506,9 @@ static int mtk_nor_drv_probe(struct platform_device *pdev)
  63. ret = mtk_nor_init(mt8173_nor, flash_np);
  64. nor_free:
  65. - if (ret) {
  66. - clk_disable_unprepare(mt8173_nor->spi_clk);
  67. - clk_disable_unprepare(mt8173_nor->nor_clk);
  68. - }
  69. + if (ret)
  70. + mt8173_nor_disable_clk(mt8173_nor);
  71. +
  72. return ret;
  73. }
  74. @@ -498,11 +516,38 @@ static int mtk_nor_drv_remove(struct platform_device *pdev)
  75. {
  76. struct mt8173_nor *mt8173_nor = platform_get_drvdata(pdev);
  77. - clk_disable_unprepare(mt8173_nor->spi_clk);
  78. - clk_disable_unprepare(mt8173_nor->nor_clk);
  79. + mt8173_nor_disable_clk(mt8173_nor);
  80. +
  81. + return 0;
  82. +}
  83. +
  84. +#ifdef CONFIG_PM_SLEEP
  85. +static int mtk_nor_suspend(struct device *dev)
  86. +{
  87. + struct mt8173_nor *mt8173_nor = dev_get_drvdata(dev);
  88. +
  89. + mt8173_nor_disable_clk(mt8173_nor);
  90. +
  91. return 0;
  92. }
  93. +static int mtk_nor_resume(struct device *dev)
  94. +{
  95. + struct mt8173_nor *mt8173_nor = dev_get_drvdata(dev);
  96. +
  97. + return mt8173_nor_enable_clk(mt8173_nor);
  98. +}
  99. +
  100. +static const struct dev_pm_ops mtk_nor_dev_pm_ops = {
  101. + .suspend = mtk_nor_suspend,
  102. + .resume = mtk_nor_resume,
  103. +};
  104. +
  105. +#define MTK_NOR_DEV_PM_OPS (&mtk_nor_dev_pm_ops)
  106. +#else
  107. +#define MTK_NOR_DEV_PM_OPS NULL
  108. +#endif
  109. +
  110. static const struct of_device_id mtk_nor_of_ids[] = {
  111. { .compatible = "mediatek,mt8173-nor"},
  112. { /* sentinel */ }
  113. @@ -514,6 +559,7 @@ static struct platform_driver mtk_nor_driver = {
  114. .remove = mtk_nor_drv_remove,
  115. .driver = {
  116. .name = "mtk-nor",
  117. + .pm = MTK_NOR_DEV_PM_OPS,
  118. .of_match_table = mtk_nor_of_ids,
  119. },
  120. };
  121. --
  122. 2.11.0