xref: /rk3399_rockchip-uboot/arch/arm/mach-uniphier/debug.h (revision 28cd88baa3f11cdb52be3b6d0610dcf32c60871a)
1*e8a92932SMasahiro Yamada /*
2*e8a92932SMasahiro Yamada  * Copyright (C) 2016 Socionext Inc.
3*e8a92932SMasahiro Yamada  *   Author: Masahiro Yamada <yamada.masahiro@socionext.com>
4*e8a92932SMasahiro Yamada  *
5*e8a92932SMasahiro Yamada  * SPDX-License-Identifier:	GPL-2.0+
6*e8a92932SMasahiro Yamada  */
7*e8a92932SMasahiro Yamada 
8*e8a92932SMasahiro Yamada #ifndef __DEBUG_H__
9*e8a92932SMasahiro Yamada #define __DEBUG_H__
10*e8a92932SMasahiro Yamada 
11*e8a92932SMasahiro Yamada #include <linux/io.h>
12*e8a92932SMasahiro Yamada #include <linux/serial_reg.h>
13*e8a92932SMasahiro Yamada 
14*e8a92932SMasahiro Yamada #define DEBUG_UART_BASE		0x54006800
15*e8a92932SMasahiro Yamada #define UART_SHIFT 2
16*e8a92932SMasahiro Yamada 
17*e8a92932SMasahiro Yamada #define UNIPHIER_UART_TX		0
18*e8a92932SMasahiro Yamada #define UNIPHIER_UART_LSR		(5 * 4)
19*e8a92932SMasahiro Yamada 
20*e8a92932SMasahiro Yamada /* All functions are inline so that they can be called from .secure section. */
21*e8a92932SMasahiro Yamada 
22*e8a92932SMasahiro Yamada #ifdef DEBUG
debug_putc(int c)23*e8a92932SMasahiro Yamada static inline void debug_putc(int c)
24*e8a92932SMasahiro Yamada {
25*e8a92932SMasahiro Yamada 	void __iomem *base = (void __iomem *)DEBUG_UART_BASE;
26*e8a92932SMasahiro Yamada 
27*e8a92932SMasahiro Yamada 	while (!(readl(base + UNIPHIER_UART_LSR) & UART_LSR_THRE))
28*e8a92932SMasahiro Yamada 		;
29*e8a92932SMasahiro Yamada 
30*e8a92932SMasahiro Yamada 	writel(c, base + UNIPHIER_UART_TX);
31*e8a92932SMasahiro Yamada }
32*e8a92932SMasahiro Yamada 
debug_puts(const char * s)33*e8a92932SMasahiro Yamada static inline void debug_puts(const char *s)
34*e8a92932SMasahiro Yamada {
35*e8a92932SMasahiro Yamada 	while (*s) {
36*e8a92932SMasahiro Yamada 		if (*s == '\n')
37*e8a92932SMasahiro Yamada 			debug_putc('\r');
38*e8a92932SMasahiro Yamada 
39*e8a92932SMasahiro Yamada 		debug_putc(*s++);
40*e8a92932SMasahiro Yamada 	}
41*e8a92932SMasahiro Yamada }
42*e8a92932SMasahiro Yamada 
debug_puth(unsigned long val)43*e8a92932SMasahiro Yamada static inline void debug_puth(unsigned long val)
44*e8a92932SMasahiro Yamada {
45*e8a92932SMasahiro Yamada 	int i;
46*e8a92932SMasahiro Yamada 	unsigned char c;
47*e8a92932SMasahiro Yamada 
48*e8a92932SMasahiro Yamada 	for (i = 8; i--; ) {
49*e8a92932SMasahiro Yamada 		c = ((val >> (i * 4)) & 0xf);
50*e8a92932SMasahiro Yamada 		c += (c >= 10) ? 'a' - 10 : '0';
51*e8a92932SMasahiro Yamada 		debug_putc(c);
52*e8a92932SMasahiro Yamada 	}
53*e8a92932SMasahiro Yamada }
54*e8a92932SMasahiro Yamada #else
debug_putc(int c)55*e8a92932SMasahiro Yamada static inline void debug_putc(int c)
56*e8a92932SMasahiro Yamada {
57*e8a92932SMasahiro Yamada }
58*e8a92932SMasahiro Yamada 
debug_puts(const char * s)59*e8a92932SMasahiro Yamada static inline void debug_puts(const char *s)
60*e8a92932SMasahiro Yamada {
61*e8a92932SMasahiro Yamada }
62*e8a92932SMasahiro Yamada 
debug_puth(unsigned long val)63*e8a92932SMasahiro Yamada static inline void debug_puth(unsigned long val)
64*e8a92932SMasahiro Yamada {
65*e8a92932SMasahiro Yamada }
66*e8a92932SMasahiro Yamada #endif
67*e8a92932SMasahiro Yamada 
68*e8a92932SMasahiro Yamada #endif /* __DEBUG_H__ */
69