From e43ce3fca755d79635899b658a97f3c4a7dbf220 Mon Sep 17 00:00:00 2001 From: Francois Retief Date: Thu, 29 Oct 2015 12:55:34 +0200 Subject: [PATCH] sparc: leon3: Add debug_uart support to LEON3 serial driver. Signed-off-by: Francois Retief --- arch/sparc/cpu/leon3/cpu_init.c | 5 ++++- arch/sparc/cpu/leon3/serial.c | 27 ++++++++++++++++++++++++++- configs/grsim_defconfig | 4 ++++ drivers/serial/Kconfig | 8 ++++++++ 4 files changed, 42 insertions(+), 2 deletions(-) diff --git a/arch/sparc/cpu/leon3/cpu_init.c b/arch/sparc/cpu/leon3/cpu_init.c index 40d1751fcb..b140da31b1 100644 --- a/arch/sparc/cpu/leon3/cpu_init.c +++ b/arch/sparc/cpu/leon3/cpu_init.c @@ -13,6 +13,7 @@ #include #include #include +#include #include @@ -50,7 +51,9 @@ struct { */ void cpu_init_f(void) { - +#ifdef CONFIG_DEBUG_UART + debug_uart_init(); +#endif } /* Routine called from start.S, diff --git a/arch/sparc/cpu/leon3/serial.c b/arch/sparc/cpu/leon3/serial.c index cefb9d2c36..66b3773027 100644 --- a/arch/sparc/cpu/leon3/serial.c +++ b/arch/sparc/cpu/leon3/serial.c @@ -28,8 +28,10 @@ static int leon3_serial_init(void) /* find UART */ if (ambapp_apb_find(&ambapp_plb, VENDOR_GAISLER, GAISLER_APBUART, - CONFIG_SYS_GRLIB_APBUART_INDEX, &apbdev) != 1) + CONFIG_SYS_GRLIB_APBUART_INDEX, &apbdev) != 1) { + panic("%s: apbuart not found!\n", __func__); return -1; /* didn't find hardware */ + } /* found apbuart, let's init .. */ uart = (ambapp_dev_apbuart *) apbdev.address; @@ -145,3 +147,26 @@ __weak struct serial_device *default_serial_console(void) { return &leon3_serial_drv; } + +#ifdef CONFIG_DEBUG_UART_APBUART + +#include + +static inline void _debug_uart_init(void) +{ + ambapp_dev_apbuart *uart = (ambapp_dev_apbuart *)CONFIG_DEBUG_UART_BASE; + uart->scaler = (((CONFIG_DEBUG_UART_CLOCK*10) / (CONFIG_BAUDRATE*8)) - 5)/10; + uart->ctrl = APBUART_CTRL_RE | APBUART_CTRL_TE; +} + +static inline void _debug_uart_putc(int ch) +{ + ambapp_dev_apbuart *uart = (ambapp_dev_apbuart *)CONFIG_DEBUG_UART_BASE; + while (!(readl(&uart->status) & APBUART_STATUS_THE)) + WATCHDOG_RESET(); + writel(ch, &uart->data); +} + +DEBUG_UART_FUNCS + +#endif diff --git a/configs/grsim_defconfig b/configs/grsim_defconfig index a5ea7ab8d8..d2f709f834 100644 --- a/configs/grsim_defconfig +++ b/configs/grsim_defconfig @@ -14,3 +14,7 @@ CONFIG_SYS_TEXT_BASE=0x00000000 # CONFIG_CMD_NET is not set # CONFIG_CMD_NFS is not set CONFIG_SYS_AMBAPP_PRINT_ON_STARTUP=y +CONFIG_DEBUG_UART=y +CONFIG_DEBUG_UART_APBUART=y +CONFIG_DEBUG_UART_BASE=0x80000100 +CONFIG_DEBUG_UART_CLOCK=40000000 diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig index d462244a04..eba96f4a80 100644 --- a/drivers/serial/Kconfig +++ b/drivers/serial/Kconfig @@ -98,6 +98,14 @@ config DEBUG_UART_ZYNQ will need to provide parameters to make this work. The driver will be available until the real driver-model serial is running. +config DEBUG_UART_APBUART + depends on LEON3 + bool "Gaisler APBUART" + help + Select this to enable a debug UART using the serial_leon3 driver. You + will need to provide parameters to make this work. The driver will + be available until the real driver model serial is running. + endchoice config DEBUG_UART_BASE -- 2.39.2