2 * Atheros AR7XXX/AR9XXX SoC early printk support
4 * Copyright (C) 2008-2011 Gabor Juhos <juhosg@openwrt.org>
5 * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License version 2 as published
9 * by the Free Software Foundation.
13 #include <linux/errno.h>
14 #include <linux/serial_reg.h>
15 #include <asm/addrspace.h>
17 #include <asm/mach-ath79/ath79.h>
18 #include <asm/mach-ath79/ar71xx_regs.h>
19 #include <asm/mach-ath79/ar933x_uart.h>
21 static void (*_prom_putchar
) (unsigned char);
23 static inline void prom_putchar_wait(void __iomem
*reg
, u32 mask
, u32 val
)
29 if ((t
& mask
) == val
)
34 static void prom_putchar_ar71xx(unsigned char ch
)
36 void __iomem
*base
= (void __iomem
*)(KSEG1ADDR(AR71XX_UART_BASE
));
38 prom_putchar_wait(base
+ UART_LSR
* 4, UART_LSR_THRE
, UART_LSR_THRE
);
39 __raw_writel(ch
, base
+ UART_TX
* 4);
40 prom_putchar_wait(base
+ UART_LSR
* 4, UART_LSR_THRE
, UART_LSR_THRE
);
43 static void prom_putchar_ar933x(unsigned char ch
)
45 void __iomem
*base
= (void __iomem
*)(KSEG1ADDR(AR933X_UART_BASE
));
47 prom_putchar_wait(base
+ AR933X_UART_DATA_REG
, AR933X_UART_DATA_TX_CSR
,
48 AR933X_UART_DATA_TX_CSR
);
49 __raw_writel(AR933X_UART_DATA_TX_CSR
| ch
, base
+ AR933X_UART_DATA_REG
);
50 prom_putchar_wait(base
+ AR933X_UART_DATA_REG
, AR933X_UART_DATA_TX_CSR
,
51 AR933X_UART_DATA_TX_CSR
);
54 static void prom_putchar_dummy(unsigned char ch
)
59 static void prom_putchar_init(void)
64 base
= (void __iomem
*)(KSEG1ADDR(AR71XX_RESET_BASE
));
65 id
= __raw_readl(base
+ AR71XX_RESET_REG_REV_ID
);
66 id
&= REV_ID_MAJOR_MASK
;
69 case REV_ID_MAJOR_AR71XX
:
70 case REV_ID_MAJOR_AR7240
:
71 case REV_ID_MAJOR_AR7241
:
72 case REV_ID_MAJOR_AR7242
:
73 case REV_ID_MAJOR_AR913X
:
74 _prom_putchar
= prom_putchar_ar71xx
;
77 case REV_ID_MAJOR_AR9330
:
78 case REV_ID_MAJOR_AR9331
:
79 _prom_putchar
= prom_putchar_ar933x
;
83 _prom_putchar
= prom_putchar_dummy
;
88 void prom_putchar(unsigned char ch
)