|
@@ -54,6 +54,8 @@
|
|
*/
|
|
*/
|
|
static unsigned int share_irqs = SERIAL8250_SHARE_IRQS;
|
|
static unsigned int share_irqs = SERIAL8250_SHARE_IRQS;
|
|
|
|
|
|
|
|
+static unsigned int nr_uarts = CONFIG_SERIAL_8250_RUNTIME_UARTS;
|
|
|
|
+
|
|
/*
|
|
/*
|
|
* Debugging.
|
|
* Debugging.
|
|
*/
|
|
*/
|
|
@@ -2118,7 +2120,7 @@ static void __init serial8250_isa_init_ports(void)
|
|
return;
|
|
return;
|
|
first = 0;
|
|
first = 0;
|
|
|
|
|
|
- for (i = 0; i < UART_NR; i++) {
|
|
|
|
|
|
+ for (i = 0; i < nr_uarts; i++) {
|
|
struct uart_8250_port *up = &serial8250_ports[i];
|
|
struct uart_8250_port *up = &serial8250_ports[i];
|
|
|
|
|
|
up->port.line = i;
|
|
up->port.line = i;
|
|
@@ -2137,7 +2139,7 @@ static void __init serial8250_isa_init_ports(void)
|
|
}
|
|
}
|
|
|
|
|
|
for (i = 0, up = serial8250_ports;
|
|
for (i = 0, up = serial8250_ports;
|
|
- i < ARRAY_SIZE(old_serial_port) && i < UART_NR;
|
|
|
|
|
|
+ i < ARRAY_SIZE(old_serial_port) && i < nr_uarts;
|
|
i++, up++) {
|
|
i++, up++) {
|
|
up->port.iobase = old_serial_port[i].port;
|
|
up->port.iobase = old_serial_port[i].port;
|
|
up->port.irq = irq_canonicalize(old_serial_port[i].irq);
|
|
up->port.irq = irq_canonicalize(old_serial_port[i].irq);
|
|
@@ -2159,7 +2161,7 @@ serial8250_register_ports(struct uart_driver *drv, struct device *dev)
|
|
|
|
|
|
serial8250_isa_init_ports();
|
|
serial8250_isa_init_ports();
|
|
|
|
|
|
- for (i = 0; i < UART_NR; i++) {
|
|
|
|
|
|
+ for (i = 0; i < nr_uarts; i++) {
|
|
struct uart_8250_port *up = &serial8250_ports[i];
|
|
struct uart_8250_port *up = &serial8250_ports[i];
|
|
|
|
|
|
up->port.dev = dev;
|
|
up->port.dev = dev;
|
|
@@ -2262,7 +2264,7 @@ static int serial8250_console_setup(struct console *co, char *options)
|
|
* if so, search for the first available port that does have
|
|
* if so, search for the first available port that does have
|
|
* console support.
|
|
* console support.
|
|
*/
|
|
*/
|
|
- if (co->index >= UART_NR)
|
|
|
|
|
|
+ if (co->index >= nr_uarts)
|
|
co->index = 0;
|
|
co->index = 0;
|
|
port = &serial8250_ports[co->index].port;
|
|
port = &serial8250_ports[co->index].port;
|
|
if (!port->iobase && !port->membase)
|
|
if (!port->iobase && !port->membase)
|
|
@@ -2298,7 +2300,7 @@ static int __init find_port(struct uart_port *p)
|
|
int line;
|
|
int line;
|
|
struct uart_port *port;
|
|
struct uart_port *port;
|
|
|
|
|
|
- for (line = 0; line < UART_NR; line++) {
|
|
|
|
|
|
+ for (line = 0; line < nr_uarts; line++) {
|
|
port = &serial8250_ports[line].port;
|
|
port = &serial8250_ports[line].port;
|
|
if (uart_match_port(p, port))
|
|
if (uart_match_port(p, port))
|
|
return line;
|
|
return line;
|
|
@@ -2420,7 +2422,7 @@ static int __devexit serial8250_remove(struct platform_device *dev)
|
|
{
|
|
{
|
|
int i;
|
|
int i;
|
|
|
|
|
|
- for (i = 0; i < UART_NR; i++) {
|
|
|
|
|
|
+ for (i = 0; i < nr_uarts; i++) {
|
|
struct uart_8250_port *up = &serial8250_ports[i];
|
|
struct uart_8250_port *up = &serial8250_ports[i];
|
|
|
|
|
|
if (up->port.dev == &dev->dev)
|
|
if (up->port.dev == &dev->dev)
|
|
@@ -2487,7 +2489,7 @@ static struct uart_8250_port *serial8250_find_match_or_unused(struct uart_port *
|
|
/*
|
|
/*
|
|
* First, find a port entry which matches.
|
|
* First, find a port entry which matches.
|
|
*/
|
|
*/
|
|
- for (i = 0; i < UART_NR; i++)
|
|
|
|
|
|
+ for (i = 0; i < nr_uarts; i++)
|
|
if (uart_match_port(&serial8250_ports[i].port, port))
|
|
if (uart_match_port(&serial8250_ports[i].port, port))
|
|
return &serial8250_ports[i];
|
|
return &serial8250_ports[i];
|
|
|
|
|
|
@@ -2496,7 +2498,7 @@ static struct uart_8250_port *serial8250_find_match_or_unused(struct uart_port *
|
|
* free entry. We look for one which hasn't been previously
|
|
* free entry. We look for one which hasn't been previously
|
|
* used (indicated by zero iobase).
|
|
* used (indicated by zero iobase).
|
|
*/
|
|
*/
|
|
- for (i = 0; i < UART_NR; i++)
|
|
|
|
|
|
+ for (i = 0; i < nr_uarts; i++)
|
|
if (serial8250_ports[i].port.type == PORT_UNKNOWN &&
|
|
if (serial8250_ports[i].port.type == PORT_UNKNOWN &&
|
|
serial8250_ports[i].port.iobase == 0)
|
|
serial8250_ports[i].port.iobase == 0)
|
|
return &serial8250_ports[i];
|
|
return &serial8250_ports[i];
|
|
@@ -2505,7 +2507,7 @@ static struct uart_8250_port *serial8250_find_match_or_unused(struct uart_port *
|
|
* That also failed. Last resort is to find any entry which
|
|
* That also failed. Last resort is to find any entry which
|
|
* doesn't have a real port associated with it.
|
|
* doesn't have a real port associated with it.
|
|
*/
|
|
*/
|
|
- for (i = 0; i < UART_NR; i++)
|
|
|
|
|
|
+ for (i = 0; i < nr_uarts; i++)
|
|
if (serial8250_ports[i].port.type == PORT_UNKNOWN)
|
|
if (serial8250_ports[i].port.type == PORT_UNKNOWN)
|
|
return &serial8250_ports[i];
|
|
return &serial8250_ports[i];
|
|
|
|
|
|
@@ -2590,8 +2592,11 @@ static int __init serial8250_init(void)
|
|
{
|
|
{
|
|
int ret, i;
|
|
int ret, i;
|
|
|
|
|
|
|
|
+ if (nr_uarts > UART_NR)
|
|
|
|
+ nr_uarts = UART_NR;
|
|
|
|
+
|
|
printk(KERN_INFO "Serial: 8250/16550 driver $Revision: 1.90 $ "
|
|
printk(KERN_INFO "Serial: 8250/16550 driver $Revision: 1.90 $ "
|
|
- "%d ports, IRQ sharing %sabled\n", (int) UART_NR,
|
|
|
|
|
|
+ "%d ports, IRQ sharing %sabled\n", nr_uarts,
|
|
share_irqs ? "en" : "dis");
|
|
share_irqs ? "en" : "dis");
|
|
|
|
|
|
for (i = 0; i < NR_IRQS; i++)
|
|
for (i = 0; i < NR_IRQS; i++)
|
|
@@ -2651,6 +2656,9 @@ module_param(share_irqs, uint, 0644);
|
|
MODULE_PARM_DESC(share_irqs, "Share IRQs with other non-8250/16x50 devices"
|
|
MODULE_PARM_DESC(share_irqs, "Share IRQs with other non-8250/16x50 devices"
|
|
" (unsafe)");
|
|
" (unsafe)");
|
|
|
|
|
|
|
|
+module_param(nr_uarts, uint, 0644);
|
|
|
|
+MODULE_PARM_DESC(nr_uarts, "Maximum number of UARTs supported. (1-" __MODULE_STRING(CONFIG_SERIAL_8250_NR_UARTS) ")");
|
|
|
|
+
|
|
#ifdef CONFIG_SERIAL_8250_RSA
|
|
#ifdef CONFIG_SERIAL_8250_RSA
|
|
module_param_array(probe_rsa, ulong, &probe_rsa_count, 0444);
|
|
module_param_array(probe_rsa, ulong, &probe_rsa_count, 0444);
|
|
MODULE_PARM_DESC(probe_rsa, "Probe I/O ports for RSA");
|
|
MODULE_PARM_DESC(probe_rsa, "Probe I/O ports for RSA");
|