1 From 8ce000aa0be7755036ab4c674002920846889f2d Mon Sep 17 00:00:00 2001
2 From: Changhuang Liang <changhuang.liang@starfivetech.com>
3 Date: Thu, 18 May 2023 23:02:02 -0700
4 Subject: [PATCH 086/129] soc: starfive: Add JH7110 AON PMU support
6 Add AON PMU for StarFive JH7110 SoC. It can be used to turn on/off the
7 dphy rx/tx power switch.
9 Reviewed-by: Walker Chen <walker.chen@starfivetech.com>
10 Signed-off-by: Changhuang Liang <changhuang.liang@starfivetech.com>
12 drivers/soc/starfive/jh71xx_pmu.c | 57 ++++++++++++++++++++++++++++---
13 1 file changed, 52 insertions(+), 5 deletions(-)
15 diff --git a/drivers/soc/starfive/jh71xx_pmu.c b/drivers/soc/starfive/jh71xx_pmu.c
16 index 0dbdcc0d2..c7b474409 100644
17 --- a/drivers/soc/starfive/jh71xx_pmu.c
18 +++ b/drivers/soc/starfive/jh71xx_pmu.c
21 * StarFive JH71XX PMU (Power Management Unit) Controller Driver
23 - * Copyright (C) 2022 StarFive Technology Co., Ltd.
24 + * Copyright (C) 2022-2023 StarFive Technology Co., Ltd.
27 #include <linux/interrupt.h>
29 #define JH71XX_PMU_EVENT_STATUS 0x88
30 #define JH71XX_PMU_INT_STATUS 0x8C
32 +/* aon pmu register offset */
33 +#define JH71XX_AON_PMU_SWITCH 0x00
35 /* sw encourage cfg */
36 #define JH71XX_PMU_SW_ENCOURAGE_EN_LO 0x05
37 #define JH71XX_PMU_SW_ENCOURAGE_EN_HI 0x50
38 @@ -160,6 +163,26 @@ static int jh7110_pmu_set_state(struct jh71xx_pmu_dev *pmd, u32 mask, bool on)
42 +static int jh7110_aon_pmu_set_state(struct jh71xx_pmu_dev *pmd, u32 mask, bool on)
44 + struct jh71xx_pmu *pmu = pmd->pmu;
45 + unsigned long flags;
48 + spin_lock_irqsave(&pmu->lock, flags);
49 + val = readl(pmu->base + JH71XX_AON_PMU_SWITCH);
56 + writel(val, pmu->base + JH71XX_AON_PMU_SWITCH);
57 + spin_unlock_irqrestore(&pmu->lock, flags);
62 static int jh71xx_pmu_set_state(struct jh71xx_pmu_dev *pmd, u32 mask, bool on)
64 struct jh71xx_pmu *pmu = pmd->pmu;
65 @@ -317,10 +340,12 @@ static int jh71xx_pmu_probe(struct platform_device *pdev)
69 - ret = match_data->pmu_parse_irq(pdev, pmu);
71 - dev_err(dev, "failed to parse irq\n");
73 + if (match_data->pmu_parse_irq) {
74 + ret = match_data->pmu_parse_irq(pdev, pmu);
76 + dev_err(dev, "failed to parse irq\n");
81 pmu->genpd = devm_kcalloc(dev, match_data->num_domains,
82 @@ -394,10 +419,31 @@ static const struct jh71xx_pmu_match_data jh7110_pmu = {
83 .pmu_set_state = jh7110_pmu_set_state,
86 +static const struct jh71xx_domain_info jh7110_aon_power_domains[] = {
87 + [JH7110_PD_DPHY_TX] = {
91 + [JH7110_PD_DPHY_RX] = {
97 +static const struct jh71xx_pmu_match_data jh7110_aon_pmu = {
98 + .num_domains = ARRAY_SIZE(jh7110_aon_power_domains),
99 + .domain_info = jh7110_aon_power_domains,
100 + .pmu_status = JH71XX_AON_PMU_SWITCH,
101 + .pmu_set_state = jh7110_aon_pmu_set_state,
104 static const struct of_device_id jh71xx_pmu_of_match[] = {
106 .compatible = "starfive,jh7110-pmu",
107 .data = (void *)&jh7110_pmu,
109 + .compatible = "starfive,jh7110-aon-syscon",
110 + .data = (void *)&jh7110_aon_pmu,
114 @@ -414,5 +460,6 @@ static struct platform_driver jh71xx_pmu_driver = {
115 builtin_platform_driver(jh71xx_pmu_driver);
117 MODULE_AUTHOR("Walker Chen <walker.chen@starfivetech.com>");
118 +MODULE_AUTHOR("Changhuang Liang <changhuang.liang@starfivetech.com>");
119 MODULE_DESCRIPTION("StarFive JH71XX PMU Driver");
120 MODULE_LICENSE("GPL");