diff options
author | David S. Miller <davem@sunset.davemloft.net> | 2006-02-14 00:28:40 -0500 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2006-03-20 04:12:46 -0500 |
commit | d5a2aa241aa0babf382d42d6033b30a5112e4c1e (patch) | |
tree | 64b0ffb5b321827be583de8167f5f80f0befdb33 | |
parent | 5259d5bfaf5b2953b130e9a500277a905bd37823 (diff) |
[SPARC64] sunhv: Bug fixes.
Add udelay to polling console write loop, and increment
the loop limit.
Name the device "ttyHV" and pass that to add_preferred_console()
when we're using hypervisor console.
Kill sunhv_console_setup(), it's empty.
Handle the case where we don't want to use hypervisor console.
(ie. we have a head attached to a sun4v machine)
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | arch/sparc64/kernel/setup.c | 1 | ||||
-rw-r--r-- | drivers/serial/sunhv.c | 25 |
2 files changed, 11 insertions, 15 deletions
diff --git a/arch/sparc64/kernel/setup.c b/arch/sparc64/kernel/setup.c index 4f253a0755b0..06807cf95ee1 100644 --- a/arch/sparc64/kernel/setup.c +++ b/arch/sparc64/kernel/setup.c | |||
@@ -410,6 +410,7 @@ static int __init set_preferred_console(void) | |||
410 | * value anyways... | 410 | * value anyways... |
411 | */ | 411 | */ |
412 | serial_console = 4; | 412 | serial_console = 4; |
413 | return add_preferred_console("ttyHV", 0, NULL); | ||
413 | } else { | 414 | } else { |
414 | prom_printf("Inconsistent console: " | 415 | prom_printf("Inconsistent console: " |
415 | "input %d, output %d\n", | 416 | "input %d, output %d\n", |
diff --git a/drivers/serial/sunhv.c b/drivers/serial/sunhv.c index d3a9dd739da3..71c70d7a998c 100644 --- a/drivers/serial/sunhv.c +++ b/drivers/serial/sunhv.c | |||
@@ -360,7 +360,7 @@ static struct uart_port *sunhv_port; | |||
360 | static inline void sunhv_console_putchar(struct uart_port *port, char c) | 360 | static inline void sunhv_console_putchar(struct uart_port *port, char c) |
361 | { | 361 | { |
362 | unsigned long flags; | 362 | unsigned long flags; |
363 | int limit = 10000; | 363 | int limit = 1000000; |
364 | 364 | ||
365 | spin_lock_irqsave(&port->lock, flags); | 365 | spin_lock_irqsave(&port->lock, flags); |
366 | 366 | ||
@@ -368,6 +368,7 @@ static inline void sunhv_console_putchar(struct uart_port *port, char c) | |||
368 | long status = hypervisor_con_putchar(c); | 368 | long status = hypervisor_con_putchar(c); |
369 | if (status == HV_EOK) | 369 | if (status == HV_EOK) |
370 | break; | 370 | break; |
371 | udelay(2); | ||
371 | } | 372 | } |
372 | 373 | ||
373 | spin_unlock_irqrestore(&port->lock, flags); | 374 | spin_unlock_irqrestore(&port->lock, flags); |
@@ -385,28 +386,23 @@ static void sunhv_console_write(struct console *con, const char *s, unsigned n) | |||
385 | } | 386 | } |
386 | } | 387 | } |
387 | 388 | ||
388 | static int sunhv_console_setup(struct console *con, char *options) | ||
389 | { | ||
390 | return 0; | ||
391 | } | ||
392 | |||
393 | static struct console sunhv_console = { | 389 | static struct console sunhv_console = { |
394 | .name = "ttyS", | 390 | .name = "ttyHV", |
395 | .write = sunhv_console_write, | 391 | .write = sunhv_console_write, |
396 | .device = uart_console_device, | 392 | .device = uart_console_device, |
397 | .setup = sunhv_console_setup, | ||
398 | .flags = CON_PRINTBUFFER, | 393 | .flags = CON_PRINTBUFFER, |
399 | .index = -1, | 394 | .index = -1, |
400 | .data = &sunhv_reg, | 395 | .data = &sunhv_reg, |
401 | }; | 396 | }; |
402 | 397 | ||
403 | static void __init sunhv_console_init(void) | 398 | static inline struct console *SUNHV_CONSOLE(void) |
404 | { | 399 | { |
405 | if (con_is_present()) | 400 | if (con_is_present()) |
406 | return; | 401 | return NULL; |
407 | 402 | ||
408 | sunhv_console.index = 0; | 403 | sunhv_console.index = 0; |
409 | register_console(&sunhv_console); | 404 | |
405 | return &sunhv_console; | ||
410 | } | 406 | } |
411 | 407 | ||
412 | static int __init hv_console_compatible(char *buf, int len) | 408 | static int __init hv_console_compatible(char *buf, int len) |
@@ -496,7 +492,6 @@ static int __init sunhv_init(void) | |||
496 | 492 | ||
497 | sunhv_reg.minor = sunserial_current_minor; | 493 | sunhv_reg.minor = sunserial_current_minor; |
498 | sunhv_reg.nr = 1; | 494 | sunhv_reg.nr = 1; |
499 | sunhv_reg.cons = &sunhv_console; | ||
500 | 495 | ||
501 | ret = uart_register_driver(&sunhv_reg); | 496 | ret = uart_register_driver(&sunhv_reg); |
502 | if (ret < 0) { | 497 | if (ret < 0) { |
@@ -506,11 +501,11 @@ static int __init sunhv_init(void) | |||
506 | return ret; | 501 | return ret; |
507 | } | 502 | } |
508 | 503 | ||
509 | sunhv_port = port; | ||
510 | |||
511 | sunserial_current_minor += 1; | 504 | sunserial_current_minor += 1; |
512 | 505 | ||
513 | sunhv_console_init(); | 506 | sunhv_reg.cons = SUNHV_CONSOLE(); |
507 | |||
508 | sunhv_port = port; | ||
514 | 509 | ||
515 | uart_add_one_port(&sunhv_reg, port); | 510 | uart_add_one_port(&sunhv_reg, port); |
516 | 511 | ||