1 /* 2 * Gemini Device Tree boot support 3 */ 4 #include <linux/kernel.h> 5 #include <linux/init.h> 6 #include <linux/io.h> 7 8 #include <asm/mach/arch.h> 9 #include <asm/mach/map.h> 10 #include <asm/system_misc.h> 11 #include <asm/proc-fns.h> 12 13 #ifdef CONFIG_DEBUG_GEMINI 14 /* This is needed for LL-debug/earlyprintk/debug-macro.S */ 15 static struct map_desc gemini_io_desc[] __initdata = { 16 { 17 .virtual = CONFIG_DEBUG_UART_VIRT, 18 .pfn = __phys_to_pfn(CONFIG_DEBUG_UART_PHYS), 19 .length = SZ_4K, 20 .type = MT_DEVICE, 21 }, 22 }; 23 24 static void __init gemini_map_io(void) 25 { 26 iotable_init(gemini_io_desc, ARRAY_SIZE(gemini_io_desc)); 27 } 28 #else 29 #define gemini_map_io NULL 30 #endif 31 32 static void gemini_idle(void) 33 { 34 /* 35 * Because of broken hardware we have to enable interrupts or the CPU 36 * will never wakeup... Acctualy it is not very good to enable 37 * interrupts first since scheduler can miss a tick, but there is 38 * no other way around this. Platforms that needs it for power saving 39 * should enable it in init code, since by default it is 40 * disabled. 41 */ 42 43 /* FIXME: Enabling interrupts here is racy! */ 44 local_irq_enable(); 45 cpu_do_idle(); 46 } 47 48 static void __init gemini_init_machine(void) 49 { 50 arm_pm_idle = gemini_idle; 51 } 52 53 static const char *gemini_board_compat[] = { 54 "cortina,gemini", 55 NULL, 56 }; 57 58 DT_MACHINE_START(GEMINI_DT, "Gemini (Device Tree)") 59 .map_io = gemini_map_io, 60 .init_machine = gemini_init_machine, 61 .dt_compat = gemini_board_compat, 62 MACHINE_END 63