Skip to content

Commit ccd9468

Browse files
committed
remoteproc: imx_dsp_rproc: Convert to dev_pm_domain_attach|detach_list()
Let's avoid the boilerplate code to manage the multiple PM domain case, by converting into using dev_pm_domain_attach|detach_list(). Cc: Bjorn Andersson <andersson@kernel.org> Cc: Shawn Guo <shawnguo@kernel.org> Cc: Sascha Hauer <s.hauer@pengutronix.de> Cc: Daniel Baluta <daniel.baluta@nxp.com> Cc: <linux-remoteproc@vger.kernel.org> Tested-by: Iuliana Prodan <iuliana.prodan@nxp.com> Reviewed-by: Iuliana Prodan <iuliana.prodan@nxp.com> Reviewed-by: Mathieu Poirier <mathieu.poirier@linaro.org> Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org> Link: https://lore.kernel.org/r/20240130123951.236243-3-ulf.hansson@linaro.org
1 parent 161e16a commit ccd9468

File tree

1 file changed

+9
-73
lines changed

1 file changed

+9
-73
lines changed

drivers/remoteproc/imx_dsp_rproc.c

Lines changed: 9 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -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
*/
114112
struct 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 = {
955951
static 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

11561092
err_detach_domains:
1157-
imx_dsp_detach_pm_domains(priv);
1093+
dev_pm_domain_detach_list(priv->pd_list);
11581094
err_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

Comments
 (0)