|
@@ -1015,6 +1015,7 @@ static struct uart_ops sunzilog_pops = {
|
|
|
.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;
|
|
|
|
|
@@ -1350,16 +1351,22 @@ static int zilog_irq = -1;
|
|
|
|
|
|
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");
|
|
@@ -1427,6 +1434,7 @@ static int __devinit zs_probe(struct of_device *op, const struct of_device_id *m
|
|
|
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",
|
|
@@ -1438,12 +1446,11 @@ static int __devinit zs_probe(struct of_device *op, const struct of_device_id *m
|
|
|
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;
|
|
|
}
|
|
|
|
|
@@ -1491,28 +1498,25 @@ static struct of_platform_driver zs_driver = {
|
|
|
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;
|
|
|
}
|