diff options
author | Huacai Chen <chenhc@lemote.com> | 2014-03-21 06:44:05 -0400 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2014-03-31 12:17:12 -0400 |
commit | 7546d2f48d5bc8479de135d80c74b0c08dbeb467 (patch) | |
tree | 081e833d521a9da36f56067e55f7c8a5b59945f4 | |
parent | d788bfa900748f3325894d18a763d1ba42326c28 (diff) |
MIPS: Loongson 3: Add serial port support
Loongson family machines has three types of serial port: PCI UART, LPC
UART and CPU internal UART. Loongson-2E and parts of Loongson-2F based
machines use PCI UART; most Loongson-2F based machines use LPC UART;
Loongson-2G/3A has both LPC and CPU UART but usually use CPU UART.
Port address of UARTs:
CPU UART: REG_BASE + OFFSET;
LPC UART: LIO1_BASE + OFFSET;
PCI UART: PCIIO_BASE + OFFSET.
Since LPC UART are linked in "Local Bus", both CPU UART and LPC UART
are called "CPU provided serial port".
Signed-off-by: Huacai Chen <chenhc@lemote.com>
Signed-off-by: Hongliang Tao <taohl@lemote.com>
Signed-off-by: Hua Yan <yanh@lemote.com>
Tested-by: Alex Smith <alex.smith@imgtec.com>
Reviewed-by: Alex Smith <alex.smith@imgtec.com>
Cc: John Crispin <john@phrozen.org>
Cc: Steven J. Hill <Steven.Hill@imgtec.com>
Cc: Aurelien Jarno <aurelien@aurel32.net>
Cc: linux-mips@linux-mips.org
Cc: Fuxin Zhang <zhangfx@lemote.com>
Cc: Zhangjin Wu <wuzhangjin@gmail.com>
Patchwork: https://patchwork.linux-mips.org/patch/6635
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
-rw-r--r-- | arch/mips/loongson/common/serial.c | 26 | ||||
-rw-r--r-- | arch/mips/loongson/common/uart_base.c | 9 |
2 files changed, 23 insertions, 12 deletions
diff --git a/arch/mips/loongson/common/serial.c b/arch/mips/loongson/common/serial.c index 5f2b78ae97cc..bd2b7095b6dc 100644 --- a/arch/mips/loongson/common/serial.c +++ b/arch/mips/loongson/common/serial.c | |||
@@ -19,19 +19,19 @@ | |||
19 | #include <loongson.h> | 19 | #include <loongson.h> |
20 | #include <machine.h> | 20 | #include <machine.h> |
21 | 21 | ||
22 | #define PORT(int) \ | 22 | #define PORT(int, clk) \ |
23 | { \ | 23 | { \ |
24 | .irq = int, \ | 24 | .irq = int, \ |
25 | .uartclk = 1843200, \ | 25 | .uartclk = clk, \ |
26 | .iotype = UPIO_PORT, \ | 26 | .iotype = UPIO_PORT, \ |
27 | .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST, \ | 27 | .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST, \ |
28 | .regshift = 0, \ | 28 | .regshift = 0, \ |
29 | } | 29 | } |
30 | 30 | ||
31 | #define PORT_M(int) \ | 31 | #define PORT_M(int, clk) \ |
32 | { \ | 32 | { \ |
33 | .irq = MIPS_CPU_IRQ_BASE + (int), \ | 33 | .irq = MIPS_CPU_IRQ_BASE + (int), \ |
34 | .uartclk = 3686400, \ | 34 | .uartclk = clk, \ |
35 | .iotype = UPIO_MEM, \ | 35 | .iotype = UPIO_MEM, \ |
36 | .membase = (void __iomem *)NULL, \ | 36 | .membase = (void __iomem *)NULL, \ |
37 | .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST, \ | 37 | .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST, \ |
@@ -40,13 +40,17 @@ | |||
40 | 40 | ||
41 | static struct plat_serial8250_port uart8250_data[][2] = { | 41 | static struct plat_serial8250_port uart8250_data[][2] = { |
42 | [MACH_LOONGSON_UNKNOWN] {}, | 42 | [MACH_LOONGSON_UNKNOWN] {}, |
43 | [MACH_LEMOTE_FL2E] {PORT(4), {} }, | 43 | [MACH_LEMOTE_FL2E] {PORT(4, 1843200), {} }, |
44 | [MACH_LEMOTE_FL2F] {PORT(3), {} }, | 44 | [MACH_LEMOTE_FL2F] {PORT(3, 1843200), {} }, |
45 | [MACH_LEMOTE_ML2F7] {PORT_M(3), {} }, | 45 | [MACH_LEMOTE_ML2F7] {PORT_M(3, 3686400), {} }, |
46 | [MACH_LEMOTE_YL2F89] {PORT_M(3), {} }, | 46 | [MACH_LEMOTE_YL2F89] {PORT_M(3, 3686400), {} }, |
47 | [MACH_DEXXON_GDIUM2F10] {PORT_M(3), {} }, | 47 | [MACH_DEXXON_GDIUM2F10] {PORT_M(3, 3686400), {} }, |
48 | [MACH_LEMOTE_NAS] {PORT_M(3), {} }, | 48 | [MACH_LEMOTE_NAS] {PORT_M(3, 3686400), {} }, |
49 | [MACH_LEMOTE_LL2F] {PORT(3), {} }, | 49 | [MACH_LEMOTE_LL2F] {PORT(3, 1843200), {} }, |
50 | [MACH_LEMOTE_A1004] {PORT_M(2, 33177600), {} }, | ||
51 | [MACH_LEMOTE_A1101] {PORT_M(2, 25000000), {} }, | ||
52 | [MACH_LEMOTE_A1201] {PORT_M(2, 25000000), {} }, | ||
53 | [MACH_LEMOTE_A1205] {PORT_M(2, 25000000), {} }, | ||
50 | [MACH_LOONGSON_END] {}, | 54 | [MACH_LOONGSON_END] {}, |
51 | }; | 55 | }; |
52 | 56 | ||
diff --git a/arch/mips/loongson/common/uart_base.c b/arch/mips/loongson/common/uart_base.c index e192ad021edc..1e1eeea73fde 100644 --- a/arch/mips/loongson/common/uart_base.c +++ b/arch/mips/loongson/common/uart_base.c | |||
@@ -35,9 +35,16 @@ void prom_init_loongson_uart_base(void) | |||
35 | case MACH_DEXXON_GDIUM2F10: | 35 | case MACH_DEXXON_GDIUM2F10: |
36 | case MACH_LEMOTE_NAS: | 36 | case MACH_LEMOTE_NAS: |
37 | default: | 37 | default: |
38 | /* The CPU provided serial port */ | 38 | /* The CPU provided serial port (LPC) */ |
39 | loongson_uart_base = LOONGSON_LIO1_BASE + 0x3f8; | 39 | loongson_uart_base = LOONGSON_LIO1_BASE + 0x3f8; |
40 | break; | 40 | break; |
41 | case MACH_LEMOTE_A1004: | ||
42 | case MACH_LEMOTE_A1101: | ||
43 | case MACH_LEMOTE_A1201: | ||
44 | case MACH_LEMOTE_A1205: | ||
45 | /* The CPU provided serial port (CPU) */ | ||
46 | loongson_uart_base = LOONGSON_REG_BASE + 0x1e0; | ||
47 | break; | ||
41 | } | 48 | } |
42 | 49 | ||
43 | _loongson_uart_base = | 50 | _loongson_uart_base = |