0073-soc-starfive-Add-JH7110-AON-PMU-support.patch 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. From 3124d653318c50e20eadbb3998eafa5928ac9b63 Mon Sep 17 00:00:00 2001
  2. From: Changhuang Liang <[email protected]>
  3. Date: Thu, 18 May 2023 23:02:02 -0700
  4. Subject: [PATCH 073/122] soc: starfive: Add JH7110 AON PMU support
  5. Add AON PMU for StarFive JH7110 SoC. It can be used to turn on/off the
  6. dphy rx/tx power switch.
  7. Reviewed-by: Walker Chen <[email protected]>
  8. Signed-off-by: Changhuang Liang <[email protected]>
  9. ---
  10. drivers/soc/starfive/jh71xx_pmu.c | 57 ++++++++++++++++++++++++++++---
  11. 1 file changed, 52 insertions(+), 5 deletions(-)
  12. --- a/drivers/soc/starfive/jh71xx_pmu.c
  13. +++ b/drivers/soc/starfive/jh71xx_pmu.c
  14. @@ -2,7 +2,7 @@
  15. /*
  16. * StarFive JH71XX PMU (Power Management Unit) Controller Driver
  17. *
  18. - * Copyright (C) 2022 StarFive Technology Co., Ltd.
  19. + * Copyright (C) 2022-2023 StarFive Technology Co., Ltd.
  20. */
  21. #include <linux/interrupt.h>
  22. @@ -24,6 +24,9 @@
  23. #define JH71XX_PMU_EVENT_STATUS 0x88
  24. #define JH71XX_PMU_INT_STATUS 0x8C
  25. +/* aon pmu register offset */
  26. +#define JH71XX_AON_PMU_SWITCH 0x00
  27. +
  28. /* sw encourage cfg */
  29. #define JH71XX_PMU_SW_ENCOURAGE_EN_LO 0x05
  30. #define JH71XX_PMU_SW_ENCOURAGE_EN_HI 0x50
  31. @@ -160,6 +163,26 @@ static int jh7110_pmu_set_state(struct j
  32. return 0;
  33. }
  34. +static int jh7110_aon_pmu_set_state(struct jh71xx_pmu_dev *pmd, u32 mask, bool on)
  35. +{
  36. + struct jh71xx_pmu *pmu = pmd->pmu;
  37. + unsigned long flags;
  38. + u32 val;
  39. +
  40. + spin_lock_irqsave(&pmu->lock, flags);
  41. + val = readl(pmu->base + JH71XX_AON_PMU_SWITCH);
  42. +
  43. + if (on)
  44. + val |= mask;
  45. + else
  46. + val &= ~mask;
  47. +
  48. + writel(val, pmu->base + JH71XX_AON_PMU_SWITCH);
  49. + spin_unlock_irqrestore(&pmu->lock, flags);
  50. +
  51. + return 0;
  52. +}
  53. +
  54. static int jh71xx_pmu_set_state(struct jh71xx_pmu_dev *pmd, u32 mask, bool on)
  55. {
  56. struct jh71xx_pmu *pmu = pmd->pmu;
  57. @@ -317,10 +340,12 @@ static int jh71xx_pmu_probe(struct platf
  58. if (!match_data)
  59. return -EINVAL;
  60. - ret = match_data->pmu_parse_irq(pdev, pmu);
  61. - if (ret) {
  62. - dev_err(dev, "failed to parse irq\n");
  63. - return ret;
  64. + if (match_data->pmu_parse_irq) {
  65. + ret = match_data->pmu_parse_irq(pdev, pmu);
  66. + if (ret) {
  67. + dev_err(dev, "failed to parse irq\n");
  68. + return ret;
  69. + }
  70. }
  71. pmu->genpd = devm_kcalloc(dev, match_data->num_domains,
  72. @@ -394,11 +419,32 @@ static const struct jh71xx_pmu_match_dat
  73. .pmu_set_state = jh7110_pmu_set_state,
  74. };
  75. +static const struct jh71xx_domain_info jh7110_aon_power_domains[] = {
  76. + [JH7110_PD_DPHY_TX] = {
  77. + .name = "DPHY-TX",
  78. + .bit = 30,
  79. + },
  80. + [JH7110_PD_DPHY_RX] = {
  81. + .name = "DPHY-RX",
  82. + .bit = 31,
  83. + },
  84. +};
  85. +
  86. +static const struct jh71xx_pmu_match_data jh7110_aon_pmu = {
  87. + .num_domains = ARRAY_SIZE(jh7110_aon_power_domains),
  88. + .domain_info = jh7110_aon_power_domains,
  89. + .pmu_status = JH71XX_AON_PMU_SWITCH,
  90. + .pmu_set_state = jh7110_aon_pmu_set_state,
  91. +};
  92. +
  93. static const struct of_device_id jh71xx_pmu_of_match[] = {
  94. {
  95. .compatible = "starfive,jh7110-pmu",
  96. .data = (void *)&jh7110_pmu,
  97. }, {
  98. + .compatible = "starfive,jh7110-aon-syscon",
  99. + .data = (void *)&jh7110_aon_pmu,
  100. + }, {
  101. /* sentinel */
  102. }
  103. };
  104. @@ -414,5 +460,6 @@ static struct platform_driver jh71xx_pmu
  105. builtin_platform_driver(jh71xx_pmu_driver);
  106. MODULE_AUTHOR("Walker Chen <[email protected]>");
  107. +MODULE_AUTHOR("Changhuang Liang <[email protected]>");
  108. MODULE_DESCRIPTION("StarFive JH71XX PMU Driver");
  109. MODULE_LICENSE("GPL");