
On 28/03/2024 18:59, Caleb Connolly wrote:
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.
Signed-off-by: Caleb Connolly caleb.connolly@linaro.org
arch/arm/mach-snapdragon/of_fixup.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+)
diff --git a/arch/arm/mach-snapdragon/of_fixup.c b/arch/arm/mach-snapdragon/of_fixup.c index 4fdfed2dff16..3f7ac227bd09 100644 --- a/arch/arm/mach-snapdragon/of_fixup.c +++ b/arch/arm/mach-snapdragon/of_fixup.c @@ -21,8 +21,9 @@ #include <dm/of_access.h> #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
- USB controllers. Rather than requiring source level DT changes, we fix up
@@ -109,8 +110,38 @@ static void fixup_usb_nodes(void) log_warning("Failed to fixup node %s: %d\n", glue_np->name, ret); } }
+/* 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(); \ func(__VA_ARGS__); \
@@ -119,5 +150,6 @@ static void fixup_usb_nodes(void)
void qcom_of_fixup_nodes(void) { time_call(fixup_usb_nodes);
- time_call(fixup_power_domains); }
Reviewed-by: Neil Armstrong neil.armstrong@linaro.org
Also tested on SM8550 & SM8650, so:
Tested-by: Neil Armstrong neil.armstrong@linaro.org