Home | History | Annotate | Download | only in mach-uniphier
      1 /* SPDX-License-Identifier: GPL-2.0+ */
      2 /*
      3  * Copyright (C) 2016 Socionext Inc.
      4  *   Author: Masahiro Yamada <yamada.masahiro (at) 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
     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 
     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 
     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
     54 static inline void debug_putc(int c)
     55 {
     56 }
     57 
     58 static inline void debug_puts(const char *s)
     59 {
     60 }
     61 
     62 static inline void debug_puth(unsigned long val)
     63 {
     64 }
     65 #endif
     66 
     67 #endif /* __DEBUG_H__ */
     68