Message ID | 20240829090916.1288854-1-thierry.reding@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Revert "drm/tegra: gr3d: Convert into dev_pm_domain_attach|detach_list()" | expand |
On Thu, 29 Aug 2024 at 11:09, Thierry Reding <thierry.reding@gmail.com> wrote: > > From: Thierry Reding <treding@nvidia.com> > > This reverts commit f790b5c09665cab0d51dfcc84832d79d2b1e6c0e. An updated > version of patch was applied to the PM tree. Sorry for the mixup. > > Signed-off-by: Thierry Reding <treding@nvidia.com> If not too late, feel free to add: Acked-by: Ulf Hansson <ulf.hansson@linaro.org> Kind regards Uffe > --- > drivers/gpu/drm/tegra/gr3d.c | 46 ++++++++++++++++++++++++++---------- > 1 file changed, 33 insertions(+), 13 deletions(-) > > diff --git a/drivers/gpu/drm/tegra/gr3d.c b/drivers/gpu/drm/tegra/gr3d.c > index 4de1ea0fc7c0..00c8564520e7 100644 > --- a/drivers/gpu/drm/tegra/gr3d.c > +++ b/drivers/gpu/drm/tegra/gr3d.c > @@ -46,7 +46,6 @@ struct gr3d { > unsigned int nclocks; > struct reset_control_bulk_data resets[RST_GR3D_MAX]; > unsigned int nresets; > - struct dev_pm_domain_list *pd_list; > > DECLARE_BITMAP(addr_regs, GR3D_NUM_REGS); > }; > @@ -370,12 +369,18 @@ static int gr3d_power_up_legacy_domain(struct device *dev, const char *name, > return 0; > } > > +static void gr3d_del_link(void *link) > +{ > + device_link_del(link); > +} > + > static int gr3d_init_power(struct device *dev, struct gr3d *gr3d) > { > - struct dev_pm_domain_attach_data pd_data = { > - .pd_names = (const char *[]) { "3d0", "3d1" }, > - .num_pd_names = 2, > - }; > + static const char * const opp_genpd_names[] = { "3d0", "3d1", NULL }; > + const u32 link_flags = DL_FLAG_STATELESS | DL_FLAG_PM_RUNTIME; > + struct device **opp_virt_devs, *pd_dev; > + struct device_link *link; > + unsigned int i; > int err; > > err = of_count_phandle_with_args(dev->of_node, "power-domains", > @@ -409,10 +414,29 @@ static int gr3d_init_power(struct device *dev, struct gr3d *gr3d) > if (dev->pm_domain) > return 0; > > - err = dev_pm_domain_attach_list(dev, &pd_data, &gr3d->pd_list); > - if (err < 0) > + err = devm_pm_opp_attach_genpd(dev, opp_genpd_names, &opp_virt_devs); > + if (err) > return err; > > + for (i = 0; opp_genpd_names[i]; i++) { > + pd_dev = opp_virt_devs[i]; > + if (!pd_dev) { > + dev_err(dev, "failed to get %s power domain\n", > + opp_genpd_names[i]); > + return -EINVAL; > + } > + > + link = device_link_add(dev, pd_dev, link_flags); > + if (!link) { > + dev_err(dev, "failed to link to %s\n", dev_name(pd_dev)); > + return -EINVAL; > + } > + > + err = devm_add_action_or_reset(dev, gr3d_del_link, link); > + if (err) > + return err; > + } > + > return 0; > } > > @@ -503,13 +527,13 @@ static int gr3d_probe(struct platform_device *pdev) > > err = devm_tegra_core_dev_init_opp_table_common(&pdev->dev); > if (err) > - goto err; > + return err; > > err = host1x_client_register(&gr3d->client.base); > if (err < 0) { > dev_err(&pdev->dev, "failed to register host1x client: %d\n", > err); > - goto err; > + return err; > } > > /* initialize address register map */ > @@ -517,9 +541,6 @@ static int gr3d_probe(struct platform_device *pdev) > set_bit(gr3d_addr_regs[i], gr3d->addr_regs); > > return 0; > -err: > - dev_pm_domain_detach_list(gr3d->pd_list); > - return err; > } > > static void gr3d_remove(struct platform_device *pdev) > @@ -528,7 +549,6 @@ static void gr3d_remove(struct platform_device *pdev) > > pm_runtime_disable(&pdev->dev); > host1x_client_unregister(&gr3d->client.base); > - dev_pm_domain_detach_list(gr3d->pd_list); > } > > static int __maybe_unused gr3d_runtime_suspend(struct device *dev) > -- > 2.45.2 >
diff --git a/drivers/gpu/drm/tegra/gr3d.c b/drivers/gpu/drm/tegra/gr3d.c index 4de1ea0fc7c0..00c8564520e7 100644 --- a/drivers/gpu/drm/tegra/gr3d.c +++ b/drivers/gpu/drm/tegra/gr3d.c @@ -46,7 +46,6 @@ struct gr3d { unsigned int nclocks; struct reset_control_bulk_data resets[RST_GR3D_MAX]; unsigned int nresets; - struct dev_pm_domain_list *pd_list; DECLARE_BITMAP(addr_regs, GR3D_NUM_REGS); }; @@ -370,12 +369,18 @@ static int gr3d_power_up_legacy_domain(struct device *dev, const char *name, return 0; } +static void gr3d_del_link(void *link) +{ + device_link_del(link); +} + static int gr3d_init_power(struct device *dev, struct gr3d *gr3d) { - struct dev_pm_domain_attach_data pd_data = { - .pd_names = (const char *[]) { "3d0", "3d1" }, - .num_pd_names = 2, - }; + static const char * const opp_genpd_names[] = { "3d0", "3d1", NULL }; + const u32 link_flags = DL_FLAG_STATELESS | DL_FLAG_PM_RUNTIME; + struct device **opp_virt_devs, *pd_dev; + struct device_link *link; + unsigned int i; int err; err = of_count_phandle_with_args(dev->of_node, "power-domains", @@ -409,10 +414,29 @@ static int gr3d_init_power(struct device *dev, struct gr3d *gr3d) if (dev->pm_domain) return 0; - err = dev_pm_domain_attach_list(dev, &pd_data, &gr3d->pd_list); - if (err < 0) + err = devm_pm_opp_attach_genpd(dev, opp_genpd_names, &opp_virt_devs); + if (err) return err; + for (i = 0; opp_genpd_names[i]; i++) { + pd_dev = opp_virt_devs[i]; + if (!pd_dev) { + dev_err(dev, "failed to get %s power domain\n", + opp_genpd_names[i]); + return -EINVAL; + } + + link = device_link_add(dev, pd_dev, link_flags); + if (!link) { + dev_err(dev, "failed to link to %s\n", dev_name(pd_dev)); + return -EINVAL; + } + + err = devm_add_action_or_reset(dev, gr3d_del_link, link); + if (err) + return err; + } + return 0; } @@ -503,13 +527,13 @@ static int gr3d_probe(struct platform_device *pdev) err = devm_tegra_core_dev_init_opp_table_common(&pdev->dev); if (err) - goto err; + return err; err = host1x_client_register(&gr3d->client.base); if (err < 0) { dev_err(&pdev->dev, "failed to register host1x client: %d\n", err); - goto err; + return err; } /* initialize address register map */ @@ -517,9 +541,6 @@ static int gr3d_probe(struct platform_device *pdev) set_bit(gr3d_addr_regs[i], gr3d->addr_regs); return 0; -err: - dev_pm_domain_detach_list(gr3d->pd_list); - return err; } static void gr3d_remove(struct platform_device *pdev) @@ -528,7 +549,6 @@ static void gr3d_remove(struct platform_device *pdev) pm_runtime_disable(&pdev->dev); host1x_client_unregister(&gr3d->client.base); - dev_pm_domain_detach_list(gr3d->pd_list); } static int __maybe_unused gr3d_runtime_suspend(struct device *dev)