mirror of
https://source.denx.de/u-boot/u-boot.git
synced 2026-06-13 15:03:58 +03:00
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 <sumit.garg@linaro.org> Reviewed-by: Neil Armstrong <neil.armstrong@linaro.org> Tested-by: Neil Armstrong <neil.armstrong@linaro.org> Signed-off-by: Caleb Connolly <caleb.connolly@linaro.org>
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user