@@ -72,6 +72,22 @@ struct imx_sc_msg_req_set_resource_power_mode {
72
72
u8 mode ;
73
73
} __packed __aligned (4 );
74
74
75
+ struct req_get_resource_mode {
76
+ u16 resource ;
77
+ };
78
+
79
+ struct resp_get_resource_mode {
80
+ u8 mode ;
81
+ };
82
+
83
+ struct imx_sc_msg_req_get_resource_power_mode {
84
+ struct imx_sc_rpc_msg hdr ;
85
+ union {
86
+ struct req_get_resource_mode req ;
87
+ struct resp_get_resource_mode resp ;
88
+ } data ;
89
+ } __packed __aligned (4 );
90
+
75
91
#define IMX_SCU_PD_NAME_SIZE 20
76
92
struct imx_sc_pm_domain {
77
93
struct generic_pm_domain pd ;
@@ -96,6 +112,14 @@ struct imx_sc_pd_soc {
96
112
97
113
static int imx_con_rsrc ;
98
114
115
+ /* Align with the IMX_SC_PM_PW_MODE_[OFF,STBY,LP,ON] macros */
116
+ static const char * const imx_sc_pm_mode [] = {
117
+ "IMX_SC_PM_PW_MODE_OFF" ,
118
+ "IMX_SC_PM_PW_MODE_STBY" ,
119
+ "IMX_SC_PM_PW_MODE_LP" ,
120
+ "IMX_SC_PM_PW_MODE_ON"
121
+ };
122
+
99
123
static const struct imx_sc_pd_range imx8qxp_scu_pd_ranges [] = {
100
124
/* LSIO SS */
101
125
{ "pwm" , IMX_SC_R_PWM_0 , 8 , true, 0 },
@@ -308,6 +332,27 @@ static void imx_sc_pd_get_console_rsrc(void)
308
332
imx_con_rsrc = specs .args [0 ];
309
333
}
310
334
335
+ static int imx_sc_get_pd_power (struct device * dev , u32 rsrc )
336
+ {
337
+ struct imx_sc_msg_req_get_resource_power_mode msg ;
338
+ struct imx_sc_rpc_msg * hdr = & msg .hdr ;
339
+ int ret ;
340
+
341
+ hdr -> ver = IMX_SC_RPC_VERSION ;
342
+ hdr -> svc = IMX_SC_RPC_SVC_PM ;
343
+ hdr -> func = IMX_SC_PM_FUNC_GET_RESOURCE_POWER_MODE ;
344
+ hdr -> size = 2 ;
345
+
346
+ msg .data .req .resource = rsrc ;
347
+
348
+ ret = imx_scu_call_rpc (pm_ipc_handle , & msg , true);
349
+ if (ret )
350
+ dev_err (dev , "failed to get power resource %d mode, ret %d\n" ,
351
+ rsrc , ret );
352
+
353
+ return msg .data .resp .mode ;
354
+ }
355
+
311
356
static int imx_sc_pd_power (struct generic_pm_domain * domain , bool power_on )
312
357
{
313
358
struct imx_sc_msg_req_set_resource_power_mode msg ;
@@ -372,8 +417,8 @@ imx_scu_add_pm_domain(struct device *dev, int idx,
372
417
const struct imx_sc_pd_range * pd_ranges )
373
418
{
374
419
struct imx_sc_pm_domain * sc_pd ;
375
- bool is_off = true ;
376
- int ret ;
420
+ bool is_off ;
421
+ int mode , ret ;
377
422
378
423
if (!imx_sc_rm_is_resource_owned (pm_ipc_handle , pd_ranges -> rsrc + idx ))
379
424
return NULL ;
@@ -394,10 +439,16 @@ imx_scu_add_pm_domain(struct device *dev, int idx,
394
439
"%s" , pd_ranges -> name );
395
440
396
441
sc_pd -> pd .name = sc_pd -> name ;
397
- if (imx_con_rsrc == sc_pd -> rsrc ) {
442
+ if (imx_con_rsrc == sc_pd -> rsrc )
398
443
sc_pd -> pd .flags = GENPD_FLAG_RPM_ALWAYS_ON ;
444
+
445
+ mode = imx_sc_get_pd_power (dev , pd_ranges -> rsrc + idx );
446
+ if (mode == IMX_SC_PM_PW_MODE_ON )
399
447
is_off = false;
400
- }
448
+ else
449
+ is_off = true;
450
+
451
+ dev_dbg (dev , "%s : %s\n" , sc_pd -> name , imx_sc_pm_mode [mode ]);
401
452
402
453
if (sc_pd -> rsrc >= IMX_SC_R_LAST ) {
403
454
dev_warn (dev , "invalid pd %s rsrc id %d found" ,
0 commit comments