sh: More flexible + SH7780 earlyprintk SCIF support.
This makes the early printk support somewhat more flexible, moving the port definition to a config option, and making the port initialization configurable for sh-ipl+g users. At the same time, this allows us to trivially wire up the SH7780 SCIF0, so that's thrown in too more or less for free. Signed-off-by: Paul Mundt <lethal@linux-sh.org>
This commit is contained in:
Родитель
510c72ad2d
Коммит
6fc21b82ef
|
@ -17,7 +17,18 @@ config SH_STANDARD_BIOS
|
||||||
|
|
||||||
config EARLY_SCIF_CONSOLE
|
config EARLY_SCIF_CONSOLE
|
||||||
bool "Use early SCIF console"
|
bool "Use early SCIF console"
|
||||||
depends on CPU_SH4 || CPU_SH2A && !SH_STANDARD_BIOS
|
help
|
||||||
|
This enables an early console using a fixed SCIF port. This can
|
||||||
|
be used by platforms that are either not running the SH
|
||||||
|
standard BIOS, or do not wish to use the BIOS callbacks for the
|
||||||
|
serial I/O.
|
||||||
|
|
||||||
|
config EARLY_SCIF_CONSOLE_PORT
|
||||||
|
hex "SCIF port for early console"
|
||||||
|
depends on EARLY_SCIF_CONSOLE
|
||||||
|
default "0xffe00000" if CPU_SUBTYPE_SH7780
|
||||||
|
default "0xfffe9800" if CPU_SUBTYPE_SH72060
|
||||||
|
default "0xffe80000" if CPU_SH4
|
||||||
|
|
||||||
config EARLY_PRINTK
|
config EARLY_PRINTK
|
||||||
bool "Early printk support"
|
bool "Early printk support"
|
||||||
|
@ -30,6 +41,11 @@ config EARLY_PRINTK
|
||||||
when the kernel may crash or hang before the serial console is
|
when the kernel may crash or hang before the serial console is
|
||||||
initialised. If unsure, say N.
|
initialised. If unsure, say N.
|
||||||
|
|
||||||
|
On devices that are running SH-IPL and want to keep the port
|
||||||
|
initialization consistent while not using the BIOS callbacks,
|
||||||
|
select both the EARLY_SCIF_CONSOLE and SH_STANDARD_BIOS, using
|
||||||
|
the kernel command line option to toggle back and forth.
|
||||||
|
|
||||||
config DEBUG_STACKOVERFLOW
|
config DEBUG_STACKOVERFLOW
|
||||||
bool "Check for stack overflows"
|
bool "Check for stack overflows"
|
||||||
depends on DEBUG_KERNEL
|
depends on DEBUG_KERNEL
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
#include <linux/console.h>
|
#include <linux/console.h>
|
||||||
#include <linux/tty.h>
|
#include <linux/tty.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <asm/io.h>
|
#include <linux/io.h>
|
||||||
|
|
||||||
#ifdef CONFIG_SH_STANDARD_BIOS
|
#ifdef CONFIG_SH_STANDARD_BIOS
|
||||||
#include <asm/sh_bios.h>
|
#include <asm/sh_bios.h>
|
||||||
|
@ -62,17 +62,9 @@ static struct console bios_console = {
|
||||||
#include <linux/serial_core.h>
|
#include <linux/serial_core.h>
|
||||||
#include "../../../drivers/serial/sh-sci.h"
|
#include "../../../drivers/serial/sh-sci.h"
|
||||||
|
|
||||||
#ifdef CONFIG_CPU_SH4
|
|
||||||
#define SCIF_REG 0xffe80000
|
|
||||||
#elif defined(CONFIG_CPU_SUBTYPE_SH72060)
|
|
||||||
#define SCIF_REG 0xfffe9800
|
|
||||||
#else
|
|
||||||
#error "Undefined SCIF for this subtype"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static struct uart_port scif_port = {
|
static struct uart_port scif_port = {
|
||||||
.mapbase = SCIF_REG,
|
.mapbase = CONFIG_EARLY_SCIF_CONSOLE_PORT,
|
||||||
.membase = (char __iomem *)SCIF_REG,
|
.membase = (char __iomem *)CONFIG_EARLY_SCIF_CONSOLE_PORT,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void scif_sercon_putc(int c)
|
static void scif_sercon_putc(int c)
|
||||||
|
@ -113,23 +105,29 @@ static struct console scif_console = {
|
||||||
.index = -1,
|
.index = -1,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#if defined(CONFIG_CPU_SH4) && !defined(CONFIG_SH_STANDARD_BIOS)
|
||||||
|
/*
|
||||||
|
* Simple SCIF init, primarily aimed at SH7750 and other similar SH-4
|
||||||
|
* devices that aren't using sh-ipl+g.
|
||||||
|
*/
|
||||||
static void scif_sercon_init(int baud)
|
static void scif_sercon_init(int baud)
|
||||||
{
|
{
|
||||||
ctrl_outw(0, SCIF_REG + 8);
|
ctrl_outw(0, scif_port.mapbase + 8);
|
||||||
ctrl_outw(0, SCIF_REG);
|
ctrl_outw(0, scif_port.mapbase);
|
||||||
|
|
||||||
/* Set baud rate */
|
/* Set baud rate */
|
||||||
ctrl_outb((CONFIG_SH_PCLK_FREQ + 16 * baud) /
|
ctrl_outb((CONFIG_SH_PCLK_FREQ + 16 * baud) /
|
||||||
(32 * baud) - 1, SCIF_REG + 4);
|
(32 * baud) - 1, scif_port.mapbase + 4);
|
||||||
|
|
||||||
ctrl_outw(12, SCIF_REG + 24);
|
ctrl_outw(12, scif_port.mapbase + 24);
|
||||||
ctrl_outw(8, SCIF_REG + 24);
|
ctrl_outw(8, scif_port.mapbase + 24);
|
||||||
ctrl_outw(0, SCIF_REG + 32);
|
ctrl_outw(0, scif_port.mapbase + 32);
|
||||||
ctrl_outw(0x60, SCIF_REG + 16);
|
ctrl_outw(0x60, scif_port.mapbase + 16);
|
||||||
ctrl_outw(0, SCIF_REG + 36);
|
ctrl_outw(0, scif_port.mapbase + 36);
|
||||||
ctrl_outw(0x30, SCIF_REG + 8);
|
ctrl_outw(0x30, scif_port.mapbase + 8);
|
||||||
}
|
}
|
||||||
#endif
|
#endif /* CONFIG_CPU_SH4 && !CONFIG_SH_STANDARD_BIOS */
|
||||||
|
#endif /* CONFIG_EARLY_SCIF_CONSOLE */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Setup a default console, if more than one is compiled in, rely on the
|
* Setup a default console, if more than one is compiled in, rely on the
|
||||||
|
@ -168,7 +166,7 @@ int __init setup_early_printk(char *opt)
|
||||||
if (!strncmp(buf, "serial", 6)) {
|
if (!strncmp(buf, "serial", 6)) {
|
||||||
early_console = &scif_console;
|
early_console = &scif_console;
|
||||||
|
|
||||||
#ifdef CONFIG_CPU_SH4
|
#if defined(CONFIG_CPU_SH4) && !defined(CONFIG_SH_STANDARD_BIOS)
|
||||||
scif_sercon_init(115200);
|
scif_sercon_init(115200);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
|
@ -379,6 +379,7 @@ SCIx_FNS(SCxSR, 0x08, 8, 0x10, 8, 0x08, 16, 0x10, 16, 0x04, 8)
|
||||||
SCIx_FNS(SCxRDR, 0x0a, 8, 0x14, 8, 0x0A, 8, 0x14, 8, 0x05, 8)
|
SCIx_FNS(SCxRDR, 0x0a, 8, 0x14, 8, 0x0A, 8, 0x14, 8, 0x05, 8)
|
||||||
SCIF_FNS(SCFCR, 0x0c, 8, 0x18, 16)
|
SCIF_FNS(SCFCR, 0x0c, 8, 0x18, 16)
|
||||||
#if defined(CONFIG_CPU_SUBTYPE_SH7760) || defined(CONFIG_CPU_SUBTYPE_SH7780)
|
#if defined(CONFIG_CPU_SUBTYPE_SH7760) || defined(CONFIG_CPU_SUBTYPE_SH7780)
|
||||||
|
SCIF_FNS(SCFDR, 0x0e, 16, 0x1C, 16)
|
||||||
SCIF_FNS(SCTFDR, 0x0e, 16, 0x1C, 16)
|
SCIF_FNS(SCTFDR, 0x0e, 16, 0x1C, 16)
|
||||||
SCIF_FNS(SCRFDR, 0x0e, 16, 0x20, 16)
|
SCIF_FNS(SCRFDR, 0x0e, 16, 0x20, 16)
|
||||||
SCIF_FNS(SCSPTR, 0, 0, 0x24, 16)
|
SCIF_FNS(SCSPTR, 0, 0, 0x24, 16)
|
||||||
|
|
Загрузка…
Ссылка в новой задаче