[PATCH v3] Stop pmac_zilog from abusing 8250's device numbers; optionally.

David Woodhouse
2007-04-04T14:20:21Z

On Wed, 2007-04-04 at 16:31 +1000, Paul Mackerras wrote:
> It seems Debian has both 8250 and pmac_zilog built in; not sure which
> one wins. Ubuntu has them both as modules and managed to get the
> right one (pmac_zilog) loaded on a colleague's powerbook.

So if you insert a PCMCIA card with an 8250-compatible port in it --
like a Bluetooth card or modem -- you won't get it to work, right?

> You'd know better than me what FC does.

Fedora has 8250 built in, which means pmac_zilog can never get loaded.

> In any case there definitely are people using pmac_zilog successfully
> on powermacs and we need to come up with a way to avoid breaking their
> setups. I'm prepared to accept that the Linux way is to be lame about
> serial port naming provided that we avoid breaking existing working
> setups.

OK, how about a config option to preserve the old behaviour...

Signed-off-by: David Woodhouse <dwmw2@infradead.org>

diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig
index ad9f321..09b2dd4 100644
--- a/drivers/serial/Kconfig
+++ b/drivers/serial/Kconfig
@@ -753,6 +753,25 @@ config SERIAL_PMACZILOG
PowerMac machines.
Say Y or M if you want to be able to these serial ports.

+config SERIAL_PMACZILOG_TTYS
+ bool "Use ttySn device nodes for Zilog z85c30"
+ depends on SERIAL_PMACZILOG
+ help
+ The z85C30 driver historically used the device nodes which
+ are registed to the 8250 serial port driver, which led to the
+ two drivers being unable to coexist; you could not use both
+ z85C30 and 8250 type ports at the same time.
+
+ The z83C30 driver was fixed to prevent this abuse by default,
+ but this configuration option remains in order to allow backward
+ compatibility by reverting to the old misbehaviour.
+
+ If you enable this option, any z85c30 ports in the system will
+ be registered as ttyS0 onwards, and you will be unable to use
+ the 8250 module for PCMCIA or other standard UARTs.
+
+ Say N.
+
config SERIAL_PMACZILOG_CONSOLE
bool "Console on PowerMac z85c30 serial port"
depends on SERIAL_PMACZILOG=y
diff --git a/drivers/serial/pmac_zilog.c b/drivers/serial/pmac_zilog.c
index 752ef07..28269bb 100644
--- a/drivers/serial/pmac_zilog.c
+++ b/drivers/serial/pmac_zilog.c
@@ -88,9 +88,19 @@ MODULE_LICENSE("GPL");

#define PWRDBG(fmt, arg...) printk(KERN_DEBUG fmt , ## arg)

+#ifdef CONFIG_SERIAL_PMACZILOG_TTYS
+#define PMACZILOG_MAJOR TTY_MAJOR
+#define PMACZILOG_MINOR 64
+#define PMACZILOG_NAME "ttyS"
+#else
+#define PMACZILOG_MAJOR 204
+#define PMACZILOG_MINOR 192
+#define PMACZILOG_NAME "ttyPZ"
+#endif
+

/*
- * For the sake of early serial console, we can do a pre-probe
+ * FOR the sake of early serial console, we can do a pre-probe
* (optional) of the ports at rather early boot time.
*/
static struct uart_pmac_port pmz_ports[MAX_ZS_PORTS];
@@ -99,9 +109,10 @@ static DEFINE_MUTEX(pmz_irq_mutex);

static struct uart_driver pmz_uart_reg = {
.owner = THIS_MODULE,
- .driver_name = "ttyS",
- .dev_name = "ttyS",
- .major = TTY_MAJOR,
+ .driver_name = PMACZILOG_NAME,
+ .dev_name = PMACZILOG_NAME,
+ .major = PMACZILOG_MAJOR,
+ .minor = PMACZILOG_MINOR,
};

@@ -1776,7 +1787,7 @@ static void pmz_console_write(struct console *con, const char *s, unsigned int c
static int __init pmz_console_setup(struct console *co, char *options);

static struct console pmz_console = {
- .name = "ttyS",
+ .name = PMACZILOG_NAME,
.write = pmz_console_write,
.device = uart_console_device,
.setup = pmz_console_setup,
@@ -1800,7 +1811,6 @@ static int __init pmz_register(void)

pmz_uart_reg.nr = pmz_ports_count;
pmz_uart_reg.cons = PMACZILOG_CONSOLE;
- pmz_uart_reg.minor = 64;

/*
* Register this driver with the serial core

--
dwmw2