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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  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. --- a/drivers/mtd/spi-nor/mtk-quadspi.c
  14. +++ b/drivers/mtd/spi-nor/mtk-quadspi.c
  15. @@ -404,6 +404,29 @@ static int mt8173_nor_write_reg(struct s
  16. return ret;
  17. }
  18. +static void mt8173_nor_disable_clk(struct mt8173_nor *mt8173_nor)
  19. +{
  20. + clk_disable_unprepare(mt8173_nor->spi_clk);
  21. + clk_disable_unprepare(mt8173_nor->nor_clk);
  22. +}
  23. +
  24. +static int mt8173_nor_enable_clk(struct mt8173_nor *mt8173_nor)
  25. +{
  26. + int ret;
  27. +
  28. + ret = clk_prepare_enable(mt8173_nor->spi_clk);
  29. + if (ret)
  30. + return ret;
  31. +
  32. + ret = clk_prepare_enable(mt8173_nor->nor_clk);
  33. + if (ret) {
  34. + clk_disable_unprepare(mt8173_nor->spi_clk);
  35. + return ret;
  36. + }
  37. +
  38. + return 0;
  39. +}
  40. +
  41. static int mtk_nor_init(struct mt8173_nor *mt8173_nor,
  42. struct device_node *flash_node)
  43. {
  44. @@ -468,15 +491,11 @@ static int mtk_nor_drv_probe(struct plat
  45. return PTR_ERR(mt8173_nor->nor_clk);
  46. mt8173_nor->dev = &pdev->dev;
  47. - ret = clk_prepare_enable(mt8173_nor->spi_clk);
  48. +
  49. + ret = mt8173_nor_enable_clk(mt8173_nor);
  50. if (ret)
  51. return ret;
  52. - ret = clk_prepare_enable(mt8173_nor->nor_clk);
  53. - if (ret) {
  54. - clk_disable_unprepare(mt8173_nor->spi_clk);
  55. - return ret;
  56. - }
  57. /* only support one attached flash */
  58. flash_np = of_get_next_available_child(pdev->dev.of_node, NULL);
  59. if (!flash_np) {
  60. @@ -487,10 +506,9 @@ static int mtk_nor_drv_probe(struct plat
  61. ret = mtk_nor_init(mt8173_nor, flash_np);
  62. nor_free:
  63. - if (ret) {
  64. - clk_disable_unprepare(mt8173_nor->spi_clk);
  65. - clk_disable_unprepare(mt8173_nor->nor_clk);
  66. - }
  67. + if (ret)
  68. + mt8173_nor_disable_clk(mt8173_nor);
  69. +
  70. return ret;
  71. }
  72. @@ -498,11 +516,38 @@ static int mtk_nor_drv_remove(struct pla
  73. {
  74. struct mt8173_nor *mt8173_nor = platform_get_drvdata(pdev);
  75. - clk_disable_unprepare(mt8173_nor->spi_clk);
  76. - clk_disable_unprepare(mt8173_nor->nor_clk);
  77. + mt8173_nor_disable_clk(mt8173_nor);
  78. +
  79. + return 0;
  80. +}
  81. +
  82. +#ifdef CONFIG_PM_SLEEP
  83. +static int mtk_nor_suspend(struct device *dev)
  84. +{
  85. + struct mt8173_nor *mt8173_nor = dev_get_drvdata(dev);
  86. +
  87. + mt8173_nor_disable_clk(mt8173_nor);
  88. +
  89. return 0;
  90. }
  91. +static int mtk_nor_resume(struct device *dev)
  92. +{
  93. + struct mt8173_nor *mt8173_nor = dev_get_drvdata(dev);
  94. +
  95. + return mt8173_nor_enable_clk(mt8173_nor);
  96. +}
  97. +
  98. +static const struct dev_pm_ops mtk_nor_dev_pm_ops = {
  99. + .suspend = mtk_nor_suspend,
  100. + .resume = mtk_nor_resume,
  101. +};
  102. +
  103. +#define MTK_NOR_DEV_PM_OPS (&mtk_nor_dev_pm_ops)
  104. +#else
  105. +#define MTK_NOR_DEV_PM_OPS NULL
  106. +#endif
  107. +
  108. static const struct of_device_id mtk_nor_of_ids[] = {
  109. { .compatible = "mediatek,mt8173-nor"},
  110. { /* sentinel */ }
  111. @@ -514,6 +559,7 @@ static struct platform_driver mtk_nor_dr
  112. .remove = mtk_nor_drv_remove,
  113. .driver = {
  114. .name = "mtk-nor",
  115. + .pm = MTK_NOR_DEV_PM_OPS,
  116. .of_match_table = mtk_nor_of_ids,
  117. },
  118. };