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