@@ -103,12 +103,10 @@ enum imx_dsp_rp_mbox_messages {
103103 * @tx_ch: mailbox tx channel handle
104104 * @rx_ch: mailbox rx channel handle
105105 * @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
108107 * @ipc_handle: System Control Unit ipc handle
109108 * @rproc_work: work for processing virtio interrupts
110109 * @pm_comp: completion primitive to sync for suspend response
111- * @num_domains: power domain number
112110 * @flags: control flags
113111 */
114112struct imx_dsp_rproc {
@@ -121,12 +119,10 @@ struct imx_dsp_rproc {
121119 struct mbox_chan * tx_ch ;
122120 struct mbox_chan * rx_ch ;
123121 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 ;
126123 struct imx_sc_ipc * ipc_handle ;
127124 struct work_struct rproc_work ;
128125 struct completion pm_comp ;
129- int num_domains ;
130126 u32 flags ;
131127};
132128
@@ -955,74 +951,14 @@ static const struct rproc_ops imx_dsp_rproc_ops = {
955951static int imx_dsp_attach_pm_domains (struct imx_dsp_rproc * priv )
956952{
957953 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 ;
1016955
1017- if (priv -> num_domains <= 1 )
956+ /* A single PM domain is already attached. */
957+ if (dev -> pm_domain )
1018958 return 0 ;
1019959
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 ;
1026962}
1027963
1028964/**
@@ -1154,7 +1090,7 @@ static int imx_dsp_rproc_probe(struct platform_device *pdev)
11541090 return 0 ;
11551091
11561092err_detach_domains :
1157- imx_dsp_detach_pm_domains (priv );
1093+ dev_pm_domain_detach_list (priv -> pd_list );
11581094err_put_rproc :
11591095 rproc_free (rproc );
11601096
@@ -1168,7 +1104,7 @@ static void imx_dsp_rproc_remove(struct platform_device *pdev)
11681104
11691105 pm_runtime_disable (& pdev -> dev );
11701106 rproc_del (rproc );
1171- imx_dsp_detach_pm_domains (priv );
1107+ dev_pm_domain_detach_list (priv -> pd_list );
11721108 rproc_free (rproc );
11731109}
11741110
0 commit comments