diff options
| author | Stepan Moskovchenko <stepanm@codeaurora.org> | 2014-06-02 15:26:29 -0700 |
|---|---|---|
| committer | Stepan Moskovchenko <stepanm@codeaurora.org> | 2014-06-02 15:30:59 -0700 |
| commit | da5784d1a7cc87d00d17f0c4968921b21752e27e (patch) | |
| tree | fcb6021afebf45f54e06b789c192ff4719b56c71 | |
| parent | f9e5104e7744882ee1e1af03fca56214f12d3604 (diff) | |
arm64: add support for MSM HSL earlyprintk
Add support for arm64 earlyprintk using the MSM UARTDM
hardware block. Such support can be enabled by passing
something like "earlyprintk=msm_hsl_uart,0xf991e000" (or
the appropriate equivalent) on the kernel command line.
Change-Id: Ia43ad430e8bdcb0fd724c60949b82b256e2611a8
Signed-off-by: Stepan Moskovchenko <stepanm@codeaurora.org>
| -rw-r--r-- | arch/arm64/kernel/early_printk.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/arch/arm64/kernel/early_printk.c b/arch/arm64/kernel/early_printk.c index fbb6e184365..1263337a1e8 100644 --- a/arch/arm64/kernel/early_printk.c +++ b/arch/arm64/kernel/early_printk.c @@ -72,6 +72,28 @@ static void uart8250_32bit_printch(char ch) writel_relaxed(ch, early_base + (UART_TX << 2)); } +#define MSM_HSL_UART_SR 0xa4 +#define MSM_HSL_UART_ISR 0xb4 +#define MSM_HSL_UART_TF 0x100 +#define MSM_HSL_UART_CR 0xa8 +#define MSM_HSL_UART_NCF_TX 0x40 +#define MSM_HSL_UART_SR_TXEMT BIT(3) +#define MSM_HSL_UART_ISR_TXREADY BIT(7) + +void msm_hsl_uart_printch(char ch) +{ + while (!(readl_relaxed(early_base + MSM_HSL_UART_SR) & + MSM_HSL_UART_SR_TXEMT) && + !(readl_relaxed(early_base + MSM_HSL_UART_ISR) & + MSM_HSL_UART_ISR_TXREADY)) + ; + + writel_relaxed(0x300, early_base + MSM_HSL_UART_CR); + writel_relaxed(1, early_base + MSM_HSL_UART_NCF_TX); + readl_relaxed(early_base + MSM_HSL_UART_NCF_TX); + writel_relaxed(ch, early_base + MSM_HSL_UART_TF); +} + struct earlycon_match { const char *name; void (*printch)(char ch); @@ -82,6 +104,7 @@ static const struct earlycon_match earlycon_match[] __initconst = { { .name = "smh", .printch = smh_printch, }, { .name = "uart8250-8bit", .printch = uart8250_8bit_printch, }, { .name = "uart8250-32bit", .printch = uart8250_32bit_printch, }, + { .name = "msm_hsl_uart", .printch = msm_hsl_uart_printch, }, {} }; |
