m68k/mvme16x: Add support for EARLY_PRINTK
Added support for EARLY_PRINTK when running on an MVME16x board. Signed-off-by: Kars de Jong <jongk@linux-m68k.org> Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
This commit is contained in:
parent
f8bd9de913
commit
f999489495
|
@ -2,6 +2,17 @@ menu "Kernel hacking"
|
||||||
|
|
||||||
source "lib/Kconfig.debug"
|
source "lib/Kconfig.debug"
|
||||||
|
|
||||||
|
config EARLY_PRINTK
|
||||||
|
bool "Early printk" if EMBEDDED
|
||||||
|
depends on MVME16x
|
||||||
|
default y
|
||||||
|
help
|
||||||
|
Write kernel log output directly to a serial port.
|
||||||
|
|
||||||
|
This is useful for kernel debugging when your machine crashes very
|
||||||
|
early before the console code is initialized.
|
||||||
|
You should normally say N here, unless you want to debug such a crash.
|
||||||
|
|
||||||
if !MMU
|
if !MMU
|
||||||
|
|
||||||
config FULLDEBUG
|
config FULLDEBUG
|
||||||
|
|
|
@ -124,6 +124,163 @@ static void __init mvme16x_init_IRQ (void)
|
||||||
#define PccSCCMICR 0x1d
|
#define PccSCCMICR 0x1d
|
||||||
#define PccSCCTICR 0x1e
|
#define PccSCCTICR 0x1e
|
||||||
#define PccSCCRICR 0x1f
|
#define PccSCCRICR 0x1f
|
||||||
|
#define PccTPIACKR 0x25
|
||||||
|
|
||||||
|
#ifdef CONFIG_EARLY_PRINTK
|
||||||
|
|
||||||
|
/**** cd2401 registers ****/
|
||||||
|
#define CD2401_ADDR (0xfff45000)
|
||||||
|
|
||||||
|
#define CyGFRCR (0x81)
|
||||||
|
#define CyCCR (0x13)
|
||||||
|
#define CyCLR_CHAN (0x40)
|
||||||
|
#define CyINIT_CHAN (0x20)
|
||||||
|
#define CyCHIP_RESET (0x10)
|
||||||
|
#define CyENB_XMTR (0x08)
|
||||||
|
#define CyDIS_XMTR (0x04)
|
||||||
|
#define CyENB_RCVR (0x02)
|
||||||
|
#define CyDIS_RCVR (0x01)
|
||||||
|
#define CyCAR (0xee)
|
||||||
|
#define CyIER (0x11)
|
||||||
|
#define CyMdmCh (0x80)
|
||||||
|
#define CyRxExc (0x20)
|
||||||
|
#define CyRxData (0x08)
|
||||||
|
#define CyTxMpty (0x02)
|
||||||
|
#define CyTxRdy (0x01)
|
||||||
|
#define CyLICR (0x26)
|
||||||
|
#define CyRISR (0x89)
|
||||||
|
#define CyTIMEOUT (0x80)
|
||||||
|
#define CySPECHAR (0x70)
|
||||||
|
#define CyOVERRUN (0x08)
|
||||||
|
#define CyPARITY (0x04)
|
||||||
|
#define CyFRAME (0x02)
|
||||||
|
#define CyBREAK (0x01)
|
||||||
|
#define CyREOIR (0x84)
|
||||||
|
#define CyTEOIR (0x85)
|
||||||
|
#define CyMEOIR (0x86)
|
||||||
|
#define CyNOTRANS (0x08)
|
||||||
|
#define CyRFOC (0x30)
|
||||||
|
#define CyRDR (0xf8)
|
||||||
|
#define CyTDR (0xf8)
|
||||||
|
#define CyMISR (0x8b)
|
||||||
|
#define CyRISR (0x89)
|
||||||
|
#define CyTISR (0x8a)
|
||||||
|
#define CyMSVR1 (0xde)
|
||||||
|
#define CyMSVR2 (0xdf)
|
||||||
|
#define CyDSR (0x80)
|
||||||
|
#define CyDCD (0x40)
|
||||||
|
#define CyCTS (0x20)
|
||||||
|
#define CyDTR (0x02)
|
||||||
|
#define CyRTS (0x01)
|
||||||
|
#define CyRTPRL (0x25)
|
||||||
|
#define CyRTPRH (0x24)
|
||||||
|
#define CyCOR1 (0x10)
|
||||||
|
#define CyPARITY_NONE (0x00)
|
||||||
|
#define CyPARITY_E (0x40)
|
||||||
|
#define CyPARITY_O (0xC0)
|
||||||
|
#define Cy_5_BITS (0x04)
|
||||||
|
#define Cy_6_BITS (0x05)
|
||||||
|
#define Cy_7_BITS (0x06)
|
||||||
|
#define Cy_8_BITS (0x07)
|
||||||
|
#define CyCOR2 (0x17)
|
||||||
|
#define CyETC (0x20)
|
||||||
|
#define CyCtsAE (0x02)
|
||||||
|
#define CyCOR3 (0x16)
|
||||||
|
#define Cy_1_STOP (0x02)
|
||||||
|
#define Cy_2_STOP (0x04)
|
||||||
|
#define CyCOR4 (0x15)
|
||||||
|
#define CyREC_FIFO (0x0F) /* Receive FIFO threshold */
|
||||||
|
#define CyCOR5 (0x14)
|
||||||
|
#define CyCOR6 (0x18)
|
||||||
|
#define CyCOR7 (0x07)
|
||||||
|
#define CyRBPR (0xcb)
|
||||||
|
#define CyRCOR (0xc8)
|
||||||
|
#define CyTBPR (0xc3)
|
||||||
|
#define CyTCOR (0xc0)
|
||||||
|
#define CySCHR1 (0x1f)
|
||||||
|
#define CySCHR2 (0x1e)
|
||||||
|
#define CyTPR (0xda)
|
||||||
|
#define CyPILR1 (0xe3)
|
||||||
|
#define CyPILR2 (0xe0)
|
||||||
|
#define CyPILR3 (0xe1)
|
||||||
|
#define CyCMR (0x1b)
|
||||||
|
#define CyASYNC (0x02)
|
||||||
|
#define CyLICR (0x26)
|
||||||
|
#define CyLIVR (0x09)
|
||||||
|
#define CySCRL (0x23)
|
||||||
|
#define CySCRH (0x22)
|
||||||
|
#define CyTFTC (0x80)
|
||||||
|
|
||||||
|
static void cons_write(struct console *co, const char *str, unsigned count)
|
||||||
|
{
|
||||||
|
volatile unsigned char *base_addr = (u_char *)CD2401_ADDR;
|
||||||
|
volatile u_char sink;
|
||||||
|
u_char ier;
|
||||||
|
int port;
|
||||||
|
u_char do_lf = 0;
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
/* Ensure transmitter is enabled! */
|
||||||
|
|
||||||
|
port = 0;
|
||||||
|
base_addr[CyCAR] = (u_char)port;
|
||||||
|
while (base_addr[CyCCR])
|
||||||
|
;
|
||||||
|
base_addr[CyCCR] = CyENB_XMTR;
|
||||||
|
|
||||||
|
ier = base_addr[CyIER];
|
||||||
|
base_addr[CyIER] = CyTxMpty;
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
if (pcc2chip[PccSCCTICR] & 0x20)
|
||||||
|
{
|
||||||
|
/* We have a Tx int. Acknowledge it */
|
||||||
|
sink = pcc2chip[PccTPIACKR];
|
||||||
|
if ((base_addr[CyLICR] >> 2) == port) {
|
||||||
|
if (i == count) {
|
||||||
|
/* Last char of string is now output */
|
||||||
|
base_addr[CyTEOIR] = CyNOTRANS;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (do_lf) {
|
||||||
|
base_addr[CyTDR] = '\n';
|
||||||
|
str++;
|
||||||
|
i++;
|
||||||
|
do_lf = 0;
|
||||||
|
}
|
||||||
|
else if (*str == '\n') {
|
||||||
|
base_addr[CyTDR] = '\r';
|
||||||
|
do_lf = 1;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
base_addr[CyTDR] = *str++;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
base_addr[CyTEOIR] = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
base_addr[CyTEOIR] = CyNOTRANS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
base_addr[CyIER] = ier;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct console cons_info =
|
||||||
|
{
|
||||||
|
.name = "sercon",
|
||||||
|
.write = cons_write,
|
||||||
|
.flags = CON_PRINTBUFFER | CON_BOOT,
|
||||||
|
.index = -1,
|
||||||
|
};
|
||||||
|
|
||||||
|
static void __init mvme16x_early_console(void)
|
||||||
|
{
|
||||||
|
register_console(&cons_info);
|
||||||
|
|
||||||
|
printk(KERN_INFO "MVME16x: early console registered\n");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void __init config_mvme16x(void)
|
void __init config_mvme16x(void)
|
||||||
{
|
{
|
||||||
|
@ -183,6 +340,9 @@ void __init config_mvme16x(void)
|
||||||
pcc2chip[PccSCCMICR] = 0x10;
|
pcc2chip[PccSCCMICR] = 0x10;
|
||||||
pcc2chip[PccSCCTICR] = 0x10;
|
pcc2chip[PccSCCTICR] = 0x10;
|
||||||
pcc2chip[PccSCCRICR] = 0x10;
|
pcc2chip[PccSCCRICR] = 0x10;
|
||||||
|
#ifdef CONFIG_EARLY_PRINTK
|
||||||
|
mvme16x_early_console();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue