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