13070033a16edcc21688d5ea8967c89522f833862Steven J. Hill/*
23070033a16edcc21688d5ea8967c89522f833862Steven J. Hill * This file is subject to the terms and conditions of the GNU General Public
33070033a16edcc21688d5ea8967c89522f833862Steven J. Hill * License.  See the file "COPYING" in the main directory of this archive
43070033a16edcc21688d5ea8967c89522f833862Steven J. Hill * for more details.
53070033a16edcc21688d5ea8967c89522f833862Steven J. Hill *
63070033a16edcc21688d5ea8967c89522f833862Steven J. Hill * Copyright (C) 2012 MIPS Technologies, Inc.  All rights reserved.
73070033a16edcc21688d5ea8967c89522f833862Steven J. Hill */
83070033a16edcc21688d5ea8967c89522f833862Steven J. Hill#include <linux/init.h>
93070033a16edcc21688d5ea8967c89522f833862Steven J. Hill#include <linux/console.h>
103070033a16edcc21688d5ea8967c89522f833862Steven J. Hill#include <linux/serial_reg.h>
113070033a16edcc21688d5ea8967c89522f833862Steven J. Hill#include <linux/io.h>
123070033a16edcc21688d5ea8967c89522f833862Steven J. Hill
137034228792cc561e79ff8600f02884bd4c80e287Ralf Baechle#define SEAD_UART1_REGS_BASE	0xbf000800   /* ttyS1 = DB9 port */
147034228792cc561e79ff8600f02884bd4c80e287Ralf Baechle#define SEAD_UART0_REGS_BASE	0xbf000900   /* ttyS0 = USB port   */
153070033a16edcc21688d5ea8967c89522f833862Steven J. Hill#define PORT(base_addr, offset) ((unsigned int __iomem *)(base_addr+(offset)*4))
163070033a16edcc21688d5ea8967c89522f833862Steven J. Hill
173070033a16edcc21688d5ea8967c89522f833862Steven J. Hillstatic char console_port = 1;
183070033a16edcc21688d5ea8967c89522f833862Steven J. Hill
193070033a16edcc21688d5ea8967c89522f833862Steven J. Hillstatic inline unsigned int serial_in(int offset, unsigned int base_addr)
203070033a16edcc21688d5ea8967c89522f833862Steven J. Hill{
213070033a16edcc21688d5ea8967c89522f833862Steven J. Hill	return __raw_readl(PORT(base_addr, offset)) & 0xff;
223070033a16edcc21688d5ea8967c89522f833862Steven J. Hill}
233070033a16edcc21688d5ea8967c89522f833862Steven J. Hill
243070033a16edcc21688d5ea8967c89522f833862Steven J. Hillstatic inline void serial_out(int offset, int value, unsigned int base_addr)
253070033a16edcc21688d5ea8967c89522f833862Steven J. Hill{
263070033a16edcc21688d5ea8967c89522f833862Steven J. Hill	__raw_writel(value, PORT(base_addr, offset));
273070033a16edcc21688d5ea8967c89522f833862Steven J. Hill}
283070033a16edcc21688d5ea8967c89522f833862Steven J. Hill
290be2abbceeb837bf938c85db03142b5b0e4675f4Steven J. Hillvoid __init fw_init_early_console(char port)
303070033a16edcc21688d5ea8967c89522f833862Steven J. Hill{
313070033a16edcc21688d5ea8967c89522f833862Steven J. Hill	console_port = port;
323070033a16edcc21688d5ea8967c89522f833862Steven J. Hill}
333070033a16edcc21688d5ea8967c89522f833862Steven J. Hill
343070033a16edcc21688d5ea8967c89522f833862Steven J. Hillint prom_putchar(char c)
353070033a16edcc21688d5ea8967c89522f833862Steven J. Hill{
363070033a16edcc21688d5ea8967c89522f833862Steven J. Hill	unsigned int base_addr;
373070033a16edcc21688d5ea8967c89522f833862Steven J. Hill
383070033a16edcc21688d5ea8967c89522f833862Steven J. Hill	base_addr = console_port ? SEAD_UART1_REGS_BASE : SEAD_UART0_REGS_BASE;
393070033a16edcc21688d5ea8967c89522f833862Steven J. Hill
403070033a16edcc21688d5ea8967c89522f833862Steven J. Hill	while ((serial_in(UART_LSR, base_addr) & UART_LSR_THRE) == 0)
413070033a16edcc21688d5ea8967c89522f833862Steven J. Hill		;
423070033a16edcc21688d5ea8967c89522f833862Steven J. Hill
433070033a16edcc21688d5ea8967c89522f833862Steven J. Hill	serial_out(UART_TX, c, base_addr);
443070033a16edcc21688d5ea8967c89522f833862Steven J. Hill
453070033a16edcc21688d5ea8967c89522f833862Steven J. Hill	return 1;
463070033a16edcc21688d5ea8967c89522f833862Steven J. Hill}
47