ARC: [DeviceTree] Convert some Kconfig items to runtime values
Vineet Gupta [Fri, 18 Jan 2013 09:42:20 +0000 (14:42 +0530)]
* mem size now runtime configured (prev CONFIG_ARC_PLAT_SDRAM_SIZE)
* core cpu clk runtime configured (prev CONFIG_ARC_PLAT_CLK)

Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Grant Likely <grant.likely@secretlab.ca>

arch/arc/Kconfig
arch/arc/boot/dts/skeleton.dtsi
arch/arc/include/asm/clk.h
arch/arc/kernel/clk.c
arch/arc/kernel/devtree.c
arch/arc/mm/init.c

index 7666857..7db9785 100644 (file)
@@ -249,10 +249,6 @@ source "arch/arc/plat-arcfpga/Kconfig"
 
 #New platform adds here
 
-config ARC_PLAT_CLK
-       int "Clk speed in Hz"
-       default "80000000"
-
 config LINUX_LINK_BASE
        hex "Linux Link Address"
        default "0x80000000"
@@ -266,14 +262,6 @@ config LINUX_LINK_BASE
          Linux needs to be scooted a bit.
          If you don't know what the above means, leave this setting alone.
 
-config ARC_PLAT_SDRAM_SIZE
-       hex "SD RAM Size"
-       default "0x10000000"
-       help
-         Implies the amount of SDRAM/DRAM Linux is going to claim/own.
-         The actual memory itself could be larger than this number. But for
-         all software purposes, this is the amt of memory.
-
 endmenu # "Platform Board Configuration"
 
 config ARC_STACK_NONEXEC
index 9b357d8..eb8b773 100644 (file)
 
 / {
        compatible = "snps,arc";
+       clock-frequency = <80000000>;   /* 80 MHZ */
        #address-cells = <1>;
        #size-cells = <1>;
        chosen { };
        aliases { };
-       memory { device_type = "memory"; reg = <0 0>; };
+       memory {
+               device_type = "memory";
+               reg = <0x00000000 0x10000000>;  /* 256M */
+       };
 };
index 6195643..bf9d29f 100644 (file)
@@ -17,4 +17,6 @@ static inline unsigned long arc_get_core_freq(void)
        return core_freq;
 }
 
+extern int arc_set_core_freq(unsigned long);
+
 #endif
index 64925db..66ce0dc 100644 (file)
@@ -8,4 +8,14 @@
 
 #include <asm/clk.h>
 
-unsigned long core_freq = CONFIG_ARC_PLAT_CLK;
+unsigned long core_freq = 800000000;
+
+/*
+ * As of now we default to device-tree provided clock
+ * In future we can determine this in early boot
+ */
+int arc_set_core_freq(unsigned long freq)
+{
+       core_freq = freq;
+       return 0;
+}
index 48e157e..c8166dc 100644 (file)
@@ -15,6 +15,7 @@
 #include <linux/of.h>
 #include <linux/of_fdt.h>
 #include <asm/prom.h>
+#include <asm/clk.h>
 
 /* called from unflatten_device_tree() to bootstrap devicetree itself */
 void * __init early_init_dt_alloc_memory_arch(u64 size, u64 align)
@@ -34,7 +35,9 @@ int __init setup_machine_fdt(void *dt)
        struct boot_param_header *devtree = dt;
        unsigned long dt_root;
        char *model, *compat;
+       void *clk;
        char manufacturer[16];
+       unsigned long len;
 
        /* check device tree validity */
        if (be32_to_cpu(devtree->magic) != OF_DT_HEADER)
@@ -60,5 +63,15 @@ int __init setup_machine_fdt(void *dt)
        /* Retrieve various information from the /chosen node */
        of_scan_flat_dt(early_init_dt_scan_chosen, boot_command_line);
 
+       /* Initialize {size,address}-cells info */
+       of_scan_flat_dt(early_init_dt_scan_root, NULL);
+
+       /* Setup memory, calling early_init_dt_add_memory_arch */
+       of_scan_flat_dt(early_init_dt_scan_memory, NULL);
+
+       clk = of_get_flat_dt_prop(dt_root, "clock-frequency", &len);
+       if (clk)
+               arc_set_core_freq(of_read_ulong(clk, len/4));
+
        return 0;
 }
index 682cf57..caf797d 100644 (file)
@@ -25,7 +25,7 @@ char empty_zero_page[PAGE_SIZE] __aligned(PAGE_SIZE);
 EXPORT_SYMBOL(empty_zero_page);
 
 /* Default tot mem from .config */
-static unsigned long arc_mem_sz = CONFIG_ARC_PLAT_SDRAM_SIZE;
+static unsigned long arc_mem_sz = 0x20000000;  /* some default */
 
 /* User can over-ride above with "mem=nnn[KkMm]" in cmdline */
 static int __init setup_mem_sz(char *str)
@@ -41,7 +41,8 @@ early_param("mem", setup_mem_sz);
 
 void __init early_init_dt_add_memory_arch(u64 base, u64 size)
 {
-       pr_err("%s(%llx, %llx)\n", __func__, base, size);
+       arc_mem_sz = size & PAGE_MASK;
+       pr_info("Memory size set via devicetree %ldM\n", TO_MB(arc_mem_sz));
 }
 
 /*
@@ -62,7 +63,9 @@ void __init setup_arch_memory(void)
 
        /*
         * We do it here, so that memory is correctly instantiated
-        * even if "mem=xxx" cmline over-ride is not given
+        * even if "mem=xxx" cmline over-ride is given and/or
+        * DT has memory node. Each causes an update to @arc_mem_sz
+        * and we finally add memory one here
         */
        memblock_add(CONFIG_LINUX_LINK_BASE, arc_mem_sz);