diff options
| -rw-r--r-- | arch/arc/include/asm/serial.h | 23 | ||||
| -rw-r--r-- | arch/arc/kernel/devtree.c | 24 |
2 files changed, 29 insertions, 18 deletions
diff --git a/arch/arc/include/asm/serial.h b/arch/arc/include/asm/serial.h index 602b0970a764..744a6ae15754 100644 --- a/arch/arc/include/asm/serial.h +++ b/arch/arc/include/asm/serial.h | |||
| @@ -10,26 +10,13 @@ | |||
| 10 | #define _ASM_ARC_SERIAL_H | 10 | #define _ASM_ARC_SERIAL_H |
| 11 | 11 | ||
| 12 | /* | 12 | /* |
| 13 | * early-8250 requires BASE_BAUD to be defined and includes this header. | 13 | * early 8250 (now earlycon) requires BASE_BAUD to be defined in this header. |
| 14 | * We put in a typical value: | 14 | * However to still determine it dynamically (for multi-platform images) |
| 15 | * (core clk / 16) - i.e. UART samples 16 times per sec. | 15 | * we do this in a helper by parsing the FDT early |
| 16 | * Athough in multi-platform-image this might not work, specially if the | ||
| 17 | * clk driving the UART is different. | ||
| 18 | * We can't use DeviceTree as this is typically for early serial. | ||
| 19 | */ | 16 | */ |
| 20 | 17 | ||
| 21 | #include <asm/clk.h> | 18 | extern unsigned int __init arc_early_base_baud(void); |
| 22 | 19 | ||
| 23 | #define BASE_BAUD (arc_get_core_freq() / 16) | 20 | #define BASE_BAUD arc_early_base_baud() |
| 24 | |||
| 25 | /* | ||
| 26 | * This is definitely going to break early 8250 consoles on multi-platform | ||
| 27 | * images but hey, it won't add any code complexity for a debug feature of | ||
| 28 | * one broken driver. | ||
| 29 | */ | ||
| 30 | #ifdef CONFIG_ARC_PLAT_TB10X | ||
| 31 | #undef BASE_BAUD | ||
| 32 | #define BASE_BAUD (arc_get_core_freq() / 16 / 3) | ||
| 33 | #endif | ||
| 34 | 21 | ||
| 35 | #endif /* _ASM_ARC_SERIAL_H */ | 22 | #endif /* _ASM_ARC_SERIAL_H */ |
diff --git a/arch/arc/kernel/devtree.c b/arch/arc/kernel/devtree.c index fffdb5e41b20..5036d4c06996 100644 --- a/arch/arc/kernel/devtree.c +++ b/arch/arc/kernel/devtree.c | |||
| @@ -17,6 +17,28 @@ | |||
| 17 | #include <asm/clk.h> | 17 | #include <asm/clk.h> |
| 18 | #include <asm/mach_desc.h> | 18 | #include <asm/mach_desc.h> |
| 19 | 19 | ||
| 20 | #ifdef CONFIG_SERIAL_8250_CONSOLE | ||
| 21 | |||
| 22 | static unsigned int __initdata arc_base_baud; | ||
| 23 | |||
| 24 | unsigned int __init arc_early_base_baud(void) | ||
| 25 | { | ||
| 26 | return arc_base_baud/16; | ||
| 27 | } | ||
| 28 | |||
| 29 | static void __init arc_set_early_base_baud(unsigned long dt_root) | ||
| 30 | { | ||
| 31 | unsigned int core_clk = arc_get_core_freq(); | ||
| 32 | |||
| 33 | if (of_flat_dt_is_compatible(dt_root, "abilis,arc-tb10x")) | ||
| 34 | arc_base_baud = core_clk/3; | ||
| 35 | else | ||
| 36 | arc_base_baud = core_clk; | ||
| 37 | } | ||
| 38 | #else | ||
| 39 | #define arc_set_early_base_baud(dt_root) | ||
| 40 | #endif | ||
| 41 | |||
| 20 | static const void * __init arch_get_next_mach(const char *const **match) | 42 | static const void * __init arch_get_next_mach(const char *const **match) |
| 21 | { | 43 | { |
| 22 | static const struct machine_desc *mdesc = __arch_info_begin; | 44 | static const struct machine_desc *mdesc = __arch_info_begin; |
| @@ -56,5 +78,7 @@ const struct machine_desc * __init setup_machine_fdt(void *dt) | |||
| 56 | if (clk) | 78 | if (clk) |
| 57 | arc_set_core_freq(of_read_ulong(clk, len/4)); | 79 | arc_set_core_freq(of_read_ulong(clk, len/4)); |
| 58 | 80 | ||
| 81 | arc_set_early_base_baud(dt_root); | ||
| 82 | |||
| 59 | return mdesc; | 83 | return mdesc; |
| 60 | } | 84 | } |
