Message ID | 20240105160103.183092-3-ulf.hansson@linaro.org |
---|---|
State | Superseded |
Headers | show |
Series | PM: domains: Add helpers for multi PM domains to avoid open-coding | expand |
On 1/5/2024 6:01 PM, Ulf Hansson wrote: > Let's avoid the boilerplate code to manage the multiple PM domain case, by > converting into using dev_pm_domain_attach|detach_list(). > > Cc: Mathieu Poirier <mathieu.poirier@linaro.org> > Cc: Bjorn Andersson <andersson@kernel.org> > Cc: Shawn Guo <shawnguo@kernel.org> > Cc: Sascha Hauer <s.hauer@pengutronix.de> > Cc: Iuliana Prodan <iuliana.prodan@nxp.com> > Cc: Daniel Baluta <daniel.baluta@nxp.com> > Cc: <linux-remoteproc@vger.kernel.org> > Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org> > --- > > Changes in v2: > - None. > > Iuliana/Daniel I am ccing you to request help with test/review of this change. > Note that, you will need patch 1/5 in the series too, to be able to test this. > > Kind regards > Ulf Hansson Sorry for the delay in responding, your patchset was lost in the shuffle. Tested-by: Iuliana Prodan <iuliana.prodan@nxp.com> Reviewed-by: Iuliana Prodan <iuliana.prodan@nxp.com> Iulia > --- > drivers/remoteproc/imx_dsp_rproc.c | 82 ++++-------------------------- > 1 file changed, 9 insertions(+), 73 deletions(-) > > diff --git a/drivers/remoteproc/imx_dsp_rproc.c b/drivers/remoteproc/imx_dsp_rproc.c > index 8fcda9b74545..0409b7c47d5c 100644 > --- a/drivers/remoteproc/imx_dsp_rproc.c > +++ b/drivers/remoteproc/imx_dsp_rproc.c > @@ -103,12 +103,10 @@ enum imx_dsp_rp_mbox_messages { > * @tx_ch: mailbox tx channel handle > * @rx_ch: mailbox rx channel handle > * @rxdb_ch: mailbox rx doorbell channel handle > - * @pd_dev: power domain device > - * @pd_dev_link: power domain device link > + * @pd_list: power domain list > * @ipc_handle: System Control Unit ipc handle > * @rproc_work: work for processing virtio interrupts > * @pm_comp: completion primitive to sync for suspend response > - * @num_domains: power domain number > * @flags: control flags > */ > struct imx_dsp_rproc { > @@ -121,12 +119,10 @@ struct imx_dsp_rproc { > struct mbox_chan *tx_ch; > struct mbox_chan *rx_ch; > struct mbox_chan *rxdb_ch; > - struct device **pd_dev; > - struct device_link **pd_dev_link; > + struct dev_pm_domain_list *pd_list; > struct imx_sc_ipc *ipc_handle; > struct work_struct rproc_work; > struct completion pm_comp; > - int num_domains; > u32 flags; > }; > > @@ -954,74 +950,14 @@ static const struct rproc_ops imx_dsp_rproc_ops = { > static int imx_dsp_attach_pm_domains(struct imx_dsp_rproc *priv) > { > struct device *dev = priv->rproc->dev.parent; > - int ret, i; > - > - priv->num_domains = of_count_phandle_with_args(dev->of_node, > - "power-domains", > - "#power-domain-cells"); > - > - /* If only one domain, then no need to link the device */ > - if (priv->num_domains <= 1) > - return 0; > - > - priv->pd_dev = devm_kmalloc_array(dev, priv->num_domains, > - sizeof(*priv->pd_dev), > - GFP_KERNEL); > - if (!priv->pd_dev) > - return -ENOMEM; > - > - priv->pd_dev_link = devm_kmalloc_array(dev, priv->num_domains, > - sizeof(*priv->pd_dev_link), > - GFP_KERNEL); > - if (!priv->pd_dev_link) > - return -ENOMEM; > - > - for (i = 0; i < priv->num_domains; i++) { > - priv->pd_dev[i] = dev_pm_domain_attach_by_id(dev, i); > - if (IS_ERR(priv->pd_dev[i])) { > - ret = PTR_ERR(priv->pd_dev[i]); > - goto detach_pm; > - } > - > - /* > - * device_link_add will check priv->pd_dev[i], if it is > - * NULL, then will break. > - */ > - priv->pd_dev_link[i] = device_link_add(dev, > - priv->pd_dev[i], > - DL_FLAG_STATELESS | > - DL_FLAG_PM_RUNTIME); > - if (!priv->pd_dev_link[i]) { > - dev_pm_domain_detach(priv->pd_dev[i], false); > - ret = -EINVAL; > - goto detach_pm; > - } > - } > - > - return 0; > - > -detach_pm: > - while (--i >= 0) { > - device_link_del(priv->pd_dev_link[i]); > - dev_pm_domain_detach(priv->pd_dev[i], false); > - } > - > - return ret; > -} > - > -static int imx_dsp_detach_pm_domains(struct imx_dsp_rproc *priv) > -{ > - int i; > + int ret; > > - if (priv->num_domains <= 1) > + /* A single PM domain is already attached. */ > + if (dev->pm_domain) > return 0; > > - for (i = 0; i < priv->num_domains; i++) { > - device_link_del(priv->pd_dev_link[i]); > - dev_pm_domain_detach(priv->pd_dev[i], false); > - } > - > - return 0; > + ret = dev_pm_domain_attach_list(dev, NULL, &priv->pd_list); > + return ret < 0 ? ret : 0; > } > > /** > @@ -1153,7 +1089,7 @@ static int imx_dsp_rproc_probe(struct platform_device *pdev) > return 0; > > err_detach_domains: > - imx_dsp_detach_pm_domains(priv); > + dev_pm_domain_detach_list(priv->pd_list); > err_put_rproc: > rproc_free(rproc); > > @@ -1167,7 +1103,7 @@ static void imx_dsp_rproc_remove(struct platform_device *pdev) > > pm_runtime_disable(&pdev->dev); > rproc_del(rproc); > - imx_dsp_detach_pm_domains(priv); > + dev_pm_domain_detach_list(priv->pd_list); > rproc_free(rproc); > } >
diff --git a/drivers/remoteproc/imx_dsp_rproc.c b/drivers/remoteproc/imx_dsp_rproc.c index 8fcda9b74545..0409b7c47d5c 100644 --- a/drivers/remoteproc/imx_dsp_rproc.c +++ b/drivers/remoteproc/imx_dsp_rproc.c @@ -103,12 +103,10 @@ enum imx_dsp_rp_mbox_messages { * @tx_ch: mailbox tx channel handle * @rx_ch: mailbox rx channel handle * @rxdb_ch: mailbox rx doorbell channel handle - * @pd_dev: power domain device - * @pd_dev_link: power domain device link + * @pd_list: power domain list * @ipc_handle: System Control Unit ipc handle * @rproc_work: work for processing virtio interrupts * @pm_comp: completion primitive to sync for suspend response - * @num_domains: power domain number * @flags: control flags */ struct imx_dsp_rproc { @@ -121,12 +119,10 @@ struct imx_dsp_rproc { struct mbox_chan *tx_ch; struct mbox_chan *rx_ch; struct mbox_chan *rxdb_ch; - struct device **pd_dev; - struct device_link **pd_dev_link; + struct dev_pm_domain_list *pd_list; struct imx_sc_ipc *ipc_handle; struct work_struct rproc_work; struct completion pm_comp; - int num_domains; u32 flags; }; @@ -954,74 +950,14 @@ static const struct rproc_ops imx_dsp_rproc_ops = { static int imx_dsp_attach_pm_domains(struct imx_dsp_rproc *priv) { struct device *dev = priv->rproc->dev.parent; - int ret, i; - - priv->num_domains = of_count_phandle_with_args(dev->of_node, - "power-domains", - "#power-domain-cells"); - - /* If only one domain, then no need to link the device */ - if (priv->num_domains <= 1) - return 0; - - priv->pd_dev = devm_kmalloc_array(dev, priv->num_domains, - sizeof(*priv->pd_dev), - GFP_KERNEL); - if (!priv->pd_dev) - return -ENOMEM; - - priv->pd_dev_link = devm_kmalloc_array(dev, priv->num_domains, - sizeof(*priv->pd_dev_link), - GFP_KERNEL); - if (!priv->pd_dev_link) - return -ENOMEM; - - for (i = 0; i < priv->num_domains; i++) { - priv->pd_dev[i] = dev_pm_domain_attach_by_id(dev, i); - if (IS_ERR(priv->pd_dev[i])) { - ret = PTR_ERR(priv->pd_dev[i]); - goto detach_pm; - } - - /* - * device_link_add will check priv->pd_dev[i], if it is - * NULL, then will break. - */ - priv->pd_dev_link[i] = device_link_add(dev, - priv->pd_dev[i], - DL_FLAG_STATELESS | - DL_FLAG_PM_RUNTIME); - if (!priv->pd_dev_link[i]) { - dev_pm_domain_detach(priv->pd_dev[i], false); - ret = -EINVAL; - goto detach_pm; - } - } - - return 0; - -detach_pm: - while (--i >= 0) { - device_link_del(priv->pd_dev_link[i]); - dev_pm_domain_detach(priv->pd_dev[i], false); - } - - return ret; -} - -static int imx_dsp_detach_pm_domains(struct imx_dsp_rproc *priv) -{ - int i; + int ret; - if (priv->num_domains <= 1) + /* A single PM domain is already attached. */ + if (dev->pm_domain) return 0; - for (i = 0; i < priv->num_domains; i++) { - device_link_del(priv->pd_dev_link[i]); - dev_pm_domain_detach(priv->pd_dev[i], false); - } - - return 0; + ret = dev_pm_domain_attach_list(dev, NULL, &priv->pd_list); + return ret < 0 ? ret : 0; } /** @@ -1153,7 +1089,7 @@ static int imx_dsp_rproc_probe(struct platform_device *pdev) return 0; err_detach_domains: - imx_dsp_detach_pm_domains(priv); + dev_pm_domain_detach_list(priv->pd_list); err_put_rproc: rproc_free(rproc); @@ -1167,7 +1103,7 @@ static void imx_dsp_rproc_remove(struct platform_device *pdev) pm_runtime_disable(&pdev->dev); rproc_del(rproc); - imx_dsp_detach_pm_domains(priv); + dev_pm_domain_detach_list(priv->pd_list); rproc_free(rproc); }
Let's avoid the boilerplate code to manage the multiple PM domain case, by converting into using dev_pm_domain_attach|detach_list(). Cc: Mathieu Poirier <mathieu.poirier@linaro.org> Cc: Bjorn Andersson <andersson@kernel.org> Cc: Shawn Guo <shawnguo@kernel.org> Cc: Sascha Hauer <s.hauer@pengutronix.de> Cc: Iuliana Prodan <iuliana.prodan@nxp.com> Cc: Daniel Baluta <daniel.baluta@nxp.com> Cc: <linux-remoteproc@vger.kernel.org> Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org> --- Changes in v2: - None. Iuliana/Daniel I am ccing you to request help with test/review of this change. Note that, you will need patch 1/5 in the series too, to be able to test this. Kind regards Ulf Hansson --- drivers/remoteproc/imx_dsp_rproc.c | 82 ++++-------------------------- 1 file changed, 9 insertions(+), 73 deletions(-)