162306a36Sopenharmony_ci/*
262306a36Sopenharmony_ci * This file is subject to the terms and conditions of the GNU General Public
362306a36Sopenharmony_ci * License.  See the file "COPYING" in the main directory of this archive
462306a36Sopenharmony_ci * for more details.
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci * Copyright (C) 2010 Gabor Juhos <juhosg@openwrt.org>
762306a36Sopenharmony_ci */
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include <linux/mm.h>
1062306a36Sopenharmony_ci#include <linux/io.h>
1162306a36Sopenharmony_ci#include <linux/serial_reg.h>
1262306a36Sopenharmony_ci#include <asm/setup.h>
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci#include "devices.h"
1562306a36Sopenharmony_ci#include "ar2315_regs.h"
1662306a36Sopenharmony_ci#include "ar5312_regs.h"
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_cistatic inline void prom_uart_wr(void __iomem *base, unsigned reg,
1962306a36Sopenharmony_ci				unsigned char ch)
2062306a36Sopenharmony_ci{
2162306a36Sopenharmony_ci	__raw_writel(ch, base + 4 * reg);
2262306a36Sopenharmony_ci}
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_cistatic inline unsigned char prom_uart_rr(void __iomem *base, unsigned reg)
2562306a36Sopenharmony_ci{
2662306a36Sopenharmony_ci	return __raw_readl(base + 4 * reg);
2762306a36Sopenharmony_ci}
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_civoid prom_putchar(char ch)
3062306a36Sopenharmony_ci{
3162306a36Sopenharmony_ci	static void __iomem *base;
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_ci	if (unlikely(base == NULL)) {
3462306a36Sopenharmony_ci		if (is_ar2315())
3562306a36Sopenharmony_ci			base = (void __iomem *)(KSEG1ADDR(AR2315_UART0_BASE));
3662306a36Sopenharmony_ci		else
3762306a36Sopenharmony_ci			base = (void __iomem *)(KSEG1ADDR(AR5312_UART0_BASE));
3862306a36Sopenharmony_ci	}
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci	while ((prom_uart_rr(base, UART_LSR) & UART_LSR_THRE) == 0)
4162306a36Sopenharmony_ci		;
4262306a36Sopenharmony_ci	prom_uart_wr(base, UART_TX, (unsigned char)ch);
4362306a36Sopenharmony_ci	while ((prom_uart_rr(base, UART_LSR) & UART_LSR_THRE) == 0)
4462306a36Sopenharmony_ci		;
4562306a36Sopenharmony_ci}
46