Commit d5a2aa24 authored by David S. Miller's avatar David S. Miller

[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: default avatarDavid S. Miller <davem@davemloft.net>
parent 5259d5bf
...@@ -410,6 +410,7 @@ static int __init set_preferred_console(void) ...@@ -410,6 +410,7 @@ static int __init set_preferred_console(void)
* value anyways... * value anyways...
*/ */
serial_console = 4; serial_console = 4;
return add_preferred_console("ttyHV", 0, NULL);
} else { } else {
prom_printf("Inconsistent console: " prom_printf("Inconsistent console: "
"input %d, output %d\n", "input %d, output %d\n",
......
...@@ -360,7 +360,7 @@ static struct uart_port *sunhv_port; ...@@ -360,7 +360,7 @@ static struct uart_port *sunhv_port;
static inline void sunhv_console_putchar(struct uart_port *port, char c) static inline void sunhv_console_putchar(struct uart_port *port, char c)
{ {
unsigned long flags; unsigned long flags;
int limit = 10000; int limit = 1000000;
spin_lock_irqsave(&port->lock, flags); spin_lock_irqsave(&port->lock, flags);
...@@ -368,6 +368,7 @@ static inline void sunhv_console_putchar(struct uart_port *port, char c) ...@@ -368,6 +368,7 @@ static inline void sunhv_console_putchar(struct uart_port *port, char c)
long status = hypervisor_con_putchar(c); long status = hypervisor_con_putchar(c);
if (status == HV_EOK) if (status == HV_EOK)
break; break;
udelay(2);
} }
spin_unlock_irqrestore(&port->lock, flags); spin_unlock_irqrestore(&port->lock, flags);
...@@ -385,28 +386,23 @@ static void sunhv_console_write(struct console *con, const char *s, unsigned n) ...@@ -385,28 +386,23 @@ static void sunhv_console_write(struct console *con, const char *s, unsigned n)
} }
} }
static int sunhv_console_setup(struct console *con, char *options)
{
return 0;
}
static struct console sunhv_console = { static struct console sunhv_console = {
.name = "ttyS", .name = "ttyHV",
.write = sunhv_console_write, .write = sunhv_console_write,
.device = uart_console_device, .device = uart_console_device,
.setup = sunhv_console_setup,
.flags = CON_PRINTBUFFER, .flags = CON_PRINTBUFFER,
.index = -1, .index = -1,
.data = &sunhv_reg, .data = &sunhv_reg,
}; };
static void __init sunhv_console_init(void) static inline struct console *SUNHV_CONSOLE(void)
{ {
if (con_is_present()) if (con_is_present())
return; return NULL;
sunhv_console.index = 0; sunhv_console.index = 0;
register_console(&sunhv_console);
return &sunhv_console;
} }
static int __init hv_console_compatible(char *buf, int len) static int __init hv_console_compatible(char *buf, int len)
...@@ -496,7 +492,6 @@ static int __init sunhv_init(void) ...@@ -496,7 +492,6 @@ static int __init sunhv_init(void)
sunhv_reg.minor = sunserial_current_minor; sunhv_reg.minor = sunserial_current_minor;
sunhv_reg.nr = 1; sunhv_reg.nr = 1;
sunhv_reg.cons = &sunhv_console;
ret = uart_register_driver(&sunhv_reg); ret = uart_register_driver(&sunhv_reg);
if (ret < 0) { if (ret < 0) {
...@@ -506,11 +501,11 @@ static int __init sunhv_init(void) ...@@ -506,11 +501,11 @@ static int __init sunhv_init(void)
return ret; return ret;
} }
sunhv_port = port;
sunserial_current_minor += 1; sunserial_current_minor += 1;
sunhv_console_init(); sunhv_reg.cons = SUNHV_CONSOLE();
sunhv_port = port;
uart_add_one_port(&sunhv_reg, port); uart_add_one_port(&sunhv_reg, port);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment