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 Yamadastatic 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 Yamadastatic 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 Yamadastatic 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 Yamadastatic inline void debug_putc(int c) 55e8a92932SMasahiro Yamada { 56e8a92932SMasahiro Yamada } 57e8a92932SMasahiro Yamada debug_puts(const char * s)58e8a92932SMasahiro Yamadastatic inline void debug_puts(const char *s) 59e8a92932SMasahiro Yamada { 60e8a92932SMasahiro Yamada } 61e8a92932SMasahiro Yamada debug_puth(unsigned long val)62e8a92932SMasahiro Yamadastatic inline void debug_puth(unsigned long val) 63e8a92932SMasahiro Yamada { 64e8a92932SMasahiro Yamada } 65e8a92932SMasahiro Yamada #endif 66e8a92932SMasahiro Yamada 67e8a92932SMasahiro Yamada #endif /* __DEBUG_H__ */ 68