aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid S. Miller <davem@sunset.davemloft.net>2006-02-13 23:09:10 -0500
committerDavid S. Miller <davem@sunset.davemloft.net>2006-03-20 04:12:42 -0500
commit1ddb7c98d44b898cfe0443c1e242cebfb0479d46 (patch)
tree995bd63451677335e59d981c57e7369238afecb4
parent10951ee61056a9f91c00c16746f2042672d7af7c (diff)
[SPARC64]: Prevent registering wrong serial console.
If the console is not for a particular Sun serial controller, set the drv->cons to NULL. Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/serial/sunsab.c17
-rw-r--r--drivers/serial/sunsu.c22
-rw-r--r--drivers/serial/sunzilog.c34
3 files changed, 47 insertions, 26 deletions
diff --git a/drivers/serial/sunsab.c b/drivers/serial/sunsab.c
index 85664228a0b6..02f62da546b5 100644
--- a/drivers/serial/sunsab.c
+++ b/drivers/serial/sunsab.c
@@ -955,14 +955,13 @@ static struct console sunsab_console = {
955 .index = -1, 955 .index = -1,
956 .data = &sunsab_reg, 956 .data = &sunsab_reg,
957}; 957};
958#define SUNSAB_CONSOLE (&sunsab_console)
959 958
960static void __init sunsab_console_init(void) 959static inline struct console *SUNSAB_CONSOLE(void)
961{ 960{
962 int i; 961 int i;
963 962
964 if (con_is_present()) 963 if (con_is_present())
965 return; 964 return NULL;
966 965
967 for (i = 0; i < num_channels; i++) { 966 for (i = 0; i < num_channels; i++) {
968 int this_minor = sunsab_reg.minor + i; 967 int this_minor = sunsab_reg.minor + i;
@@ -971,13 +970,14 @@ static void __init sunsab_console_init(void)
971 break; 970 break;
972 } 971 }
973 if (i == num_channels) 972 if (i == num_channels)
974 return; 973 return NULL;
975 974
976 sunsab_console.index = i; 975 sunsab_console.index = i;
977 register_console(&sunsab_console); 976
977 return &sunsab_console;
978} 978}
979#else 979#else
980#define SUNSAB_CONSOLE (NULL) 980#define SUNSAB_CONSOLE() (NULL)
981#define sunsab_console_init() do { } while (0) 981#define sunsab_console_init() do { } while (0)
982#endif 982#endif
983 983
@@ -1124,7 +1124,6 @@ static int __init sunsab_init(void)
1124 1124
1125 sunsab_reg.minor = sunserial_current_minor; 1125 sunsab_reg.minor = sunserial_current_minor;
1126 sunsab_reg.nr = num_channels; 1126 sunsab_reg.nr = num_channels;
1127 sunsab_reg.cons = SUNSAB_CONSOLE;
1128 1127
1129 ret = uart_register_driver(&sunsab_reg); 1128 ret = uart_register_driver(&sunsab_reg);
1130 if (ret < 0) { 1129 if (ret < 0) {
@@ -1143,10 +1142,10 @@ static int __init sunsab_init(void)
1143 return ret; 1142 return ret;
1144 } 1143 }
1145 1144
1145 sunsab_reg.cons = SUNSAB_CONSOLE();
1146
1146 sunserial_current_minor += num_channels; 1147 sunserial_current_minor += num_channels;
1147 1148
1148 sunsab_console_init();
1149
1150 for (i = 0; i < num_channels; i++) { 1149 for (i = 0; i < num_channels; i++) {
1151 struct uart_sunsab_port *up = &sunsab_ports[i]; 1150 struct uart_sunsab_port *up = &sunsab_ports[i];
1152 1151
diff --git a/drivers/serial/sunsu.c b/drivers/serial/sunsu.c
index 4e453fa966ae..3313cb2a355a 100644
--- a/drivers/serial/sunsu.c
+++ b/drivers/serial/sunsu.c
@@ -1464,18 +1464,17 @@ static struct console sunsu_cons = {
1464 .index = -1, 1464 .index = -1,
1465 .data = &sunsu_reg, 1465 .data = &sunsu_reg,
1466}; 1466};
1467#define SUNSU_CONSOLE (&sunsu_cons)
1468 1467
1469/* 1468/*
1470 * Register console. 1469 * Register console.
1471 */ 1470 */
1472 1471
1473static int __init sunsu_serial_console_init(void) 1472static inline struct console *SUNSU_CONSOLE(void)
1474{ 1473{
1475 int i; 1474 int i;
1476 1475
1477 if (con_is_present()) 1476 if (con_is_present())
1478 return 0; 1477 return NULL;
1479 1478
1480 for (i = 0; i < UART_NR; i++) { 1479 for (i = 0; i < UART_NR; i++) {
1481 int this_minor = sunsu_reg.minor + i; 1480 int this_minor = sunsu_reg.minor + i;
@@ -1484,16 +1483,16 @@ static int __init sunsu_serial_console_init(void)
1484 break; 1483 break;
1485 } 1484 }
1486 if (i == UART_NR) 1485 if (i == UART_NR)
1487 return 0; 1486 return NULL;
1488 if (sunsu_ports[i].port_node == 0) 1487 if (sunsu_ports[i].port_node == 0)
1489 return 0; 1488 return NULL;
1490 1489
1491 sunsu_cons.index = i; 1490 sunsu_cons.index = i;
1492 register_console(&sunsu_cons); 1491
1493 return 0; 1492 return &sunsu_cons;
1494} 1493}
1495#else 1494#else
1496#define SUNSU_CONSOLE (NULL) 1495#define SUNSU_CONSOLE() (NULL)
1497#define sunsu_serial_console_init() do { } while (0) 1496#define sunsu_serial_console_init() do { } while (0)
1498#endif 1497#endif
1499 1498
@@ -1523,16 +1522,17 @@ static int __init sunsu_serial_init(void)
1523 } 1522 }
1524 1523
1525 sunsu_reg.minor = sunserial_current_minor; 1524 sunsu_reg.minor = sunserial_current_minor;
1526 sunserial_current_minor += instance;
1527 1525
1528 sunsu_reg.nr = instance; 1526 sunsu_reg.nr = instance;
1529 sunsu_reg.cons = SUNSU_CONSOLE;
1530 1527
1531 ret = uart_register_driver(&sunsu_reg); 1528 ret = uart_register_driver(&sunsu_reg);
1532 if (ret < 0) 1529 if (ret < 0)
1533 return ret; 1530 return ret;
1534 1531
1535 sunsu_serial_console_init(); 1532 sunserial_current_minor += instance;
1533
1534 sunsu_reg.cons = SUNSU_CONSOLE();
1535
1536 for (i = 0; i < UART_NR; i++) { 1536 for (i = 0; i < UART_NR; i++) {
1537 struct uart_sunsu_port *up = &sunsu_ports[i]; 1537 struct uart_sunsu_port *up = &sunsu_ports[i];
1538 1538
diff --git a/drivers/serial/sunzilog.c b/drivers/serial/sunzilog.c
index 5cc4d4c2935c..5aa74e7a954e 100644
--- a/drivers/serial/sunzilog.c
+++ b/drivers/serial/sunzilog.c
@@ -1390,7 +1390,6 @@ static struct console sunzilog_console = {
1390 .index = -1, 1390 .index = -1,
1391 .data = &sunzilog_reg, 1391 .data = &sunzilog_reg,
1392}; 1392};
1393#define SUNZILOG_CONSOLE (&sunzilog_console)
1394 1393
1395static int __init sunzilog_console_init(void) 1394static int __init sunzilog_console_init(void)
1396{ 1395{
@@ -1413,8 +1412,31 @@ static int __init sunzilog_console_init(void)
1413 register_console(&sunzilog_console); 1412 register_console(&sunzilog_console);
1414 return 0; 1413 return 0;
1415} 1414}
1415
1416static inline struct console *SUNZILOG_CONSOLE(void)
1417{
1418 int i;
1419
1420 if (con_is_present())
1421 return NULL;
1422
1423 for (i = 0; i < NUM_CHANNELS; i++) {
1424 int this_minor = sunzilog_reg.minor + i;
1425
1426 if ((this_minor - 64) == (serial_console - 1))
1427 break;
1428 }
1429 if (i == NUM_CHANNELS)
1430 return NULL;
1431
1432 sunzilog_console.index = i;
1433 sunzilog_port_table[i].flags |= SUNZILOG_FLAG_IS_CONS;
1434
1435 return &sunzilog_console;
1436}
1437
1416#else 1438#else
1417#define SUNZILOG_CONSOLE (NULL) 1439#define SUNZILOG_CONSOLE() (NULL)
1418#define sunzilog_console_init() do { } while (0) 1440#define sunzilog_console_init() do { } while (0)
1419#endif 1441#endif
1420 1442
@@ -1666,14 +1688,14 @@ static int __init sunzilog_ports_init(void)
1666 } 1688 }
1667 1689
1668 sunzilog_reg.nr = uart_count; 1690 sunzilog_reg.nr = uart_count;
1669 sunzilog_reg.cons = SUNZILOG_CONSOLE;
1670
1671 sunzilog_reg.minor = sunserial_current_minor; 1691 sunzilog_reg.minor = sunserial_current_minor;
1672 sunserial_current_minor += uart_count;
1673 1692
1674 ret = uart_register_driver(&sunzilog_reg); 1693 ret = uart_register_driver(&sunzilog_reg);
1675 if (ret == 0) { 1694 if (ret == 0) {
1676 sunzilog_console_init(); 1695 sunzilog_reg.cons = SUNZILOG_CONSOLE();
1696
1697 sunserial_current_minor += uart_count;
1698
1677 for (i = 0; i < NUM_CHANNELS; i++) { 1699 for (i = 0; i < NUM_CHANNELS; i++) {
1678 struct uart_sunzilog_port *up = &sunzilog_port_table[i]; 1700 struct uart_sunzilog_port *up = &sunzilog_port_table[i];
1679 1701