diff options
Diffstat (limited to 'drivers/serial')
-rw-r--r-- | drivers/serial/cpm_uart/cpm_uart_core.c | 14 | ||||
-rw-r--r-- | drivers/serial/mpc52xx_uart.c | 40 |
2 files changed, 23 insertions, 31 deletions
diff --git a/drivers/serial/cpm_uart/cpm_uart_core.c b/drivers/serial/cpm_uart/cpm_uart_core.c index bde4b4b0b80f..5c6ef51da274 100644 --- a/drivers/serial/cpm_uart/cpm_uart_core.c +++ b/drivers/serial/cpm_uart/cpm_uart_core.c | |||
@@ -406,6 +406,18 @@ static int cpm_uart_startup(struct uart_port *port) | |||
406 | 406 | ||
407 | pr_debug("CPM uart[%d]:startup\n", port->line); | 407 | pr_debug("CPM uart[%d]:startup\n", port->line); |
408 | 408 | ||
409 | /* If the port is not the console, make sure rx is disabled. */ | ||
410 | if (!(pinfo->flags & FLAG_CONSOLE)) { | ||
411 | /* Disable UART rx */ | ||
412 | if (IS_SMC(pinfo)) { | ||
413 | clrbits16(&pinfo->smcp->smc_smcmr, SMCMR_REN); | ||
414 | clrbits8(&pinfo->smcp->smc_smcm, SMCM_RX); | ||
415 | } else { | ||
416 | clrbits32(&pinfo->sccp->scc_gsmrl, SCC_GSMRL_ENR); | ||
417 | clrbits16(&pinfo->sccp->scc_sccm, UART_SCCM_RX); | ||
418 | } | ||
419 | cpm_line_cr_cmd(pinfo, CPM_CR_INIT_TRX); | ||
420 | } | ||
409 | /* Install interrupt handler. */ | 421 | /* Install interrupt handler. */ |
410 | retval = request_irq(port->irq, cpm_uart_int, 0, "cpm_uart", port); | 422 | retval = request_irq(port->irq, cpm_uart_int, 0, "cpm_uart", port); |
411 | if (retval) | 423 | if (retval) |
@@ -420,8 +432,6 @@ static int cpm_uart_startup(struct uart_port *port) | |||
420 | setbits32(&pinfo->sccp->scc_gsmrl, (SCC_GSMRL_ENR | SCC_GSMRL_ENT)); | 432 | setbits32(&pinfo->sccp->scc_gsmrl, (SCC_GSMRL_ENR | SCC_GSMRL_ENT)); |
421 | } | 433 | } |
422 | 434 | ||
423 | if (!(pinfo->flags & FLAG_CONSOLE)) | ||
424 | cpm_line_cr_cmd(pinfo, CPM_CR_INIT_TRX); | ||
425 | return 0; | 435 | return 0; |
426 | } | 436 | } |
427 | 437 | ||
diff --git a/drivers/serial/mpc52xx_uart.c b/drivers/serial/mpc52xx_uart.c index 0c3a2ab1612c..7f72f8ceaa6f 100644 --- a/drivers/serial/mpc52xx_uart.c +++ b/drivers/serial/mpc52xx_uart.c | |||
@@ -50,8 +50,8 @@ | |||
50 | /* OF Platform device Usage : | 50 | /* OF Platform device Usage : |
51 | * | 51 | * |
52 | * This driver is only used for PSCs configured in uart mode. The device | 52 | * This driver is only used for PSCs configured in uart mode. The device |
53 | * tree will have a node for each PSC in uart mode w/ device_type = "serial" | 53 | * tree will have a node for each PSC with "mpc52xx-psc-uart" in the compatible |
54 | * and "mpc52xx-psc-uart" in the compatible string | 54 | * list. |
55 | * | 55 | * |
56 | * By default, PSC devices are enumerated in the order they are found. However | 56 | * By default, PSC devices are enumerated in the order they are found. However |
57 | * a particular PSC number can be forces by adding 'device_no = <port#>' | 57 | * a particular PSC number can be forces by adding 'device_no = <port#>' |
@@ -522,7 +522,7 @@ mpc52xx_uart_startup(struct uart_port *port) | |||
522 | 522 | ||
523 | /* Request IRQ */ | 523 | /* Request IRQ */ |
524 | ret = request_irq(port->irq, mpc52xx_uart_int, | 524 | ret = request_irq(port->irq, mpc52xx_uart_int, |
525 | IRQF_DISABLED | IRQF_SAMPLE_RANDOM | IRQF_SHARED, | 525 | IRQF_DISABLED | IRQF_SAMPLE_RANDOM, |
526 | "mpc52xx_psc_uart", port); | 526 | "mpc52xx_psc_uart", port); |
527 | if (ret) | 527 | if (ret) |
528 | return ret; | 528 | return ret; |
@@ -1212,30 +1212,18 @@ mpc52xx_uart_of_resume(struct of_device *op) | |||
1212 | #endif | 1212 | #endif |
1213 | 1213 | ||
1214 | static void | 1214 | static void |
1215 | mpc52xx_uart_of_assign(struct device_node *np, int idx) | 1215 | mpc52xx_uart_of_assign(struct device_node *np) |
1216 | { | 1216 | { |
1217 | int free_idx = -1; | ||
1218 | int i; | 1217 | int i; |
1219 | 1218 | ||
1220 | /* Find the first free node */ | 1219 | /* Find the first free PSC number */ |
1221 | for (i = 0; i < MPC52xx_PSC_MAXNUM; i++) { | 1220 | for (i = 0; i < MPC52xx_PSC_MAXNUM; i++) { |
1222 | if (mpc52xx_uart_nodes[i] == NULL) { | 1221 | if (mpc52xx_uart_nodes[i] == NULL) { |
1223 | free_idx = i; | 1222 | of_node_get(np); |
1224 | break; | 1223 | mpc52xx_uart_nodes[i] = np; |
1224 | return; | ||
1225 | } | 1225 | } |
1226 | } | 1226 | } |
1227 | |||
1228 | if ((idx < 0) || (idx >= MPC52xx_PSC_MAXNUM)) | ||
1229 | idx = free_idx; | ||
1230 | |||
1231 | if (idx < 0) | ||
1232 | return; /* No free slot; abort */ | ||
1233 | |||
1234 | of_node_get(np); | ||
1235 | /* If the slot is already occupied, then swap slots */ | ||
1236 | if (mpc52xx_uart_nodes[idx] && (free_idx != -1)) | ||
1237 | mpc52xx_uart_nodes[free_idx] = mpc52xx_uart_nodes[idx]; | ||
1238 | mpc52xx_uart_nodes[idx] = np; | ||
1239 | } | 1227 | } |
1240 | 1228 | ||
1241 | static void | 1229 | static void |
@@ -1243,23 +1231,17 @@ mpc52xx_uart_of_enumerate(void) | |||
1243 | { | 1231 | { |
1244 | static int enum_done; | 1232 | static int enum_done; |
1245 | struct device_node *np; | 1233 | struct device_node *np; |
1246 | const unsigned int *devno; | ||
1247 | const struct of_device_id *match; | 1234 | const struct of_device_id *match; |
1248 | int i; | 1235 | int i; |
1249 | 1236 | ||
1250 | if (enum_done) | 1237 | if (enum_done) |
1251 | return; | 1238 | return; |
1252 | 1239 | ||
1253 | for_each_node_by_type(np, "serial") { | 1240 | /* Assign index to each PSC in device tree */ |
1241 | for_each_matching_node(np, mpc52xx_uart_of_match) { | ||
1254 | match = of_match_node(mpc52xx_uart_of_match, np); | 1242 | match = of_match_node(mpc52xx_uart_of_match, np); |
1255 | if (!match) | ||
1256 | continue; | ||
1257 | |||
1258 | psc_ops = match->data; | 1243 | psc_ops = match->data; |
1259 | 1244 | mpc52xx_uart_of_assign(np); | |
1260 | /* Is a particular device number requested? */ | ||
1261 | devno = of_get_property(np, "port-number", NULL); | ||
1262 | mpc52xx_uart_of_assign(np, devno ? *devno : -1); | ||
1263 | } | 1245 | } |
1264 | 1246 | ||
1265 | enum_done = 1; | 1247 | enum_done = 1; |