powerpc/powermac: Fixup default serial port device for pmac_zilog

This removes the non-working code in legacy_serial that tried to handle
the powermac SCC ports, and instead add a (now working) function to the
powermac platform code to find the default serial console if any.
Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
parent f023bf0f
...@@ -493,18 +493,18 @@ static int __init serial_dev_init(void) ...@@ -493,18 +493,18 @@ static int __init serial_dev_init(void)
device_initcall(serial_dev_init); device_initcall(serial_dev_init);
#ifdef CONFIG_SERIAL_8250_CONSOLE
/* /*
* This is called very early, as part of console_init() (typically just after * This is called very early, as part of console_init() (typically just after
* time_init()). This function is respondible for trying to find a good * time_init()). This function is respondible for trying to find a good
* default console on serial ports. It tries to match the open firmware * default console on serial ports. It tries to match the open firmware
* default output with one of the available serial console drivers, either * default output with one of the available serial console drivers that have
* one of the platform serial ports that have been probed earlier by * been probed earlier by find_legacy_serial_ports()
* find_legacy_serial_ports() or some more platform specific ones.
*/ */
static int __init check_legacy_serial_console(void) static int __init check_legacy_serial_console(void)
{ {
struct device_node *prom_stdout = NULL; struct device_node *prom_stdout = NULL;
int speed = 0, offset = 0; int i, speed = 0, offset = 0;
const char *name; const char *name;
const u32 *spd; const u32 *spd;
...@@ -548,31 +548,20 @@ static int __init check_legacy_serial_console(void) ...@@ -548,31 +548,20 @@ static int __init check_legacy_serial_console(void)
if (spd) if (spd)
speed = *spd; speed = *spd;
if (0) if (strcmp(name, "serial") != 0)
; goto not_found;
#ifdef CONFIG_SERIAL_8250_CONSOLE
else if (strcmp(name, "serial") == 0) { /* Look for it in probed array */
int i; for (i = 0; i < legacy_serial_count; i++) {
/* Look for it in probed array */ if (prom_stdout != legacy_serial_infos[i].np)
for (i = 0; i < legacy_serial_count; i++) { continue;
if (prom_stdout != legacy_serial_infos[i].np) offset = i;
continue; speed = legacy_serial_infos[i].speed;
offset = i; break;
speed = legacy_serial_infos[i].speed;
break;
}
if (i >= legacy_serial_count)
goto not_found;
} }
#endif /* CONFIG_SERIAL_8250_CONSOLE */ if (i >= legacy_serial_count)
#ifdef CONFIG_SERIAL_PMACZILOG_CONSOLE
else if (strcmp(name, "ch-a") == 0)
offset = 0;
else if (strcmp(name, "ch-b") == 0)
offset = 1;
#endif /* CONFIG_SERIAL_PMACZILOG_CONSOLE */
else
goto not_found; goto not_found;
of_node_put(prom_stdout); of_node_put(prom_stdout);
DBG("Found serial console at ttyS%d\n", offset); DBG("Found serial console at ttyS%d\n", offset);
...@@ -591,3 +580,4 @@ static int __init check_legacy_serial_console(void) ...@@ -591,3 +580,4 @@ static int __init check_legacy_serial_console(void)
} }
console_initcall(check_legacy_serial_console); console_initcall(check_legacy_serial_console);
#endif /* CONFIG_SERIAL_8250_CONSOLE */
...@@ -541,6 +541,78 @@ static int __init pmac_declare_of_platform_devices(void) ...@@ -541,6 +541,78 @@ static int __init pmac_declare_of_platform_devices(void)
} }
machine_device_initcall(powermac, pmac_declare_of_platform_devices); machine_device_initcall(powermac, pmac_declare_of_platform_devices);
#ifdef CONFIG_SERIAL_PMACZILOG_CONSOLE
/*
* This is called very early, as part of console_init() (typically just after
* time_init()). This function is respondible for trying to find a good
* default console on serial ports. It tries to match the open firmware
* default output with one of the available serial console drivers.
*/
static int __init check_pmac_serial_console(void)
{
struct device_node *prom_stdout = NULL;
int offset = 0;
const char *name;
#ifdef CONFIG_SERIAL_PMACZILOG_TTYS
char *devname = "ttyS";
#else
char *devname = "ttyPZ";
#endif
pr_debug(" -> check_pmac_serial_console()\n");
/* The user has requested a console so this is already set up. */
if (strstr(boot_command_line, "console=")) {
pr_debug(" console was specified !\n");
return -EBUSY;
}
if (!of_chosen) {
pr_debug(" of_chosen is NULL !\n");
return -ENODEV;
}
/* We are getting a weird phandle from OF ... */
/* ... So use the full path instead */
name = of_get_property(of_chosen, "linux,stdout-path", NULL);
if (name == NULL) {
pr_debug(" no linux,stdout-path !\n");
return -ENODEV;
}
prom_stdout = of_find_node_by_path(name);
if (!prom_stdout) {
pr_debug(" can't find stdout package %s !\n", name);
return -ENODEV;
}
pr_debug("stdout is %s\n", prom_stdout->full_name);
name = of_get_property(prom_stdout, "name", NULL);
if (!name) {
pr_debug(" stdout package has no name !\n");
goto not_found;
}
if (strcmp(name, "ch-a") == 0)
offset = 0;
else if (strcmp(name, "ch-b") == 0)
offset = 1;
else
goto not_found;
of_node_put(prom_stdout);
pr_debug("Found serial console at %s%d\n", devname, offset);
return add_preferred_console(devname, offset, NULL);
not_found:
pr_debug("No preferred console found !\n");
of_node_put(prom_stdout);
return -ENODEV;
}
console_initcall(check_pmac_serial_console);
#endif /* CONFIG_SERIAL_PMACZILOG_CONSOLE */
/* /*
* Called very early, MMU is off, device-tree isn't unflattened * Called very early, MMU is off, device-tree isn't unflattened
*/ */
......
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