54
54
*/
55
55
static unsigned int share_irqs = SERIAL8250_SHARE_IRQS ;
56
56
57
+ static unsigned int nr_uarts = CONFIG_SERIAL_8250_RUNTIME_UARTS ;
58
+
57
59
/*
58
60
* Debugging.
59
61
*/
@@ -2118,7 +2120,7 @@ static void __init serial8250_isa_init_ports(void)
2118
2120
return ;
2119
2121
first = 0 ;
2120
2122
2121
- for (i = 0 ; i < UART_NR ; i ++ ) {
2123
+ for (i = 0 ; i < nr_uarts ; i ++ ) {
2122
2124
struct uart_8250_port * up = & serial8250_ports [i ];
2123
2125
2124
2126
up -> port .line = i ;
@@ -2137,7 +2139,7 @@ static void __init serial8250_isa_init_ports(void)
2137
2139
}
2138
2140
2139
2141
for (i = 0 , up = serial8250_ports ;
2140
- i < ARRAY_SIZE (old_serial_port ) && i < UART_NR ;
2142
+ i < ARRAY_SIZE (old_serial_port ) && i < nr_uarts ;
2141
2143
i ++ , up ++ ) {
2142
2144
up -> port .iobase = old_serial_port [i ].port ;
2143
2145
up -> port .irq = irq_canonicalize (old_serial_port [i ].irq );
@@ -2159,7 +2161,7 @@ serial8250_register_ports(struct uart_driver *drv, struct device *dev)
2159
2161
2160
2162
serial8250_isa_init_ports ();
2161
2163
2162
- for (i = 0 ; i < UART_NR ; i ++ ) {
2164
+ for (i = 0 ; i < nr_uarts ; i ++ ) {
2163
2165
struct uart_8250_port * up = & serial8250_ports [i ];
2164
2166
2165
2167
up -> port .dev = dev ;
@@ -2262,7 +2264,7 @@ static int serial8250_console_setup(struct console *co, char *options)
2262
2264
* if so, search for the first available port that does have
2263
2265
* console support.
2264
2266
*/
2265
- if (co -> index >= UART_NR )
2267
+ if (co -> index >= nr_uarts )
2266
2268
co -> index = 0 ;
2267
2269
port = & serial8250_ports [co -> index ].port ;
2268
2270
if (!port -> iobase && !port -> membase )
@@ -2298,7 +2300,7 @@ static int __init find_port(struct uart_port *p)
2298
2300
int line ;
2299
2301
struct uart_port * port ;
2300
2302
2301
- for (line = 0 ; line < UART_NR ; line ++ ) {
2303
+ for (line = 0 ; line < nr_uarts ; line ++ ) {
2302
2304
port = & serial8250_ports [line ].port ;
2303
2305
if (uart_match_port (p , port ))
2304
2306
return line ;
@@ -2420,7 +2422,7 @@ static int __devexit serial8250_remove(struct platform_device *dev)
2420
2422
{
2421
2423
int i ;
2422
2424
2423
- for (i = 0 ; i < UART_NR ; i ++ ) {
2425
+ for (i = 0 ; i < nr_uarts ; i ++ ) {
2424
2426
struct uart_8250_port * up = & serial8250_ports [i ];
2425
2427
2426
2428
if (up -> port .dev == & dev -> dev )
@@ -2487,7 +2489,7 @@ static struct uart_8250_port *serial8250_find_match_or_unused(struct uart_port *
2487
2489
/*
2488
2490
* First, find a port entry which matches.
2489
2491
*/
2490
- for (i = 0 ; i < UART_NR ; i ++ )
2492
+ for (i = 0 ; i < nr_uarts ; i ++ )
2491
2493
if (uart_match_port (& serial8250_ports [i ].port , port ))
2492
2494
return & serial8250_ports [i ];
2493
2495
@@ -2496,7 +2498,7 @@ static struct uart_8250_port *serial8250_find_match_or_unused(struct uart_port *
2496
2498
* free entry. We look for one which hasn't been previously
2497
2499
* used (indicated by zero iobase).
2498
2500
*/
2499
- for (i = 0 ; i < UART_NR ; i ++ )
2501
+ for (i = 0 ; i < nr_uarts ; i ++ )
2500
2502
if (serial8250_ports [i ].port .type == PORT_UNKNOWN &&
2501
2503
serial8250_ports [i ].port .iobase == 0 )
2502
2504
return & serial8250_ports [i ];
@@ -2505,7 +2507,7 @@ static struct uart_8250_port *serial8250_find_match_or_unused(struct uart_port *
2505
2507
* That also failed. Last resort is to find any entry which
2506
2508
* doesn't have a real port associated with it.
2507
2509
*/
2508
- for (i = 0 ; i < UART_NR ; i ++ )
2510
+ for (i = 0 ; i < nr_uarts ; i ++ )
2509
2511
if (serial8250_ports [i ].port .type == PORT_UNKNOWN )
2510
2512
return & serial8250_ports [i ];
2511
2513
@@ -2590,8 +2592,11 @@ static int __init serial8250_init(void)
2590
2592
{
2591
2593
int ret , i ;
2592
2594
2595
+ if (nr_uarts > UART_NR )
2596
+ nr_uarts = UART_NR ;
2597
+
2593
2598
printk (KERN_INFO "Serial: 8250/16550 driver $Revision: 1.90 $ "
2594
- "%d ports, IRQ sharing %sabled\n" , ( int ) UART_NR ,
2599
+ "%d ports, IRQ sharing %sabled\n" , nr_uarts ,
2595
2600
share_irqs ? "en" : "dis" );
2596
2601
2597
2602
for (i = 0 ; i < NR_IRQS ; i ++ )
@@ -2651,6 +2656,9 @@ module_param(share_irqs, uint, 0644);
2651
2656
MODULE_PARM_DESC (share_irqs , "Share IRQs with other non-8250/16x50 devices"
2652
2657
" (unsafe)" );
2653
2658
2659
+ module_param (nr_uarts , uint , 0644 );
2660
+ MODULE_PARM_DESC (nr_uarts , "Maximum number of UARTs supported. (1-" __MODULE_STRING (CONFIG_SERIAL_8250_NR_UARTS ) ")" );
2661
+
2654
2662
#ifdef CONFIG_SERIAL_8250_RSA
2655
2663
module_param_array (probe_rsa , ulong , & probe_rsa_count , 0444 );
2656
2664
MODULE_PARM_DESC (probe_rsa , "Probe I/O ports for RSA" );
0 commit comments