Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/arch/arc/kernel/devtree.c
26439 views
1
// SPDX-License-Identifier: GPL-2.0-only
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; /* Fixed 166.6MHz clk (TB10x) */
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; /* Fixed 33MHz clk (AXS10x & HSDK) */
33
else
34
arc_base_baud = 50000000; /* Fixed default 50MHz */
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
}
77
78