summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStepan Moskovchenko <stepanm@codeaurora.org>2014-06-02 15:26:29 -0700
committerGeorgi Djakov <georgi.djakov@linaro.org>2015-02-19 10:56:53 +0200
commit69b492a1e9c3736ed490e19f443c4b3027f3b84b (patch)
treee3deef7a55652c907ca88c8e7b57fc1a3cbe658c
parent676a154ec4ea3b8836a61b279ca08dc9e4eb761d (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> Signed-off-by: Georgi Djakov <georgi.djakov@linaro.org>
-rw-r--r--arch/arm64/kernel/early_printk.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/arch/arm64/kernel/early_printk.c b/arch/arm64/kernel/early_printk.c
index ffbbdde7aba..5f52f2a7abd 100644
--- a/arch/arm64/kernel/early_printk.c
+++ b/arch/arm64/kernel/early_printk.c
@@ -74,6 +74,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);
@@ -84,6 +106,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, },
{}
};