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 Yamadastatic 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 Yamadastatic 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 Yamadastatic 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 Yamadastatic inline void debug_putc(int c) 56*e8a92932SMasahiro Yamada { 57*e8a92932SMasahiro Yamada } 58*e8a92932SMasahiro Yamada debug_puts(const char * s)59*e8a92932SMasahiro Yamadastatic inline void debug_puts(const char *s) 60*e8a92932SMasahiro Yamada { 61*e8a92932SMasahiro Yamada } 62*e8a92932SMasahiro Yamada debug_puth(unsigned long val)63*e8a92932SMasahiro Yamadastatic 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