diff mbox

ARM: integrator: fix OF-related regression

Message ID 1403611687-23512-1-git-send-email-linus.walleij@linaro.org
State Accepted
Commit 11f9323a48875101bc4de6077155c17aed82cfc8
Headers show

Commit Message

Linus Walleij June 24, 2014, 12:08 p.m. UTC
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()

After this the Integrators boot again. Tested on
Integrator/AP and Integrator/CP.

Cc: Grant Likely <grant.likely@linaro.org>
Cc: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Linus Walleij <linus.walleij@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(-)

Comments

Rob Herring June 25, 2014, 1:06 p.m. UTC | #1
On Tue, Jun 24, 2014 at 7:08 AM, Linus Walleij <linus.walleij@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@linaro.org>
> Cc: Arnd Bergmann <arnd@arndb.de>
> Signed-off-by: Linus Walleij <linus.walleij@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@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Linus Walleij June 26, 2014, 12:15 p.m. UTC | #2
On Wed, Jun 25, 2014 at 3:06 PM, Rob Herring <robherring2@gmail.com> wrote:
> On Tue, Jun 24, 2014 at 7:08 AM, Linus Walleij <linus.walleij@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?

It fails by failing to populate the devicetree somehow. I don't
have the proper debugging needs, I just trial-and-horror-fixed
it by making the board init similar to other platforms :-/

Yours,
Linus Walleij
Rabin Vincent June 26, 2014, 7:39 p.m. UTC | #3
On Thu, Jun 26, 2014 at 02:15:42PM +0200, Linus Walleij wrote:
> On Wed, Jun 25, 2014 at 3:06 PM, Rob Herring <robherring2@gmail.com> wrote:
> > On Tue, Jun 24, 2014 at 7:08 AM, Linus Walleij <linus.walleij@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?
> 
> It fails by failing to populate the devicetree somehow. I don't
> have the proper debugging needs, I just trial-and-horror-fixed
> it by making the board init similar to other platforms :-/

earlyprintk doesn't work on Integrator hardware?  It does on QEMU's
integratorcp so it's trivial to debug there.

The problem is that integrator_init_sysfs() adds a device attribute
called "fpga" to the soc0 bus, and the soc0 bus device is also used as
the root of the device tree, and the device tree has a node called "fpga".

Before 07e461cd7e73a84f0e3757932b93cc80976fd749 this node directory and
attribute file had unique paths:

	sysfs: creating file '/devices/soc0/fpga'
	sysfs: creating dir '/devices/soc0/fpga.0'

07e461cd7e73a84f0e3757932b93cc80976fd749 removed the .0 from the fpga node's
directory, leading to that node (and its subnodes) failing to register due to a
filename conflict with the fpga attribute's file:

