On Mon, 15 Apr 2024 at 18:00, Tomi Valkeinen <tomi.valkeinen@xxxxxxxxxxxxxxxx> wrote: > > When the dts file has multiple referrers to a single PD (e.g. > simple-framebuffer and dss nodes both point to the DSS power-domain) the > ti-sci driver will create two power domains, both with the same ID, and > that will cause problems as one of the power domains will hide the other > one. > > Fix this checking if a PD with the ID has already been created, and only > create a PD for new IDs. > > Fixes: efa5c01cd7ee ("soc: ti: ti_sci_pm_domains: switch to use multiple genpds instead of one") > Signed-off-by: Tomi Valkeinen <tomi.valkeinen@xxxxxxxxxxxxxxxx> Applied for fixes and by adding a stable tag, thanks! Kind regards Uffe > --- > drivers/pmdomain/ti/ti_sci_pm_domains.c | 20 +++++++++++++++++++- > 1 file changed, 19 insertions(+), 1 deletion(-) > > diff --git a/drivers/pmdomain/ti/ti_sci_pm_domains.c b/drivers/pmdomain/ti/ti_sci_pm_domains.c > index 9dddf227a3a6..1510d5ddae3d 100644 > --- a/drivers/pmdomain/ti/ti_sci_pm_domains.c > +++ b/drivers/pmdomain/ti/ti_sci_pm_domains.c > @@ -114,6 +114,18 @@ static const struct of_device_id ti_sci_pm_domain_matches[] = { > }; > MODULE_DEVICE_TABLE(of, ti_sci_pm_domain_matches); > > +static bool ti_sci_pm_idx_exists(struct ti_sci_genpd_provider *pd_provider, u32 idx) > +{ > + struct ti_sci_pm_domain *pd; > + > + list_for_each_entry(pd, &pd_provider->pd_list, node) { > + if (pd->idx == idx) > + return true; > + } > + > + return false; > +} > + > static int ti_sci_pm_domain_probe(struct platform_device *pdev) > { > struct device *dev = &pdev->dev; > @@ -149,8 +161,14 @@ static int ti_sci_pm_domain_probe(struct platform_device *pdev) > break; > > if (args.args_count >= 1 && args.np == dev->of_node) { > - if (args.args[0] > max_id) > + if (args.args[0] > max_id) { > max_id = args.args[0]; > + } else { > + if (ti_sci_pm_idx_exists(pd_provider, args.args[0])) { > + index++; > + continue; > + } > + } > > pd = devm_kzalloc(dev, sizeof(*pd), GFP_KERNEL); > if (!pd) { > > -- > 2.34.1 >