the problem had done,but i did not use device tree.I used drivers/tty/serial/8250/8250_exar_st16c554.c
------------------------------
#include <linux/module.h>
#include <linux/init.h>
#include <linux/serial_8250.h>
#define CS1_BASE 0x0c000000 //64M+32M+32M+0
#define CARD1_BASE CS1_BASE + 0x00004000
#define CARD2_BASE CS1_BASE + 0x00005000
#define CARD3_BASE CS1_BASE + 0x00006000
#define CARD4_BASE CS1_BASE + 0x00007000
#define CARD5_BASE CS1_BASE + 0x00008000
#define PHY_ST16C554_UART0 CARD1_BASE
#define PHY_ST16C554_UART1 CARD1_BASE + 0x10
#define PHY_ST16C554_UART2 CARD1_BASE + 0x20
#define PHY_ST16C554_UART3 CARD1_BASE + 0x30
#define PORT(_base,_irq) \
{ \
.membase = NULL, \
.mapbase = _base, \
.irq = _irq, \
.uartclk = 1843200, \
.regshift = 0, \
.iotype = UPIO_MEM, \
.flags = (UPF_BOOT_AUTOCONF |UPF_IOREMAP), \
}
static struct plat_serial8250_port exar_data[] = {
PORT(PHY_ST16C554_UART0, 302),
PORT(PHY_ST16C554_UART1, 273),
PORT(PHY_ST16C554_UART2, 297),
PORT(PHY_ST16C554_UART3, 299),
{ },
};
static struct platform_device exar_device = {
.name = "ST16C554",
.id = PLAT8250_DEV_EXAR_ST16C554,
.dev = {
.platform_data = exar_data,
},
};
static int __init exar_init(void)
{
return platform_device_register(&exar_device);
}
module_init(exar_init);
MODULE_AUTHOR("Paul B Schroeder");
MODULE_DESCRIPTION("8250 serial probe module for Exar cards");
MODULE_LICENSE("GPL");
---------------------------------------
and I inited the interrupts and bus time in 8250_core.c