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