From: John Crispin Date: Fri, 2 Oct 2015 10:49:16 +0000 (+0000) Subject: ramips: make the early_printk code detect which uart is used X-Git-Url: https://git.archive.openwrt.org/?a=commitdiff_plain;h=a2356c299938ea7beb8b41dae789d87182e57023;p=15.05%2Fopenwrt.git ramips: make the early_printk code detect which uart is used only tested on mt7628 Signed-off-by: John Crispin Backport of r46950 git-svn-id: svn://svn.openwrt.org/openwrt/branches/chaos_calmer@47086 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- diff --git a/target/linux/ramips/patches-3.18/0015-MIPS-ralink-cleanup-early_printk.patch b/target/linux/ramips/patches-3.18/0015-MIPS-ralink-cleanup-early_printk.patch index d139139322..3fffa804cf 100644 --- a/target/linux/ramips/patches-3.18/0015-MIPS-ralink-cleanup-early_printk.patch +++ b/target/linux/ramips/patches-3.18/0015-MIPS-ralink-cleanup-early_printk.patch @@ -13,7 +13,7 @@ Signed-off-by: John Crispin --- a/arch/mips/ralink/early_printk.c +++ b/arch/mips/ralink/early_printk.c -@@ -12,21 +12,24 @@ +@@ -12,21 +12,26 @@ #include #ifdef CONFIG_SOC_RT288X @@ -40,15 +40,17 @@ Signed-off-by: John Crispin +#define MT7628_CHIP_NAME1 0x20203832 + +#define UART_REG_TX 0x04 ++#define UART_REG_LCR 0x0c +#define UART_REG_LSR 0x14 +#define UART_REG_LSR_RT2880 0x1c static __iomem void *uart_membase = (__iomem void *) KSEG1ADDR(EARLY_UART_BASE); +static __iomem void *chipid_membase = (__iomem void *) KSEG1ADDR(CHIPID_BASE); ++static int init_complete; static inline void uart_w32(u32 val, unsigned reg) { -@@ -38,11 +41,23 @@ static inline u32 uart_r32(unsigned reg) +@@ -38,11 +43,46 @@ return __raw_readl(uart_membase + reg); } @@ -58,6 +60,24 @@ Signed-off-by: John Crispin + (__raw_readl(chipid_membase) == MT7628_CHIP_NAME1); +} + ++static inline void find_uart_base(void) ++{ ++ int i; ++ ++ if (!soc_is_mt7628()) ++ return; ++ ++ for (i = 0; i < 3; i++) { ++ u32 reg = uart_r32(UART_REG_LCR + (0x100 * i)); ++ ++ if (!reg) ++ continue; ++ ++ uart_membase = (__iomem void *) KSEG1ADDR(EARLY_UART_BASE + (0x100 * i)); ++ break; ++ } ++} ++ void prom_putchar(unsigned char ch) { - while ((uart_r32(UART_REG_LSR) & UART_LSR_THRE) == 0) @@ -65,6 +85,11 @@ Signed-off-by: John Crispin - uart_w32(ch, UART_REG_TX); - while ((uart_r32(UART_REG_LSR) & UART_LSR_THRE) == 0) - ; ++ if (!init_complete) { ++ find_uart_base(); ++ init_complete = 1; ++ } ++ + if (IS_ENABLED(CONFIG_SOC_MT7621) || soc_is_mt7628()) { + uart_w32(ch, UART_TX); + while ((uart_r32(UART_REG_LSR) & UART_LSR_THRE) == 0)