@@ -103,12 +103,10 @@ enum imx_dsp_rp_mbox_messages {
103
103
* @tx_ch: mailbox tx channel handle
104
104
* @rx_ch: mailbox rx channel handle
105
105
* @rxdb_ch: mailbox rx doorbell channel handle
106
- * @pd_dev: power domain device
107
- * @pd_dev_link: power domain device link
106
+ * @pd_list: power domain list
108
107
* @ipc_handle: System Control Unit ipc handle
109
108
* @rproc_work: work for processing virtio interrupts
110
109
* @pm_comp: completion primitive to sync for suspend response
111
- * @num_domains: power domain number
112
110
* @flags: control flags
113
111
*/
114
112
struct imx_dsp_rproc {
@@ -121,12 +119,10 @@ struct imx_dsp_rproc {
121
119
struct mbox_chan * tx_ch ;
122
120
struct mbox_chan * rx_ch ;
123
121
struct mbox_chan * rxdb_ch ;
124
- struct device * * pd_dev ;
125
- struct device_link * * pd_dev_link ;
122
+ struct dev_pm_domain_list * pd_list ;
126
123
struct imx_sc_ipc * ipc_handle ;
127
124
struct work_struct rproc_work ;
128
125
struct completion pm_comp ;
129
- int num_domains ;
130
126
u32 flags ;
131
127
};
132
128
@@ -955,74 +951,14 @@ static const struct rproc_ops imx_dsp_rproc_ops = {
955
951
static int imx_dsp_attach_pm_domains (struct imx_dsp_rproc * priv )
956
952
{
957
953
struct device * dev = priv -> rproc -> dev .parent ;
958
- int ret , i ;
959
-
960
- priv -> num_domains = of_count_phandle_with_args (dev -> of_node ,
961
- "power-domains" ,
962
- "#power-domain-cells" );
963
-
964
- /* If only one domain, then no need to link the device */
965
- if (priv -> num_domains <= 1 )
966
- return 0 ;
967
-
968
- priv -> pd_dev = devm_kmalloc_array (dev , priv -> num_domains ,
969
- sizeof (* priv -> pd_dev ),
970
- GFP_KERNEL );
971
- if (!priv -> pd_dev )
972
- return - ENOMEM ;
973
-
974
- priv -> pd_dev_link = devm_kmalloc_array (dev , priv -> num_domains ,
975
- sizeof (* priv -> pd_dev_link ),
976
- GFP_KERNEL );
977
- if (!priv -> pd_dev_link )
978
- return - ENOMEM ;
979
-
980
- for (i = 0 ; i < priv -> num_domains ; i ++ ) {
981
- priv -> pd_dev [i ] = dev_pm_domain_attach_by_id (dev , i );
982
- if (IS_ERR (priv -> pd_dev [i ])) {
983
- ret = PTR_ERR (priv -> pd_dev [i ]);
984
- goto detach_pm ;
985
- }
986
-
987
- /*
988
- * device_link_add will check priv->pd_dev[i], if it is
989
- * NULL, then will break.
990
- */
991
- priv -> pd_dev_link [i ] = device_link_add (dev ,
992
- priv -> pd_dev [i ],
993
- DL_FLAG_STATELESS |
994
- DL_FLAG_PM_RUNTIME );
995
- if (!priv -> pd_dev_link [i ]) {
996
- dev_pm_domain_detach (priv -> pd_dev [i ], false);
997
- ret = - EINVAL ;
998
- goto detach_pm ;
999
- }
1000
- }
1001
-
1002
- return 0 ;
1003
-
1004
- detach_pm :
1005
- while (-- i >= 0 ) {
1006
- device_link_del (priv -> pd_dev_link [i ]);
1007
- dev_pm_domain_detach (priv -> pd_dev [i ], false);
1008
- }
1009
-
1010
- return ret ;
1011
- }
1012
-
1013
- static int imx_dsp_detach_pm_domains (struct imx_dsp_rproc * priv )
1014
- {
1015
- int i ;
954
+ int ret ;
1016
955
1017
- if (priv -> num_domains <= 1 )
956
+ /* A single PM domain is already attached. */
957
+ if (dev -> pm_domain )
1018
958
return 0 ;
1019
959
1020
- for (i = 0 ; i < priv -> num_domains ; i ++ ) {
1021
- device_link_del (priv -> pd_dev_link [i ]);
1022
- dev_pm_domain_detach (priv -> pd_dev [i ], false);
1023
- }
1024
-
1025
- return 0 ;
960
+ ret = dev_pm_domain_attach_list (dev , NULL , & priv -> pd_list );
961
+ return ret < 0 ? ret : 0 ;
1026
962
}
1027
963
1028
964
/**
@@ -1154,7 +1090,7 @@ static int imx_dsp_rproc_probe(struct platform_device *pdev)
1154
1090
return 0 ;
1155
1091
1156
1092
err_detach_domains :
1157
- imx_dsp_detach_pm_domains (priv );
1093
+ dev_pm_domain_detach_list (priv -> pd_list );
1158
1094
err_put_rproc :
1159
1095
rproc_free (rproc );
1160
1096
@@ -1168,7 +1104,7 @@ static void imx_dsp_rproc_remove(struct platform_device *pdev)
1168
1104
1169
1105
pm_runtime_disable (& pdev -> dev );
1170
1106
rproc_del (rproc );
1171
- imx_dsp_detach_pm_domains (priv );
1107
+ dev_pm_domain_detach_list (priv -> pd_list );
1172
1108
rproc_free (rproc );
1173
1109
}
1174
1110
0 commit comments