xref: /openbmc/linux/arch/nios2/boot/compressed/console.c (revision 58e16d792a6a8c6b750f637a4649967fcac853dc)
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 Tan static 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 Tan static 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 Tan static 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 Tan static 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 Tan static 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 Tan static 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 Tan static 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 Tan static 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 Tan static int putchar(int ch)
9701623627SLey Foon Tan {
9801623627SLey Foon Tan 	return ch;
9901623627SLey Foon Tan }
10001623627SLey Foon Tan 
console_init(void)10101623627SLey Foon Tan static 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 Tan static 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