From b2018180441b7b51f15bfd74669e21f4a0127f30 Mon Sep 17 00:00:00 2001 From: Hauke Mehrtens Date: Sun, 6 Oct 2013 23:55:35 +0000 Subject: 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 SVN-Revision: 38309 --- ...Add-8250-16550-serial-early-printk-driver.patch | 124 +++++++++++++++++++++ 1 file changed, 124 insertions(+) create mode 100644 target/linux/brcm47xx/patches-3.10/080-MIPS-Add-8250-16550-serial-early-printk-driver.patch (limited to 'target/linux/brcm47xx/patches-3.10/080-MIPS-Add-8250-16550-serial-early-printk-driver.patch') 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 +Date: Mon Feb 8 20:59:39 2010 +0900 + + MIPS: Add 8250/16550 serial early printk driver + + Signed-off-by: Yoichi Yuasa + Cc: linux-mips + Patchwork: https://patchwork.linux-mips.org/patch/947/ + Signed-off-by: Ralf Baechle + +--- 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 ++ * ++ * 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 ++#include ++#include ++ ++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); ++} -- cgit v1.2.3