1d5cf3297SMasahiro Yamada /* 2d5cf3297SMasahiro Yamada * Copyright (C) 2016 Masahiro Yamada <yamada.masahiro@socionext.com> 3d5cf3297SMasahiro Yamada * 4d5cf3297SMasahiro Yamada * SPDX-License-Identifier: GPL-2.0+ 5d5cf3297SMasahiro Yamada */ 6d5cf3297SMasahiro Yamada 7d5cf3297SMasahiro Yamada #include <common.h> 8d5cf3297SMasahiro Yamada #include <debug_uart.h> 9d5cf3297SMasahiro Yamada #include <linux/io.h> 10d5cf3297SMasahiro Yamada #include <linux/serial_reg.h> 11d5cf3297SMasahiro Yamada 12d5cf3297SMasahiro Yamada #include "../soc-info.h" 13d5cf3297SMasahiro Yamada #include "debug-uart.h" 14d5cf3297SMasahiro Yamada 15d5cf3297SMasahiro Yamada #define UNIPHIER_UART_TX 0x00 16d5cf3297SMasahiro Yamada #define UNIPHIER_UART_LCR_MCR 0x10 17d5cf3297SMasahiro Yamada #define UNIPHIER_UART_LSR 0x14 18d5cf3297SMasahiro Yamada #define UNIPHIER_UART_LDR 0x24 19d5cf3297SMasahiro Yamada _debug_uart_putc(int c)20d5cf3297SMasahiro Yamadastatic void _debug_uart_putc(int c) 21d5cf3297SMasahiro Yamada { 22d5cf3297SMasahiro Yamada void __iomem *base = (void __iomem *)CONFIG_DEBUG_UART_BASE; 23d5cf3297SMasahiro Yamada 24d5cf3297SMasahiro Yamada while (!(readl(base + UNIPHIER_UART_LSR) & UART_LSR_THRE)) 25d5cf3297SMasahiro Yamada ; 26d5cf3297SMasahiro Yamada 27d5cf3297SMasahiro Yamada writel(c, base + UNIPHIER_UART_TX); 28d5cf3297SMasahiro Yamada } 29d5cf3297SMasahiro Yamada _debug_uart_init(void)30d5cf3297SMasahiro Yamadavoid _debug_uart_init(void) 31d5cf3297SMasahiro Yamada { 32d5cf3297SMasahiro Yamada void __iomem *base = (void __iomem *)CONFIG_DEBUG_UART_BASE; 33d5cf3297SMasahiro Yamada unsigned int divisor; 34d5cf3297SMasahiro Yamada 35*e27d6c7dSMasahiro Yamada switch (uniphier_get_soc_id()) { 36d5cf3297SMasahiro Yamada #if defined(CONFIG_ARCH_UNIPHIER_LD4) 37*e27d6c7dSMasahiro Yamada case UNIPHIER_LD4_ID: 38d5cf3297SMasahiro Yamada divisor = uniphier_ld4_debug_uart_init(); 39d5cf3297SMasahiro Yamada break; 40d5cf3297SMasahiro Yamada #endif 41d5cf3297SMasahiro Yamada #if defined(CONFIG_ARCH_UNIPHIER_PRO4) 42*e27d6c7dSMasahiro Yamada case UNIPHIER_PRO4_ID: 43d5cf3297SMasahiro Yamada divisor = uniphier_pro4_debug_uart_init(); 44d5cf3297SMasahiro Yamada break; 45d5cf3297SMasahiro Yamada #endif 46d5cf3297SMasahiro Yamada #if defined(CONFIG_ARCH_UNIPHIER_SLD8) 47*e27d6c7dSMasahiro Yamada case UNIPHIER_SLD8_ID: 48d5cf3297SMasahiro Yamada divisor = uniphier_sld8_debug_uart_init(); 49d5cf3297SMasahiro Yamada break; 50d5cf3297SMasahiro Yamada #endif 51d5cf3297SMasahiro Yamada #if defined(CONFIG_ARCH_UNIPHIER_PRO5) 52*e27d6c7dSMasahiro Yamada case UNIPHIER_PRO5_ID: 53d5cf3297SMasahiro Yamada divisor = uniphier_pro5_debug_uart_init(); 54d5cf3297SMasahiro Yamada break; 55d5cf3297SMasahiro Yamada #endif 56d5cf3297SMasahiro Yamada #if defined(CONFIG_ARCH_UNIPHIER_PXS2) 57*e27d6c7dSMasahiro Yamada case UNIPHIER_PXS2_ID: 58d5cf3297SMasahiro Yamada divisor = uniphier_pxs2_debug_uart_init(); 59d5cf3297SMasahiro Yamada break; 60d5cf3297SMasahiro Yamada #endif 61d5cf3297SMasahiro Yamada #if defined(CONFIG_ARCH_UNIPHIER_LD6B) 62*e27d6c7dSMasahiro Yamada case UNIPHIER_LD6B_ID: 63d5cf3297SMasahiro Yamada divisor = uniphier_ld6b_debug_uart_init(); 64d5cf3297SMasahiro Yamada break; 65d5cf3297SMasahiro Yamada #endif 66d5cf3297SMasahiro Yamada #if defined(CONFIG_ARCH_UNIPHIER_LD11) || defined(CONFIG_ARCH_UNIPHIER_LD20) 67*e27d6c7dSMasahiro Yamada case UNIPHIER_LD11_ID: 68*e27d6c7dSMasahiro Yamada case UNIPHIER_LD20_ID: 69d5cf3297SMasahiro Yamada divisor = uniphier_ld20_debug_uart_init(); 70d5cf3297SMasahiro Yamada break; 71d5cf3297SMasahiro Yamada #endif 72d5cf3297SMasahiro Yamada default: 73d5cf3297SMasahiro Yamada return; 74d5cf3297SMasahiro Yamada } 75d5cf3297SMasahiro Yamada 76d5cf3297SMasahiro Yamada writel(UART_LCR_WLEN8 << 8, base + UNIPHIER_UART_LCR_MCR); 77d5cf3297SMasahiro Yamada 78d5cf3297SMasahiro Yamada writel(divisor, base + UNIPHIER_UART_LDR); 79d5cf3297SMasahiro Yamada } 80d5cf3297SMasahiro Yamada DEBUG_UART_FUNCS 81