Re: [PATCH v3 3/3] ARM: at91: remove unnecessary of_platform_default_populate calls

Alexander Dahl
2026-04-24T10:56:52Z

Hei hei,

after few hints in IRC yesterday, I tried to understand why neither
the ebi driver nor the nand driver are probed, but I failed. See below.

Am Thu, Apr 23, 2026 at 10:24:46AM +0200 schrieb Alexander Dahl:
> Hello everyone,
>
> I'm afraid this patch breaks finding rootfs on raw nand on sam9x60,
> see below:
>
> Am Mon, Jan 05, 2026 at 03:06:45PM -0600 schrieb Rob Herring (Arm):
> > The DT core will call of_platform_default_populate, so it is not
> > necessary for machine specific code to call it unless there are custom
> > match entries, auxdata or parent device. Neither of those apply here, so
> > remove the call.
> >
> > Acked-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
> > Tested-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
> > Signed-off-by: Rob Herring (Arm) <robh@kernel.org>
>
> Not sure what was actually tested, but this change breaks booting from
> raw NAND flash on our sam9x60 based board. I bisected the boot
> failure to this exact change. Before the change I see the nand
> controller messages in the kernel log like this:
>
> atmel-nand-controller 10000000.ebi:nand-controller: using dma0chan5 for DMA transfers
> nand: device found, Manufacturer ID: 0x01, Chip ID: 0xda
> nand: AMD/Spansion S34ML02G1
> nand: 256 MiB, SLC, erase size: 128 KiB, page size: 2048, OOB size: 64
>
> After the change, there are no kernel log messages related to nand at
> all, the driver does not seem to load. This of course leads to no mtd
> and ubi devices created, no ubi volumes found, no rootfs, and
> eventually this message:
>
> VFS: Cannot open root device "ubi0:rootfs2" or unknown-block(0,253): error -19
>
> I tried to understand the whole patch series, and to my understanding
> the intend was the device nodes still get populated, and the drivers
> loaded, right? Patch 1/3 is related to the atmel nand controller, and
> that one is not in the tree yet when bisecting to the end. However it
> is present in v7.0-rc1 (and later) and trying to boot that kernel (or
> 7.0 or todays master) fails, too. (Also I don't see those probe defer
> messages related to SRAM on v7.0-rc1, so I assume that's not the
> problem?)
>
> Now the strange thing is: on a different hardware based on sama5d2
> v7.0-rc1 boots fine from raw nand flash. I wonder what's the
> difference which makes it work on one atmel platform and not work on
> the other?
>
> I compared kernel .config of both boards, no obvious pieces missing.
> Looking at the dts (and included dtsi) files of both boards I could
> spot no mistake. Also no obvious flaws in sama5d2.dtsi or
> sam9x60.dtsi.
>
> Note: raw NAND flash is the only storage for rootfs on our platforms,
> we can not simply put rootfs to a different storage. I could try
> setting up NFS boot for further investigation, but that will take a
> while.

Meanwhile I got to boot the device over NFS and did some
instrumentation of the atmel-ebi driver and the atmel rawnand driver.

Can confirm, that the probe functions of those drivers are not called
(still v7.0-rc1 on sam9x60). The atmel-pmecc driver however actually
is probed/loaded, but that device node sits in a different area of the
device tree.

> Does anyone have an idea how to make booting from raw NAND flash work
> on sam9x60 again (despite the obviously not desired revert)? What can
> I try? What information would be interesting for debugging?

Tried booting with cmdline option 'fw_devlink=off' but that did not
change anything.

When mounting debugfs, the file /sys/kernel/debug/devices_deferred is
empty, so deferred devices waiting on something seems not the cause.

Strange thing is /sys/bus/platform/devices/ has an entry
'10000000.ebi' but none for the child node of the nand-controller.
And /sys/bus/platform/drivers has an entry for 'atmel-nand-controller'
but 'atmel-ebi' is missing (it is not on the sama5d2 system).

I don't get what the key difference between those systems is and
what's necessary so the atmel-ebi probe function gets called?

