1d2912cb1SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
2999159a5SVineet Gupta /*
3999159a5SVineet Gupta * Copyright (C) 2012 Synopsys, Inc. (www.synopsys.com)
4999159a5SVineet Gupta *
5999159a5SVineet Gupta * Based on reduced version of METAG
6999159a5SVineet Gupta */
7999159a5SVineet Gupta
8999159a5SVineet Gupta
9999159a5SVineet Gupta #include <linux/init.h>
10999159a5SVineet Gupta #include <linux/reboot.h>
11999159a5SVineet Gupta #include <linux/memblock.h>
12999159a5SVineet Gupta #include <linux/of.h>
13999159a5SVineet Gupta #include <linux/of_fdt.h>
1403a6d28cSVineet Gupta #include <asm/mach_desc.h>
154d369680SVineet Gupta #include <asm/serial.h>
16999159a5SVineet Gupta
17091f56beSPeter Hurley #ifdef CONFIG_SERIAL_EARLYCON
18ffb7fcd6SVineet Gupta
19ffb7fcd6SVineet Gupta static unsigned int __initdata arc_base_baud;
20ffb7fcd6SVineet Gupta
arc_early_base_baud(void)21ffb7fcd6SVineet Gupta unsigned int __init arc_early_base_baud(void)
22ffb7fcd6SVineet Gupta {
23ffb7fcd6SVineet Gupta return arc_base_baud/16;
24ffb7fcd6SVineet Gupta }
25ffb7fcd6SVineet Gupta
arc_set_early_base_baud(unsigned long dt_root)26ffb7fcd6SVineet Gupta static void __init arc_set_early_base_baud(unsigned long dt_root)
27ffb7fcd6SVineet Gupta {
28ffb7fcd6SVineet Gupta if (of_flat_dt_is_compatible(dt_root, "abilis,arc-tb10x"))
290e6e9b64SAlexey Brodkin arc_base_baud = 166666666; /* Fixed 166.6MHz clk (TB10x) */
30a518d637SAlexey Brodkin else if (of_flat_dt_is_compatible(dt_root, "snps,arc-sdp") ||
31a518d637SAlexey Brodkin of_flat_dt_is_compatible(dt_root, "snps,hsdk"))
32a518d637SAlexey Brodkin arc_base_baud = 33333333; /* Fixed 33MHz clk (AXS10x & HSDK) */
33ffb7fcd6SVineet Gupta else
340e6e9b64SAlexey Brodkin arc_base_baud = 50000000; /* Fixed default 50MHz */
35ffb7fcd6SVineet Gupta }
36ffb7fcd6SVineet Gupta #else
37ffb7fcd6SVineet Gupta #define arc_set_early_base_baud(dt_root)
38ffb7fcd6SVineet Gupta #endif
39ffb7fcd6SVineet Gupta
arch_get_next_mach(const char * const ** match)40880beb88SRob Herring static const void * __init arch_get_next_mach(const char *const **match)
41880beb88SRob Herring {
42880beb88SRob Herring static const struct machine_desc *mdesc = __arch_info_begin;
43880beb88SRob Herring const struct machine_desc *m = mdesc;
44880beb88SRob Herring
45880beb88SRob Herring if (m >= __arch_info_end)
46880beb88SRob Herring return NULL;
47880beb88SRob Herring
48880beb88SRob Herring mdesc++;
49880beb88SRob Herring *match = m->dt_compat;
50880beb88SRob Herring return m;
51880beb88SRob Herring }
52880beb88SRob Herring
53999159a5SVineet Gupta /**
54999159a5SVineet Gupta * setup_machine_fdt - Machine setup when an dtb was passed to the kernel
55999159a5SVineet Gupta * @dt: virtual address pointer to dt blob
56999159a5SVineet Gupta *
57999159a5SVineet Gupta * If a dtb was passed to the kernel, then use it to choose the correct
58999159a5SVineet Gupta * machine_desc and to setup the system.
59999159a5SVineet Gupta */
setup_machine_fdt(void * dt)60880beb88SRob Herring const struct machine_desc * __init setup_machine_fdt(void *dt)
61999159a5SVineet Gupta {
62880beb88SRob Herring const struct machine_desc *mdesc;
63999159a5SVineet Gupta unsigned long dt_root;
64999159a5SVineet Gupta
65*1103d3b5SUsama Arif if (!early_init_dt_scan(dt, __pa(dt)))
6603a6d28cSVineet Gupta return NULL;
67999159a5SVineet Gupta
68880beb88SRob Herring mdesc = of_flat_dt_match_machine(NULL, arch_get_next_mach);
69880beb88SRob Herring if (!mdesc)
7003a6d28cSVineet Gupta machine_halt();
7103a6d28cSVineet Gupta
72880beb88SRob Herring dt_root = of_get_flat_dt_root();
73ffb7fcd6SVineet Gupta arc_set_early_base_baud(dt_root);
74ffb7fcd6SVineet Gupta
75880beb88SRob Herring return mdesc;
76999159a5SVineet Gupta }
77