From cd855dd7c34837134286ea67b89a8c981f635d07 Mon Sep 17 00:00:00 2001 From: Antony Pavlov Date: Mon, 4 May 2015 15:29:23 +0300 Subject: MIPS: mach-ath79: debug_ll.h: add assembler routines Signed-off-by: Antony Pavlov Signed-off-by: Sascha Hauer --- arch/mips/mach-ath79/include/mach/debug_ll.h | 136 ++++++++++++++++++++++++++- 1 file changed, 131 insertions(+), 5 deletions(-) (limited to 'arch/mips/mach-ath79') diff --git a/arch/mips/mach-ath79/include/mach/debug_ll.h b/arch/mips/mach-ath79/include/mach/debug_ll.h index de4c00dfd1..c697318488 100644 --- a/arch/mips/mach-ath79/include/mach/debug_ll.h +++ b/arch/mips/mach-ath79/include/mach/debug_ll.h @@ -18,17 +18,26 @@ #ifndef __AR933X_DEBUG_LL__ #define __AR933X_DEBUG_LL__ -#include -#include #include -#include +/* Alas! isn't assembly-tolerant */ +#define AR71XX_APB_BASE 0x18000000 +#define AR933X_UART_BASE (AR71XX_APB_BASE + 0x00020000) + +#define DEBUG_LL_UART_ADDR KSEG1ADDR(AR933X_UART_BASE) #define AR933X_UART_DATA_REG 0x00 #define AR933X_UART_DATA_TX_RX_MASK 0xff -#define AR933X_UART_DATA_TX_CSR BIT(9) +#define AR933X_UART_DATA_TX_CSR 0x200 +#define AR933X_UART_DATA_RX_CSR 0x100 -#define DEBUG_LL_UART_ADDR KSEG1ADDR(AR933X_UART_BASE) +#ifndef __ASSEMBLY__ + +#include + +/* + * C macros + */ static inline void ar933x_debug_ll_writel(u32 b, int offset) { @@ -52,5 +61,122 @@ static inline void PUTC_LL(int ch) data = (ch & AR933X_UART_DATA_TX_RX_MASK) | AR933X_UART_DATA_TX_CSR; ar933x_debug_ll_writel(data, AR933X_UART_DATA_REG); } +#else /* __ASSEMBLY__ */ +/* + * Macros for use in assembly language code + */ + +/* + * output a character in a0 + */ +.macro debug_ll_outc_a0 +#ifdef CONFIG_DEBUG_LL + .set push + .set reorder + + la t0, DEBUG_LL_UART_ADDR +201: + lw t1, AR933X_UART_DATA_REG(t0) /* get line status */ + andi t1, t1, AR933X_UART_DATA_TX_CSR /* check for transmitter empty */ + beqz t1, 201b /* try again */ + andi a0, a0, AR933X_UART_DATA_TX_RX_MASK + ori a0, a0, AR933X_UART_DATA_TX_CSR + sw a0, 0(t0) /* write the character */ + .set pop +#endif /* CONFIG_DEBUG_LL */ +.endm + +/* + * output a character + */ +.macro debug_ll_outc chr +#ifdef CONFIG_DEBUG_LL + li a0, \chr + debug_ll_outc_a0 +#endif /* CONFIG_DEBUG_LL */ +.endm + +/* + * output a 32-bit value in hex + */ +.macro debug_ll_outhexw +#ifdef CONFIG_DEBUG_LL + .set push + .set reorder + + move t6, a0 + li t5, 32 + +202: + addi t5, t5, -4 + srlv a0, t6, t5 + + /* output one hex digit */ + andi a0, a0, 15 + blt a0, 10, 203f + + addi a0, a0, ('a' - '9' - 1) + +203: + addi a0, a0, '0' + + debug_ll_outc_a0 + + bgtz t5, 202b + + .set pop +#endif /* CONFIG_DEBUG_LL */ +.endm + +/* + * check character in input buffer + * return value: + * v0 = 0 no character in input buffer + * v0 != 0 character in input buffer + */ +/* FIXME: use tstc */ +.macro debug_ll_tstc +#ifdef CONFIG_DEBUG_LL + .set push + .set reorder + + la t0, DEBUG_LL_UART_ADDR + + /* get line status and check for data present */ + lw v0, AR933X_UART_DATA_REG(t0) + andi v0, v0, AR933X_UART_DATA_RX_CSR + + .set pop +#endif /* CONFIG_DEBUG_LL */ +.endm + +/* + * get character to v0 + */ +.macro debug_ll_getc +#ifdef CONFIG_DEBUG_LL + .set push + .set reorder + + la t0, DEBUG_LL_UART_ADDR +204: + lw v0, AR933X_UART_DATA_REG(t0) + andi v0, v0, AR933X_UART_DATA_RX_CSR + + /* try again */ + beqz v0, 204b + + /* read a character */ + lw v0, AR933X_UART_DATA_REG(t0) + andi v0, v0, AR933X_UART_DATA_TX_RX_MASK + + /* remove the character from the FIFO */ + li t1, AR933X_UART_DATA_RX_CSR + sw t1, AR933X_UART_DATA_REG(t0) + + .set pop +#endif /* CONFIG_DEBUG_LL */ +.endm +#endif /* __ASSEMBLY__ */ #endif /* __AR933X_DEBUG_LL__ */ -- cgit v1.2.3