[PATCH] ARM: integrator: fix OF-related regression
Rob Herring
robherring2 at gmail.com
Wed Jun 25 06:06:27 PDT 2014
On Tue, Jun 24, 2014 at 7:08 AM, Linus Walleij <linus.walleij at linaro.org> wrote:
> Commit 07e461cd7e73a84f0e3757932b93cc80976fd749
> "of: Ensure unique names without sacrificing determinism"
> caused a boot failure regression on the Integrator machines.
>
> The problem is probably caused by fiddling too much with
> the device tree population in the OF init function, such
> as passing the SoC bus device as parent when populating
> the device tree.
>
> This patch fixes the problem by:
>
> - Avoiding to explicitly look up the tree root
> - Look up devices needed before device population from
> the match only, passing NULL as root
> - Passing NULL as root and parent when calling
> of_platform_populate()
Just curious, I don't see how this fixes booting for Integrator. Where
exactly does boot fail?
Rob
>
> After this the Integrators boot again. Tested on
> Integrator/AP and Integrator/CP.
>
> Cc: Grant Likely <grant.likely at linaro.org>
> Cc: Arnd Bergmann <arnd at arndb.de>
> Signed-off-by: Linus Walleij <linus.walleij at linaro.org>
> ---
> ARM SoC maintainers: if you're happy with this fix, please
> apply it directly for fixes in the ARM SoC tree, thanks.
> ---
> arch/arm/mach-integrator/integrator_ap.c | 26 +++++++-------------------
> arch/arm/mach-integrator/integrator_cp.c | 23 ++++++-----------------
> 2 files changed, 13 insertions(+), 36 deletions(-)
>
> diff --git a/arch/arm/mach-integrator/integrator_ap.c b/arch/arm/mach-integrator/integrator_ap.c
> index dd0cc677d596..660ca6feff40 100644
> --- a/arch/arm/mach-integrator/integrator_ap.c
> +++ b/arch/arm/mach-integrator/integrator_ap.c
> @@ -480,25 +480,18 @@ static const struct of_device_id ebi_match[] = {
> static void __init ap_init_of(void)
> {
> unsigned long sc_dec;
> - struct device_node *root;
> struct device_node *syscon;
> struct device_node *ebi;
> struct device *parent;
> struct soc_device *soc_dev;
> struct soc_device_attribute *soc_dev_attr;
> u32 ap_sc_id;
> - int err;
> int i;
>
> - /* Here we create an SoC device for the root node */
> - root = of_find_node_by_path("/");
> - if (!root)
> - return;
> -
> - syscon = of_find_matching_node(root, ap_syscon_match);
> + syscon = of_find_matching_node(NULL, ap_syscon_match);
> if (!syscon)
> return;
> - ebi = of_find_matching_node(root, ebi_match);
> + ebi = of_find_matching_node(NULL, ebi_match);
> if (!ebi)
> return;
>
> @@ -509,19 +502,17 @@ static void __init ap_init_of(void)
> if (!ebi_base)
> return;
>
> + of_platform_populate(NULL, of_default_bus_match_table,
> + ap_auxdata_lookup, NULL);
> +
> ap_sc_id = readl(ap_syscon_base);
>
> soc_dev_attr = kzalloc(sizeof(*soc_dev_attr), GFP_KERNEL);
> if (!soc_dev_attr)
> return;
>
> - err = of_property_read_string(root, "compatible",
> - &soc_dev_attr->soc_id);
> - if (err)
> - return;
> - err = of_property_read_string(root, "model", &soc_dev_attr->machine);
> - if (err)
> - return;
> + soc_dev_attr->soc_id = "XVC";
> + soc_dev_attr->machine = "Integrator/AP";
> soc_dev_attr->family = "Integrator";
> soc_dev_attr->revision = kasprintf(GFP_KERNEL, "%c",
> 'A' + (ap_sc_id & 0x0f));
> @@ -536,9 +527,6 @@ static void __init ap_init_of(void)
> parent = soc_device_to_device(soc_dev);
> integrator_init_sysfs(parent, ap_sc_id);
>
> - of_platform_populate(root, of_default_bus_match_table,
> - ap_auxdata_lookup, parent);
> -
> sc_dec = readl(ap_syscon_base + INTEGRATOR_SC_DEC_OFFSET);
> for (i = 0; i < 4; i++) {
> struct lm_device *lmdev;
> diff --git a/arch/arm/mach-integrator/integrator_cp.c b/arch/arm/mach-integrator/integrator_cp.c
> index a938242b0c95..0e57f8f820a5 100644
> --- a/arch/arm/mach-integrator/integrator_cp.c
> +++ b/arch/arm/mach-integrator/integrator_cp.c
> @@ -279,20 +279,13 @@ static const struct of_device_id intcp_syscon_match[] = {
>
> static void __init intcp_init_of(void)
> {
> - struct device_node *root;
> struct device_node *cpcon;
> struct device *parent;
> struct soc_device *soc_dev;
> struct soc_device_attribute *soc_dev_attr;
> u32 intcp_sc_id;
> - int err;
>
> - /* Here we create an SoC device for the root node */
> - root = of_find_node_by_path("/");
> - if (!root)
> - return;
> -
> - cpcon = of_find_matching_node(root, intcp_syscon_match);
> + cpcon = of_find_matching_node(NULL, intcp_syscon_match);
> if (!cpcon)
> return;
>
> @@ -300,19 +293,17 @@ static void __init intcp_init_of(void)
> if (!intcp_con_base)
> return;
>
> + of_platform_populate(NULL, of_default_bus_match_table,
> + intcp_auxdata_lookup, NULL);
> +
> intcp_sc_id = readl(intcp_con_base);
>
> soc_dev_attr = kzalloc(sizeof(*soc_dev_attr), GFP_KERNEL);
> if (!soc_dev_attr)
> return;
>
> - err = of_property_read_string(root, "compatible",
> - &soc_dev_attr->soc_id);
> - if (err)
> - return;
> - err = of_property_read_string(root, "model", &soc_dev_attr->machine);
> - if (err)
> - return;
> + soc_dev_attr->soc_id = "XCV";
> + soc_dev_attr->machine = "Integrator/CP";
> soc_dev_attr->family = "Integrator";
> soc_dev_attr->revision = kasprintf(GFP_KERNEL, "%c",
> 'A' + (intcp_sc_id & 0x0f));
> @@ -326,8 +317,6 @@ static void __init intcp_init_of(void)
>
> parent = soc_device_to_device(soc_dev);
> integrator_init_sysfs(parent, intcp_sc_id);
> - of_platform_populate(root, of_default_bus_match_table,
> - intcp_auxdata_lookup, parent);
> }
>
> static const char * intcp_dt_board_compat[] = {
> --
> 1.9.3
>
>
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
More information about the linux-arm-kernel
mailing list