diff options
author | Ahmad Fatoum <a.fatoum@pengutronix.de> | 2022-08-08 16:00:33 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2022-08-09 06:34:53 +0200 |
commit | 4aca68990d04ee6b6688b2bb28fcebc015063ee8 (patch) | |
tree | ea93980eff96ad7dd44fd7a5971c4ac1a3414e58 | |
parent | c1c460b7e44c1c46f819232a32cbfdf9c7b06ade (diff) | |
download | barebox-4aca68990d04ee6b6688b2bb28fcebc015063ee8.tar.gz barebox-4aca68990d04ee6b6688b2bb28fcebc015063ee8.tar.xz |
drivers: power: ignore power domains with barebox,allow-dummy
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>
Link: https://lore.barebox.org/20220808140035.1672733-2-a.fatoum@pengutronix.de
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
-rw-r--r-- | drivers/base/power.c | 24 |
1 files changed, 21 insertions, 3 deletions
diff --git a/drivers/base/power.c b/drivers/base/power.c index 96cac1a091..4a206051b1 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); |