The fw_devlink stuff also does not really make sense to me. FWIW,
from the sam9x60 system:

$ ls -1 /sys/class/devlink/
platform:ahb:apb:pinctrl@fffff400--platform:10000000.ebi
platform:ahb:apb:pinctrl@fffff400--platform:f0014000.spi
platform:ahb:apb:pinctrl@fffff400--platform:f802c000.ethernet
platform:ahb:apb:pinctrl@fffff400--platform:fffff200.serial
platform:ahb:apb:pinctrl@fffff400--platform:gpio-keys
platform:ahb:apb:pinctrl@fffff400--platform:led-controller-0
platform:ahb:apb:pinctrl@fffff400--platform:spi-gpio-1
platform:fffff400.gpio--platform:spi-gpio-1
platform:fffff600.gpio--mdio_bus:f802c000.ethernet-ffffffff:03
platform:fffff600.gpio--spi:spi1.0
platform:fffffa00.gpio--platform:10000000.ebi

The sama5d2 system (which successfully loads the nand-controller
driver) has this:

$ ls -1 /sys/class/devlink/
platform:ahb:apb--platform:f8034200.serial
platform:f802c000.pwm--platform:led-controller-1
platform:fc038000.pinctrl--platform:10000000.ebi
platform:fc038000.pinctrl--platform:f8000000.spi
platform:fc038000.pinctrl--platform:f8008000.ethernet
platform:fc038000.pinctrl--platform:f8020000.serial
platform:fc038000.pinctrl--platform:f802c000.pwm
platform:fc038000.pinctrl--platform:f8034000.flexcom
platform:fc038000.pinctrl--platform:gpio-keys
platform:fc038000.pinctrl--spi:spi0.0

So both platforms use different pinctrl drivers (pinctrl-at91-pio4.c
vs. pinctrl-at91.c) but can that be the issue?

I know not many people use raw nand on at91, but any ideas welcome.
Also where I should look in sysfs, debugfs, or code?

Greets
Alex

