projects
/
powerpc.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge master.kernel.org:/pub/scm/linux/kernel/git/lethal/sh-2.6
[powerpc.git]
/
drivers
/
serial
/
sunsu.c
diff --git
a/drivers/serial/sunsu.c
b/drivers/serial/sunsu.c
index
f9013ba
..
9b3b9aa
100644
(file)
--- a/
drivers/serial/sunsu.c
+++ b/
drivers/serial/sunsu.c
@@
-1200,6
+1200,11
@@
static int __init sunsu_kbd_ms_init(struct uart_sunsu_port *up)
if (up->port.type == PORT_UNKNOWN)
return -ENODEV;
if (up->port.type == PORT_UNKNOWN)
return -ENODEV;
+ printk("%s: %s port at %lx, irq %u\n",
+ to_of_device(up->port.dev)->node->full_name,
+ (up->su_type == SU_PORT_KBD) ? "Keyboard" : "Mouse",
+ up->port.mapbase, up->port.irq);
+
#ifdef CONFIG_SERIO
serio = &up->serio;
serio->port_data = up;
#ifdef CONFIG_SERIO
serio = &up->serio;
serio->port_data = up;
@@
-1406,25
+1411,35
@@
static int __devinit su_probe(struct of_device *op, const struct of_device_id *m
struct device_node *dp = op->node;
struct uart_sunsu_port *up;
struct resource *rp;
struct device_node *dp = op->node;
struct uart_sunsu_port *up;
struct resource *rp;
+ enum su_type type;
int err;
int err;
- if (inst >= UART_NR)
- return -EINVAL;
+ type = su_get_type(dp);
+ if (type == SU_PORT_PORT) {
+ if (inst >= UART_NR)
+ return -EINVAL;
+ up = &sunsu_ports[inst];
+ } else {
+ up = kzalloc(sizeof(*up), GFP_KERNEL);
+ if (!up)
+ return -ENOMEM;
+ }
- up = &sunsu_ports[inst];
up->port.line = inst;
spin_lock_init(&up->port.lock);
up->port.line = inst;
spin_lock_init(&up->port.lock);
- up->su_type =
su_get_type(dp)
;
+ up->su_type =
type
;
rp = &op->resource[0];
rp = &op->resource[0];
- up->port.mapbase = op->resource[0].start;
-
+ up->port.mapbase = rp->start;
up->reg_size = (rp->end - rp->start) + 1;
up->port.membase = of_ioremap(rp, 0, up->reg_size, "su");
up->reg_size = (rp->end - rp->start) + 1;
up->port.membase = of_ioremap(rp, 0, up->reg_size, "su");
- if (!up->port.membase)
+ if (!up->port.membase) {
+ if (type != SU_PORT_PORT)
+ kfree(up);
return -ENOMEM;
return -ENOMEM;
+ }
up->port.irq = op->irqs[0];
up->port.irq = op->irqs[0];
@@
-1436,8
+1451,11
@@
static int __devinit su_probe(struct of_device *op, const struct of_device_id *m
err = 0;
if (up->su_type == SU_PORT_KBD || up->su_type == SU_PORT_MS) {
err = sunsu_kbd_ms_init(up);
err = 0;
if (up->su_type == SU_PORT_KBD || up->su_type == SU_PORT_MS) {
err = sunsu_kbd_ms_init(up);
- if (err)
+ if (err) {
+ kfree(up);
goto out_unmap;
goto out_unmap;
+ }
+ dev_set_drvdata(&op->dev, up);
return 0;
}
return 0;
}
@@
-1476,8
+1494,15
@@
static int __devexit su_remove(struct of_device *dev)
#ifdef CONFIG_SERIO
serio_unregister_port(&up->serio);
#endif
#ifdef CONFIG_SERIO
serio_unregister_port(&up->serio);
#endif
- } else if (up->port.type != PORT_UNKNOWN)
+ kfree(up);
+ } else if (up->port.type != PORT_UNKNOWN) {
uart_remove_one_port(&sunsu_reg, &up->port);
uart_remove_one_port(&sunsu_reg, &up->port);
+ }
+
+ if (up->port.membase)
+ of_iounmap(up->port.membase, up->reg_size);
+
+ dev_set_drvdata(&dev->dev, NULL);
return 0;
}
return 0;
}