MIPS, ttyFDC: Add early FDC console support
authorJames Hogan <james.hogan@imgtec.com>
Thu, 29 Jan 2015 11:14:13 +0000 (11:14 +0000)
committerRalf Baechle <ralf@linux-mips.org>
Tue, 31 Mar 2015 10:04:12 +0000 (12:04 +0200)
Add support for early console of MIPS Fast Debug Channel (FDC) on
channel 1 with a call very early from the MIPS setup_arch().

Signed-off-by: James Hogan <james.hogan@imgtec.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Jiri Slaby <jslaby@suse.cz>
Cc: linux-mips@linux-mips.org
Cc: linux-kernel@vger.kernel.org
Patchwork: https://patchwork.linux-mips.org/patch/9145/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
arch/mips/include/asm/cdmm.h
arch/mips/kernel/setup.c
drivers/tty/Kconfig
drivers/tty/mips_ejtag_fdc.c

index b7d520f28d306d93d70d949ec2a1cd2a95220171..16e22ce9719fdf7b801bd7c003fc916019d9dd71 100644 (file)
@@ -84,4 +84,15 @@ void mips_cdmm_driver_unregister(struct mips_cdmm_driver *);
        module_driver(__mips_cdmm_driver, mips_cdmm_driver_register, \
                        mips_cdmm_driver_unregister)
 
+/* drivers/tty/mips_ejtag_fdc.c */
+
+#ifdef CONFIG_MIPS_EJTAG_FDC_EARLYCON
+int setup_early_fdc_console(void);
+#else
+static inline int setup_early_fdc_console(void)
+{
+       return -ENODEV;
+}
+#endif
+
 #endif /* __ASM_CDMM_H */
index 0589290413682ae321e7a022e6fca3e074533027..be73c491182bcab53f74aa765498d4a026a5b71b 100644 (file)
@@ -31,6 +31,7 @@
 #include <asm/bootinfo.h>
 #include <asm/bugs.h>
 #include <asm/cache.h>
+#include <asm/cdmm.h>
 #include <asm/cpu.h>
 #include <asm/sections.h>
 #include <asm/setup.h>
@@ -763,6 +764,7 @@ void __init setup_arch(char **cmdline_p)
        cpu_probe();
        prom_init();
 
+       setup_early_fdc_console();
 #ifdef CONFIG_EARLY_PRINTK
        setup_early_printk();
 #endif
index 39469ca4231ce3435decd03fdaa7b7f396e6f5bb..e0c18e5b7057803e4eec0c9748bedd4fa6427072 100644 (file)
@@ -437,4 +437,17 @@ config MIPS_EJTAG_FDC_TTY
 
          If unsure, say N.
 
+config MIPS_EJTAG_FDC_EARLYCON
+       bool "Early FDC console"
+       depends on MIPS_EJTAG_FDC_TTY
+       help
+         This registers a console on FDC channel 1 very early during boot (from
+         MIPS arch code). This is useful for bring-up and debugging early boot
+         issues.
+
+         Do not enable unless there is a debug probe attached to drain the FDC
+         TX FIFO.
+
+         If unsure, say N.
+
 endif # TTY
index 51672cfe7e45abcc1c200c9c9c7760c89814153e..8d9bf6f90110a41f8a9019c7828c8dd3f3fe29c1 100644 (file)
@@ -69,6 +69,9 @@
 #define REG_FDSTAT_TXE                 BIT(1)  /* Tx Empty */
 #define REG_FDSTAT_TXF                 BIT(0)  /* Tx Full */
 
+/* Default channel for the early console */
+#define CONSOLE_CHANNEL      1
+
 #define NUM_TTY_CHANNELS     16
 
 #define RX_BUF_SIZE 1024
@@ -1124,3 +1127,20 @@ static int __init mips_ejtag_fdc_init_console(void)
        return mips_ejtag_fdc_console_init(&mips_ejtag_fdc_con);
 }
 console_initcall(mips_ejtag_fdc_init_console);
+
+#ifdef CONFIG_MIPS_EJTAG_FDC_EARLYCON
+static struct mips_ejtag_fdc_console mips_ejtag_fdc_earlycon = {
+       .cons   = {
+               .name   = "early_fdc",
+               .write  = mips_ejtag_fdc_console_write,
+               .flags  = CON_PRINTBUFFER | CON_BOOT,
+               .index  = CONSOLE_CHANNEL,
+       },
+       .lock   = __RAW_SPIN_LOCK_UNLOCKED(mips_ejtag_fdc_earlycon.lock),
+};
+
+int __init setup_early_fdc_console(void)
+{
+       return mips_ejtag_fdc_console_init(&mips_ejtag_fdc_earlycon);
+}
+#endif