extern void __init prom_init_cmdline(void);
extern void __init prom_init_machtype(void);
extern void __init prom_init_env(void);
+extern unsigned long _loongson_uart_base;
+extern unsigned long uart8250_base[];
+extern void prom_init_uart_base(void);
/* irq operation functions */
extern void bonito_irqdispatch(void);
#ifdef CONFIG_LEMOTE_FULOONG2E
-#define LOONGSON_UART_BASE (LOONGSON_PCIIO_BASE + 0x3f8)
-
#define LOONGSON_MACHTYPE MACH_LEMOTE_FL2E
#endif
#
obj-y += setup.o init.o cmdline.o env.o time.o reset.o irq.o \
- pci.o bonito-irq.o mem.o machtype.o
+ pci.o bonito-irq.o mem.o machtype.o uart_base.o
#
# Early printk support
#include <linux/serial_reg.h>
#include <loongson.h>
-#include <machine.h>
#define PORT(base, offset) (u8 *)(base + offset)
void prom_putchar(char c)
{
- unsigned char *uart_base =
- (unsigned char *) ioremap_nocache(LOONGSON_UART_BASE, 8);
+ int timeout;
+ unsigned char *uart_base;
- while ((serial_in(uart_base, UART_LSR) & UART_LSR_THRE) == 0)
+ uart_base = (unsigned char *)_loongson_uart_base;
+ timeout = 1024;
+
+ while (((serial_in(uart_base, UART_LSR) & UART_LSR_THRE) == 0) &&
+ (timeout-- > 0))
;
serial_out(uart_base, UART_TX, c);
/*
- * Copyright (C) 2009 Lemote Inc. & Insititute of Computing Technology
+ * Copyright (C) 2009 Lemote Inc.
* Author: Wu Zhangjin, wuzj@lemote.com
*
* This program is free software; you can redistribute it and/or modify it
#include <linux/bootmem.h>
-#include <asm/bootinfo.h>
-
#include <loongson.h>
void __init prom_init(void)
{
- /* init base address of io space */
+ /* init base address of io space */
set_io_port_base((unsigned long)
ioremap(LOONGSON_PCIIO_BASE, LOONGSON_PCIIO_SIZE));
prom_init_cmdline();
prom_init_env();
prom_init_memory();
+
+ /*init the uart base address */
+#if defined(CONFIG_EARLY_PRINTK) || defined(CONFIG_SERIAL_8250)
+ prom_init_uart_base();
+#endif
}
void __init prom_free_prom_memory(void)
{ \
.irq = int, \
.uartclk = 1843200, \
- .iobase = (LOONGSON_UART_BASE - LOONGSON_PCIIO_BASE),\
.iotype = UPIO_PORT, \
.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST, \
.regshift = 0, \
static struct platform_device uart8250_device = {
.name = "serial8250",
.id = PLAT8250_DEV_PLATFORM,
- .dev = {
- .platform_data = uart8250_data[LOONGSON_MACHTYPE],
- },
};
static int __init serial_init(void)
{
- if (uart8250_data[LOONGSON_MACHTYPE][0].iotype == UPIO_MEM)
- uart8250_data[LOONGSON_MACHTYPE][0].membase =
- ioremap_nocache(LOONGSON_UART_BASE, 8);
+ if (uart8250_data[mips_machtype][0].iotype == UPIO_MEM)
+ uart8250_data[mips_machtype][0].membase =
+ (void __iomem *)_loongson_uart_base;
+ else if (uart8250_data[mips_machtype][0].iotype == UPIO_PORT)
+ uart8250_data[mips_machtype][0].iobase =
+ uart8250_base[mips_machtype] - LOONGSON_PCIIO_BASE;
- platform_device_register(&uart8250_device);
+ uart8250_device.dev.platform_data = uart8250_data[mips_machtype];
- return 0;
+ return platform_device_register(&uart8250_device);
}
device_initcall(serial_init);
--- /dev/null
+/*
+ * Copyright (C) 2009 Lemote Inc.
+ * Author: Wu Zhangjin, wuzj@lemote.com
+ *
+ * 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.
+ */
+
+#include <linux/module.h>
+#include <asm/bootinfo.h>
+
+#include <loongson.h>
+
+unsigned long __maybe_unused _loongson_uart_base;
+EXPORT_SYMBOL(_loongson_uart_base);
+
+unsigned long __maybe_unused uart8250_base[] = {
+ [MACH_LOONGSON_UNKNOWN] 0,
+ [MACH_LEMOTE_FL2E] (LOONGSON_PCIIO_BASE + 0x3f8),
+ [MACH_LEMOTE_FL2F] (LOONGSON_PCIIO_BASE + 0x2f8),
+ [MACH_LEMOTE_ML2F7] (LOONGSON_LIO1_BASE + 0x3f8),
+ [MACH_LEMOTE_YL2F89] (LOONGSON_LIO1_BASE + 0x3f8),
+ [MACH_DEXXON_GDIUM2F10] (LOONGSON_LIO1_BASE + 0x3f8),
+ [MACH_LOONGSON_END] 0,
+};
+EXPORT_SYMBOL(uart8250_base);
+
+void __maybe_unused prom_init_uart_base(void)
+{
+ _loongson_uart_base =
+ (unsigned long)ioremap_nocache(uart8250_base[mips_machtype], 8);
+}