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