diff options
-rw-r--r-- | drivers/serial/cpm_uart/cpm_uart.h | 6 | ||||
-rw-r--r-- | drivers/serial/cpm_uart/cpm_uart_core.c | 241 | ||||
-rw-r--r-- | drivers/serial/cpm_uart/cpm_uart_cpm1.c | 16 | ||||
-rw-r--r-- | drivers/serial/cpm_uart/cpm_uart_cpm1.h | 2 | ||||
-rw-r--r-- | drivers/serial/cpm_uart/cpm_uart_cpm2.c | 18 | ||||
-rw-r--r-- | drivers/serial/cpm_uart/cpm_uart_cpm2.h | 2 |
6 files changed, 260 insertions, 25 deletions
diff --git a/drivers/serial/cpm_uart/cpm_uart.h b/drivers/serial/cpm_uart/cpm_uart.h index a8f894c78194..4e1987adc23b 100644 --- a/drivers/serial/cpm_uart/cpm_uart.h +++ b/drivers/serial/cpm_uart/cpm_uart.h | |||
@@ -80,14 +80,18 @@ struct uart_cpm_port { | |||
80 | int is_portb; | 80 | int is_portb; |
81 | /* wait on close if needed */ | 81 | /* wait on close if needed */ |
82 | int wait_closing; | 82 | int wait_closing; |
83 | /* value to combine with opcode to form cpm command */ | ||
84 | u32 command; | ||
83 | }; | 85 | }; |
84 | 86 | ||
87 | #ifndef CONFIG_PPC_CPM_NEW_BINDING | ||
85 | extern int cpm_uart_port_map[UART_NR]; | 88 | extern int cpm_uart_port_map[UART_NR]; |
89 | #endif | ||
86 | extern int cpm_uart_nr; | 90 | extern int cpm_uart_nr; |
87 | extern struct uart_cpm_port cpm_uart_ports[UART_NR]; | 91 | extern struct uart_cpm_port cpm_uart_ports[UART_NR]; |
88 | 92 | ||
89 | /* these are located in their respective files */ | 93 | /* these are located in their respective files */ |
90 | void cpm_line_cr_cmd(int line, int cmd); | 94 | void cpm_line_cr_cmd(struct uart_cpm_port *port, int cmd); |
91 | int cpm_uart_init_portdesc(void); | 95 | int cpm_uart_init_portdesc(void); |
92 | int cpm_uart_allocbuf(struct uart_cpm_port *pinfo, unsigned int is_con); | 96 | int cpm_uart_allocbuf(struct uart_cpm_port *pinfo, unsigned int is_con); |
93 | void cpm_uart_freebuf(struct uart_cpm_port *pinfo); | 97 | void cpm_uart_freebuf(struct uart_cpm_port *pinfo); |
diff --git a/drivers/serial/cpm_uart/cpm_uart_core.c b/drivers/serial/cpm_uart/cpm_uart_core.c index cefde58dbad2..8564ba2f3ec2 100644 --- a/drivers/serial/cpm_uart/cpm_uart_core.c +++ b/drivers/serial/cpm_uart/cpm_uart_core.c | |||
@@ -10,7 +10,7 @@ | |||
10 | * Maintainer: Kumar Gala (galak@kernel.crashing.org) (CPM2) | 10 | * Maintainer: Kumar Gala (galak@kernel.crashing.org) (CPM2) |
11 | * Pantelis Antoniou (panto@intracom.gr) (CPM1) | 11 | * Pantelis Antoniou (panto@intracom.gr) (CPM1) |
12 | * | 12 | * |
13 | * Copyright (C) 2004 Freescale Semiconductor, Inc. | 13 | * Copyright (C) 2004, 2007 Freescale Semiconductor, Inc. |
14 | * (C) 2004 Intracom, S.A. | 14 | * (C) 2004 Intracom, S.A. |
15 | * (C) 2005-2006 MontaVista Software, Inc. | 15 | * (C) 2005-2006 MontaVista Software, Inc. |
16 | * Vitaly Bordug <vbordug@ru.mvista.com> | 16 | * Vitaly Bordug <vbordug@ru.mvista.com> |
@@ -47,6 +47,11 @@ | |||
47 | #include <asm/irq.h> | 47 | #include <asm/irq.h> |
48 | #include <asm/delay.h> | 48 | #include <asm/delay.h> |
49 | #include <asm/fs_pd.h> | 49 | #include <asm/fs_pd.h> |
50 | #include <asm/udbg.h> | ||
51 | |||
52 | #ifdef CONFIG_PPC_CPM_NEW_BINDING | ||
53 | #include <linux/of_platform.h> | ||
54 | #endif | ||
50 | 55 | ||
51 | #if defined(CONFIG_SERIAL_CPM_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) | 56 | #if defined(CONFIG_SERIAL_CPM_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) |
52 | #define SUPPORT_SYSRQ | 57 | #define SUPPORT_SYSRQ |
@@ -57,12 +62,6 @@ | |||
57 | 62 | ||
58 | #include "cpm_uart.h" | 63 | #include "cpm_uart.h" |
59 | 64 | ||
60 | /***********************************************************************/ | ||
61 | |||
62 | /* Track which ports are configured as uarts */ | ||
63 | int cpm_uart_port_map[UART_NR]; | ||
64 | /* How many ports did we config as uarts */ | ||
65 | int cpm_uart_nr = 0; | ||
66 | 65 | ||
67 | /**************************************************************/ | 66 | /**************************************************************/ |
68 | 67 | ||
@@ -73,6 +72,11 @@ static void cpm_uart_initbd(struct uart_cpm_port *pinfo); | |||
73 | 72 | ||
74 | /**************************************************************/ | 73 | /**************************************************************/ |
75 | 74 | ||
75 | #ifndef CONFIG_PPC_CPM_NEW_BINDING | ||
76 | /* Track which ports are configured as uarts */ | ||
77 | int cpm_uart_port_map[UART_NR]; | ||
78 | /* How many ports did we config as uarts */ | ||
79 | int cpm_uart_nr; | ||
76 | 80 | ||
77 | /* Place-holder for board-specific stuff */ | 81 | /* Place-holder for board-specific stuff */ |
78 | struct platform_device* __attribute__ ((weak)) __init | 82 | struct platform_device* __attribute__ ((weak)) __init |
@@ -119,6 +123,7 @@ static int cpm_uart_id2nr(int id) | |||
119 | /* not found or invalid argument */ | 123 | /* not found or invalid argument */ |
120 | return -1; | 124 | return -1; |
121 | } | 125 | } |
126 | #endif | ||
122 | 127 | ||
123 | /* | 128 | /* |
124 | * Check, if transmit buffers are processed | 129 | * Check, if transmit buffers are processed |
@@ -232,15 +237,14 @@ static void cpm_uart_enable_ms(struct uart_port *port) | |||
232 | static void cpm_uart_break_ctl(struct uart_port *port, int break_state) | 237 | static void cpm_uart_break_ctl(struct uart_port *port, int break_state) |
233 | { | 238 | { |
234 | struct uart_cpm_port *pinfo = (struct uart_cpm_port *)port; | 239 | struct uart_cpm_port *pinfo = (struct uart_cpm_port *)port; |
235 | int line = pinfo - cpm_uart_ports; | ||
236 | 240 | ||
237 | pr_debug("CPM uart[%d]:break ctrl, break_state: %d\n", port->line, | 241 | pr_debug("CPM uart[%d]:break ctrl, break_state: %d\n", port->line, |
238 | break_state); | 242 | break_state); |
239 | 243 | ||
240 | if (break_state) | 244 | if (break_state) |
241 | cpm_line_cr_cmd(line, CPM_CR_STOP_TX); | 245 | cpm_line_cr_cmd(pinfo, CPM_CR_STOP_TX); |
242 | else | 246 | else |
243 | cpm_line_cr_cmd(line, CPM_CR_RESTART_TX); | 247 | cpm_line_cr_cmd(pinfo, CPM_CR_RESTART_TX); |
244 | } | 248 | } |
245 | 249 | ||
246 | /* | 250 | /* |
@@ -407,7 +411,6 @@ static int cpm_uart_startup(struct uart_port *port) | |||
407 | { | 411 | { |
408 | int retval; | 412 | int retval; |
409 | struct uart_cpm_port *pinfo = (struct uart_cpm_port *)port; | 413 | struct uart_cpm_port *pinfo = (struct uart_cpm_port *)port; |
410 | int line = pinfo - cpm_uart_ports; | ||
411 | 414 | ||
412 | pr_debug("CPM uart[%d]:startup\n", port->line); | 415 | pr_debug("CPM uart[%d]:startup\n", port->line); |
413 | 416 | ||
@@ -426,7 +429,7 @@ static int cpm_uart_startup(struct uart_port *port) | |||
426 | } | 429 | } |
427 | 430 | ||
428 | if (!(pinfo->flags & FLAG_CONSOLE)) | 431 | if (!(pinfo->flags & FLAG_CONSOLE)) |
429 | cpm_line_cr_cmd(line,CPM_CR_INIT_TRX); | 432 | cpm_line_cr_cmd(pinfo, CPM_CR_INIT_TRX); |
430 | return 0; | 433 | return 0; |
431 | } | 434 | } |
432 | 435 | ||
@@ -442,7 +445,6 @@ inline void cpm_uart_wait_until_send(struct uart_cpm_port *pinfo) | |||
442 | static void cpm_uart_shutdown(struct uart_port *port) | 445 | static void cpm_uart_shutdown(struct uart_port *port) |
443 | { | 446 | { |
444 | struct uart_cpm_port *pinfo = (struct uart_cpm_port *)port; | 447 | struct uart_cpm_port *pinfo = (struct uart_cpm_port *)port; |
445 | int line = pinfo - cpm_uart_ports; | ||
446 | 448 | ||
447 | pr_debug("CPM uart[%d]:shutdown\n", port->line); | 449 | pr_debug("CPM uart[%d]:shutdown\n", port->line); |
448 | 450 | ||
@@ -473,9 +475,9 @@ static void cpm_uart_shutdown(struct uart_port *port) | |||
473 | 475 | ||
474 | /* Shut them really down and reinit buffer descriptors */ | 476 | /* Shut them really down and reinit buffer descriptors */ |
475 | if (IS_SMC(pinfo)) | 477 | if (IS_SMC(pinfo)) |
476 | cpm_line_cr_cmd(line, CPM_CR_STOP_TX); | 478 | cpm_line_cr_cmd(pinfo, CPM_CR_STOP_TX); |
477 | else | 479 | else |
478 | cpm_line_cr_cmd(line, CPM_CR_GRA_STOP_TX); | 480 | cpm_line_cr_cmd(pinfo, CPM_CR_GRA_STOP_TX); |
479 | 481 | ||
480 | cpm_uart_initbd(pinfo); | 482 | cpm_uart_initbd(pinfo); |
481 | } | 483 | } |
@@ -595,7 +597,6 @@ static void cpm_uart_set_termios(struct uart_port *port, | |||
595 | 597 | ||
596 | cpm_set_brg(pinfo->brg - 1, baud); | 598 | cpm_set_brg(pinfo->brg - 1, baud); |
597 | spin_unlock_irqrestore(&port->lock, flags); | 599 | spin_unlock_irqrestore(&port->lock, flags); |
598 | |||
599 | } | 600 | } |
600 | 601 | ||
601 | static const char *cpm_uart_type(struct uart_port *port) | 602 | static const char *cpm_uart_type(struct uart_port *port) |
@@ -742,7 +743,6 @@ static void cpm_uart_initbd(struct uart_cpm_port *pinfo) | |||
742 | 743 | ||
743 | static void cpm_uart_init_scc(struct uart_cpm_port *pinfo) | 744 | static void cpm_uart_init_scc(struct uart_cpm_port *pinfo) |
744 | { | 745 | { |
745 | int line = pinfo - cpm_uart_ports; | ||
746 | volatile scc_t *scp; | 746 | volatile scc_t *scp; |
747 | volatile scc_uart_t *sup; | 747 | volatile scc_uart_t *sup; |
748 | 748 | ||
@@ -783,7 +783,7 @@ static void cpm_uart_init_scc(struct uart_cpm_port *pinfo) | |||
783 | 783 | ||
784 | /* Send the CPM an initialize command. | 784 | /* Send the CPM an initialize command. |
785 | */ | 785 | */ |
786 | cpm_line_cr_cmd(line, CPM_CR_INIT_TRX); | 786 | cpm_line_cr_cmd(pinfo, CPM_CR_INIT_TRX); |
787 | 787 | ||
788 | /* Set UART mode, 8 bit, no parity, one stop. | 788 | /* Set UART mode, 8 bit, no parity, one stop. |
789 | * Enable receive and transmit. | 789 | * Enable receive and transmit. |
@@ -803,7 +803,6 @@ static void cpm_uart_init_scc(struct uart_cpm_port *pinfo) | |||
803 | 803 | ||
804 | static void cpm_uart_init_smc(struct uart_cpm_port *pinfo) | 804 | static void cpm_uart_init_smc(struct uart_cpm_port *pinfo) |
805 | { | 805 | { |
806 | int line = pinfo - cpm_uart_ports; | ||
807 | volatile smc_t *sp; | 806 | volatile smc_t *sp; |
808 | volatile smc_uart_t *up; | 807 | volatile smc_uart_t *up; |
809 | 808 | ||
@@ -840,7 +839,7 @@ static void cpm_uart_init_smc(struct uart_cpm_port *pinfo) | |||
840 | up->smc_brkec = 0; | 839 | up->smc_brkec = 0; |
841 | up->smc_brkcr = 1; | 840 | up->smc_brkcr = 1; |
842 | 841 | ||
843 | cpm_line_cr_cmd(line, CPM_CR_INIT_TRX); | 842 | cpm_line_cr_cmd(pinfo, CPM_CR_INIT_TRX); |
844 | 843 | ||
845 | /* Set UART mode, 8 bit, no parity, one stop. | 844 | /* Set UART mode, 8 bit, no parity, one stop. |
846 | * Enable receive and transmit. | 845 | * Enable receive and transmit. |
@@ -929,6 +928,85 @@ static struct uart_ops cpm_uart_pops = { | |||
929 | .verify_port = cpm_uart_verify_port, | 928 | .verify_port = cpm_uart_verify_port, |
930 | }; | 929 | }; |
931 | 930 | ||
931 | #ifdef CONFIG_PPC_CPM_NEW_BINDING | ||
932 | struct uart_cpm_port cpm_uart_ports[UART_NR]; | ||
933 | |||
934 | int cpm_uart_init_port(struct device_node *np, struct uart_cpm_port *pinfo) | ||
935 | { | ||
936 | const u32 *data; | ||
937 | void __iomem *mem, __iomem *pram; | ||
938 | int len; | ||
939 | int ret; | ||
940 | |||
941 | data = of_get_property(np, "fsl,cpm-brg", &len); | ||
942 | if (!data || len != 4) { | ||
943 | printk(KERN_ERR "CPM UART %s has no/invalid " | ||
944 | "fsl,cpm-brg property.\n", np->name); | ||
945 | return -EINVAL; | ||
946 | } | ||
947 | pinfo->brg = *data; | ||
948 | |||
949 | data = of_get_property(np, "fsl,cpm-command", &len); | ||
950 | if (!data || len != 4) { | ||
951 | printk(KERN_ERR "CPM UART %s has no/invalid " | ||
952 | "fsl,cpm-command property.\n", np->name); | ||
953 | return -EINVAL; | ||
954 | } | ||
955 | pinfo->command = *data; | ||
956 | |||
957 | mem = of_iomap(np, 0); | ||
958 | if (!mem) | ||
959 | return -ENOMEM; | ||
960 | |||
961 | pram = of_iomap(np, 1); | ||
962 | if (!pram) { | ||
963 | ret = -ENOMEM; | ||
964 | goto out_mem; | ||
965 | } | ||
966 | |||
967 | if (of_device_is_compatible(np, "fsl,cpm1-scc-uart") || | ||
968 | of_device_is_compatible(np, "fsl,cpm2-scc-uart")) { | ||
969 | pinfo->sccp = mem; | ||
970 | pinfo->sccup = pram; | ||
971 | } else if (of_device_is_compatible(np, "fsl,cpm1-smc-uart") || | ||
972 | of_device_is_compatible(np, "fsl,cpm2-smc-uart")) { | ||
973 | pinfo->flags |= FLAG_SMC; | ||
974 | pinfo->smcp = mem; | ||
975 | pinfo->smcup = pram; | ||
976 | } else { | ||
977 | ret = -ENODEV; | ||
978 | goto out_pram; | ||
979 | } | ||
980 | |||
981 | pinfo->tx_nrfifos = TX_NUM_FIFO; | ||
982 | pinfo->tx_fifosize = TX_BUF_SIZE; | ||
983 | pinfo->rx_nrfifos = RX_NUM_FIFO; | ||
984 | pinfo->rx_fifosize = RX_BUF_SIZE; | ||
985 | |||
986 | pinfo->port.uartclk = ppc_proc_freq; | ||
987 | pinfo->port.mapbase = (unsigned long)mem; | ||
988 | pinfo->port.type = PORT_CPM; | ||
989 | pinfo->port.ops = &cpm_uart_pops, | ||
990 | pinfo->port.iotype = UPIO_MEM; | ||
991 | spin_lock_init(&pinfo->port.lock); | ||
992 | |||
993 | pinfo->port.irq = of_irq_to_resource(np, 0, NULL); | ||
994 | if (pinfo->port.irq == NO_IRQ) { | ||
995 | ret = -EINVAL; | ||
996 | goto out_pram; | ||
997 | } | ||
998 | |||
999 | return cpm_uart_request_port(&pinfo->port); | ||
1000 | |||
1001 | out_pram: | ||
1002 | iounmap(pram); | ||
1003 | out_mem: | ||
1004 | iounmap(mem); | ||
1005 | return ret; | ||
1006 | } | ||
1007 | |||
1008 | #else | ||
1009 | |||
932 | struct uart_cpm_port cpm_uart_ports[UART_NR] = { | 1010 | struct uart_cpm_port cpm_uart_ports[UART_NR] = { |
933 | [UART_SMC1] = { | 1011 | [UART_SMC1] = { |
934 | .port = { | 1012 | .port = { |
@@ -1072,6 +1150,7 @@ int cpm_uart_drv_get_platform_data(struct platform_device *pdev, int is_con) | |||
1072 | 1150 | ||
1073 | return 0; | 1151 | return 0; |
1074 | } | 1152 | } |
1153 | #endif | ||
1075 | 1154 | ||
1076 | #ifdef CONFIG_SERIAL_CPM_CONSOLE | 1155 | #ifdef CONFIG_SERIAL_CPM_CONSOLE |
1077 | /* | 1156 | /* |
@@ -1083,8 +1162,12 @@ int cpm_uart_drv_get_platform_data(struct platform_device *pdev, int is_con) | |||
1083 | static void cpm_uart_console_write(struct console *co, const char *s, | 1162 | static void cpm_uart_console_write(struct console *co, const char *s, |
1084 | u_int count) | 1163 | u_int count) |
1085 | { | 1164 | { |
1165 | #ifdef CONFIG_PPC_CPM_NEW_BINDING | ||
1166 | struct uart_cpm_port *pinfo = &cpm_uart_ports[co->index]; | ||
1167 | #else | ||
1086 | struct uart_cpm_port *pinfo = | 1168 | struct uart_cpm_port *pinfo = |
1087 | &cpm_uart_ports[cpm_uart_port_map[co->index]]; | 1169 | &cpm_uart_ports[cpm_uart_port_map[co->index]]; |
1170 | #endif | ||
1088 | unsigned int i; | 1171 | unsigned int i; |
1089 | volatile cbd_t *bdp, *bdbase; | 1172 | volatile cbd_t *bdp, *bdbase; |
1090 | volatile unsigned char *cp; | 1173 | volatile unsigned char *cp; |
@@ -1155,13 +1238,47 @@ static void cpm_uart_console_write(struct console *co, const char *s, | |||
1155 | 1238 | ||
1156 | static int __init cpm_uart_console_setup(struct console *co, char *options) | 1239 | static int __init cpm_uart_console_setup(struct console *co, char *options) |
1157 | { | 1240 | { |
1158 | struct uart_port *port; | ||
1159 | struct uart_cpm_port *pinfo; | ||
1160 | int baud = 38400; | 1241 | int baud = 38400; |
1161 | int bits = 8; | 1242 | int bits = 8; |
1162 | int parity = 'n'; | 1243 | int parity = 'n'; |
1163 | int flow = 'n'; | 1244 | int flow = 'n'; |
1164 | int ret; | 1245 | int ret; |
1246 | struct uart_cpm_port *pinfo; | ||
1247 | struct uart_port *port; | ||
1248 | |||
1249 | #ifdef CONFIG_PPC_CPM_NEW_BINDING | ||
1250 | struct device_node *np = NULL; | ||
1251 | int i = 0; | ||
1252 | |||
1253 | if (co->index >= UART_NR) { | ||
1254 | printk(KERN_ERR "cpm_uart: console index %d too high\n", | ||
1255 | co->index); | ||
1256 | return -ENODEV; | ||
1257 | } | ||
1258 | |||
1259 | do { | ||
1260 | np = of_find_node_by_type(np, "serial"); | ||
1261 | if (!np) | ||
1262 | return -ENODEV; | ||
1263 | |||
1264 | if (!of_device_is_compatible(np, "fsl,cpm1-smc-uart") && | ||
1265 | !of_device_is_compatible(np, "fsl,cpm1-scc-uart") && | ||
1266 | !of_device_is_compatible(np, "fsl,cpm2-smc-uart") && | ||
1267 | !of_device_is_compatible(np, "fsl,cpm2-scc-uart")) | ||
1268 | i--; | ||
1269 | } while (i++ != co->index); | ||
1270 | |||
1271 | pinfo = &cpm_uart_ports[co->index]; | ||
1272 | |||
1273 | pinfo->flags |= FLAG_CONSOLE; | ||
1274 | port = &pinfo->port; | ||
1275 | |||
1276 | ret = cpm_uart_init_port(np, pinfo); | ||
1277 | of_node_put(np); | ||
1278 | if (ret) | ||
1279 | return ret; | ||
1280 | |||
1281 | #else | ||
1165 | 1282 | ||
1166 | struct fs_uart_platform_info *pdata; | 1283 | struct fs_uart_platform_info *pdata; |
1167 | struct platform_device* pdev = early_uart_get_pdev(co->index); | 1284 | struct platform_device* pdev = early_uart_get_pdev(co->index); |
@@ -1188,6 +1305,7 @@ static int __init cpm_uart_console_setup(struct console *co, char *options) | |||
1188 | } | 1305 | } |
1189 | 1306 | ||
1190 | pinfo->flags |= FLAG_CONSOLE; | 1307 | pinfo->flags |= FLAG_CONSOLE; |
1308 | #endif | ||
1191 | 1309 | ||
1192 | if (options) { | 1310 | if (options) { |
1193 | uart_parse_options(options, &baud, &parity, &bits, &flow); | 1311 | uart_parse_options(options, &baud, &parity, &bits, &flow); |
@@ -1196,6 +1314,10 @@ static int __init cpm_uart_console_setup(struct console *co, char *options) | |||
1196 | baud = 9600; | 1314 | baud = 9600; |
1197 | } | 1315 | } |
1198 | 1316 | ||
1317 | #ifdef CONFIG_PPC_EARLY_DEBUG_CPM | ||
1318 | udbg_putc = NULL; | ||
1319 | #endif | ||
1320 | |||
1199 | if (IS_SMC(pinfo)) { | 1321 | if (IS_SMC(pinfo)) { |
1200 | pinfo->smcp->smc_smcm &= ~(SMCM_RX | SMCM_TX); | 1322 | pinfo->smcp->smc_smcm &= ~(SMCM_RX | SMCM_TX); |
1201 | pinfo->smcp->smc_smcmr &= ~(SMCMR_REN | SMCMR_TEN); | 1323 | pinfo->smcp->smc_smcmr &= ~(SMCMR_REN | SMCMR_TEN); |
@@ -1252,7 +1374,81 @@ static struct uart_driver cpm_reg = { | |||
1252 | .major = SERIAL_CPM_MAJOR, | 1374 | .major = SERIAL_CPM_MAJOR, |
1253 | .minor = SERIAL_CPM_MINOR, | 1375 | .minor = SERIAL_CPM_MINOR, |
1254 | .cons = CPM_UART_CONSOLE, | 1376 | .cons = CPM_UART_CONSOLE, |
1377 | .nr = UART_NR, | ||
1378 | }; | ||
1379 | |||
1380 | #ifdef CONFIG_PPC_CPM_NEW_BINDING | ||
1381 | static int probe_index; | ||
1382 | |||
1383 | static int __devinit cpm_uart_probe(struct of_device *ofdev, | ||
1384 | const struct of_device_id *match) | ||
1385 | { | ||
1386 | int index = probe_index++; | ||
1387 | struct uart_cpm_port *pinfo = &cpm_uart_ports[index]; | ||
1388 | int ret; | ||
1389 | |||
1390 | pinfo->port.line = index; | ||
1391 | |||
1392 | if (index >= UART_NR) | ||
1393 | return -ENODEV; | ||
1394 | |||
1395 | dev_set_drvdata(&ofdev->dev, pinfo); | ||
1396 | |||
1397 | ret = cpm_uart_init_port(ofdev->node, pinfo); | ||
1398 | if (ret) | ||
1399 | return ret; | ||
1400 | |||
1401 | return uart_add_one_port(&cpm_reg, &pinfo->port); | ||
1402 | } | ||
1403 | |||
1404 | static int __devexit cpm_uart_remove(struct of_device *ofdev) | ||
1405 | { | ||
1406 | struct uart_cpm_port *pinfo = dev_get_drvdata(&ofdev->dev); | ||
1407 | return uart_remove_one_port(&cpm_reg, &pinfo->port); | ||
1408 | } | ||
1409 | |||
1410 | static struct of_device_id cpm_uart_match[] = { | ||
1411 | { | ||
1412 | .compatible = "fsl,cpm1-smc-uart", | ||
1413 | }, | ||
1414 | { | ||
1415 | .compatible = "fsl,cpm1-scc-uart", | ||
1416 | }, | ||
1417 | { | ||
1418 | .compatible = "fsl,cpm2-smc-uart", | ||
1419 | }, | ||
1420 | { | ||
1421 | .compatible = "fsl,cpm2-scc-uart", | ||
1422 | }, | ||
1423 | {} | ||
1255 | }; | 1424 | }; |
1425 | |||
1426 | static struct of_platform_driver cpm_uart_driver = { | ||
1427 | .name = "cpm_uart", | ||
1428 | .match_table = cpm_uart_match, | ||
1429 | .probe = cpm_uart_probe, | ||
1430 | .remove = cpm_uart_remove, | ||
1431 | }; | ||
1432 | |||
1433 | static int __init cpm_uart_init(void) | ||
1434 | { | ||
1435 | int ret = uart_register_driver(&cpm_reg); | ||
1436 | if (ret) | ||
1437 | return ret; | ||
1438 | |||
1439 | ret = of_register_platform_driver(&cpm_uart_driver); | ||
1440 | if (ret) | ||
1441 | uart_unregister_driver(&cpm_reg); | ||
1442 | |||
1443 | return ret; | ||
1444 | } | ||
1445 | |||
1446 | static void __exit cpm_uart_exit(void) | ||
1447 | { | ||
1448 | of_unregister_platform_driver(&cpm_uart_driver); | ||
1449 | uart_unregister_driver(&cpm_reg); | ||
1450 | } | ||
1451 | #else | ||
1256 | static int cpm_uart_drv_probe(struct device *dev) | 1452 | static int cpm_uart_drv_probe(struct device *dev) |
1257 | { | 1453 | { |
1258 | struct platform_device *pdev = to_platform_device(dev); | 1454 | struct platform_device *pdev = to_platform_device(dev); |
@@ -1380,6 +1576,7 @@ static void __exit cpm_uart_exit(void) | |||
1380 | driver_unregister(&cpm_smc_uart_driver); | 1576 | driver_unregister(&cpm_smc_uart_driver); |
1381 | uart_unregister_driver(&cpm_reg); | 1577 | uart_unregister_driver(&cpm_reg); |
1382 | } | 1578 | } |
1579 | #endif | ||
1383 | 1580 | ||
1384 | module_init(cpm_uart_init); | 1581 | module_init(cpm_uart_init); |
1385 | module_exit(cpm_uart_exit); | 1582 | module_exit(cpm_uart_exit); |
diff --git a/drivers/serial/cpm_uart/cpm_uart_cpm1.c b/drivers/serial/cpm_uart/cpm_uart_cpm1.c index 8c6324ed0202..4647f55e19f1 100644 --- a/drivers/serial/cpm_uart/cpm_uart_cpm1.c +++ b/drivers/serial/cpm_uart/cpm_uart_cpm1.c | |||
@@ -49,9 +49,20 @@ | |||
49 | 49 | ||
50 | /**************************************************************/ | 50 | /**************************************************************/ |
51 | 51 | ||
52 | void cpm_line_cr_cmd(int line, int cmd) | 52 | #ifdef CONFIG_PPC_CPM_NEW_BINDING |
53 | void cpm_line_cr_cmd(struct uart_cpm_port *port, int cmd) | ||
54 | { | ||
55 | u16 __iomem *cpcr = &cpmp->cp_cpcr; | ||
56 | |||
57 | out_be16(cpcr, port->command | (cmd << 8) | CPM_CR_FLG); | ||
58 | while (in_be16(cpcr) & CPM_CR_FLG) | ||
59 | ; | ||
60 | } | ||
61 | #else | ||
62 | void cpm_line_cr_cmd(struct uart_cpm_port *port, int cmd) | ||
53 | { | 63 | { |
54 | ushort val; | 64 | ushort val; |
65 | int line = port - cpm_uart_ports; | ||
55 | volatile cpm8xx_t *cp = cpmp; | 66 | volatile cpm8xx_t *cp = cpmp; |
56 | 67 | ||
57 | switch (line) { | 68 | switch (line) { |
@@ -114,6 +125,7 @@ void scc4_lineif(struct uart_cpm_port *pinfo) | |||
114 | /* XXX SCC4: insert port configuration here */ | 125 | /* XXX SCC4: insert port configuration here */ |
115 | pinfo->brg = 4; | 126 | pinfo->brg = 4; |
116 | } | 127 | } |
128 | #endif | ||
117 | 129 | ||
118 | /* | 130 | /* |
119 | * Allocate DP-Ram and memory buffers. We need to allocate a transmit and | 131 | * Allocate DP-Ram and memory buffers. We need to allocate a transmit and |
@@ -184,6 +196,7 @@ void cpm_uart_freebuf(struct uart_cpm_port *pinfo) | |||
184 | cpm_dpfree(pinfo->dp_addr); | 196 | cpm_dpfree(pinfo->dp_addr); |
185 | } | 197 | } |
186 | 198 | ||
199 | #ifndef CONFIG_PPC_CPM_NEW_BINDING | ||
187 | /* Setup any dynamic params in the uart desc */ | 200 | /* Setup any dynamic params in the uart desc */ |
188 | int cpm_uart_init_portdesc(void) | 201 | int cpm_uart_init_portdesc(void) |
189 | { | 202 | { |
@@ -279,3 +292,4 @@ int cpm_uart_init_portdesc(void) | |||
279 | #endif | 292 | #endif |
280 | return 0; | 293 | return 0; |
281 | } | 294 | } |
295 | #endif | ||
diff --git a/drivers/serial/cpm_uart/cpm_uart_cpm1.h b/drivers/serial/cpm_uart/cpm_uart_cpm1.h index 2a6477834c3e..69f523a442e0 100644 --- a/drivers/serial/cpm_uart/cpm_uart_cpm1.h +++ b/drivers/serial/cpm_uart/cpm_uart_cpm1.h | |||
@@ -13,12 +13,14 @@ | |||
13 | #include <asm/commproc.h> | 13 | #include <asm/commproc.h> |
14 | 14 | ||
15 | /* defines for IRQs */ | 15 | /* defines for IRQs */ |
16 | #ifndef CONFIG_PPC_CPM_NEW_BINDING | ||
16 | #define SMC1_IRQ (CPM_IRQ_OFFSET + CPMVEC_SMC1) | 17 | #define SMC1_IRQ (CPM_IRQ_OFFSET + CPMVEC_SMC1) |
17 | #define SMC2_IRQ (CPM_IRQ_OFFSET + CPMVEC_SMC2) | 18 | #define SMC2_IRQ (CPM_IRQ_OFFSET + CPMVEC_SMC2) |
18 | #define SCC1_IRQ (CPM_IRQ_OFFSET + CPMVEC_SCC1) | 19 | #define SCC1_IRQ (CPM_IRQ_OFFSET + CPMVEC_SCC1) |
19 | #define SCC2_IRQ (CPM_IRQ_OFFSET + CPMVEC_SCC2) | 20 | #define SCC2_IRQ (CPM_IRQ_OFFSET + CPMVEC_SCC2) |
20 | #define SCC3_IRQ (CPM_IRQ_OFFSET + CPMVEC_SCC3) | 21 | #define SCC3_IRQ (CPM_IRQ_OFFSET + CPMVEC_SCC3) |
21 | #define SCC4_IRQ (CPM_IRQ_OFFSET + CPMVEC_SCC4) | 22 | #define SCC4_IRQ (CPM_IRQ_OFFSET + CPMVEC_SCC4) |
23 | #endif | ||
22 | 24 | ||
23 | static inline void cpm_set_brg(int brg, int baud) | 25 | static inline void cpm_set_brg(int brg, int baud) |
24 | { | 26 | { |
diff --git a/drivers/serial/cpm_uart/cpm_uart_cpm2.c b/drivers/serial/cpm_uart/cpm_uart_cpm2.c index 7b61d805ebe9..7ebce263ad40 100644 --- a/drivers/serial/cpm_uart/cpm_uart_cpm2.c +++ b/drivers/serial/cpm_uart/cpm_uart_cpm2.c | |||
@@ -49,9 +49,22 @@ | |||
49 | 49 | ||
50 | /**************************************************************/ | 50 | /**************************************************************/ |
51 | 51 | ||
52 | void cpm_line_cr_cmd(int line, int cmd) | 52 | #ifdef CONFIG_PPC_CPM_NEW_BINDING |
53 | void cpm_line_cr_cmd(struct uart_cpm_port *port, int cmd) | ||
54 | { | ||
55 | cpm_cpm2_t __iomem *cp = cpm2_map(im_cpm); | ||
56 | |||
57 | out_be32(&cp->cp_cpcr, port->command | cmd | CPM_CR_FLG); | ||
58 | while (in_be32(&cp->cp_cpcr) & CPM_CR_FLG) | ||
59 | ; | ||
60 | |||
61 | cpm2_unmap(cp); | ||
62 | } | ||
63 | #else | ||
64 | void cpm_line_cr_cmd(struct uart_cpm_port *port, int cmd) | ||
53 | { | 65 | { |
54 | ulong val; | 66 | ulong val; |
67 | int line = port - cpm_uart_ports; | ||
55 | volatile cpm_cpm2_t *cp = cpm2_map(im_cpm); | 68 | volatile cpm_cpm2_t *cp = cpm2_map(im_cpm); |
56 | 69 | ||
57 | 70 | ||
@@ -211,6 +224,7 @@ void scc4_lineif(struct uart_cpm_port *pinfo) | |||
211 | cpm2_unmap(cpmux); | 224 | cpm2_unmap(cpmux); |
212 | cpm2_unmap(io); | 225 | cpm2_unmap(io); |
213 | } | 226 | } |
227 | #endif | ||
214 | 228 | ||
215 | /* | 229 | /* |
216 | * Allocate DP-Ram and memory buffers. We need to allocate a transmit and | 230 | * Allocate DP-Ram and memory buffers. We need to allocate a transmit and |
@@ -281,6 +295,7 @@ void cpm_uart_freebuf(struct uart_cpm_port *pinfo) | |||
281 | cpm_dpfree(pinfo->dp_addr); | 295 | cpm_dpfree(pinfo->dp_addr); |
282 | } | 296 | } |
283 | 297 | ||
298 | #ifndef CONFIG_PPC_CPM_NEW_BINDING | ||
284 | /* Setup any dynamic params in the uart desc */ | 299 | /* Setup any dynamic params in the uart desc */ |
285 | int cpm_uart_init_portdesc(void) | 300 | int cpm_uart_init_portdesc(void) |
286 | { | 301 | { |
@@ -386,3 +401,4 @@ int cpm_uart_init_portdesc(void) | |||
386 | 401 | ||
387 | return 0; | 402 | return 0; |
388 | } | 403 | } |
404 | #endif | ||
diff --git a/drivers/serial/cpm_uart/cpm_uart_cpm2.h b/drivers/serial/cpm_uart/cpm_uart_cpm2.h index 1b3219f56c81..e7717ece0831 100644 --- a/drivers/serial/cpm_uart/cpm_uart_cpm2.h +++ b/drivers/serial/cpm_uart/cpm_uart_cpm2.h | |||
@@ -13,12 +13,14 @@ | |||
13 | #include <asm/cpm2.h> | 13 | #include <asm/cpm2.h> |
14 | 14 | ||
15 | /* defines for IRQs */ | 15 | /* defines for IRQs */ |
16 | #ifndef CONFIG_PPC_CPM_NEW_BINDING | ||
16 | #define SMC1_IRQ SIU_INT_SMC1 | 17 | #define SMC1_IRQ SIU_INT_SMC1 |
17 | #define SMC2_IRQ SIU_INT_SMC2 | 18 | #define SMC2_IRQ SIU_INT_SMC2 |
18 | #define SCC1_IRQ SIU_INT_SCC1 | 19 | #define SCC1_IRQ SIU_INT_SCC1 |
19 | #define SCC2_IRQ SIU_INT_SCC2 | 20 | #define SCC2_IRQ SIU_INT_SCC2 |
20 | #define SCC3_IRQ SIU_INT_SCC3 | 21 | #define SCC3_IRQ SIU_INT_SCC3 |
21 | #define SCC4_IRQ SIU_INT_SCC4 | 22 | #define SCC4_IRQ SIU_INT_SCC4 |
23 | #endif | ||
22 | 24 | ||
23 | static inline void cpm_set_brg(int brg, int baud) | 25 | static inline void cpm_set_brg(int brg, int baud) |
24 | { | 26 | { |