------------[ cut here ]------------
WARNING: CPU: 0 PID: 1 at /home/rabin/dev/linux/fs/sysfs/dir.c:31 sysfs_warn_dup+0x54/0x74()
sysfs: cannot create duplicate filename '/devices/soc0/fpga'
Modules linked in:
CPU: 0 PID: 1 Comm: swapper Not tainted 3.15.0-rc5-00030-g244fb0a #17
[<c000ea34>] (unwind_backtrace) from [<c000c18c>] (show_stack+0x10/0x14)
[<c000c18c>] (show_stack) from [<c00193f0>] (warn_slowpath_common+0x64/0x84)
[<c00193f0>] (warn_slowpath_common) from [<c0019440>] (warn_slowpath_fmt+0x30/0x40)
[<c0019440>] (warn_slowpath_fmt) from [<c0104008>] (sysfs_warn_dup+0x54/0x74)
[<c0104008>] (sysfs_warn_dup) from [<c01040b0>] (sysfs_create_dir_ns+0x88/0x98)
[<c01040b0>] (sysfs_create_dir_ns) from [<c0188410>] (kobject_add_internal+0xac/0x2fc)
[<c0188410>] (kobject_add_internal) from [<c0188820>] (kobject_add+0x4c/0x98)
[<c0188820>] (kobject_add) from [<c01edacc>] (device_add+0xe0/0x4f0)
[<c01edacc>] (device_add) from [<c02559b0>] (of_platform_device_create_pdata+0x6c/0x8c)
[<c02559b0>] (of_platform_device_create_pdata) from [<c0255aac>] (of_platform_bus_create+0xd0/0x2b4)
[<c0255aac>] (of_platform_bus_create) from [<c0255db8>] (of_platform_populate+0x5c/0xa0)
[<c0255db8>] (of_platform_populate) from [<c0415fdc>] (customize_machine+0x20/0x44)
[<c0415fdc>] (customize_machine) from [<c0008b6c>] (do_one_initcall+0xfc/0x160)
[<c0008b6c>] (do_one_initcall) from [<c0413b40>] (kernel_init_freeable+0xf4/0x1ac)
[<c0413b40>] (kernel_init_freeable) from [<c0312b60>] (kernel_init+0x8/0xec)
[<c0312b60>] (kernel_init) from [<c0009830>] (ret_from_fork+0x14/0x24)
---[ end trace b6f453d64d825b4b ]---
------------[ cut here ]------------
WARNING: CPU: 0 PID: 1 at /home/rabin/dev/linux/lib/kobject.c:240 kobject_add_internal+0x274/0x2fc()
kobject_add_internal failed for fpga with -EEXIST, don't try to register things with the same name in the same directory.
Modules linked in:
CPU: 0 PID: 1 Comm: swapper Tainted: G        W     3.15.0-rc5-00030-g244fb0a #17
[<c000ea34>] (unwind_backtrace) from [<c000c18c>] (show_stack+0x10/0x14)
[<c000c18c>] (show_stack) from [<c00193f0>] (warn_slowpath_common+0x64/0x84)
[<c00193f0>] (warn_slowpath_common) from [<c0019440>] (warn_slowpath_fmt+0x30/0x40)
[<c0019440>] (warn_slowpath_fmt) from [<c01885d8>] (kobject_add_internal+0x274/0x2fc)
[<c01885d8>] (kobject_add_internal) from [<c0188820>] (kobject_add+0x4c/0x98)
[<c0188820>] (kobject_add) from [<c01edacc>] (device_add+0xe0/0x4f0)
[<c01edacc>] (device_add) from [<c02559b0>] (of_platform_device_create_pdata+0x6c/0x8c)
[<c02559b0>] (of_platform_device_create_pdata) from [<c0255aac>] (of_platform_bus_create+0xd0/0x2b4)
[<c0255aac>] (of_platform_bus_create) from [<c0255db8>] (of_platform_populate+0x5c/0xa0)
[<c0255db8>] (of_platform_populate) from [<c0415fdc>] (customize_machine+0x20/0x44)
[<c0415fdc>] (customize_machine) from [<c0008b6c>] (do_one_initcall+0xfc/0x160)
[<c0008b6c>] (do_one_initcall) from [<c0413b40>] (kernel_init_freeable+0xf4/0x1ac)
[<c0413b40>] (kernel_init_freeable) from [<c0312b60>] (kernel_init+0x8/0xec)
[<c0312b60>] (kernel_init) from [<c0009830>] (ret_from_fork+0x14/0x24)
---[ end trace b6f453d64d825b4c ]---

After Linus' patch, the root is no longer soc0 so the fpga node's directory
becomes /devices/fpga while the attribute file remains at /devices/soc0/fpga.
Rob Herring June 26, 2014, 9:31 p.m. UTC | #4
On Thu, Jun 26, 2014 at 2:39 PM, Rabin Vincent <rabin@rab.in> wrote:
> On Thu, Jun 26, 2014 at 02:15:42PM +0200, Linus Walleij wrote:
>> On Wed, Jun 25, 2014 at 3:06 PM, Rob Herring <robherring2@gmail.com> wrote:
>> > On Tue, Jun 24, 2014 at 7:08 AM, Linus Walleij <linus.walleij@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?
>>
>> It fails by failing to populate the devicetree somehow. I don't
>> have the proper debugging needs, I just trial-and-horror-fixed
>> it by making the board init similar to other platforms :-/
>
> earlyprintk doesn't work on Integrator hardware?  It does on QEMU's
> integratorcp so it's trivial to debug there.

I got as far as building a kernel to do that before getting distracted...

> The problem is that integrator_init_sysfs() adds a device attribute
> called "fpga" to the soc0 bus, and the soc0 bus device is also used as
> the root of the device tree, and the device tree has a node called "fpga".
>
> Before 07e461cd7e73a84f0e3757932b93cc80976fd749 this node directory and
> attribute file had unique paths:
>
>         sysfs: creating file '/devices/soc0/fpga'
>         sysfs: creating dir '/devices/soc0/fpga.0'
>
> 07e461cd7e73a84f0e3757932b93cc80976fd749 removed the .0 from the fpga node's
> directory, leading to that node (and its subnodes) failing to register due to a
> filename conflict with the fpga attribute's file:

Thanks for debugging. Now this makes sense as to why this is specific
to Integrator. I think this is the right direction and we should not
put devices under soc0/. That way the structure is consistent across
SOCs and regardless of whether you decide to create an soc_device or
not.

