ARM: 6771/1: vexpress: add support for multiple core tiles
[deliverable/linux.git] / arch / arm / mach-vexpress / v2m.c
index 63ef663fb0be7faa6a97c056d71c40b87b378b47..ba46e8e0743713b4ddbfed79c2615600b8e37506 100644 (file)
@@ -14,7 +14,9 @@
 #include <linux/usb/isp1760.h>
 #include <linux/clkdev.h>
 
+#include <asm/mach-types.h>
 #include <asm/sizes.h>
+#include <asm/mach/arch.h>
 #include <asm/mach/flash.h>
 #include <asm/mach/map.h>
 #include <asm/mach/time.h>
@@ -22,6 +24,7 @@
 #include <asm/hardware/timer-sp.h>
 #include <asm/hardware/sp810.h>
 
+#include <mach/ct-ca9x4.h>
 #include <mach/motherboard.h>
 
 #include <plat/sched_clock.h>
@@ -43,14 +46,9 @@ static struct map_desc v2m_io_desc[] __initdata = {
        },
 };
 
-void __init v2m_map_io(struct map_desc *tile, size_t num)
-{
-       iotable_init(v2m_io_desc, ARRAY_SIZE(v2m_io_desc));
-       iotable_init(tile, num);
-}
-
-void __init v2m_init_early(void)
+static void __init v2m_init_early(void)
 {
+       ct_desc->init_early();
        versatile_sched_clock_init(MMIO_P2V(V2M_SYS_24MHZ), 24000000);
 }
 
@@ -71,7 +69,7 @@ static void __init v2m_timer_init(void)
        sp804_clockevents_init(MMIO_P2V(V2M_TIMER0), IRQ_V2M_TIMER0);
 }
 
-struct sys_timer v2m_timer = {
+static struct sys_timer v2m_timer = {
        .init   = v2m_timer_init,
 };
 
@@ -380,7 +378,44 @@ static void v2m_restart(char str, const char *cmd)
                printk(KERN_EMERG "Unable to reboot\n");
 }
 
-static int __init v2m_init(void)
+struct ct_desc *ct_desc;
+
+static struct ct_desc *ct_descs[] __initdata = {
+#ifdef CONFIG_ARCH_VEXPRESS_CA9X4
+       &ct_ca9x4_desc,
+#endif
+};
+
+static void __init v2m_populate_ct_desc(void)
+{
+       int i;
+       u32 current_tile_id;
+
+       ct_desc = NULL;
+       current_tile_id = readl(MMIO_P2V(V2M_SYS_PROCID0)) & V2M_CT_ID_MASK;
+
+       for (i = 0; i < ARRAY_SIZE(ct_descs) && !ct_desc; ++i)
+               if (ct_descs[i]->id == current_tile_id)
+                       ct_desc = ct_descs[i];
+
+       if (!ct_desc)
+               panic("vexpress: failed to populate core tile description "
+                     "for tile ID 0x%8x\n", current_tile_id);
+}
+
+static void __init v2m_map_io(void)
+{
+       iotable_init(v2m_io_desc, ARRAY_SIZE(v2m_io_desc));
+       v2m_populate_ct_desc();
+       ct_desc->map_io();
+}
+
+static void __init v2m_init_irq(void)
+{
+       ct_desc->init_irq();
+}
+
+static void __init v2m_init(void)
 {
        int i;
 
@@ -399,6 +434,14 @@ static int __init v2m_init(void)
        pm_power_off = v2m_power_off;
        arm_pm_restart = v2m_restart;
 
-       return 0;
+       ct_desc->init_tile();
 }
-arch_initcall(v2m_init);
+
+MACHINE_START(VEXPRESS, "ARM-Versatile Express")
+       .boot_params    = PLAT_PHYS_OFFSET + 0x00000100,
+       .map_io         = v2m_map_io,
+       .init_early     = v2m_init_early,
+       .init_irq       = v2m_init_irq,
+       .timer          = &v2m_timer,
+       .init_machine   = v2m_init,
+MACHINE_END
This page took 0.026463 seconds and 5 git commands to generate.