diff options
author | Pali Rohár <pali@kernel.org> | 2021-05-14 15:52:11 +0200 |
---|---|---|
committer | Pali Rohár <pali@kernel.org> | 2021-06-02 14:19:52 +0100 |
commit | 5a91c439cbeb1f64b8b9830de91efad5113d3c89 (patch) | |
tree | 331a918c1e5300656a7ad1c766ed2f5d7ebf3471 /plat/marvell/armada | |
parent | 3133625859b74df42deddd80b705578af6fc2fea (diff) | |
download | arm-trusted-firmware-5a91c439cbeb1f64b8b9830de91efad5113d3c89.tar.gz |
fix(plat/marvell/a3720/uart): fix UART parent clock rate determination
The UART code for the A3K platform assumes that UART parent clock rate
is always 25 MHz. This is incorrect, because the xtal clock can also run
at 40 MHz (this is board specific).
The frequency of the xtal clock is determined by a value on a strapping
pin during SOC reset. The code to determine this frequency is already in
A3K's comphy driver.
Move the get_ref_clk() function from the comphy driver to a separate
file and use it for UART parent clock rate determination.
Signed-off-by: Pali Rohár <pali@kernel.org>
Change-Id: I8bb18a2d020ef18fe65aa06ffa4ab205c71be92e
Diffstat (limited to 'plat/marvell/armada')
5 files changed, 46 insertions, 2 deletions
diff --git a/plat/marvell/armada/a3k/common/a3700_common.mk b/plat/marvell/armada/a3k/common/a3700_common.mk index 79097f399..7d95e4827 100644 --- a/plat/marvell/armada/a3k/common/a3700_common.mk +++ b/plat/marvell/armada/a3k/common/a3700_common.mk @@ -38,6 +38,7 @@ PLAT_INCLUDES := -I$(PLAT_FAMILY_BASE)/$(PLAT) \ -I$/drivers/arm/gic/common/ PLAT_BL_COMMON_SOURCES := $(PLAT_COMMON_BASE)/aarch64/a3700_common.c \ + $(PLAT_COMMON_BASE)/aarch64/a3700_clock.S \ $(MARVELL_DRV_BASE)/uart/a3700_console.S BL1_SOURCES += $(PLAT_COMMON_BASE)/aarch64/plat_helpers.S \ diff --git a/plat/marvell/armada/a3k/common/aarch64/a3700_clock.S b/plat/marvell/armada/a3k/common/aarch64/a3700_clock.S new file mode 100644 index 000000000..f79516f5c --- /dev/null +++ b/plat/marvell/armada/a3k/common/aarch64/a3700_clock.S @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2018 Marvell International Ltd. + * + * SPDX-License-Identifier: BSD-3-Clause + * https://spdx.org/licenses + */ + +#include <asm_macros.S> +#include <platform_def.h> + +/* + * Below address in used only for reading, therefore no problem with concurrent + * Linux access. + */ +#define MVEBU_TEST_PIN_LATCH_N (MVEBU_NB_GPIO_REG_BASE + 0x8) + #define MVEBU_XTAL_MODE_MASK BIT(9) + + /* ----------------------------------------------------- + * uint32_t get_ref_clk (void); + * + * returns reference clock in MHz (25 or 40) + * ----------------------------------------------------- + */ +.globl get_ref_clk +func get_ref_clk + mov_imm x0, MVEBU_TEST_PIN_LATCH_N + ldr w0, [x0] + tst w0, #MVEBU_XTAL_MODE_MASK + bne 40 + mov w0, #25 + ret +40: + mov w0, #40 + ret +endfunc get_ref_clk diff --git a/plat/marvell/armada/a3k/common/include/platform_def.h b/plat/marvell/armada/a3k/common/include/platform_def.h index f8eb06153..f19d96b2c 100644 --- a/plat/marvell/armada/a3k/common/include/platform_def.h +++ b/plat/marvell/armada/a3k/common/include/platform_def.h @@ -164,7 +164,6 @@ * PL011 related constants */ #define PLAT_MARVELL_UART_BASE (MVEBU_REGS_BASE + 0x12000) -#define PLAT_MARVELL_UART_CLK_IN_HZ 25000000 /* Required platform porting definitions */ #define PLAT_MAX_PWR_LVL MPIDR_AFFLVL1 diff --git a/plat/marvell/armada/common/aarch64/marvell_helpers.S b/plat/marvell/armada/common/aarch64/marvell_helpers.S index 71516bb28..3038ec098 100644 --- a/plat/marvell/armada/common/aarch64/marvell_helpers.S +++ b/plat/marvell/armada/common/aarch64/marvell_helpers.S @@ -63,8 +63,16 @@ endfunc plat_marvell_calc_core_pos * --------------------------------------------- */ func plat_crash_console_init - mov_imm x0, PLAT_MARVELL_UART_BASE +#ifdef PLAT_a3700 + mov x1, x30 + bl get_ref_clk + mov x30, x1 + mov_imm x1, 1000000 + mul x1, x0, x1 +#else mov_imm x1, PLAT_MARVELL_UART_CLK_IN_HZ +#endif + mov_imm x0, PLAT_MARVELL_UART_BASE mov_imm x2, MARVELL_CONSOLE_BAUDRATE #ifdef PLAT_a3700 b console_a3700_core_init diff --git a/plat/marvell/armada/common/marvell_console.c b/plat/marvell/armada/common/marvell_console.c index 6829658fa..ef54bff40 100644 --- a/plat/marvell/armada/common/marvell_console.c +++ b/plat/marvell/armada/common/marvell_console.c @@ -14,6 +14,7 @@ #ifdef PLAT_a3700 #include <drivers/marvell/uart/a3700_console.h> +#define PLAT_MARVELL_UART_CLK_IN_HZ (get_ref_clk() * 1000000) #define console_marvell_register console_a3700_register #else #include <drivers/ti/uart/uart_16550.h> |