> Greets
> Alex
>
> > ---
> > v3:
> > - Fixup split between patch 2 and 3.
> >
> > v2:
> > - Dust off and rebase to 6.18-rc1
> > - Add new platforms added since v1
> > ---
> > arch/arm/mach-at91/at91rm9200.c | 9 ---------
> > arch/arm/mach-at91/at91sam9.c | 9 ---------
> > arch/arm/mach-at91/sam9x60.c | 9 ---------
> > arch/arm/mach-at91/sam9x7.c | 9 ---------
> > arch/arm/mach-at91/sama5.c | 16 ----------------
> > arch/arm/mach-at91/sama7.c | 9 ---------
> > 6 files changed, 61 deletions(-)
> >
> > diff --git a/arch/arm/mach-at91/at91rm9200.c b/arch/arm/mach-at91/at91rm9200.c
> > index 2ac564eb8bbb..d15997fff5d7 100644
> > --- a/arch/arm/mach-at91/at91rm9200.c
> > +++ b/arch/arm/mach-at91/at91rm9200.c
> > @@ -7,18 +7,10 @@
> > * 2012 Joachim Eastwood <manabian@gmail.com>
> > */
> >
> > -#include <linux/of.h>
> > -#include <linux/of_platform.h>
> > -
> > #include <asm/mach/arch.h>
> >
> > #include "generic.h"
> >
> > -static void __init at91rm9200_dt_device_init(void)
> > -{
> > - of_platform_default_populate(NULL, NULL, NULL);
> > -}
> > -
> > static const char *const at91rm9200_dt_board_compat[] __initconst = {
> > "atmel,at91rm9200",
> > NULL
> > @@ -26,6 +18,5 @@ static const char *const at91rm9200_dt_board_compat[] __initconst = {
> >
> > DT_MACHINE_START(at91rm9200_dt, "Atmel AT91RM9200")
> > .init_late = at91rm9200_pm_init,
> > - .init_machine = at91rm9200_dt_device_init,
> > .dt_compat = at91rm9200_dt_board_compat,
> > MACHINE_END
> > diff --git a/arch/arm/mach-at91/at91sam9.c b/arch/arm/mach-at91/at91sam9.c
> > index cf07cba4ee5d..b9d2909d1b65 100644
> > --- a/arch/arm/mach-at91/at91sam9.c
> > +++ b/arch/arm/mach-at91/at91sam9.c
> > @@ -6,19 +6,11 @@
> > * 2011 Nicolas Ferre <nicolas.ferre@atmel.com>
> > */
> >
> > -#include <linux/of.h>
> > -#include <linux/of_platform.h>
> > -
> > #include <asm/mach/arch.h>
> > #include <asm/system_misc.h>
> >
> > #include "generic.h"
> >
> > -static void __init at91sam9_init(void)
> > -{
> > - of_platform_default_populate(NULL, NULL, NULL);
> > -}
> > -
> > static const char *const at91_dt_board_compat[] __initconst = {
> > "atmel,at91sam9",
> > NULL
> > @@ -27,6 +19,5 @@ static const char *const at91_dt_board_compat[] __initconst = {
> > DT_MACHINE_START(at91sam_dt, "Atmel AT91SAM9")
> > /* Maintainer: Atmel */
> > .init_late = at91sam9_pm_init,
> > - .init_machine = at91sam9_init,
> > .dt_compat = at91_dt_board_compat,
> > MACHINE_END
> > diff --git a/arch/arm/mach-at91/sam9x60.c b/arch/arm/mach-at91/sam9x60.c
> > index a31beaaeffcd..744bab2cbb92 100644
> > --- a/arch/arm/mach-at91/sam9x60.c
> > +++ b/arch/arm/mach-at91/sam9x60.c
> > @@ -7,19 +7,11 @@
> > * Author: Claudiu Beznea <claudiu.beznea@microchip.com>
> > */
> >
> > -#include <linux/of.h>
> > -#include <linux/of_platform.h>
> > -
> > #include <asm/mach/arch.h>
> > #include <asm/system_misc.h>
> >
> > #include "generic.h"
> >
> > -static void __init sam9x60_init(void)
> > -{
> > - of_platform_default_populate(NULL, NULL, NULL);
> > -}
> > -
> > static const char *const sam9x60_dt_board_compat[] __initconst = {
> > "microchip,sam9x60",
> > NULL
> > @@ -28,6 +20,5 @@ static const char *const sam9x60_dt_board_compat[] __initconst = {
> > DT_MACHINE_START(sam9x60_dt, "Microchip SAM9X60")
> > /* Maintainer: Microchip */
> > .init_late = sam9x60_pm_init,
> > - .init_machine = sam9x60_init,
> > .dt_compat = sam9x60_dt_board_compat,
> > MACHINE_END
> > diff --git a/arch/arm/mach-at91/sam9x7.c b/arch/arm/mach-at91/sam9x7.c
> > index 0c73f7fefd4f..166c8625509d 100644
> > --- a/arch/arm/mach-at91/sam9x7.c
> > +++ b/arch/arm/mach-at91/sam9x7.c
> > @@ -7,18 +7,10 @@
> > * Author: Varshini Rajendran <varshini.rajendran@microchip.com>
> > */
> >
> > -#include <linux/of.h>
> > -#include <linux/of_platform.h>
> > -
> > #include <asm/mach/arch.h>
> >
> > #include "generic.h"
> >
> > -static void __init sam9x7_init(void)
> > -{
> > - of_platform_default_populate(NULL, NULL, NULL);
> > -}
> > -
> > static const char * const sam9x7_dt_board_compat[] __initconst = {
> > "microchip,sam9x7",
> > NULL
> > @@ -27,6 +19,5 @@ static const char * const sam9x7_dt_board_compat[] __initconst = {
> > DT_MACHINE_START(sam9x7_dt, "Microchip SAM9X7")
> > /* Maintainer: Microchip */
> > .init_late = sam9x7_pm_init,
> > - .init_machine = sam9x7_init,
> > .dt_compat = sam9x7_dt_board_compat,
> > MACHINE_END
> > diff --git a/arch/arm/mach-at91/sama5.c b/arch/arm/mach-at91/sama5.c
> > index 576654cba82d..e56022f00800 100644
> > --- a/arch/arm/mach-at91/sama5.c
> > +++ b/arch/arm/mach-at91/sama5.c
> > @@ -6,9 +6,6 @@
> > * 2013 Ludovic Desroches <ludovic.desroches@atmel.com>
> > */
> >
> > -#include <linux/of.h>
> > -#include <linux/of_platform.h>
> > -
> > #include <asm/hardware/cache-l2x0.h>
> > #include <asm/mach/arch.h>
> > #include <asm/mach/map.h>
> > @@ -30,11 +27,6 @@ static void __init sama5_secure_cache_init(void)
> > outer_cache.write_sec = sama5_l2c310_write_sec;
> > }
> >
> > -static void __init sama5_dt_device_init(void)
> > -{
> > - of_platform_default_populate(NULL, NULL, NULL);
> > -}
> > -
> > static const char *const sama5_dt_board_compat[] __initconst = {
> > "atmel,sama5",
> > NULL
> > @@ -43,7 +35,6 @@ static const char *const sama5_dt_board_compat[] __initconst = {
> > DT_MACHINE_START(sama5_dt, "Atmel SAMA5")
> > /* Maintainer: Atmel */
> > .init_late = sama5_pm_init,
> > - .init_machine = sama5_dt_device_init,
> > .dt_compat = sama5_dt_board_compat,
> > MACHINE_END
> >
> > @@ -54,17 +45,11 @@ static const char *const sama5_alt_dt_board_compat[] __initconst = {
> >
> > DT_MACHINE_START(sama5_alt_dt, "Atmel SAMA5")
> > /* Maintainer: Atmel */
> > - .init_machine = sama5_dt_device_init,
> > .init_late = sama5_pm_init,
> > .dt_compat = sama5_alt_dt_board_compat,
> > .l2c_aux_mask = ~0UL,
> > MACHINE_END
> >
> > -static void __init sama5d2_init(void)
> > -{
> > - of_platform_default_populate(NULL, NULL, NULL);
> > -}
> > -
> > static const char *const sama5d2_compat[] __initconst = {
> > "atmel,sama5d2",
> > NULL
> > @@ -72,7 +57,6 @@ static const char *const sama5d2_compat[] __initconst = {
> >
> > DT_MACHINE_START(sama5d2, "Atmel SAMA5")
> > /* Maintainer: Atmel */
> > - .init_machine = sama5d2_init,
> > .init_early = sama5_secure_cache_init,
> > .init_late = sama5d2_pm_init,
> > .dt_compat = sama5d2_compat,
> > diff --git a/arch/arm/mach-at91/sama7.c b/arch/arm/mach-at91/sama7.c
> > index 8bf57a020f1c..f56828d61199 100644
> > --- a/arch/arm/mach-at91/sama7.c
> > +++ b/arch/arm/mach-at91/sama7.c
> > @@ -6,19 +6,11 @@
> > *
> > */
> >
> > -#include <linux/of.h>
> > -#include <linux/of_platform.h>
> > -
> > #include <asm/mach/arch.h>
> > #include <asm/system_misc.h>
> >
> > #include "generic.h"
> >
> > -static void __init sama7_dt_device_init(void)
> > -{
> > - of_platform_default_populate(NULL, NULL, NULL);
> > -}
> > -
> > static const char *const sama7_dt_board_compat[] __initconst = {
> > "microchip,sama7",
> > NULL
> > @@ -27,7 +19,6 @@ static const char *const sama7_dt_board_compat[] __initconst = {
> > DT_MACHINE_START(sama7_dt, "Microchip SAMA7")
> > /* Maintainer: Microchip */
> > .init_late = sama7_pm_init,
> > - .init_machine = sama7_dt_device_init,
> > .dt_compat = sama7_dt_board_compat,
> > MACHINE_END
> >
> >
> > --
> > 2.51.0
> >
> >
>