diff options
| author | Caleb Connolly <[email protected]> | 2024-04-03 14:07:46 +0200 |
|---|---|---|
| committer | Caleb Connolly <[email protected]> | 2024-04-04 17:46:47 +0200 |
| commit | b2f2c7b526ad34f803f0bd26aaf80107debd8abd (patch) | |
| tree | 2edc61294238a63058b0d6a7e61564f9de84910e | |
| parent | 06db7f962fa3d3cfa0ec15cd3ac69c4de485127e (diff) | |
mach-snapdragon: fixup power-domains
We don't support the RPM(h)PD power domains in U-Boot, and we don't need
to - the necessary resources are on, and we aren't going to enter any
low power modes.
We could try using a no-op device, but this requires adding a compatible
for every platform, and just pollutes the driver model. So instead let's
just remove every "power-domains" property that references the RPM(h)pd
power controller. This takes <1ms as we're using OF_LIVE.
Of note, this only applies to drivers which are loading post-relocation.
Drivers loaded pre-reloc that reference the rpm(h)pd still need
DM_FLAG_DEFAULT_PD_CTRL_OFF in their flags.
Acked-by: Sumit Garg <[email protected]>
Reviewed-by: Neil Armstrong <[email protected]>
Tested-by: Neil Armstrong <[email protected]>
Signed-off-by: Caleb Connolly <[email protected]>
| -rw-r--r-- | arch/arm/mach-snapdragon/of_fixup.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/arch/arm/mach-snapdragon/of_fixup.c b/arch/arm/mach-snapdragon/of_fixup.c index 4fdfed2dff1..3f7ac227bd0 100644 --- a/arch/arm/mach-snapdragon/of_fixup.c +++ b/arch/arm/mach-snapdragon/of_fixup.c @@ -22,6 +22,7 @@ #include <dm/of.h> #include <fdt_support.h> #include <linux/errno.h> +#include <stdlib.h> #include <time.h> /* U-Boot only supports USB high-speed mode on Qualcomm platforms with DWC3 @@ -110,6 +111,36 @@ static void fixup_usb_nodes(void) } } +/* Remove all references to the rpmhpd device */ +static void fixup_power_domains(void) +{ + struct device_node *pd = NULL, *np = NULL; + struct property *prop; + const __be32 *val; + + /* All Qualcomm platforms name the rpm(h)pd "power-controller" */ + for_each_of_allnodes(pd) { + if (pd->name && !strcmp("power-controller", pd->name)) + break; + } + + /* Sanity check that this is indeed a power domain controller */ + if (!of_find_property(pd, "#power-domain-cells", NULL)) { + log_err("Found power-controller but it doesn't have #power-domain-cells\n"); + return; + } + + /* Remove all references to the power domain controller */ + for_each_of_allnodes(np) { + if (!(prop = of_find_property(np, "power-domains", NULL))) + continue; + + val = prop->value; + if (val[0] == cpu_to_fdt32(pd->phandle)) + of_remove_property(np, prop); + } +} + #define time_call(func, ...) \ do { \ u64 start = timer_get_us(); \ @@ -120,4 +151,5 @@ static void fixup_usb_nodes(void) void qcom_of_fixup_nodes(void) { time_call(fixup_usb_nodes); + time_call(fixup_power_domains); } |
