[PATCH 3/3] soc: imx: gpcv2: split PGC domain probe in two passes

Lucas Stach l.stach at pengutronix.de
Mon Aug 29 00:15:24 PDT 2022


Am Montag, dem 29.08.2022 um 01:55 +0000 schrieb Peng Fan:
> > Subject: [PATCH 3/3] soc: imx: gpcv2: split PGC domain probe in two passes
> > 
> > Since 5a46079a9645 ("PM: domains: Delete usage of
> > driver_deferred_probe_check_state()")
> > power domain consumers attached by the driver core do not support probe
> > deferral anymore, as it is assumed that they are only probed after the
> > provider is present, as a devlink should have been established between the
> > two.
> > 
> > With the GPCv2 and its slightly unusual mix between platform devices and
> > DT description for the PGC domains, devlink fails to add the neccessary
> > probe dependency. Now that probe deferral is not an option anymore, the
> > domain drivers for nested GPC domains simply fail to probe, leaving parts of
> > the SoC unusable. Rather than trying to teach devlink about our one-off
> > usage of DT and platform devices, just split the registration of the nested
> > power domains into a second pass, so that we never need any dependency
> > handling.
> > 
> > Fixes: 5a46079a9645 ("PM: domains: Delete usage of
> > driver_deferred_probe_check_state()")
> 
> This regression has been fixed, the patch author reverted that patch.
> 
Thanks, didn't know this.

> Do we still need this fix?
> 
We certainly do not need it as a fix then. Depending on how people feel
about the code change, I would still like to land it, as we can avoid a
probe deferral cycle for some GPC power domains this way and thus avoid
unnecessary work during kernel boot.

Regards,
Lucas

> Thanks,
> Peng.
> > Signed-off-by: Lucas Stach <l.stach at pengutronix.de>
> > ---
> >  drivers/soc/imx/gpcv2.c | 19 ++++++++++++++++++-
> >  1 file changed, 18 insertions(+), 1 deletion(-)
> > 
> > diff --git a/drivers/soc/imx/gpcv2.c b/drivers/soc/imx/gpcv2.c index
> > 6383a4edc360..d1bbadbcb034 100644
> > --- a/drivers/soc/imx/gpcv2.c
> > +++ b/drivers/soc/imx/gpcv2.c
> > @@ -1446,7 +1446,7 @@ static int imx_gpcv2_probe(struct
> > platform_device *pdev)
> >  	struct device_node *pgc_np, *np;
> >  	struct regmap *regmap;
> >  	void __iomem *base;
> > -	int ret;
> > +	int ret, pass = 0;
> > 
> >  	pgc_np = of_get_child_by_name(dev->of_node, "pgc");
> >  	if (!pgc_np) {
> > @@ -1465,7 +1465,16 @@ static int imx_gpcv2_probe(struct
> > platform_device *pdev)
> >  		return ret;
> >  	}
> > 
> > +	/*
> > +	 * Run two passes for the registration of the PGC domain platform
> > +	 * devices: first all devices that are not part of a power-domain
> > +	 * themselves, then all the others. This avoids -EPROBE_DEFER being
> > +	 * returned for nested domains, that need their parent PGC domains
> > +	 * to be present on probe.
> > +	 */
> > +again:
> >  	for_each_child_of_node(pgc_np, np) {
> > +		bool child_domain = of_property_read_bool(np, "power-
> > domains");
> >  		struct platform_device *pd_pdev;
> >  		struct imx_pgc_domain *domain;
> >  		u32 domain_index;
> > @@ -1473,6 +1482,9 @@ static int imx_gpcv2_probe(struct
> > platform_device *pdev)
> >  		if (!of_device_is_available(np))
> >  			continue;
> > 
> > +		if ((pass == 0 && child_domain) || (pass == 1
> > && !child_domain))
> > +			continue;
> > +
> >  		ret = of_property_read_u32(np, "reg", &domain_index);
> >  		if (ret) {
> >  			dev_err(dev, "Failed to read 'reg' property\n"); @@
> > -1522,6 +1534,11 @@ static int imx_gpcv2_probe(struct platform_device
> > *pdev)
> >  		}
> >  	}
> > 
> > +	if (pass == 0) {
> > +		pass++;
> > +		goto again;
> > +	}
> > +
> >  	return 0;
> >  }
> > 
> > --
> > 2.30.2
> 





More information about the linux-arm-kernel mailing list