MIPS: ath79: Add basic device tree support
authorAlban Bedel <albeu@free.fr>
Sat, 30 May 2015 23:52:25 +0000 (01:52 +0200)
committerRalf Baechle <ralf@linux-mips.org>
Sun, 21 Jun 2015 19:54:01 +0000 (21:54 +0200)
Add the bare minimum to load a device tree.

Signed-off-by: Alban Bedel <albeu@free.fr>
Cc: linux-mips@linux-mips.org
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
arch/mips/Kconfig
arch/mips/ath79/machtypes.h
arch/mips/ath79/setup.c

index 733f6ac97f28da6e8ed01b9ae27b3365012dd7dc..164d8c73552fff501f34e1dc2c75ae8ffcbc189f 100644 (file)
@@ -134,6 +134,7 @@ config ATH79
        select SYS_SUPPORTS_BIG_ENDIAN
        select SYS_SUPPORTS_MIPS16
        select SYS_SUPPORTS_ZBOOT
+       select USE_OF
        help
          Support for the Atheros AR71XX/AR724X/AR913X SoCs.
 
index 26254058c545c6343b9435d4f8a7f9e3bd19b3e1..a13db3d15c8f5aa50fe0d42fbb3173a2d13633ec 100644 (file)
@@ -15,6 +15,7 @@
 #include <asm/mips_machine.h>
 
 enum ath79_mach_type {
+       ATH79_MACH_GENERIC_OF = -1,     /* Device tree board */
        ATH79_MACH_GENERIC = 0,
        ATH79_MACH_AP121,               /* Atheros AP121 reference board */
        ATH79_MACH_AP136_010,           /* Atheros AP136-010 reference board */
index 74f1af7eeefccb27a7c8af12a234cbae85c02bcb..01a644f174dd08e34843ca501035b077d777bea2 100644 (file)
 #include <linux/bootmem.h>
 #include <linux/err.h>
 #include <linux/clk.h>
+#include <linux/of_platform.h>
+#include <linux/of_fdt.h>
 
 #include <asm/bootinfo.h>
 #include <asm/idle.h>
 #include <asm/time.h>          /* for mips_hpt_frequency */
 #include <asm/reboot.h>                /* for _machine_{restart,halt} */
 #include <asm/mips_machine.h>
+#include <asm/prom.h>
+#include <asm/fw/fw.h>
 
 #include <asm/mach-ath79/ath79.h>
 #include <asm/mach-ath79/ar71xx_regs.h>
@@ -194,8 +198,19 @@ unsigned int get_c0_compare_int(void)
 
 void __init plat_mem_setup(void)
 {
+       unsigned long fdt_start;
+
        set_io_port_base(KSEG1);
 
+       /* Get the position of the FDT passed by the bootloader */
+       fdt_start = fw_getenvl("fdt_start");
+       if (fdt_start)
+               __dt_setup_arch((void *)KSEG0ADDR(fdt_start));
+#ifdef CONFIG_BUILTIN_DTB
+       else
+               __dt_setup_arch(__dtb_start);
+#endif
+
        ath79_reset_base = ioremap_nocache(AR71XX_RESET_BASE,
                                           AR71XX_RESET_SIZE);
        ath79_pll_base = ioremap_nocache(AR71XX_PLL_BASE,
@@ -203,7 +218,8 @@ void __init plat_mem_setup(void)
        ath79_ddr_ctrl_init();
 
        ath79_detect_sys_type();
-       detect_memory_region(0, ATH79_MEM_SIZE_MIN, ATH79_MEM_SIZE_MAX);
+       if (mips_machtype != ATH79_MACH_GENERIC_OF)
+               detect_memory_region(0, ATH79_MEM_SIZE_MIN, ATH79_MEM_SIZE_MAX);
 
        _machine_restart = ath79_restart;
        _machine_halt = ath79_halt;
@@ -235,6 +251,10 @@ void __init plat_time_init(void)
 
 static int __init ath79_setup(void)
 {
+       of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
+       if  (mips_machtype == ATH79_MACH_GENERIC_OF)
+               return 0;
+
        ath79_gpio_init();
        ath79_register_uart();
        ath79_register_wdt();
@@ -246,6 +266,11 @@ static int __init ath79_setup(void)
 
 arch_initcall(ath79_setup);
 
+void __init device_tree_init(void)
+{
+       unflatten_and_copy_device_tree();
+}
+
 static void __init ath79_generic_init(void)
 {
        /* Nothing to do */