1*1ccea77eSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-or-later 201623627SLey Foon Tan /* 301623627SLey Foon Tan * Copyright (C) 2008-2010 Thomas Chou <thomas@wytron.com.tw> 401623627SLey Foon Tan */ 501623627SLey Foon Tan 601623627SLey Foon Tan #include <linux/io.h> 701623627SLey Foon Tan 801623627SLey Foon Tan #if (defined(CONFIG_SERIAL_ALTERA_JTAGUART_CONSOLE) && defined(JTAG_UART_BASE))\ 901623627SLey Foon Tan || (defined(CONFIG_SERIAL_ALTERA_UART_CONSOLE) && defined(UART0_BASE)) my_ioremap(unsigned long physaddr)1001623627SLey Foon Tanstatic void *my_ioremap(unsigned long physaddr) 1101623627SLey Foon Tan { 1201623627SLey Foon Tan return (void *)(physaddr | CONFIG_NIOS2_IO_REGION_BASE); 1301623627SLey Foon Tan } 1401623627SLey Foon Tan #endif 1501623627SLey Foon Tan 1601623627SLey Foon Tan #if defined(CONFIG_SERIAL_ALTERA_JTAGUART_CONSOLE) && defined(JTAG_UART_BASE) 1701623627SLey Foon Tan 1801623627SLey Foon Tan #define ALTERA_JTAGUART_SIZE 8 1901623627SLey Foon Tan #define ALTERA_JTAGUART_DATA_REG 0 2001623627SLey Foon Tan #define ALTERA_JTAGUART_CONTROL_REG 4 2101623627SLey Foon Tan #define ALTERA_JTAGUART_CONTROL_AC_MSK (0x00000400) 2201623627SLey Foon Tan #define ALTERA_JTAGUART_CONTROL_WSPACE_MSK (0xFFFF0000) 2301623627SLey Foon Tan static void *uartbase; 2401623627SLey Foon Tan 2501623627SLey Foon Tan #if defined(CONFIG_SERIAL_ALTERA_JTAGUART_CONSOLE_BYPASS) jtag_putc(int ch)2601623627SLey Foon Tanstatic void jtag_putc(int ch) 2701623627SLey Foon Tan { 2801623627SLey Foon Tan if (readl(uartbase + ALTERA_JTAGUART_CONTROL_REG) & 2901623627SLey Foon Tan ALTERA_JTAGUART_CONTROL_WSPACE_MSK) 3001623627SLey Foon Tan writeb(ch, uartbase + ALTERA_JTAGUART_DATA_REG); 3101623627SLey Foon Tan } 3201623627SLey Foon Tan #else jtag_putc(int ch)3301623627SLey Foon Tanstatic void jtag_putc(int ch) 3401623627SLey Foon Tan { 3501623627SLey Foon Tan while ((readl(uartbase + ALTERA_JTAGUART_CONTROL_REG) & 3601623627SLey Foon Tan ALTERA_JTAGUART_CONTROL_WSPACE_MSK) == 0) 3701623627SLey Foon Tan ; 3801623627SLey Foon Tan writeb(ch, uartbase + ALTERA_JTAGUART_DATA_REG); 3901623627SLey Foon Tan } 4001623627SLey Foon Tan #endif 4101623627SLey Foon Tan putchar(int ch)4201623627SLey Foon Tanstatic int putchar(int ch) 4301623627SLey Foon Tan { 4401623627SLey Foon Tan jtag_putc(ch); 4501623627SLey Foon Tan return ch; 4601623627SLey Foon Tan } 4701623627SLey Foon Tan console_init(void)4801623627SLey Foon Tanstatic void console_init(void) 4901623627SLey Foon Tan { 5001623627SLey Foon Tan uartbase = my_ioremap((unsigned long) JTAG_UART_BASE); 5101623627SLey Foon Tan writel(ALTERA_JTAGUART_CONTROL_AC_MSK, 5201623627SLey Foon Tan uartbase + ALTERA_JTAGUART_CONTROL_REG); 5301623627SLey Foon Tan } 5401623627SLey Foon Tan 5501623627SLey Foon Tan #elif defined(CONFIG_SERIAL_ALTERA_UART_CONSOLE) && defined(UART0_BASE) 5601623627SLey Foon Tan 5701623627SLey Foon Tan #define ALTERA_UART_SIZE 32 5801623627SLey Foon Tan #define ALTERA_UART_TXDATA_REG 4 5901623627SLey Foon Tan #define ALTERA_UART_STATUS_REG 8 6001623627SLey Foon Tan #define ALTERA_UART_DIVISOR_REG 16 6101623627SLey Foon Tan #define ALTERA_UART_STATUS_TRDY_MSK (0x40) 6201623627SLey Foon Tan static unsigned uartbase; 6301623627SLey Foon Tan uart_putc(int ch)6401623627SLey Foon Tanstatic void uart_putc(int ch) 6501623627SLey Foon Tan { 6601623627SLey Foon Tan int i; 6701623627SLey Foon Tan 6801623627SLey Foon Tan for (i = 0; (i < 0x10000); i++) { 6901623627SLey Foon Tan if (readw(uartbase + ALTERA_UART_STATUS_REG) & 7001623627SLey Foon Tan ALTERA_UART_STATUS_TRDY_MSK) 7101623627SLey Foon Tan break; 7201623627SLey Foon Tan } 7301623627SLey Foon Tan writeb(ch, uartbase + ALTERA_UART_TXDATA_REG); 7401623627SLey Foon Tan } 7501623627SLey Foon Tan putchar(int ch)7601623627SLey Foon Tanstatic int putchar(int ch) 7701623627SLey Foon Tan { 7801623627SLey Foon Tan uart_putc(ch); 7901623627SLey Foon Tan if (ch == '\n') 8001623627SLey Foon Tan uart_putc('\r'); 8101623627SLey Foon Tan return ch; 8201623627SLey Foon Tan } 8301623627SLey Foon Tan console_init(void)8401623627SLey Foon Tanstatic void console_init(void) 8501623627SLey Foon Tan { 8601623627SLey Foon Tan unsigned int baud, baudclk; 8701623627SLey Foon Tan 8801623627SLey Foon Tan uartbase = (unsigned long) my_ioremap((unsigned long) UART0_BASE); 8901623627SLey Foon Tan baud = CONFIG_SERIAL_ALTERA_UART_BAUDRATE; 9001623627SLey Foon Tan baudclk = UART0_FREQ / baud; 9101623627SLey Foon Tan writew(baudclk, uartbase + ALTERA_UART_DIVISOR_REG); 9201623627SLey Foon Tan } 9301623627SLey Foon Tan 9401623627SLey Foon Tan #else 9501623627SLey Foon Tan putchar(int ch)9601623627SLey Foon Tanstatic int putchar(int ch) 9701623627SLey Foon Tan { 9801623627SLey Foon Tan return ch; 9901623627SLey Foon Tan } 10001623627SLey Foon Tan console_init(void)10101623627SLey Foon Tanstatic void console_init(void) 10201623627SLey Foon Tan { 10301623627SLey Foon Tan } 10401623627SLey Foon Tan 10501623627SLey Foon Tan #endif 10601623627SLey Foon Tan puts(const char * s)10701623627SLey Foon Tanstatic int puts(const char *s) 10801623627SLey Foon Tan { 10901623627SLey Foon Tan while (*s) 11001623627SLey Foon Tan putchar(*s++); 11101623627SLey Foon Tan return 0; 11201623627SLey Foon Tan } 113