Message ID | 20240328-b4-qcom-livetree-v5-11-4e98228b3d03@linaro.org |
---|---|
State | Superseded |
Headers | show |
Series | Qualcomm platform USB support | expand |
On Thu, 28 Mar 2024 at 23:29, Caleb Connolly <caleb.connolly@linaro.org> 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(+) > Acked-by: Sumit Garg <sumit.garg@linaro.org> -Sumit > 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); > } > > -- > 2.44.0 >
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>
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); }
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(+)