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