summaryrefslogtreecommitdiff
path: root/target/linux/brcm47xx/patches-3.10/080-MIPS-Add-8250-16550-serial-early-printk-driver.patch
diff options
context:
space:
mode:
authorhauke <hauke@3c298f89-4303-0410-b956-a3cf2f4a3e73>2013-10-06 23:55:35 +0000
committerhauke <hauke@3c298f89-4303-0410-b956-a3cf2f4a3e73>2013-10-06 23:55:35 +0000
commit163ed4e9a51c483e42e4c67fd14b0f4f0a15e5e1 (patch)
tree1ea4d49631253f3a332f7e09a4031d45c1c14fee /target/linux/brcm47xx/patches-3.10/080-MIPS-Add-8250-16550-serial-early-printk-driver.patch
parentb82d0dc241632d33e8208c35dafae017fc872c6e (diff)
brcm47xx: update early printk patches
Early printk was disabled because it caused hangs on some devices, the old patches were using the CFE console now we use the normal serial console, it is at a constant address. Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de> git-svn-id: svn://svn.openwrt.org/openwrt/trunk@38309 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'target/linux/brcm47xx/patches-3.10/080-MIPS-Add-8250-16550-serial-early-printk-driver.patch')
-rw-r--r--target/linux/brcm47xx/patches-3.10/080-MIPS-Add-8250-16550-serial-early-printk-driver.patch124
1 files changed, 124 insertions, 0 deletions
diff --git a/target/linux/brcm47xx/patches-3.10/080-MIPS-Add-8250-16550-serial-early-printk-driver.patch b/target/linux/brcm47xx/patches-3.10/080-MIPS-Add-8250-16550-serial-early-printk-driver.patch
new file mode 100644
index 0000000000..bfbe43be5b
--- /dev/null
+++ b/target/linux/brcm47xx/patches-3.10/080-MIPS-Add-8250-16550-serial-early-printk-driver.patch
@@ -0,0 +1,124 @@
+commit 0a76092a63809a0e72e3e9552acadf42869c0293
+Author: Yoichi Yuasa <yuasa@linux-mips.org>
+Date: Mon Feb 8 20:59:39 2010 +0900
+
+ MIPS: Add 8250/16550 serial early printk driver
+
+ Signed-off-by: Yoichi Yuasa <yuasa@linux-mips.org>
+ Cc: linux-mips <linux-mips@linux-mips.org>
+ Patchwork: https://patchwork.linux-mips.org/patch/947/
+ Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
+
+--- a/arch/mips/Kconfig.debug
++++ b/arch/mips/Kconfig.debug
+@@ -20,6 +20,14 @@ config EARLY_PRINTK
+ doesn't cooperate with an X server. You should normally say N here,
+ unless you want to debug such a crash.
+
++config EARLY_PRINTK_8250
++ bool "8250/16550 and compatible serial early printk driver"
++ depends on EARLY_PRINTK
++ default n
++ help
++ If you say Y here, it will be possible to use a 8250/16550 serial
++ port as the boot console.
++
+ config CMDLINE_BOOL
+ bool "Built-in kernel command line"
+ default n
+--- a/arch/mips/include/asm/setup.h
++++ b/arch/mips/include/asm/setup.h
+@@ -5,6 +5,14 @@
+
+ extern void setup_early_printk(void);
+
++#ifdef CONFIG_EARLY_PRINTK_8250
++extern void setup_8250_early_printk_port(unsigned long base,
++ unsigned int reg_shift, unsigned int timeout);
++#else
++static inline void setup_8250_early_printk_port(unsigned long base,
++ unsigned int reg_shift, unsigned int timeout) {}
++#endif
++
+ extern void set_handler(unsigned long offset, void *addr, unsigned long len);
+ extern void set_uncached_handler(unsigned long offset, void *addr, unsigned long len);
+
+--- a/arch/mips/kernel/Makefile
++++ b/arch/mips/kernel/Makefile
+@@ -84,6 +84,7 @@ obj-$(CONFIG_GPIO_TXX9) += gpio_txx9.o
+ obj-$(CONFIG_KEXEC) += machine_kexec.o relocate_kernel.o crash.o
+ obj-$(CONFIG_CRASH_DUMP) += crash_dump.o
+ obj-$(CONFIG_EARLY_PRINTK) += early_printk.o
++obj-$(CONFIG_EARLY_PRINTK_8250) += early_printk_8250.o
+ obj-$(CONFIG_SPINLOCK_TEST) += spinlock_test.o
+ obj-$(CONFIG_MIPS_MACHINE) += mips_machine.o
+
+--- /dev/null
++++ b/arch/mips/kernel/early_printk_8250.c
+@@ -0,0 +1,66 @@
++/*
++ * 8250/16550-type serial ports prom_putchar()
++ *
++ * Copyright (C) 2010 Yoichi Yuasa <yuasa@linux-mips.org>
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
++ */
++#include <linux/io.h>
++#include <linux/serial_core.h>
++#include <linux/serial_reg.h>
++
++static void __iomem *serial8250_base;
++static unsigned int serial8250_reg_shift;
++static unsigned int serial8250_tx_timeout;
++
++void setup_8250_early_printk_port(unsigned long base, unsigned int reg_shift,
++ unsigned int timeout)
++{
++ serial8250_base = (void __iomem *)base;
++ serial8250_reg_shift = reg_shift;
++ serial8250_tx_timeout = timeout;
++}
++
++static inline u8 serial_in(int offset)
++{
++ return readb(serial8250_base + (offset << serial8250_reg_shift));
++}
++
++static inline void serial_out(int offset, char value)
++{
++ writeb(value, serial8250_base + (offset << serial8250_reg_shift));
++}
++
++void prom_putchar(char c)
++{
++ unsigned int timeout;
++ int status, bits;
++
++ if (!serial8250_base)
++ return;
++
++ timeout = serial8250_tx_timeout;
++ bits = UART_LSR_TEMT | UART_LSR_THRE;
++
++ do {
++ status = serial_in(UART_LSR);
++
++ if (--timeout == 0)
++ break;
++ } while ((status & bits) != bits);
++
++ if (timeout)
++ serial_out(UART_TX, c);
++}