19
19
#include <linux/of_clk.h>
20
20
#include <linux/clk.h>
21
21
#include <linux/regmap.h>
22
+ #include <linux/regulator/consumer.h>
22
23
#include <linux/mfd/syscon.h>
23
24
#include <soc/rockchip/pm_domains.h>
24
25
#include <soc/rockchip/rockchip_sip.h>
@@ -46,6 +47,7 @@ struct rockchip_domain_info {
46
47
int idle_mask ;
47
48
int ack_mask ;
48
49
bool active_wakeup ;
50
+ bool need_regulator ;
49
51
int pwr_w_mask ;
50
52
int req_w_mask ;
51
53
int clk_ungate_mask ;
@@ -94,6 +96,8 @@ struct rockchip_pm_domain {
94
96
u32 * qos_save_regs [MAX_QOS_REGS_NUM ];
95
97
int num_clks ;
96
98
struct clk_bulk_data * clks ;
99
+ struct device_node * node ;
100
+ struct regulator * supply ;
97
101
};
98
102
99
103
struct rockchip_pmu {
@@ -131,7 +135,7 @@ struct rockchip_pmu {
131
135
.active_wakeup = wakeup, \
132
136
}
133
137
134
- #define DOMAIN_M_O_R (_name , p_offset , pwr , status , m_offset , m_status , r_status , r_offset , req , idle , ack , wakeup ) \
138
+ #define DOMAIN_M_O_R (_name , p_offset , pwr , status , m_offset , m_status , r_status , r_offset , req , idle , ack , wakeup , regulator ) \
135
139
{ \
136
140
.name = _name, \
137
141
.pwr_offset = p_offset, \
@@ -147,6 +151,7 @@ struct rockchip_pmu {
147
151
.idle_mask = (idle), \
148
152
.ack_mask = (ack), \
149
153
.active_wakeup = wakeup, \
154
+ .need_regulator = regulator, \
150
155
}
151
156
152
157
#define DOMAIN_M_O_R_G (_name , p_offset , pwr , status , m_offset , m_status , r_status , r_offset , req , idle , ack , g_mask , wakeup ) \
@@ -305,8 +310,8 @@ void rockchip_pmu_unblock(void)
305
310
}
306
311
EXPORT_SYMBOL_GPL (rockchip_pmu_unblock );
307
312
308
- #define DOMAIN_RK3588 (name , p_offset , pwr , status , m_offset , m_status , r_status , r_offset , req , idle , wakeup ) \
309
- DOMAIN_M_O_R(name, p_offset, pwr, status, m_offset, m_status, r_status, r_offset, req, idle, idle, wakeup)
313
+ #define DOMAIN_RK3588 (name , p_offset , pwr , status , m_offset , m_status , r_status , r_offset , req , idle , wakeup , regulator ) \
314
+ DOMAIN_M_O_R(name, p_offset, pwr, status, m_offset, m_status, r_status, r_offset, req, idle, idle, wakeup, regulator )
310
315
311
316
static bool rockchip_pmu_domain_is_idle (struct rockchip_pm_domain * pd )
312
317
{
@@ -632,18 +637,57 @@ static int rockchip_pd_power(struct rockchip_pm_domain *pd, bool power_on)
632
637
return ret ;
633
638
}
634
639
640
+ static int rockchip_pd_regulator_disable (struct rockchip_pm_domain * pd )
641
+ {
642
+ return IS_ERR_OR_NULL (pd -> supply ) ? 0 : regulator_disable (pd -> supply );
643
+ }
644
+
645
+ static int rockchip_pd_regulator_enable (struct rockchip_pm_domain * pd )
646
+ {
647
+ struct rockchip_pmu * pmu = pd -> pmu ;
648
+
649
+ if (!pd -> info -> need_regulator )
650
+ return 0 ;
651
+
652
+ if (IS_ERR_OR_NULL (pd -> supply )) {
653
+ pd -> supply = devm_of_regulator_get (pmu -> dev , pd -> node , "domain" );
654
+
655
+ if (IS_ERR (pd -> supply ))
656
+ return PTR_ERR (pd -> supply );
657
+ }
658
+
659
+ return regulator_enable (pd -> supply );
660
+ }
661
+
635
662
static int rockchip_pd_power_on (struct generic_pm_domain * domain )
636
663
{
637
664
struct rockchip_pm_domain * pd = to_rockchip_pd (domain );
665
+ int ret ;
666
+
667
+ ret = rockchip_pd_regulator_enable (pd );
668
+ if (ret ) {
669
+ dev_err (pd -> pmu -> dev , "Failed to enable supply: %d\n" , ret );
670
+ return ret ;
671
+ }
638
672
639
- return rockchip_pd_power (pd , true);
673
+ ret = rockchip_pd_power (pd , true);
674
+ if (ret )
675
+ rockchip_pd_regulator_disable (pd );
676
+
677
+ return ret ;
640
678
}
641
679
642
680
static int rockchip_pd_power_off (struct generic_pm_domain * domain )
643
681
{
644
682
struct rockchip_pm_domain * pd = to_rockchip_pd (domain );
683
+ int ret ;
645
684
646
- return rockchip_pd_power (pd , false);
685
+ ret = rockchip_pd_power (pd , false);
686
+ if (ret )
687
+ return ret ;
688
+
689
+ rockchip_pd_regulator_disable (pd );
690
+ return ret ;
647
691
}
648
692
649
693
static int rockchip_pd_attach_dev (struct generic_pm_domain * genpd ,
@@ -724,6 +768,7 @@ static int rockchip_pm_add_one_domain(struct rockchip_pmu *pmu,
724
768
725
769
pd -> info = pd_info ;
726
770
pd -> pmu = pmu ;
771
+ pd -> node = node ;
727
772
728
773
pd -> num_clks = of_clk_get_parent_count (node );
729
774
if (pd -> num_clks > 0 ) {
@@ -1187,35 +1232,35 @@ static const struct rockchip_domain_info rk3576_pm_domains[] = {
1187
1232
};
1188
1233
1189
1234
static const struct rockchip_domain_info rk3588_pm_domains [] = {
1190
- [RK3588_PD_GPU ] = DOMAIN_RK3588 ("gpu" , 0x0 , BIT (0 ), 0 , 0x0 , 0 , BIT (1 ), 0x0 , BIT (0 ), BIT (0 ), false),
1191
- [RK3588_PD_NPU ] = DOMAIN_RK3588 ("npu" , 0x0 , BIT (1 ), BIT (1 ), 0x0 , 0 , 0 , 0x0 , 0 , 0 , false),
1192
- [RK3588_PD_VCODEC ] = DOMAIN_RK3588 ("vcodec" , 0x0 , BIT (2 ), BIT (2 ), 0x0 , 0 , 0 , 0x0 , 0 , 0 , false),
1193
- [RK3588_PD_NPUTOP ] = DOMAIN_RK3588 ("nputop" , 0x0 , BIT (3 ), 0 , 0x0 , BIT (11 ), BIT (2 ), 0x0 , BIT (1 ), BIT (1 ), false),
1194
- [RK3588_PD_NPU1 ] = DOMAIN_RK3588 ("npu1" , 0x0 , BIT (4 ), 0 , 0x0 , BIT (12 ), BIT (3 ), 0x0 , BIT (2 ), BIT (2 ), false),
1195
- [RK3588_PD_NPU2 ] = DOMAIN_RK3588 ("npu2" , 0x0 , BIT (5 ), 0 , 0x0 , BIT (13 ), BIT (4 ), 0x0 , BIT (3 ), BIT (3 ), false),
1196
- [RK3588_PD_VENC0 ] = DOMAIN_RK3588 ("venc0" , 0x0 , BIT (6 ), 0 , 0x0 , BIT (14 ), BIT (5 ), 0x0 , BIT (4 ), BIT (4 ), false),
1197
- [RK3588_PD_VENC1 ] = DOMAIN_RK3588 ("venc1" , 0x0 , BIT (7 ), 0 , 0x0 , BIT (15 ), BIT (6 ), 0x0 , BIT (5 ), BIT (5 ), false),
1198
- [RK3588_PD_RKVDEC0 ] = DOMAIN_RK3588 ("rkvdec0" , 0x0 , BIT (8 ), 0 , 0x0 , BIT (16 ), BIT (7 ), 0x0 , BIT (6 ), BIT (6 ), false),
1199
- [RK3588_PD_RKVDEC1 ] = DOMAIN_RK3588 ("rkvdec1" , 0x0 , BIT (9 ), 0 , 0x0 , BIT (17 ), BIT (8 ), 0x0 , BIT (7 ), BIT (7 ), false),
1200
- [RK3588_PD_VDPU ] = DOMAIN_RK3588 ("vdpu" , 0x0 , BIT (10 ), 0 , 0x0 , BIT (18 ), BIT (9 ), 0x0 , BIT (8 ), BIT (8 ), false),
1201
- [RK3588_PD_RGA30 ] = DOMAIN_RK3588 ("rga30" , 0x0 , BIT (11 ), 0 , 0x0 , BIT (19 ), BIT (10 ), 0x0 , 0 , 0 , false),
1202
- [RK3588_PD_AV1 ] = DOMAIN_RK3588 ("av1" , 0x0 , BIT (12 ), 0 , 0x0 , BIT (20 ), BIT (11 ), 0x0 , BIT (9 ), BIT (9 ), false),
1203
- [RK3588_PD_VI ] = DOMAIN_RK3588 ("vi" , 0x0 , BIT (13 ), 0 , 0x0 , BIT (21 ), BIT (12 ), 0x0 , BIT (10 ), BIT (10 ), false),
1204
- [RK3588_PD_FEC ] = DOMAIN_RK3588 ("fec" , 0x0 , BIT (14 ), 0 , 0x0 , BIT (22 ), BIT (13 ), 0x0 , 0 , 0 , false),
1205
- [RK3588_PD_ISP1 ] = DOMAIN_RK3588 ("isp1" , 0x0 , BIT (15 ), 0 , 0x0 , BIT (23 ), BIT (14 ), 0x0 , BIT (11 ), BIT (11 ), false),
1206
- [RK3588_PD_RGA31 ] = DOMAIN_RK3588 ("rga31" , 0x4 , BIT (0 ), 0 , 0x0 , BIT (24 ), BIT (15 ), 0x0 , BIT (12 ), BIT (12 ), false),
1207
- [RK3588_PD_VOP ] = DOMAIN_RK3588 ("vop" , 0x4 , BIT (1 ), 0 , 0x0 , BIT (25 ), BIT (16 ), 0x0 , BIT (13 ) | BIT (14 ), BIT (13 ) | BIT (14 ), false),
1208
- [RK3588_PD_VO0 ] = DOMAIN_RK3588 ("vo0" , 0x4 , BIT (2 ), 0 , 0x0 , BIT (26 ), BIT (17 ), 0x0 , BIT (15 ), BIT (15 ), false),
1209
- [RK3588_PD_VO1 ] = DOMAIN_RK3588 ("vo1" , 0x4 , BIT (3 ), 0 , 0x0 , BIT (27 ), BIT (18 ), 0x4 , BIT (0 ), BIT (16 ), false),
1210
- [RK3588_PD_AUDIO ] = DOMAIN_RK3588 ("audio" , 0x4 , BIT (4 ), 0 , 0x0 , BIT (28 ), BIT (19 ), 0x4 , BIT (1 ), BIT (17 ), false),
1211
- [RK3588_PD_PHP ] = DOMAIN_RK3588 ("php" , 0x4 , BIT (5 ), 0 , 0x0 , BIT (29 ), BIT (20 ), 0x4 , BIT (5 ), BIT (21 ), false),
1212
- [RK3588_PD_GMAC ] = DOMAIN_RK3588 ("gmac" , 0x4 , BIT (6 ), 0 , 0x0 , BIT (30 ), BIT (21 ), 0x0 , 0 , 0 , false),
1213
- [RK3588_PD_PCIE ] = DOMAIN_RK3588 ("pcie" , 0x4 , BIT (7 ), 0 , 0x0 , BIT (31 ), BIT (22 ), 0x0 , 0 , 0 , true),
1214
- [RK3588_PD_NVM ] = DOMAIN_RK3588 ("nvm" , 0x4 , BIT (8 ), BIT (24 ), 0x4 , 0 , 0 , 0x4 , BIT (2 ), BIT (18 ), false),
1215
- [RK3588_PD_NVM0 ] = DOMAIN_RK3588 ("nvm0" , 0x4 , BIT (9 ), 0 , 0x4 , BIT (1 ), BIT (23 ), 0x0 , 0 , 0 , false),
1216
- [RK3588_PD_SDIO ] = DOMAIN_RK3588 ("sdio" , 0x4 , BIT (10 ), 0 , 0x4 , BIT (2 ), BIT (24 ), 0x4 , BIT (3 ), BIT (19 ), false),
1217
- [RK3588_PD_USB ] = DOMAIN_RK3588 ("usb" , 0x4 , BIT (11 ), 0 , 0x4 , BIT (3 ), BIT (25 ), 0x4 , BIT (4 ), BIT (20 ), true),
1218
- [RK3588_PD_SDMMC ] = DOMAIN_RK3588 ("sdmmc" , 0x4 , BIT (13 ), 0 , 0x4 , BIT (5 ), BIT (26 ), 0x0 , 0 , 0 , false),
1235
+ [RK3588_PD_GPU ] = DOMAIN_RK3588 ("gpu" , 0x0 , BIT (0 ), 0 , 0x0 , 0 , BIT (1 ), 0x0 , BIT (0 ), BIT (0 ), false, true ),
1236
+ [RK3588_PD_NPU ] = DOMAIN_RK3588 ("npu" , 0x0 , BIT (1 ), BIT (1 ), 0x0 , 0 , 0 , 0x0 , 0 , 0 , false, true ),
1237
+ [RK3588_PD_VCODEC ] = DOMAIN_RK3588 ("vcodec" , 0x0 , BIT (2 ), BIT (2 ), 0x0 , 0 , 0 , 0x0 , 0 , 0 , false, false ),
1238
+ [RK3588_PD_NPUTOP ] = DOMAIN_RK3588 ("nputop" , 0x0 , BIT (3 ), 0 , 0x0 , BIT (11 ), BIT (2 ), 0x0 , BIT (1 ), BIT (1 ), false, false ),
1239
+ [RK3588_PD_NPU1 ] = DOMAIN_RK3588 ("npu1" , 0x0 , BIT (4 ), 0 , 0x0 , BIT (12 ), BIT (3 ), 0x0 , BIT (2 ), BIT (2 ), false, false ),
1240
+ [RK3588_PD_NPU2 ] = DOMAIN_RK3588 ("npu2" , 0x0 , BIT (5 ), 0 , 0x0 , BIT (13 ), BIT (4 ), 0x0 , BIT (3 ), BIT (3 ), false, false ),
1241
+ [RK3588_PD_VENC0 ] = DOMAIN_RK3588 ("venc0" , 0x0 , BIT (6 ), 0 , 0x0 , BIT (14 ), BIT (5 ), 0x0 , BIT (4 ), BIT (4 ), false, false ),
1242
+ [RK3588_PD_VENC1 ] = DOMAIN_RK3588 ("venc1" , 0x0 , BIT (7 ), 0 , 0x0 , BIT (15 ), BIT (6 ), 0x0 , BIT (5 ), BIT (5 ), false, false ),
1243
+ [RK3588_PD_RKVDEC0 ] = DOMAIN_RK3588 ("rkvdec0" , 0x0 , BIT (8 ), 0 , 0x0 , BIT (16 ), BIT (7 ), 0x0 , BIT (6 ), BIT (6 ), false, false ),
1244
+ [RK3588_PD_RKVDEC1 ] = DOMAIN_RK3588 ("rkvdec1" , 0x0 , BIT (9 ), 0 , 0x0 , BIT (17 ), BIT (8 ), 0x0 , BIT (7 ), BIT (7 ), false, false ),
1245
+ [RK3588_PD_VDPU ] = DOMAIN_RK3588 ("vdpu" , 0x0 , BIT (10 ), 0 , 0x0 , BIT (18 ), BIT (9 ), 0x0 , BIT (8 ), BIT (8 ), false, false ),
1246
+ [RK3588_PD_RGA30 ] = DOMAIN_RK3588 ("rga30" , 0x0 , BIT (11 ), 0 , 0x0 , BIT (19 ), BIT (10 ), 0x0 , 0 , 0 , false, false ),
1247
+ [RK3588_PD_AV1 ] = DOMAIN_RK3588 ("av1" , 0x0 , BIT (12 ), 0 , 0x0 , BIT (20 ), BIT (11 ), 0x0 , BIT (9 ), BIT (9 ), false, false ),
1248
+ [RK3588_PD_VI ] = DOMAIN_RK3588 ("vi" , 0x0 , BIT (13 ), 0 , 0x0 , BIT (21 ), BIT (12 ), 0x0 , BIT (10 ), BIT (10 ), false, false ),
1249
+ [RK3588_PD_FEC ] = DOMAIN_RK3588 ("fec" , 0x0 , BIT (14 ), 0 , 0x0 , BIT (22 ), BIT (13 ), 0x0 , 0 , 0 , false, false ),
1250
+ [RK3588_PD_ISP1 ] = DOMAIN_RK3588 ("isp1" , 0x0 , BIT (15 ), 0 , 0x0 , BIT (23 ), BIT (14 ), 0x0 , BIT (11 ), BIT (11 ), false, false ),
1251
+ [RK3588_PD_RGA31 ] = DOMAIN_RK3588 ("rga31" , 0x4 , BIT (0 ), 0 , 0x0 , BIT (24 ), BIT (15 ), 0x0 , BIT (12 ), BIT (12 ), false, false ),
1252
+ [RK3588_PD_VOP ] = DOMAIN_RK3588 ("vop" , 0x4 , BIT (1 ), 0 , 0x0 , BIT (25 ), BIT (16 ), 0x0 , BIT (13 ) | BIT (14 ), BIT (13 ) | BIT (14 ), false, false ),
1253
+ [RK3588_PD_VO0 ] = DOMAIN_RK3588 ("vo0" , 0x4 , BIT (2 ), 0 , 0x0 , BIT (26 ), BIT (17 ), 0x0 , BIT (15 ), BIT (15 ), false, false ),
1254
+ [RK3588_PD_VO1 ] = DOMAIN_RK3588 ("vo1" , 0x4 , BIT (3 ), 0 , 0x0 , BIT (27 ), BIT (18 ), 0x4 , BIT (0 ), BIT (16 ), false, false ),
1255
+ [RK3588_PD_AUDIO ] = DOMAIN_RK3588 ("audio" , 0x4 , BIT (4 ), 0 , 0x0 , BIT (28 ), BIT (19 ), 0x4 , BIT (1 ), BIT (17 ), false, false ),
1256
+ [RK3588_PD_PHP ] = DOMAIN_RK3588 ("php" , 0x4 , BIT (5 ), 0 , 0x0 , BIT (29 ), BIT (20 ), 0x4 , BIT (5 ), BIT (21 ), false, false ),
1257
+ [RK3588_PD_GMAC ] = DOMAIN_RK3588 ("gmac" , 0x4 , BIT (6 ), 0 , 0x0 , BIT (30 ), BIT (21 ), 0x0 , 0 , 0 , false, false ),
1258
+ [RK3588_PD_PCIE ] = DOMAIN_RK3588 ("pcie" , 0x4 , BIT (7 ), 0 , 0x0 , BIT (31 ), BIT (22 ), 0x0 , 0 , 0 , true, false ),
1259
+ [RK3588_PD_NVM ] = DOMAIN_RK3588 ("nvm" , 0x4 , BIT (8 ), BIT (24 ), 0x4 , 0 , 0 , 0x4 , BIT (2 ), BIT (18 ), false, false ),
1260
+ [RK3588_PD_NVM0 ] = DOMAIN_RK3588 ("nvm0" , 0x4 , BIT (9 ), 0 , 0x4 , BIT (1 ), BIT (23 ), 0x0 , 0 , 0 , false, false ),
1261
+ [RK3588_PD_SDIO ] = DOMAIN_RK3588 ("sdio" , 0x4 , BIT (10 ), 0 , 0x4 , BIT (2 ), BIT (24 ), 0x4 , BIT (3 ), BIT (19 ), false, false ),
1262
+ [RK3588_PD_USB ] = DOMAIN_RK3588 ("usb" , 0x4 , BIT (11 ), 0 , 0x4 , BIT (3 ), BIT (25 ), 0x4 , BIT (4 ), BIT (20 ), true, false ),
1263
+ [RK3588_PD_SDMMC ] = DOMAIN_RK3588 ("sdmmc" , 0x4 , BIT (13 ), 0 , 0x4 , BIT (5 ), BIT (26 ), 0x0 , 0 , 0 , false, false ),
1219
1264
};
1220
1265
1221
1266
static const struct rockchip_pmu_info px30_pmu = {
0 commit comments