| 1 | |
| 2 | |
| 3 | * Copyright (C) 2012 Synopsys, Inc. (www.synopsys.com)
|
| 4 | *
|
| 5 | * Based on reduced version of METAG
|
| 6 |
|
| 7 |
|
| 8 |
|
| 9 | #include <linux/init.h>
|
| 10 | #include <linux/reboot.h>
|
| 11 | #include <linux/memblock.h>
|
| 12 | #include <linux/of.h>
|
| 13 | #include <linux/of_fdt.h>
|
| 14 | #include <asm/mach_desc.h>
|
| 15 | #include <asm/serial.h>
|
| 16 |
|
| 17 | #ifdef CONFIG_SERIAL_EARLYCON
|
| 18 |
|
| 19 | static unsigned int __initdata arc_base_baud;
|
| 20 |
|
| 21 | unsigned int __init arc_early_base_baud(void)
|
| 22 | {
|
| 23 | return arc_base_baud/16;
|
| 24 | }
|
| 25 |
|
| 26 | static void __init arc_set_early_base_baud(unsigned long dt_root)
|
| 27 | {
|
| 28 | if (of_flat_dt_is_compatible(dt_root, "abilis,arc-tb10x"))
|
| 29 | arc_base_baud = 166666666;
|
| 30 | else if (of_flat_dt_is_compatible(dt_root, "snps,arc-sdp") ||
|
| 31 | of_flat_dt_is_compatible(dt_root, "snps,hsdk"))
|
| 32 | arc_base_baud = 33333333;
|
| 33 | else
|
| 34 | arc_base_baud = 50000000;
|
| 35 | }
|
| 36 | #else
|
| 37 | #define arc_set_early_base_baud(dt_root)
|
| 38 | #endif
|
| 39 |
|
| 40 | static const void * __init arch_get_next_mach(const char *const **match)
|
| 41 | {
|
| 42 | static const struct machine_desc *mdesc = __arch_info_begin;
|
| 43 | const struct machine_desc *m = mdesc;
|
| 44 |
|
| 45 | if (m >= __arch_info_end)
|
| 46 | return NULL;
|
| 47 |
|
| 48 | mdesc++;
|
| 49 | *match = m->dt_compat;
|
| 50 | return m;
|
| 51 | }
|
| 52 |
|
| 53 | |
| 54 | * setup_machine_fdt - Machine setup when an dtb was passed to the kernel
|
| 55 | * @dt: virtual address pointer to dt blob
|
| 56 | *
|
| 57 | * If a dtb was passed to the kernel, then use it to choose the correct
|
| 58 | * machine_desc and to setup the system.
|
| 59 |
|
| 60 | const struct machine_desc * __init setup_machine_fdt(void *dt)
|
| 61 | {
|
| 62 | const struct machine_desc *mdesc;
|
| 63 | unsigned long dt_root;
|
| 64 |
|
| 65 | if (!early_init_dt_scan(dt, __pa(dt)))
|
| 66 | return NULL;
|
| 67 |
|
| 68 | mdesc = of_flat_dt_match_machine(NULL, arch_get_next_mach);
|
| 69 | if (!mdesc)
|
| 70 | machine_halt();
|
| 71 |
|
| 72 | dt_root = of_get_flat_dt_root();
|
| 73 | arc_set_early_base_baud(dt_root);
|
| 74 |
|
| 75 | return mdesc;
|
| 76 | }
|