Commit 0a492896 authored by David S. Miller's avatar David S. Miller

sparc: Really fix "console=" for serial consoles.

If a video head and keyboard are hooked up, specifying "console=ttyS0"
or similar to use a serial console will not work properly.

The key issue is that we must register all serial console capable
devices with register_console(), otherwise the command line specified
device won't be found.  The sun serial drivers would only register
themselves as console devices if the OpenFirmware specified console
device node matched.  To fix this part we now unconditionally get
the serial console register by setting serial_drv->cons always.

Secondarily we must not add_preferred_console() using the firmware
provided console setting if the user gaven an override on the kernel
command line using "console="  The "primary framebuffer" matching
logic was always triggering o n openfirmware device node match, make
it not when a command line override was given.
Reported-by: default avatarFrans Pop <elendil@planet.nl>
Tested-by: default avatarFrans Pop <elendil@planet.nl>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 2dc4ec5d
#ifndef _SPARC_FB_H_ #ifndef _SPARC_FB_H_
#define _SPARC_FB_H_ #define _SPARC_FB_H_
#include <linux/console.h>
#include <linux/fb.h> #include <linux/fb.h>
#include <linux/fs.h> #include <linux/fs.h>
#include <asm/page.h> #include <asm/page.h>
...@@ -18,6 +19,9 @@ static inline int fb_is_primary_device(struct fb_info *info) ...@@ -18,6 +19,9 @@ static inline int fb_is_primary_device(struct fb_info *info)
struct device *dev = info->device; struct device *dev = info->device;
struct device_node *node; struct device_node *node;
if (console_set_on_cmdline)
return 0;
node = dev->of_node; node = dev->of_node;
if (node && if (node &&
node == of_console_device) node == of_console_device)
......
...@@ -55,7 +55,12 @@ EXPORT_SYMBOL(sunserial_unregister_minors); ...@@ -55,7 +55,12 @@ EXPORT_SYMBOL(sunserial_unregister_minors);
int sunserial_console_match(struct console *con, struct device_node *dp, int sunserial_console_match(struct console *con, struct device_node *dp,
struct uart_driver *drv, int line, bool ignore_line) struct uart_driver *drv, int line, bool ignore_line)
{ {
if (!con || of_console_device != dp) if (!con)
return 0;
drv->cons = con;
if (of_console_device != dp)
return 0; return 0;
if (!ignore_line) { if (!ignore_line) {
...@@ -69,12 +74,10 @@ int sunserial_console_match(struct console *con, struct device_node *dp, ...@@ -69,12 +74,10 @@ int sunserial_console_match(struct console *con, struct device_node *dp,
return 0; return 0;
} }
if (!console_set_on_cmdline) {
con->index = line; con->index = line;
drv->cons = con;
if (!console_set_on_cmdline)
add_preferred_console(con->name, line, NULL); add_preferred_console(con->name, line, NULL);
}
return 1; return 1;
} }
EXPORT_SYMBOL(sunserial_console_match); EXPORT_SYMBOL(sunserial_console_match);
......
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