The newly added device tree based first stage fails to load the second
stage from MMC, which might be in relation to a preceding atmel_mci
"command/data timeout" message.

Due to this and because it's not clear yet how viable it's to use the device
tree for the size-constrained first stage anyway, make CONFIG_OFDEVICE
configurable and provide a legacy board code based fallback whenever it's
unselected. The resulting image is 48K big with PBL_CONSOLE compared to
72K for the device tree based version without PBL_CONSOLE.

If barebox can be shrunk further and the device tree support in the
first stage was fixed, this commit could be reverted for full device
tree goodness.

The board code is a stripped down version of the sama5d3_xplained board's.

Signed-off-by: Ahmad Fatoum <a.fat...@pengutronix.de>
---
 .../arm/boards/microchip-ksz9477-evb/Makefile |   3 +
 arch/arm/boards/microchip-ksz9477-evb/board.c | 129 ++++++++++++++++++
 .../boards/microchip-ksz9477-evb/lowlevel.c   |   3 +-
 ...rochip_ksz9477_evb_bootstrap_mmc_defconfig |  24 ++++
 arch/arm/mach-at91/Kconfig                    |  14 +-
 5 files changed, 169 insertions(+), 4 deletions(-)
 create mode 100644 arch/arm/boards/microchip-ksz9477-evb/board.c
 create mode 100644 
arch/arm/configs/microchip_ksz9477_evb_bootstrap_mmc_defconfig

diff --git a/arch/arm/boards/microchip-ksz9477-evb/Makefile 
b/arch/arm/boards/microchip-ksz9477-evb/Makefile
index b08c4a93ca27..8d0379a3f59f 100644
--- a/arch/arm/boards/microchip-ksz9477-evb/Makefile
+++ b/arch/arm/boards/microchip-ksz9477-evb/Makefile
@@ -1 +1,4 @@
 lwl-y += lowlevel.o
+ifeq ($(CONFIG_MACH_MICROCHIP_KSZ9477_EVB_DT),)
+obj-y += board.o
+endif
diff --git a/arch/arm/boards/microchip-ksz9477-evb/board.c 
b/arch/arm/boards/microchip-ksz9477-evb/board.c
new file mode 100644
index 000000000000..b5c95c5efba3
--- /dev/null
+++ b/arch/arm/boards/microchip-ksz9477-evb/board.c
@@ -0,0 +1,129 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2014 Bo Shen <voice.s...@gmail.com>
+ */
+
+#include <init.h>
+#include <mach/board.h>
+#include <mach/iomux.h>
+
+#if defined(CONFIG_NAND_ATMEL)
+static struct atmel_nand_data nand_pdata = {
+       .ale            = 21,
+       .cle            = 22,
+       .det_pin        = -EINVAL,
+       .rdy_pin        = -EINVAL,
+       .enable_pin     = -EINVAL,
+       .ecc_mode       = NAND_ECC_HW,
+       .has_pmecc      = 1,
+       .pmecc_sector_size = 512,
+       .pmecc_corr_cap = 4,
+#if defined(CONFIG_MTD_NAND_ATMEL_BUSWIDTH_16)
+       .bus_width_16   = 1,
+#endif
+       .on_flash_bbt   = 1,
+};
+
+static struct sam9_smc_config sama5d3_xplained_nand_smc_config = {
+       .ncs_read_setup         = 1,
+       .nrd_setup              = 2,
+       .ncs_write_setup        = 1,
+       .nwe_setup              = 2,
+
+       .ncs_read_pulse         = 5,
+       .nrd_pulse              = 3,
+       .ncs_write_pulse        = 5,
+       .nwe_pulse              = 3,
+
+       .read_cycle             = 8,
+       .write_cycle            = 8,
+
+       .mode                   = AT91_SMC_READMODE | AT91_SMC_WRITEMODE | 
AT91_SMC_EXNWMODE_DISABLE,
+       .tdf_cycles             = 3,
+
+       .tclr                   = 3,
+       .tadl                   = 10,
+       .tar                    = 3,
+       .ocms                   = 0,
+       .trr                    = 4,
+       .twb                    = 5,
+       .rbnsel                 = 3,
+       .nfsel                  = 1
+};
+
+static void ek_add_device_nand(void)
+{
+       struct clk *clk = clk_get(NULL, "smc_clk");
+
+       clk_enable(clk);
+
+       /* setup bus-width (8 or 16) */
+       if (nand_pdata.bus_width_16)
+               sama5d3_xplained_nand_smc_config.mode |= AT91_SMC_DBW_16;
+       else
+               sama5d3_xplained_nand_smc_config.mode |= AT91_SMC_DBW_8;
+
+       /* configure chip-select 3 (NAND) */
+       sama5_smc_configure(0, 3, &sama5d3_xplained_nand_smc_config);
+
+       at91_add_device_nand(&nand_pdata);
+}
+#else
+static void ek_add_device_nand(void) {}
+#endif
+
+#if defined(CONFIG_MCI_ATMEL)
+/*
+ * MCI (SD/MMC)
+ */
+static struct atmel_mci_platform_data mci0_data = {
+       .bus_width      = 8,
+       .detect_pin     = AT91_PIN_PE0,
+       .wp_pin         = -EINVAL,
+};
+
+static void ek_add_device_mci(void)
+{
+       /* MMC0 */
+       at91_add_device_mci(0, &mci0_data);
+}
+#else
+static void ek_add_device_mci(void) {}
+#endif
+
+static int sama5d3_xplained_mem_init(void)
+{
+       at91_add_device_sdram(0);
+
+       return 0;
+}
+mem_initcall(sama5d3_xplained_mem_init);
+
+static const struct devfs_partition sama5d3_xplained_nand0_partitions[] = {
+       {
+               .offset = 0x00000,
+               .size = SZ_256K,
+               .flags = DEVFS_PARTITION_FIXED,
+               .name = "at91bootstrap_raw",
+               .bbname = "at91bootstrap",
+       }, {
+               .offset = DEVFS_PARTITION_APPEND, /* 256 KiB */
+               .size = SZ_1M,
+               .flags = DEVFS_PARTITION_FIXED,
+               .name = "self_raw",
+               .bbname = "self0",
+       }, {
+               /* sentinel */
+       }
+};
+
+static int sama5d3_xplained_devices_init(void)
+{
+       ek_add_device_nand();
+       ek_add_device_mci();
+
+       devfs_create_partitions("nand0", sama5d3_xplained_nand0_partitions);
+
+       return 0;
+}
+device_initcall(sama5d3_xplained_devices_init);
diff --git a/arch/arm/boards/microchip-ksz9477-evb/lowlevel.c 
b/arch/arm/boards/microchip-ksz9477-evb/lowlevel.c
index 2813743c0765..92c5ce40977f 100644
--- a/arch/arm/boards/microchip-ksz9477-evb/lowlevel.c
+++ b/arch/arm/boards/microchip-ksz9477-evb/lowlevel.c
@@ -181,7 +181,8 @@ static noinline void board_init(void)
 
        sama5d3_ddramc_init();
 
