diff options
Diffstat (limited to 'arch/mips/loongson/common/serial.c')
-rw-r--r-- | arch/mips/loongson/common/serial.c | 66 |
1 files changed, 49 insertions, 17 deletions
diff --git a/arch/mips/loongson/common/serial.c b/arch/mips/loongson/common/serial.c index bd2b7095b6dc..c23fa1373729 100644 --- a/arch/mips/loongson/common/serial.c +++ b/arch/mips/loongson/common/serial.c | |||
@@ -38,20 +38,17 @@ | |||
38 | .regshift = 0, \ | 38 | .regshift = 0, \ |
39 | } | 39 | } |
40 | 40 | ||
41 | static struct plat_serial8250_port uart8250_data[][2] = { | 41 | static struct plat_serial8250_port uart8250_data[][MAX_UARTS + 1] = { |
42 | [MACH_LOONGSON_UNKNOWN] {}, | 42 | [MACH_LOONGSON_UNKNOWN] = {}, |
43 | [MACH_LEMOTE_FL2E] {PORT(4, 1843200), {} }, | 43 | [MACH_LEMOTE_FL2E] = {PORT(4, 1843200), {} }, |
44 | [MACH_LEMOTE_FL2F] {PORT(3, 1843200), {} }, | 44 | [MACH_LEMOTE_FL2F] = {PORT(3, 1843200), {} }, |
45 | [MACH_LEMOTE_ML2F7] {PORT_M(3, 3686400), {} }, | 45 | [MACH_LEMOTE_ML2F7] = {PORT_M(3, 3686400), {} }, |
46 | [MACH_LEMOTE_YL2F89] {PORT_M(3, 3686400), {} }, | 46 | [MACH_LEMOTE_YL2F89] = {PORT_M(3, 3686400), {} }, |
47 | [MACH_DEXXON_GDIUM2F10] {PORT_M(3, 3686400), {} }, | 47 | [MACH_DEXXON_GDIUM2F10] = {PORT_M(3, 3686400), {} }, |
48 | [MACH_LEMOTE_NAS] {PORT_M(3, 3686400), {} }, | 48 | [MACH_LEMOTE_NAS] = {PORT_M(3, 3686400), {} }, |
49 | [MACH_LEMOTE_LL2F] {PORT(3, 1843200), {} }, | 49 | [MACH_LEMOTE_LL2F] = {PORT(3, 1843200), {} }, |
50 | [MACH_LEMOTE_A1004] {PORT_M(2, 33177600), {} }, | 50 | [MACH_LOONGSON_GENERIC] = {PORT_M(2, 25000000), {} }, |
51 | [MACH_LEMOTE_A1101] {PORT_M(2, 25000000), {} }, | 51 | [MACH_LOONGSON_END] = {}, |
52 | [MACH_LEMOTE_A1201] {PORT_M(2, 25000000), {} }, | ||
53 | [MACH_LEMOTE_A1205] {PORT_M(2, 25000000), {} }, | ||
54 | [MACH_LOONGSON_END] {}, | ||
55 | }; | 52 | }; |
56 | 53 | ||
57 | static struct platform_device uart8250_device = { | 54 | static struct platform_device uart8250_device = { |
@@ -61,17 +58,52 @@ static struct platform_device uart8250_device = { | |||
61 | 58 | ||
62 | static int __init serial_init(void) | 59 | static int __init serial_init(void) |
63 | { | 60 | { |
61 | int i; | ||
64 | unsigned char iotype; | 62 | unsigned char iotype; |
65 | 63 | ||
66 | iotype = uart8250_data[mips_machtype][0].iotype; | 64 | iotype = uart8250_data[mips_machtype][0].iotype; |
67 | 65 | ||
68 | if (UPIO_MEM == iotype) | 66 | if (UPIO_MEM == iotype) { |
67 | uart8250_data[mips_machtype][0].mapbase = | ||
68 | loongson_uart_base[0]; | ||
69 | uart8250_data[mips_machtype][0].membase = | 69 | uart8250_data[mips_machtype][0].membase = |
70 | (void __iomem *)_loongson_uart_base; | 70 | (void __iomem *)_loongson_uart_base[0]; |
71 | } | ||
71 | else if (UPIO_PORT == iotype) | 72 | else if (UPIO_PORT == iotype) |
72 | uart8250_data[mips_machtype][0].iobase = | 73 | uart8250_data[mips_machtype][0].iobase = |
73 | loongson_uart_base - LOONGSON_PCIIO_BASE; | 74 | loongson_uart_base[0] - LOONGSON_PCIIO_BASE; |
74 | 75 | ||
76 | if (loongson_sysconf.uarts[0].uartclk) | ||
77 | uart8250_data[mips_machtype][0].uartclk = | ||
78 | loongson_sysconf.uarts[0].uartclk; | ||
79 | |||
80 | for (i = 1; i < loongson_sysconf.nr_uarts; i++) { | ||
81 | iotype = loongson_sysconf.uarts[i].iotype; | ||
82 | uart8250_data[mips_machtype][i].iotype = iotype; | ||
83 | loongson_uart_base[i] = loongson_sysconf.uarts[i].uart_base; | ||
84 | |||
85 | if (UPIO_MEM == iotype) { | ||
86 | uart8250_data[mips_machtype][i].irq = | ||
87 | MIPS_CPU_IRQ_BASE + loongson_sysconf.uarts[i].int_offset; | ||
88 | uart8250_data[mips_machtype][i].mapbase = | ||
89 | loongson_uart_base[i]; | ||
90 | uart8250_data[mips_machtype][i].membase = | ||
91 | ioremap_nocache(loongson_uart_base[i], 8); | ||
92 | } else if (UPIO_PORT == iotype) { | ||
93 | uart8250_data[mips_machtype][i].irq = | ||
94 | loongson_sysconf.uarts[i].int_offset; | ||
95 | uart8250_data[mips_machtype][i].iobase = | ||
96 | loongson_uart_base[i] - LOONGSON_PCIIO_BASE; | ||
97 | } | ||
98 | |||
99 | uart8250_data[mips_machtype][i].uartclk = | ||
100 | loongson_sysconf.uarts[i].uartclk; | ||
101 | uart8250_data[mips_machtype][i].flags = | ||
102 | UPF_BOOT_AUTOCONF | UPF_SKIP_TEST; | ||
103 | } | ||
104 | |||
105 | memset(&uart8250_data[mips_machtype][loongson_sysconf.nr_uarts], | ||
106 | 0, sizeof(struct plat_serial8250_port)); | ||
75 | uart8250_device.dev.platform_data = uart8250_data[mips_machtype]; | 107 | uart8250_device.dev.platform_data = uart8250_data[mips_machtype]; |
76 | 108 | ||
77 | return platform_device_register(&uart8250_device); | 109 | return platform_device_register(&uart8250_device); |