xref: /openbmc/linux/arch/arc/kernel/devtree.c (revision ecc23d0a422a3118fcf6e4f0a46e17a6c2047b02)
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