-       fdt = __dtb_z_at91_microchip_ksz9477_evb_boot_bin_start + 
get_runtime_offset();
+       if (IS_ENABLED(CONFIG_MACH_MICROCHIP_KSZ9477_EVB_DT))
+               fdt = __dtb_z_at91_microchip_ksz9477_evb_boot_bin_start + 
get_runtime_offset();
 
        barebox_arm_entry(SAMA5_DDRCS, SZ_256M, fdt);
 }
diff --git a/arch/arm/configs/microchip_ksz9477_evb_bootstrap_mmc_defconfig 
b/arch/arm/configs/microchip_ksz9477_evb_bootstrap_mmc_defconfig
new file mode 100644
index 000000000000..8af85bc10613
--- /dev/null
+++ b/arch/arm/configs/microchip_ksz9477_evb_bootstrap_mmc_defconfig
@@ -0,0 +1,24 @@
+CONFIG_ARCH_SAMA5D3=y
+CONFIG_AT91_MULTI_BOARDS=y
+CONFIG_MACH_MICROCHIP_KSZ9477_EVB=y
+CONFIG_AT91_BOOTSTRAP=y
+CONFIG_MALLOC_TLSF=y
+CONFIG_RELOCATABLE=y
+CONFIG_PROMPT="BOOT.BIN:"
+CONFIG_SHELL_NONE=y
+# CONFIG_TIMESTAMP is not set
+CONFIG_CONSOLE_SIMPLE=y
+CONFIG_PBL_CONSOLE=y
+CONFIG_DEFAULT_LOGLEVEL=6
+CONFIG_DEBUG_LL=y
+# CONFIG_SPI is not set
+CONFIG_MCI=y
+CONFIG_MCI_STARTUP=y
+# CONFIG_MCI_WRITE is not set
+CONFIG_MCI_ATMEL=y
+CONFIG_MFD_SYSCON=y
+# CONFIG_FS_RAMFS is not set
+# CONFIG_FS_DEVFS is not set
+CONFIG_FS_FAT=y
+CONFIG_BOOTSTRAP_DEVFS=y
+CONFIG_BOOTSTRAP_DISK=y
diff --git a/arch/arm/mach-at91/Kconfig b/arch/arm/mach-at91/Kconfig
index 5d5b4f2b6e60..699e4df183ba 100644
--- a/arch/arm/mach-at91/Kconfig
+++ b/arch/arm/mach-at91/Kconfig
@@ -26,6 +26,15 @@ config MACH_AT91SAM9263EK_DT
          Enabled for at91sam9263ek - evaluation kit.
          But only if we need the device tree (bootstrap do not use DT)
 
+config MACH_MICROCHIP_KSZ9477_EVB_DT
+       def_bool y
+       depends on MACH_MICROCHIP_KSZ9477_EVB && OFDEVICE
+       select ARM_USE_COMPRESSED_DTB
+       help
+         Enabled for Microchip KSZ9477 - evaluation kit.
+         But only if we need the device tree (bootstrap doesn't yet work with
+         DT)
+
 config HAVE_AT91_SMD
        bool
 
@@ -554,9 +563,8 @@ config MACH_AT91SAM9X5EK
 config MACH_MICROCHIP_KSZ9477_EVB
        bool "Microchip EVB-KSZ9477 Evaluation Kit"
        depends on ARCH_SAMA5D3
-       select OFDEVICE
-       select COMMON_CLK_OF_PROVIDER
-       select ARM_USE_COMPRESSED_DTB
+       select OFDEVICE if !AT91_LOAD_BAREBOX_SRAM
+       select COMMON_CLK_OF_PROVIDER if OFDEVICE
        select HAVE_AT91_BOOTSTRAP
        help
          Select this if you are using Microchip's EVB-KSZ9477 Evaluation Kit.
-- 
2.20.1


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

Reply via email to