With deep probe enabled, we can know for certain whether a driver will be found for a device or not. This allows us to specially handle devices that lack a driver. We already do that for regulators, where the device tree can specify barebox,allow-dummy-supply for regulators that are known to be enabled by the time barebox runs. Add the same functionality for power domains as well. Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de> --- drivers/base/power.c | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/drivers/base/power.c b/drivers/base/power.c index 96cac1a091f3..4a206051b137 100644 --- a/drivers/base/power.c +++ b/drivers/base/power.c @@ -139,14 +139,32 @@ static struct generic_pm_domain *genpd_get_from_provider( struct of_phandle_args *genpdspec) { struct generic_pm_domain *genpd = ERR_PTR(-ENOENT); + struct device_node *node = genpdspec->np; struct of_genpd_provider *provider; + int ret; if (!genpdspec) return ERR_PTR(-EINVAL); + ret = of_device_ensure_probed(node); + if (ret) { + struct device_node *parent; + + /* + * If "barebox,allow-dummy" property is set for power domain + * provider, assume it's turned on. + */ + parent = of_get_parent(node); + if (of_get_property(node, "barebox,allow-dummy", NULL) || + of_get_property(parent, "barebox,allow-dummy", NULL)) + return NULL; + + return ERR_PTR(ret); + } + /* Check if we have such a provider in our array */ list_for_each_entry(provider, &of_genpd_providers, link) { - if (provider->node == genpdspec->np) + if (provider->node == node) genpd = provider->xlate(genpdspec, provider->data); if (!IS_ERR(genpd)) break; @@ -175,7 +193,7 @@ static int genpd_power_on(struct generic_pm_domain *genpd, unsigned int depth) { int ret; - if (genpd_status_on(genpd)) + if (!genpd || genpd_status_on(genpd)) return 0; ret = _genpd_power_on(genpd, true); @@ -211,7 +229,7 @@ static int __genpd_dev_pm_attach(struct device_d *dev, struct device_node *np, return (ret == -ENOENT) ? -EPROBE_DEFER : ret; } - dev_dbg(dev, "adding to PM domain %s\n", pd->name); + dev_dbg(dev, "adding to PM domain %s\n", pd ? pd->name : "dummy"); if (power_on) ret = genpd_power_on(pd, 0); -- 2.30.2
When i.MX8MM support was first added, upstream device tree did list no power domains. Now it does and we defer probe of USB indefinitely because we have no power domain driver. If we need to do PCI on the i.MX8MM in barebox, there'll likely be no way around importing the power domain driver, but for USB which used to work, only thing we need to do is ignore the new power domain specification. Do so by adding the new barebox,allow-dummy property to the new known-enabled power domains. Fixes: 3f2f5980d517 ("dts: update to v5.16-rc1") Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de> --- Issue observed on i.MX8MM based board with deep probe enabled. --- arch/arm/dts/imx8mm.dtsi | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/arch/arm/dts/imx8mm.dtsi b/arch/arm/dts/imx8mm.dtsi index 78bbacb2b1b2..cdf212820594 100644 --- a/arch/arm/dts/imx8mm.dtsi +++ b/arch/arm/dts/imx8mm.dtsi @@ -5,6 +5,14 @@ }; }; +&pgc_otg1 { + barebox,allow-dummy; +}; + +&pgc_otg2 { + barebox,allow-dummy; +}; + &src { compatible = "fsl,imx8mm-src", "fsl,imx8mq-src", "syscon", "simple-mfd"; -- 2.30.2
When i.MX8MN support was first added, upstream device tree did list no power domains. Now it does and we defer probe of USB indefinitely because we have no power domain driver. If we need to do PCI on the i.MX8MM in barebox, there'll likely be no way around importing the power domain driver, but for USB which used to work, only thing we need to do is ignore the new power domain specification. Do so by adding the new barebox,allow-dummy property to the new known-enabled power domain. Fixes: b01786baa849 ("dts: update to v5.18-rc1") Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de> --- Untested on actual i.MX8MN HW, but close enough i.MX8MM. i.MX8MP is also affect since v5.19-rc1 sync, but we have no USB support there yet. Power domains also seems more complicated on 8MPlus where we have a blk-ctrl power domain driver in-between usbotg and gpcv2. --- arch/arm/dts/imx8mn-evk.dtsi | 2 ++ arch/arm/dts/imx8mn.dtsi | 5 +++++ 2 files changed, 7 insertions(+) create mode 100644 arch/arm/dts/imx8mn.dtsi diff --git a/arch/arm/dts/imx8mn-evk.dtsi b/arch/arm/dts/imx8mn-evk.dtsi index ceeb5f8b9384..aeb357007991 100644 --- a/arch/arm/dts/imx8mn-evk.dtsi +++ b/arch/arm/dts/imx8mn-evk.dtsi @@ -4,6 +4,8 @@ * Copyright (C) 2017 Pengutronix, Lucas Stach <kernel@pengutronix.de> */ +#include "imx8mn.dtsi" + / { chosen { environment-sd { diff --git a/arch/arm/dts/imx8mn.dtsi b/arch/arm/dts/imx8mn.dtsi new file mode 100644 index 000000000000..176125e73bce --- /dev/null +++ b/arch/arm/dts/imx8mn.dtsi @@ -0,0 +1,5 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) + +&pgc_otg1 { + barebox,allow-dummy; +}; -- 2.30.2
On 30.07.22 11:52, Ahmad Fatoum wrote: > With deep probe enabled, we can know for certain whether a driver will > be found for a device or not. This allows us to specially handle devices > that lack a driver. We already do that for regulators, where the device > tree can specify barebox,allow-dummy-supply for regulators that are > known to be enabled by the time barebox runs. Add the same functionality > for power domains as well. > > Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de> > --- Please dismiss, sending out v2 shortly. > drivers/base/power.c | 24 +++++++++++++++++++++--- > 1 file changed, 21 insertions(+), 3 deletions(-) > > diff --git a/drivers/base/power.c b/drivers/base/power.c > index 96cac1a091f3..4a206051b137 100644 > --- a/drivers/base/power.c > +++ b/drivers/base/power.c > @@ -139,14 +139,32 @@ static struct generic_pm_domain *genpd_get_from_provider( > struct of_phandle_args *genpdspec) > { > struct generic_pm_domain *genpd = ERR_PTR(-ENOENT); > + struct device_node *node = genpdspec->np; > struct of_genpd_provider *provider; > + int ret; > > if (!genpdspec) > return ERR_PTR(-EINVAL); > > + ret = of_device_ensure_probed(node); > + if (ret) { > + struct device_node *parent; > + > + /* > + * If "barebox,allow-dummy" property is set for power domain > + * provider, assume it's turned on. > + */ > + parent = of_get_parent(node); > + if (of_get_property(node, "barebox,allow-dummy", NULL) || > + of_get_property(parent, "barebox,allow-dummy", NULL)) > + return NULL; > + > + return ERR_PTR(ret); > + } > + > /* Check if we have such a provider in our array */ > list_for_each_entry(provider, &of_genpd_providers, link) { > - if (provider->node == genpdspec->np) > + if (provider->node == node) > genpd = provider->xlate(genpdspec, provider->data); > if (!IS_ERR(genpd)) > break; > @@ -175,7 +193,7 @@ static int genpd_power_on(struct generic_pm_domain *genpd, unsigned int depth) > { > int ret; > > - if (genpd_status_on(genpd)) > + if (!genpd || genpd_status_on(genpd)) > return 0; > > ret = _genpd_power_on(genpd, true); > @@ -211,7 +229,7 @@ static int __genpd_dev_pm_attach(struct device_d *dev, struct device_node *np, > return (ret == -ENOENT) ? -EPROBE_DEFER : ret; > } > > - dev_dbg(dev, "adding to PM domain %s\n", pd->name); > + dev_dbg(dev, "adding to PM domain %s\n", pd ? pd->name : "dummy"); > > if (power_on) > ret = genpd_power_on(pd, 0); -- Pengutronix e.K. | | Steuerwalder Str. 21 | http://www.pengutronix.de/ | 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |