55
55
#define QDSP6SS_CORE_CBCR 0x20
56
56
#define QDSP6SS_SLEEP_CBCR 0x3c
57
57
58
- #define QCOM_Q6V5_RPROC_PROXY_PD_MAX 3
59
-
60
58
#define LPASS_BOOT_CORE_START BIT(0)
61
59
#define LPASS_BOOT_CMD_START BIT(0)
62
60
#define LPASS_EFUSE_Q6SS_EVB_SEL 0x0
@@ -74,7 +72,8 @@ struct adsp_pil_data {
74
72
75
73
const char * * clk_ids ;
76
74
int num_clks ;
77
- const char * * proxy_pd_names ;
75
+ const char * * pd_names ;
76
+ unsigned int num_pds ;
78
77
const char * load_state ;
79
78
};
80
79
@@ -110,8 +109,7 @@ struct qcom_adsp {
110
109
size_t mem_size ;
111
110
bool has_iommu ;
112
111
113
- struct device * proxy_pds [QCOM_Q6V5_RPROC_PROXY_PD_MAX ];
114
- size_t proxy_pd_count ;
112
+ struct dev_pm_domain_list * pd_list ;
115
113
116
114
struct qcom_rproc_glink glink_subdev ;
117
115
struct qcom_rproc_ssr ssr_subdev ;
@@ -120,98 +118,92 @@ struct qcom_adsp {
120
118
int (* shutdown )(struct qcom_adsp * adsp );
121
119
};
122
120
123
- static int qcom_rproc_pds_attach (struct device * dev , struct qcom_adsp * adsp ,
124
- const char * * pd_names )
121
+ static int qcom_rproc_pds_attach (struct qcom_adsp * adsp , const char * * pd_names ,
122
+ unsigned int num_pds )
125
123
{
126
- struct device * * devs = adsp -> proxy_pds ;
127
- size_t num_pds = 0 ;
124
+ struct device * dev = adsp -> dev ;
125
+ struct dev_pm_domain_attach_data pd_data = {
126
+ .pd_names = pd_names ,
127
+ .num_pd_names = num_pds ,
128
+ };
128
129
int ret ;
129
- int i ;
130
-
131
- if (!pd_names )
132
- return 0 ;
133
130
134
131
/* Handle single power domain */
135
- if (dev -> pm_domain ) {
136
- devs [0 ] = dev ;
137
- pm_runtime_enable (dev );
138
- return 1 ;
139
- }
132
+ if (dev -> pm_domain )
133
+ goto out ;
140
134
141
- while ( pd_names [ num_pds ] )
142
- num_pds ++ ;
135
+ if (! pd_names )
136
+ return 0 ;
143
137
144
- if (num_pds > ARRAY_SIZE (adsp -> proxy_pds ))
145
- return - E2BIG ;
138
+ ret = dev_pm_domain_attach_list (dev , & pd_data , & adsp -> pd_list );
139
+ if (ret < 0 )
140
+ return ret ;
146
141
147
- for (i = 0 ; i < num_pds ; i ++ ) {
148
- devs [i ] = dev_pm_domain_attach_by_name (dev , pd_names [i ]);
149
- if (IS_ERR_OR_NULL (devs [i ])) {
150
- ret = PTR_ERR (devs [i ]) ? : - ENODATA ;
151
- goto unroll_attach ;
152
- }
153
- }
142
+ out :
143
+ pm_runtime_enable (dev );
144
+ return 0 ;
145
+ }
154
146
155
- return num_pds ;
147
+ static void qcom_rproc_pds_detach (struct qcom_adsp * adsp )
148
+ {
149
+ struct device * dev = adsp -> dev ;
150
+ struct dev_pm_domain_list * pds = adsp -> pd_list ;
156
151
157
- unroll_attach :
158
- for (i -- ; i >= 0 ; i -- )
159
- dev_pm_domain_detach (devs [i ], false);
152
+ dev_pm_domain_detach_list (pds );
160
153
161
- return ret ;
154
+ if (dev -> pm_domain || pds )
155
+ pm_runtime_disable (adsp -> dev );
162
156
}
163
157
164
- static void qcom_rproc_pds_detach (struct qcom_adsp * adsp , struct device * * pds ,
165
- size_t pd_count )
158
+ static int qcom_rproc_pds_enable (struct qcom_adsp * adsp )
166
159
{
167
160
struct device * dev = adsp -> dev ;
168
- int i ;
161
+ struct dev_pm_domain_list * pds = adsp -> pd_list ;
162
+ int ret , i = 0 ;
169
163
170
- /* Handle single power domain */
171
- if (dev -> pm_domain && pd_count ) {
172
- pm_runtime_disable (dev );
173
- return ;
174
- }
164
+ if (!dev -> pm_domain && !pds )
165
+ return 0 ;
175
166
176
- for (i = 0 ; i < pd_count ; i ++ )
177
- dev_pm_domain_detach (pds [i ], false);
178
- }
167
+ if (dev -> pm_domain )
168
+ dev_pm_genpd_set_performance_state (dev , INT_MAX );
179
169
180
- static int qcom_rproc_pds_enable (struct qcom_adsp * adsp , struct device * * pds ,
181
- size_t pd_count )
182
- {
183
- int ret ;
184
- int i ;
185
-
186
- for (i = 0 ; i < pd_count ; i ++ ) {
187
- dev_pm_genpd_set_performance_state (pds [i ], INT_MAX );
188
- ret = pm_runtime_resume_and_get (pds [i ]);
189
- if (ret < 0 ) {
190
- dev_pm_genpd_set_performance_state (pds [i ], 0 );
191
- goto unroll_pd_votes ;
192
- }
170
+ while (pds && i < pds -> num_pds ) {
171
+ dev_pm_genpd_set_performance_state (pds -> pd_devs [i ], INT_MAX );
172
+ i ++ ;
193
173
}
194
174
195
- return 0 ;
175
+ ret = pm_runtime_resume_and_get (dev );
176
+ if (ret < 0 ) {
177
+ while (pds && i > 0 ) {
178
+ i -- ;
179
+ dev_pm_genpd_set_performance_state (pds -> pd_devs [i ], 0 );
180
+ }
196
181
197
- unroll_pd_votes :
198
- for (i -- ; i >= 0 ; i -- ) {
199
- dev_pm_genpd_set_performance_state (pds [i ], 0 );
200
- pm_runtime_put (pds [i ]);
182
+ if (dev -> pm_domain )
183
+ dev_pm_genpd_set_performance_state (dev , 0 );
201
184
}
202
185
203
186
return ret ;
204
187
}
205
188
206
- static void qcom_rproc_pds_disable (struct qcom_adsp * adsp , struct device * * pds ,
207
- size_t pd_count )
189
+ static void qcom_rproc_pds_disable (struct qcom_adsp * adsp )
208
190
{
209
- int i ;
191
+ struct device * dev = adsp -> dev ;
192
+ struct dev_pm_domain_list * pds = adsp -> pd_list ;
193
+ int i = 0 ;
194
+
195
+ if (!dev -> pm_domain && !pds )
196
+ return ;
197
+
198
+ if (dev -> pm_domain )
199
+ dev_pm_genpd_set_performance_state (dev , 0 );
210
200
211
- for ( i = 0 ; i < pd_count ; i ++ ) {
212
- dev_pm_genpd_set_performance_state (pds [i ], 0 );
213
- pm_runtime_put ( pds [ i ]) ;
201
+ while ( pds && i < pds -> num_pds ) {
202
+ dev_pm_genpd_set_performance_state (pds -> pd_devs [i ], 0 );
203
+ i ++ ;
214
204
}
205
+
206
+ pm_runtime_put (dev );
215
207
}
216
208
217
209
static int qcom_wpss_shutdown (struct qcom_adsp * adsp )
@@ -397,8 +389,7 @@ static int adsp_start(struct rproc *rproc)
397
389
if (ret )
398
390
goto adsp_smmu_unmap ;
399
391
400
- ret = qcom_rproc_pds_enable (adsp , adsp -> proxy_pds ,
401
- adsp -> proxy_pd_count );
392
+ ret = qcom_rproc_pds_enable (adsp );
402
393
if (ret < 0 )
403
394
goto disable_xo_clk ;
404
395
@@ -448,7 +439,7 @@ static int adsp_start(struct rproc *rproc)
448
439
disable_adsp_clks :
449
440
clk_bulk_disable_unprepare (adsp -> num_clks , adsp -> clks );
450
441
disable_power_domain :
451
- qcom_rproc_pds_disable (adsp , adsp -> proxy_pds , adsp -> proxy_pd_count );
442
+ qcom_rproc_pds_disable (adsp );
452
443
disable_xo_clk :
453
444
clk_disable_unprepare (adsp -> xo );
454
445
adsp_smmu_unmap :
@@ -464,7 +455,7 @@ static void qcom_adsp_pil_handover(struct qcom_q6v5 *q6v5)
464
455
struct qcom_adsp * adsp = container_of (q6v5 , struct qcom_adsp , q6v5 );
465
456
466
457
clk_disable_unprepare (adsp -> xo );
467
- qcom_rproc_pds_disable (adsp , adsp -> proxy_pds , adsp -> proxy_pd_count );
458
+ qcom_rproc_pds_disable (adsp );
468
459
}
469
460
470
461
static int adsp_stop (struct rproc * rproc )
@@ -715,13 +706,11 @@ static int adsp_probe(struct platform_device *pdev)
715
706
if (ret )
716
707
goto free_rproc ;
717
708
718
- ret = qcom_rproc_pds_attach (adsp -> dev , adsp ,
719
- desc -> proxy_pd_names );
709
+ ret = qcom_rproc_pds_attach (adsp , desc -> pd_names , desc -> num_pds );
720
710
if (ret < 0 ) {
721
711
dev_err (& pdev -> dev , "Failed to attach proxy power domains\n" );
722
712
goto free_rproc ;
723
713
}
724
- adsp -> proxy_pd_count = ret ;
725
714
726
715
ret = adsp_init_reset (adsp );
727
716
if (ret )
@@ -753,7 +742,7 @@ static int adsp_probe(struct platform_device *pdev)
753
742
return 0 ;
754
743
755
744
disable_pm :
756
- qcom_rproc_pds_detach (adsp , adsp -> proxy_pds , adsp -> proxy_pd_count );
745
+ qcom_rproc_pds_detach (adsp );
757
746
758
747
free_rproc :
759
748
rproc_free (rproc );
@@ -771,7 +760,7 @@ static void adsp_remove(struct platform_device *pdev)
771
760
qcom_remove_glink_subdev (adsp -> rproc , & adsp -> glink_subdev );
772
761
qcom_remove_sysmon_subdev (adsp -> sysmon );
773
762
qcom_remove_ssr_subdev (adsp -> rproc , & adsp -> ssr_subdev );
774
- qcom_rproc_pds_detach (adsp , adsp -> proxy_pds , adsp -> proxy_pd_count );
763
+ qcom_rproc_pds_detach (adsp );
775
764
rproc_free (adsp -> rproc );
776
765
}
777
766
@@ -788,9 +777,8 @@ static const struct adsp_pil_data adsp_resource_init = {
788
777
"qdsp6ss_xo" , "qdsp6ss_sleep" , "qdsp6ss_core" , NULL
789
778
},
790
779
.num_clks = 7 ,
791
- .proxy_pd_names = (const char * []) {
792
- "cx" , NULL
793
- },
780
+ .pd_names = (const char * []) { "cx" },
781
+ .num_pds = 1 ,
794
782
};
795
783
796
784
static const struct adsp_pil_data adsp_sc7280_resource_init = {
@@ -821,9 +809,8 @@ static const struct adsp_pil_data cdsp_resource_init = {
821
809
"q6_axim" , NULL
822
810
},
823
811
.num_clks = 7 ,
824
- .proxy_pd_names = (const char * []) {
825
- "cx" , NULL
826
- },
812
+ .pd_names = (const char * []) { "cx" },
813
+ .num_pds = 1 ,
827
814
};
828
815
829
816
static const struct adsp_pil_data wpss_resource_init = {
@@ -839,9 +826,8 @@ static const struct adsp_pil_data wpss_resource_init = {
839
826
"ahb_bdg" , "ahb" , "rscp" , NULL
840
827
},
841
828
.num_clks = 3 ,
842
- .proxy_pd_names = (const char * []) {
843
- "cx" , "mx" , NULL
844
- },
829
+ .pd_names = (const char * []) { "cx" , "mx" },
830
+ .num_pds = 2 ,
845
831
};
846
832
847
833
static const struct of_device_id adsp_of_match [] = {
0 commit comments