.verify_port    =       sunzilog_verify_port,
 };
 
+static int uart_chip_count;
 static struct uart_sunzilog_port *sunzilog_port_table;
 static struct zilog_layout __iomem **sunzilog_chip_regs;
 
 
 static int __devinit zs_probe(struct of_device *op, const struct of_device_id *match)
 {
-       static int inst;
+       static int kbm_inst, uart_inst;
+       int inst;
        struct uart_sunzilog_port *up;
        struct zilog_layout __iomem *rp;
-       int keyboard_mouse;
+       int keyboard_mouse = 0;
        int err;
 
-       keyboard_mouse = 0;
        if (of_find_property(op->node, "keyboard", NULL))
                keyboard_mouse = 1;
 
+       /* uarts must come before keyboards/mice */
+       if (keyboard_mouse)
+               inst = uart_chip_count + kbm_inst;
+       else
+               inst = uart_inst;
+
        sunzilog_chip_regs[inst] = of_ioremap(&op->resource[0], 0,
                                              sizeof(struct zilog_layout),
                                              "zs");
                                   rp, sizeof(struct zilog_layout));
                        return err;
                }
+               uart_inst++;
        } else {
                printk(KERN_INFO "%s: Keyboard at MMIO 0x%llx (irq = %d) "
                       "is a %s\n",
                       op->dev.bus_id,
                       (unsigned long long) up[1].port.mapbase,
                       op->irqs[0], sunzilog_type(&up[1].port));
+               kbm_inst++;
        }
 
        dev_set_drvdata(&op->dev, &up[0]);
 
-       inst++;
-
        return 0;
 }
 
 static int __init sunzilog_init(void)
 {
        struct device_node *dp;
-       int err, uart_count;
-       int num_keybms;
+       int err;
+       int num_keybms = 0;
        int num_sunzilog = 0;
 
-       num_keybms = 0;
        for_each_node_by_name(dp, "zs") {
                num_sunzilog++;
                if (of_find_property(dp, "keyboard", NULL))
                        num_keybms++;
        }
 
-       uart_count = 0;
        if (num_sunzilog) {
-               int uart_count;
-
                err = sunzilog_alloc_tables(num_sunzilog);
                if (err)
                        goto out;
 
-               uart_count = (num_sunzilog * 2) - (2 * num_keybms);
+               uart_chip_count = num_sunzilog - num_keybms;
 
-               err = sunserial_register_minors(&sunzilog_reg, uart_count);
+               err = sunserial_register_minors(&sunzilog_reg,
+                                               uart_chip_count * 2);
                if (err)
                        goto out_free_tables;
        }