Rob
Linus Walleij June 30, 2014, 4:52 p.m. UTC | #5
On Thu, Jun 26, 2014 at 9:39 PM, Rabin Vincent <rabin@rab.in> wrote:

> earlyprintk doesn't work on Integrator hardware?

It does, but loading the kernel is done over serial line 115200 bps
so iterative tests take "some time" :-)

> It does on QEMU's
> integratorcp so it's trivial to debug there.

Yeah I should be using QEMU for things like this ... poke self.

> The problem is that integrator_init_sysfs() adds a device attribute
> called "fpga" to the soc0 bus, and the soc0 bus device is also used as
> the root of the device tree, and the device tree has a node called "fpga".
(...)
> 07e461cd7e73a84f0e3757932b93cc80976fd749 removed the .0 from the fpga node's
> directory, leading to that node (and its subnodes) failing to register due to a
> filename conflict with the fpga attribute's file:

Aha! Thanks for root-causing this Rabin. Awesome.

> After Linus' patch, the root is no longer soc0 so the fpga node's directory
> becomes /devices/fpga while the attribute file remains at /devices/soc0/fpga.

It appears the patch is doing the right thing, though I had very vague
ideas as to why.

Yours,
Linus Walleij
Olof Johansson July 7, 2014, 12:51 a.m. UTC | #6
On Mon, Jun 30, 2014 at 06:52:58PM +0200, Linus Walleij wrote:
> On Thu, Jun 26, 2014 at 9:39 PM, Rabin Vincent <rabin@rab.in> wrote:
> 
> > earlyprintk doesn't work on Integrator hardware?
> 
> It does, but loading the kernel is done over serial line 115200 bps
> so iterative tests take "some time" :-)
> 
> > It does on QEMU's
> > integratorcp so it's trivial to debug there.
> 
> Yeah I should be using QEMU for things like this ... poke self.
> 
> > The problem is that integrator_init_sysfs() adds a device attribute
> > called "fpga" to the soc0 bus, and the soc0 bus device is also used as
> > the root of the device tree, and the device tree has a node called "fpga".
> (...)
> > 07e461cd7e73a84f0e3757932b93cc80976fd749 removed the .0 from the fpga node's
> > directory, leading to that node (and its subnodes) failing to register due to a
> > filename conflict with the fpga attribute's file:
> 
> Aha! Thanks for root-causing this Rabin. Awesome.
> 
> > After Linus' patch, the root is no longer soc0 so the fpga node's directory
> > becomes /devices/fpga while the attribute file remains at /devices/soc0/fpga.
> 
> It appears the patch is doing the right thing, though I had very vague
> ideas as to why.

Ok, sounds like this is good to go. I'll apply it to the fixes branch, we can
fairly easily take it out right now if it needs to bake more so please speak up
quickly if that is the case.


-Olof
Olof Johansson July 7, 2014, 12:53 a.m. UTC | #7
On Sun, Jul 6, 2014 at 5:51 PM, Olof Johansson <olof@lixom.net> wrote:
> On Mon, Jun 30, 2014 at 06:52:58PM +0200, Linus Walleij wrote:
>> On Thu, Jun 26, 2014 at 9:39 PM, Rabin Vincent <rabin@rab.in> wrote:
>>
>> > earlyprintk doesn't work on Integrator hardware?
>>
>> It does, but loading the kernel is done over serial line 115200 bps
>> so iterative tests take "some time" :-)
>>
>> > It does on QEMU's
>> > integratorcp so it's trivial to debug there.
>>
>> Yeah I should be using QEMU for things like this ... poke self.
>>
>> > The problem is that integrator_init_sysfs() adds a device attribute
>> > called "fpga" to the soc0 bus, and the soc0 bus device is also used as
>> > the root of the device tree, and the device tree has a node called "fpga".
>> (...)
>> > 07e461cd7e73a84f0e3757932b93cc80976fd749 removed the .0 from the fpga node's
>> > directory, leading to that node (and its subnodes) failing to register due to a
>> > filename conflict with the fpga attribute's file:
>>
>> Aha! Thanks for root-causing this Rabin. Awesome.
>>
>> > After Linus' patch, the root is no longer soc0 so the fpga node's directory
>> > becomes /devices/fpga while the attribute file remains at /devices/soc0/fpga.
>>
>> It appears the patch is doing the right thing, though I had very vague
>> ideas as to why.
>
> Ok, sounds like this is good to go. I'll apply it to the fixes branch, we can
> fairly easily take it out right now if it needs to bake more so please speak up
> quickly if that is the case.

Hm, nevermind. Looks like Arnd silently applied it already, and it's
been sent up. Nothing left to do. :)


-Olof
diff mbox

Patch

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[] = {