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