diff options
author | Dmitry Torokhov <dtor_core@ameritech.net> | 2005-09-15 03:01:44 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2005-10-28 12:52:52 -0400 |
commit | 2e5b636bb5f8dacbb91d08544e2c41ebcad5dace (patch) | |
tree | 059a2078d7b11713cad4675a9d8a062337957102 | |
parent | d19fbe8a763634395d4bef40fc88cdb61c4a6274 (diff) |
[PATCH] drivers/input/mouse: convert to dynamic input_dev allocation
Input: convert drivers/input/mouse to dynamic input_dev allocation
This is required for input_dev sysfs integration
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r-- | drivers/input/mouse/alps.c | 63 | ||||
-rw-r--r-- | drivers/input/mouse/alps.h | 2 | ||||
-rw-r--r-- | drivers/input/mouse/amimouse.c | 49 | ||||
-rw-r--r-- | drivers/input/mouse/inport.c | 96 | ||||
-rw-r--r-- | drivers/input/mouse/lifebook.c | 16 | ||||
-rw-r--r-- | drivers/input/mouse/logibm.c | 88 | ||||
-rw-r--r-- | drivers/input/mouse/logips2pp.c | 20 | ||||
-rw-r--r-- | drivers/input/mouse/maplemouse.c | 10 | ||||
-rw-r--r-- | drivers/input/mouse/pc110pad.c | 64 | ||||
-rw-r--r-- | drivers/input/mouse/psmouse-base.c | 99 | ||||
-rw-r--r-- | drivers/input/mouse/psmouse.h | 2 | ||||
-rw-r--r-- | drivers/input/mouse/rpcmouse.c | 43 | ||||
-rw-r--r-- | drivers/input/mouse/sermouse.c | 82 | ||||
-rw-r--r-- | drivers/input/mouse/synaptics.c | 6 | ||||
-rw-r--r-- | drivers/input/mouse/vsxxxaa.c | 84 |
15 files changed, 363 insertions, 361 deletions
diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c index b20783f9748a..4acc7fd4cd0f 100644 --- a/drivers/input/mouse/alps.c +++ b/drivers/input/mouse/alps.c | |||
@@ -79,8 +79,8 @@ static void alps_process_packet(struct psmouse *psmouse, struct pt_regs *regs) | |||
79 | { | 79 | { |
80 | struct alps_data *priv = psmouse->private; | 80 | struct alps_data *priv = psmouse->private; |
81 | unsigned char *packet = psmouse->packet; | 81 | unsigned char *packet = psmouse->packet; |
82 | struct input_dev *dev = &psmouse->dev; | 82 | struct input_dev *dev = psmouse->dev; |
83 | struct input_dev *dev2 = &priv->dev2; | 83 | struct input_dev *dev2 = priv->dev2; |
84 | int x, y, z, ges, fin, left, right, middle; | 84 | int x, y, z, ges, fin, left, right, middle; |
85 | int back = 0, forward = 0; | 85 | int back = 0, forward = 0; |
86 | 86 | ||
@@ -379,20 +379,24 @@ static int alps_reconnect(struct psmouse *psmouse) | |||
379 | static void alps_disconnect(struct psmouse *psmouse) | 379 | static void alps_disconnect(struct psmouse *psmouse) |
380 | { | 380 | { |
381 | struct alps_data *priv = psmouse->private; | 381 | struct alps_data *priv = psmouse->private; |
382 | |||
382 | psmouse_reset(psmouse); | 383 | psmouse_reset(psmouse); |
383 | input_unregister_device(&priv->dev2); | 384 | input_unregister_device(priv->dev2); |
384 | kfree(priv); | 385 | kfree(priv); |
385 | } | 386 | } |
386 | 387 | ||
387 | int alps_init(struct psmouse *psmouse) | 388 | int alps_init(struct psmouse *psmouse) |
388 | { | 389 | { |
389 | struct alps_data *priv; | 390 | struct alps_data *priv; |
391 | struct input_dev *dev1 = psmouse->dev, *dev2; | ||
390 | int version; | 392 | int version; |
391 | 393 | ||
392 | psmouse->private = priv = kmalloc(sizeof(struct alps_data), GFP_KERNEL); | 394 | psmouse->private = priv = kzalloc(sizeof(struct alps_data), GFP_KERNEL); |
393 | if (!priv) | 395 | dev2 = input_allocate_device(); |
396 | if (!priv || !dev2) | ||
394 | goto init_fail; | 397 | goto init_fail; |
395 | memset(priv, 0, sizeof(struct alps_data)); | 398 | |
399 | priv->dev2 = dev2; | ||
396 | 400 | ||
397 | if (!(priv->i = alps_get_model(psmouse, &version))) | 401 | if (!(priv->i = alps_get_model(psmouse, &version))) |
398 | goto init_fail; | 402 | goto init_fail; |
@@ -411,41 +415,39 @@ int alps_init(struct psmouse *psmouse) | |||
411 | if ((priv->i->flags & ALPS_PASS) && alps_passthrough_mode(psmouse, 0)) | 415 | if ((priv->i->flags & ALPS_PASS) && alps_passthrough_mode(psmouse, 0)) |
412 | goto init_fail; | 416 | goto init_fail; |
413 | 417 | ||
414 | psmouse->dev.evbit[LONG(EV_KEY)] |= BIT(EV_KEY); | 418 | dev1->evbit[LONG(EV_KEY)] |= BIT(EV_KEY); |
415 | psmouse->dev.keybit[LONG(BTN_TOUCH)] |= BIT(BTN_TOUCH); | 419 | dev1->keybit[LONG(BTN_TOUCH)] |= BIT(BTN_TOUCH); |
416 | psmouse->dev.keybit[LONG(BTN_TOOL_FINGER)] |= BIT(BTN_TOOL_FINGER); | 420 | dev1->keybit[LONG(BTN_TOOL_FINGER)] |= BIT(BTN_TOOL_FINGER); |
417 | psmouse->dev.keybit[LONG(BTN_LEFT)] |= BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | BIT(BTN_RIGHT); | 421 | dev1->keybit[LONG(BTN_LEFT)] |= BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | BIT(BTN_RIGHT); |
418 | 422 | ||
419 | psmouse->dev.evbit[LONG(EV_ABS)] |= BIT(EV_ABS); | 423 | dev1->evbit[LONG(EV_ABS)] |= BIT(EV_ABS); |
420 | input_set_abs_params(&psmouse->dev, ABS_X, 0, 1023, 0, 0); | 424 | input_set_abs_params(dev1, ABS_X, 0, 1023, 0, 0); |
421 | input_set_abs_params(&psmouse->dev, ABS_Y, 0, 767, 0, 0); | 425 | input_set_abs_params(dev1, ABS_Y, 0, 767, 0, 0); |
422 | input_set_abs_params(&psmouse->dev, ABS_PRESSURE, 0, 127, 0, 0); | 426 | input_set_abs_params(dev1, ABS_PRESSURE, 0, 127, 0, 0); |
423 | 427 | ||
424 | if (priv->i->flags & ALPS_WHEEL) { | 428 | if (priv->i->flags & ALPS_WHEEL) { |
425 | psmouse->dev.evbit[LONG(EV_REL)] |= BIT(EV_REL); | 429 | dev1->evbit[LONG(EV_REL)] |= BIT(EV_REL); |
426 | psmouse->dev.relbit[LONG(REL_WHEEL)] |= BIT(REL_WHEEL); | 430 | dev1->relbit[LONG(REL_WHEEL)] |= BIT(REL_WHEEL); |
427 | } | 431 | } |
428 | 432 | ||
429 | if (priv->i->flags & (ALPS_FW_BK_1 | ALPS_FW_BK_2)) { | 433 | if (priv->i->flags & (ALPS_FW_BK_1 | ALPS_FW_BK_2)) { |
430 | psmouse->dev.keybit[LONG(BTN_FORWARD)] |= BIT(BTN_FORWARD); | 434 | dev1->keybit[LONG(BTN_FORWARD)] |= BIT(BTN_FORWARD); |
431 | psmouse->dev.keybit[LONG(BTN_BACK)] |= BIT(BTN_BACK); | 435 | dev1->keybit[LONG(BTN_BACK)] |= BIT(BTN_BACK); |
432 | } | 436 | } |
433 | 437 | ||
434 | sprintf(priv->phys, "%s/input1", psmouse->ps2dev.serio->phys); | 438 | sprintf(priv->phys, "%s/input1", psmouse->ps2dev.serio->phys); |
435 | priv->dev2.phys = priv->phys; | 439 | dev2->phys = priv->phys; |
436 | priv->dev2.name = (priv->i->flags & ALPS_DUALPOINT) ? "DualPoint Stick" : "PS/2 Mouse"; | 440 | dev2->name = (priv->i->flags & ALPS_DUALPOINT) ? "DualPoint Stick" : "PS/2 Mouse"; |
437 | priv->dev2.id.bustype = BUS_I8042; | 441 | dev2->id.bustype = BUS_I8042; |
438 | priv->dev2.id.vendor = 0x0002; | 442 | dev2->id.vendor = 0x0002; |
439 | priv->dev2.id.product = PSMOUSE_ALPS; | 443 | dev2->id.product = PSMOUSE_ALPS; |
440 | priv->dev2.id.version = 0x0000; | 444 | dev2->id.version = 0x0000; |
441 | |||
442 | priv->dev2.evbit[0] = BIT(EV_KEY) | BIT(EV_REL); | ||
443 | priv->dev2.relbit[LONG(REL_X)] |= BIT(REL_X) | BIT(REL_Y); | ||
444 | priv->dev2.keybit[LONG(BTN_LEFT)] |= BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | BIT(BTN_RIGHT); | ||
445 | 445 | ||
446 | input_register_device(&priv->dev2); | 446 | dev2->evbit[0] = BIT(EV_KEY) | BIT(EV_REL); |
447 | dev2->relbit[LONG(REL_X)] |= BIT(REL_X) | BIT(REL_Y); | ||
448 | dev2->keybit[LONG(BTN_LEFT)] |= BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | BIT(BTN_RIGHT); | ||
447 | 449 | ||
448 | printk(KERN_INFO "input: %s on %s\n", priv->dev2.name, psmouse->ps2dev.serio->phys); | 450 | input_register_device(priv->dev2); |
449 | 451 | ||
450 | psmouse->protocol_handler = alps_process_byte; | 452 | psmouse->protocol_handler = alps_process_byte; |
451 | psmouse->disconnect = alps_disconnect; | 453 | psmouse->disconnect = alps_disconnect; |
@@ -455,6 +457,7 @@ int alps_init(struct psmouse *psmouse) | |||
455 | return 0; | 457 | return 0; |
456 | 458 | ||
457 | init_fail: | 459 | init_fail: |
460 | input_free_device(dev2); | ||
458 | kfree(priv); | 461 | kfree(priv); |
459 | return -1; | 462 | return -1; |
460 | } | 463 | } |
diff --git a/drivers/input/mouse/alps.h b/drivers/input/mouse/alps.h index aba103dd65b7..e428f8d5d12e 100644 --- a/drivers/input/mouse/alps.h +++ b/drivers/input/mouse/alps.h | |||
@@ -22,7 +22,7 @@ struct alps_model_info { | |||
22 | }; | 22 | }; |
23 | 23 | ||
24 | struct alps_data { | 24 | struct alps_data { |
25 | struct input_dev dev2; /* Relative device */ | 25 | struct input_dev *dev2; /* Relative device */ |
26 | char name[32]; /* Name */ | 26 | char name[32]; /* Name */ |
27 | char phys[32]; /* Phys */ | 27 | char phys[32]; /* Phys */ |
28 | struct alps_model_info *i; /* Info */ | 28 | struct alps_model_info *i; /* Info */ |
diff --git a/drivers/input/mouse/amimouse.c b/drivers/input/mouse/amimouse.c index e994849efb8f..d13d4c8fe3c5 100644 --- a/drivers/input/mouse/amimouse.c +++ b/drivers/input/mouse/amimouse.c | |||
@@ -34,10 +34,7 @@ MODULE_DESCRIPTION("Amiga mouse driver"); | |||
34 | MODULE_LICENSE("GPL"); | 34 | MODULE_LICENSE("GPL"); |
35 | 35 | ||
36 | static int amimouse_lastx, amimouse_lasty; | 36 | static int amimouse_lastx, amimouse_lasty; |
37 | static struct input_dev amimouse_dev; | 37 | static struct input_dev *amimouse_dev; |
38 | |||
39 | static char *amimouse_name = "Amiga mouse"; | ||
40 | static char *amimouse_phys = "amimouse/input0"; | ||
41 | 38 | ||
42 | static irqreturn_t amimouse_interrupt(int irq, void *dummy, struct pt_regs *fp) | 39 | static irqreturn_t amimouse_interrupt(int irq, void *dummy, struct pt_regs *fp) |
43 | { | 40 | { |
@@ -62,16 +59,16 @@ static irqreturn_t amimouse_interrupt(int irq, void *dummy, struct pt_regs *fp) | |||
62 | 59 | ||
63 | potgor = custom.potgor; | 60 | potgor = custom.potgor; |
64 | 61 | ||
65 | input_regs(&amimouse_dev, fp); | 62 | input_regs(amimouse_dev, fp); |
66 | 63 | ||
67 | input_report_rel(&amimouse_dev, REL_X, dx); | 64 | input_report_rel(amimouse_dev, REL_X, dx); |
68 | input_report_rel(&amimouse_dev, REL_Y, dy); | 65 | input_report_rel(amimouse_dev, REL_Y, dy); |
69 | 66 | ||
70 | input_report_key(&amimouse_dev, BTN_LEFT, ciaa.pra & 0x40); | 67 | input_report_key(amimouse_dev, BTN_LEFT, ciaa.pra & 0x40); |
71 | input_report_key(&amimouse_dev, BTN_MIDDLE, potgor & 0x0100); | 68 | input_report_key(amimouse_dev, BTN_MIDDLE, potgor & 0x0100); |
72 | input_report_key(&amimouse_dev, BTN_RIGHT, potgor & 0x0400); | 69 | input_report_key(amimouse_dev, BTN_RIGHT, potgor & 0x0400); |
73 | 70 | ||
74 | input_sync(&amimouse_dev); | 71 | input_sync(amimouse_dev); |
75 | 72 | ||
76 | return IRQ_HANDLED; | 73 | return IRQ_HANDLED; |
77 | } | 74 | } |
@@ -103,28 +100,30 @@ static int __init amimouse_init(void) | |||
103 | if (!MACH_IS_AMIGA || !AMIGAHW_PRESENT(AMI_MOUSE)) | 100 | if (!MACH_IS_AMIGA || !AMIGAHW_PRESENT(AMI_MOUSE)) |
104 | return -ENODEV; | 101 | return -ENODEV; |
105 | 102 | ||
106 | amimouse_dev.evbit[0] = BIT(EV_KEY) | BIT(EV_REL); | 103 | if (!(amimouse_dev = input_allocate_device())) |
107 | amimouse_dev.relbit[0] = BIT(REL_X) | BIT(REL_Y); | 104 | return -ENOMEM; |
108 | amimouse_dev.keybit[LONG(BTN_LEFT)] = BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | BIT(BTN_RIGHT); | 105 | |
109 | amimouse_dev.open = amimouse_open; | 106 | amimouse_dev->name = "Amiga mouse"; |
110 | amimouse_dev.close = amimouse_close; | 107 | amimouse_dev->phys = "amimouse/input0"; |
108 | amimouse_dev->id.bustype = BUS_AMIGA; | ||
109 | amimouse_dev->id.vendor = 0x0001; | ||
110 | amimouse_dev->id.product = 0x0002; | ||
111 | amimouse_dev->id.version = 0x0100; | ||
111 | 112 | ||
112 | amimouse_dev.name = amimouse_name; | 113 | amimouse_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REL); |
113 | amimouse_dev.phys = amimouse_phys; | 114 | amimouse_dev->relbit[0] = BIT(REL_X) | BIT(REL_Y); |
114 | amimouse_dev.id.bustype = BUS_AMIGA; | 115 | amimouse_dev->keybit[LONG(BTN_LEFT)] = BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | BIT(BTN_RIGHT); |
115 | amimouse_dev.id.vendor = 0x0001; | 116 | amimouse_dev->open = amimouse_open; |
116 | amimouse_dev.id.product = 0x0002; | 117 | amimouse_dev->close = amimouse_close; |
117 | amimouse_dev.id.version = 0x0100; | ||
118 | 118 | ||
119 | input_register_device(&amimouse_dev); | 119 | input_register_device(amimouse_dev); |
120 | 120 | ||
121 | printk(KERN_INFO "input: %s at joy0dat\n", amimouse_name); | ||
122 | return 0; | 121 | return 0; |
123 | } | 122 | } |
124 | 123 | ||
125 | static void __exit amimouse_exit(void) | 124 | static void __exit amimouse_exit(void) |
126 | { | 125 | { |
127 | input_unregister_device(&amimouse_dev); | 126 | input_unregister_device(amimouse_dev); |
128 | } | 127 | } |
129 | 128 | ||
130 | module_init(amimouse_init); | 129 | module_init(amimouse_init); |
diff --git a/drivers/input/mouse/inport.c b/drivers/input/mouse/inport.c index 1f62c0134010..afc66f56df43 100644 --- a/drivers/input/mouse/inport.c +++ b/drivers/input/mouse/inport.c | |||
@@ -87,40 +87,7 @@ MODULE_PARM_DESC(irq, "IRQ number (5=default)"); | |||
87 | 87 | ||
88 | __obsolete_setup("inport_irq="); | 88 | __obsolete_setup("inport_irq="); |
89 | 89 | ||
90 | static irqreturn_t inport_interrupt(int irq, void *dev_id, struct pt_regs *regs); | 90 | static struct input_dev *inport_dev; |
91 | |||
92 | static int inport_open(struct input_dev *dev) | ||
93 | { | ||
94 | if (request_irq(inport_irq, inport_interrupt, 0, "inport", NULL)) | ||
95 | return -EBUSY; | ||
96 | outb(INPORT_REG_MODE, INPORT_CONTROL_PORT); | ||
97 | outb(INPORT_MODE_IRQ | INPORT_MODE_BASE, INPORT_DATA_PORT); | ||
98 | |||
99 | return 0; | ||
100 | } | ||
101 | |||
102 | static void inport_close(struct input_dev *dev) | ||
103 | { | ||
104 | outb(INPORT_REG_MODE, INPORT_CONTROL_PORT); | ||
105 | outb(INPORT_MODE_BASE, INPORT_DATA_PORT); | ||
106 | free_irq(inport_irq, NULL); | ||
107 | } | ||
108 | |||
109 | static struct input_dev inport_dev = { | ||
110 | .evbit = { BIT(EV_KEY) | BIT(EV_REL) }, | ||
111 | .keybit = { [LONG(BTN_LEFT)] = BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | BIT(BTN_RIGHT) }, | ||
112 | .relbit = { BIT(REL_X) | BIT(REL_Y) }, | ||
113 | .open = inport_open, | ||
114 | .close = inport_close, | ||
115 | .name = INPORT_NAME, | ||
116 | .phys = "isa023c/input0", | ||
117 | .id = { | ||
118 | .bustype = BUS_ISA, | ||
119 | .vendor = INPORT_VENDOR, | ||
120 | .product = 0x0001, | ||
121 | .version = 0x0100, | ||
122 | }, | ||
123 | }; | ||
124 | 91 | ||
125 | static irqreturn_t inport_interrupt(int irq, void *dev_id, struct pt_regs *regs) | 92 | static irqreturn_t inport_interrupt(int irq, void *dev_id, struct pt_regs *regs) |
126 | { | 93 | { |
@@ -129,31 +96,48 @@ static irqreturn_t inport_interrupt(int irq, void *dev_id, struct pt_regs *regs) | |||
129 | outb(INPORT_REG_MODE, INPORT_CONTROL_PORT); | 96 | outb(INPORT_REG_MODE, INPORT_CONTROL_PORT); |
130 | outb(INPORT_MODE_HOLD | INPORT_MODE_IRQ | INPORT_MODE_BASE, INPORT_DATA_PORT); | 97 | outb(INPORT_MODE_HOLD | INPORT_MODE_IRQ | INPORT_MODE_BASE, INPORT_DATA_PORT); |
131 | 98 | ||
132 | input_regs(&inport_dev, regs); | 99 | input_regs(inport_dev, regs); |
133 | 100 | ||
134 | outb(INPORT_REG_X, INPORT_CONTROL_PORT); | 101 | outb(INPORT_REG_X, INPORT_CONTROL_PORT); |
135 | input_report_rel(&inport_dev, REL_X, inb(INPORT_DATA_PORT)); | 102 | input_report_rel(inport_dev, REL_X, inb(INPORT_DATA_PORT)); |
136 | 103 | ||
137 | outb(INPORT_REG_Y, INPORT_CONTROL_PORT); | 104 | outb(INPORT_REG_Y, INPORT_CONTROL_PORT); |
138 | input_report_rel(&inport_dev, REL_Y, inb(INPORT_DATA_PORT)); | 105 | input_report_rel(inport_dev, REL_Y, inb(INPORT_DATA_PORT)); |
139 | 106 | ||
140 | outb(INPORT_REG_BTNS, INPORT_CONTROL_PORT); | 107 | outb(INPORT_REG_BTNS, INPORT_CONTROL_PORT); |
141 | buttons = inb(INPORT_DATA_PORT); | 108 | buttons = inb(INPORT_DATA_PORT); |
142 | 109 | ||
143 | input_report_key(&inport_dev, BTN_MIDDLE, buttons & 1); | 110 | input_report_key(inport_dev, BTN_MIDDLE, buttons & 1); |
144 | input_report_key(&inport_dev, BTN_LEFT, buttons & 2); | 111 | input_report_key(inport_dev, BTN_LEFT, buttons & 2); |
145 | input_report_key(&inport_dev, BTN_RIGHT, buttons & 4); | 112 | input_report_key(inport_dev, BTN_RIGHT, buttons & 4); |
146 | 113 | ||
147 | outb(INPORT_REG_MODE, INPORT_CONTROL_PORT); | 114 | outb(INPORT_REG_MODE, INPORT_CONTROL_PORT); |
148 | outb(INPORT_MODE_IRQ | INPORT_MODE_BASE, INPORT_DATA_PORT); | 115 | outb(INPORT_MODE_IRQ | INPORT_MODE_BASE, INPORT_DATA_PORT); |
149 | 116 | ||
150 | input_sync(&inport_dev); | 117 | input_sync(inport_dev); |
151 | return IRQ_HANDLED; | 118 | return IRQ_HANDLED; |
152 | } | 119 | } |
153 | 120 | ||
121 | static int inport_open(struct input_dev *dev) | ||
122 | { | ||
123 | if (request_irq(inport_irq, inport_interrupt, 0, "inport", NULL)) | ||
124 | return -EBUSY; | ||
125 | outb(INPORT_REG_MODE, INPORT_CONTROL_PORT); | ||
126 | outb(INPORT_MODE_IRQ | INPORT_MODE_BASE, INPORT_DATA_PORT); | ||
127 | |||
128 | return 0; | ||
129 | } | ||
130 | |||
131 | static void inport_close(struct input_dev *dev) | ||
132 | { | ||
133 | outb(INPORT_REG_MODE, INPORT_CONTROL_PORT); | ||
134 | outb(INPORT_MODE_BASE, INPORT_DATA_PORT); | ||
135 | free_irq(inport_irq, NULL); | ||
136 | } | ||
137 | |||
154 | static int __init inport_init(void) | 138 | static int __init inport_init(void) |
155 | { | 139 | { |
156 | unsigned char a,b,c; | 140 | unsigned char a, b, c; |
157 | 141 | ||
158 | if (!request_region(INPORT_BASE, INPORT_EXTENT, "inport")) { | 142 | if (!request_region(INPORT_BASE, INPORT_EXTENT, "inport")) { |
159 | printk(KERN_ERR "inport.c: Can't allocate ports at %#x\n", INPORT_BASE); | 143 | printk(KERN_ERR "inport.c: Can't allocate ports at %#x\n", INPORT_BASE); |
@@ -163,26 +147,44 @@ static int __init inport_init(void) | |||
163 | a = inb(INPORT_SIGNATURE_PORT); | 147 | a = inb(INPORT_SIGNATURE_PORT); |
164 | b = inb(INPORT_SIGNATURE_PORT); | 148 | b = inb(INPORT_SIGNATURE_PORT); |
165 | c = inb(INPORT_SIGNATURE_PORT); | 149 | c = inb(INPORT_SIGNATURE_PORT); |
166 | if (( a == b ) || ( a != c )) { | 150 | if (a == b || a != c) { |
167 | release_region(INPORT_BASE, INPORT_EXTENT); | 151 | release_region(INPORT_BASE, INPORT_EXTENT); |
168 | printk(KERN_ERR "inport.c: Didn't find InPort mouse at %#x\n", INPORT_BASE); | 152 | printk(KERN_ERR "inport.c: Didn't find InPort mouse at %#x\n", INPORT_BASE); |
169 | return -ENODEV; | 153 | return -ENODEV; |
170 | } | 154 | } |
171 | 155 | ||
156 | if (!(inport_dev = input_allocate_device())) { | ||
157 | printk(KERN_ERR "inport.c: Not enough memory for input device\n"); | ||
158 | release_region(INPORT_BASE, INPORT_EXTENT); | ||
159 | return -ENOMEM; | ||
160 | } | ||
161 | |||
162 | inport_dev->name = INPORT_NAME; | ||
163 | inport_dev->phys = "isa023c/input0"; | ||
164 | inport_dev->id.bustype = BUS_ISA; | ||
165 | inport_dev->id.vendor = INPORT_VENDOR; | ||
166 | inport_dev->id.product = 0x0001; | ||
167 | inport_dev->id.version = 0x0100; | ||
168 | |||
169 | inport_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REL); | ||
170 | inport_dev->keybit[LONG(BTN_LEFT)] = BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | BIT(BTN_RIGHT); | ||
171 | inport_dev->relbit[0] = BIT(REL_X) | BIT(REL_Y); | ||
172 | |||
173 | inport_dev->open = inport_open; | ||
174 | inport_dev->close = inport_close; | ||
175 | |||
172 | outb(INPORT_RESET, INPORT_CONTROL_PORT); | 176 | outb(INPORT_RESET, INPORT_CONTROL_PORT); |
173 | outb(INPORT_REG_MODE, INPORT_CONTROL_PORT); | 177 | outb(INPORT_REG_MODE, INPORT_CONTROL_PORT); |
174 | outb(INPORT_MODE_BASE, INPORT_DATA_PORT); | 178 | outb(INPORT_MODE_BASE, INPORT_DATA_PORT); |
175 | 179 | ||
176 | input_register_device(&inport_dev); | 180 | input_register_device(inport_dev); |
177 | |||
178 | printk(KERN_INFO "input: " INPORT_NAME " at %#x irq %d\n", INPORT_BASE, inport_irq); | ||
179 | 181 | ||
180 | return 0; | 182 | return 0; |
181 | } | 183 | } |
182 | 184 | ||
183 | static void __exit inport_exit(void) | 185 | static void __exit inport_exit(void) |
184 | { | 186 | { |
185 | input_unregister_device(&inport_dev); | 187 | input_unregister_device(inport_dev); |
186 | release_region(INPORT_BASE, INPORT_EXTENT); | 188 | release_region(INPORT_BASE, INPORT_EXTENT); |
187 | } | 189 | } |
188 | 190 | ||
diff --git a/drivers/input/mouse/lifebook.c b/drivers/input/mouse/lifebook.c index bd9df9b28325..55991424ac91 100644 --- a/drivers/input/mouse/lifebook.c +++ b/drivers/input/mouse/lifebook.c | |||
@@ -34,7 +34,7 @@ static struct dmi_system_id lifebook_dmi_table[] = { | |||
34 | static psmouse_ret_t lifebook_process_byte(struct psmouse *psmouse, struct pt_regs *regs) | 34 | static psmouse_ret_t lifebook_process_byte(struct psmouse *psmouse, struct pt_regs *regs) |
35 | { | 35 | { |
36 | unsigned char *packet = psmouse->packet; | 36 | unsigned char *packet = psmouse->packet; |
37 | struct input_dev *dev = &psmouse->dev; | 37 | struct input_dev *dev = psmouse->dev; |
38 | 38 | ||
39 | if (psmouse->pktcnt != 3) | 39 | if (psmouse->pktcnt != 3) |
40 | return PSMOUSE_GOOD_DATA; | 40 | return PSMOUSE_GOOD_DATA; |
@@ -113,15 +113,17 @@ int lifebook_detect(struct psmouse *psmouse, int set_properties) | |||
113 | 113 | ||
114 | int lifebook_init(struct psmouse *psmouse) | 114 | int lifebook_init(struct psmouse *psmouse) |
115 | { | 115 | { |
116 | struct input_dev *input_dev = psmouse->dev; | ||
117 | |||
116 | if (lifebook_absolute_mode(psmouse)) | 118 | if (lifebook_absolute_mode(psmouse)) |
117 | return -1; | 119 | return -1; |
118 | 120 | ||
119 | psmouse->dev.evbit[0] = BIT(EV_ABS) | BIT(EV_KEY) | BIT(EV_REL); | 121 | input_dev->evbit[0] = BIT(EV_ABS) | BIT(EV_KEY) | BIT(EV_REL); |
120 | psmouse->dev.keybit[LONG(BTN_LEFT)] = BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | BIT(BTN_RIGHT); | 122 | input_dev->keybit[LONG(BTN_LEFT)] = BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | BIT(BTN_RIGHT); |
121 | psmouse->dev.keybit[LONG(BTN_TOUCH)] = BIT(BTN_TOUCH); | 123 | input_dev->keybit[LONG(BTN_TOUCH)] = BIT(BTN_TOUCH); |
122 | psmouse->dev.relbit[0] = BIT(REL_X) | BIT(REL_Y); | 124 | input_dev->relbit[0] = BIT(REL_X) | BIT(REL_Y); |
123 | input_set_abs_params(&psmouse->dev, ABS_X, 0, 1024, 0, 0); | 125 | input_set_abs_params(input_dev, ABS_X, 0, 1024, 0, 0); |
124 | input_set_abs_params(&psmouse->dev, ABS_Y, 0, 1024, 0, 0); | 126 | input_set_abs_params(input_dev, ABS_Y, 0, 1024, 0, 0); |
125 | 127 | ||
126 | psmouse->protocol_handler = lifebook_process_byte; | 128 | psmouse->protocol_handler = lifebook_process_byte; |
127 | psmouse->set_resolution = lifebook_set_resolution; | 129 | psmouse->set_resolution = lifebook_set_resolution; |
diff --git a/drivers/input/mouse/logibm.c b/drivers/input/mouse/logibm.c index 8b5243167227..9c7ce38806d7 100644 --- a/drivers/input/mouse/logibm.c +++ b/drivers/input/mouse/logibm.c | |||
@@ -77,39 +77,7 @@ MODULE_PARM_DESC(irq, "IRQ number (5=default)"); | |||
77 | 77 | ||
78 | __obsolete_setup("logibm_irq="); | 78 | __obsolete_setup("logibm_irq="); |
79 | 79 | ||
80 | static irqreturn_t logibm_interrupt(int irq, void *dev_id, struct pt_regs *regs); | 80 | static struct input_dev *logibm_dev; |
81 | |||
82 | static int logibm_open(struct input_dev *dev) | ||
83 | { | ||
84 | if (request_irq(logibm_irq, logibm_interrupt, 0, "logibm", NULL)) { | ||
85 | printk(KERN_ERR "logibm.c: Can't allocate irq %d\n", logibm_irq); | ||
86 | return -EBUSY; | ||
87 | } | ||
88 | outb(LOGIBM_ENABLE_IRQ, LOGIBM_CONTROL_PORT); | ||
89 | return 0; | ||
90 | } | ||
91 | |||
92 | static void logibm_close(struct input_dev *dev) | ||
93 | { | ||
94 | outb(LOGIBM_DISABLE_IRQ, LOGIBM_CONTROL_PORT); | ||
95 | free_irq(logibm_irq, NULL); | ||
96 | } | ||
97 | |||
98 | static struct input_dev logibm_dev = { | ||
99 | .evbit = { BIT(EV_KEY) | BIT(EV_REL) }, | ||
100 | .keybit = { [LONG(BTN_LEFT)] = BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | BIT(BTN_RIGHT) }, | ||
101 | .relbit = { BIT(REL_X) | BIT(REL_Y) }, | ||
102 | .open = logibm_open, | ||
103 | .close = logibm_close, | ||
104 | .name = "Logitech bus mouse", | ||
105 | .phys = "isa023c/input0", | ||
106 | .id = { | ||
107 | .bustype = BUS_ISA, | ||
108 | .vendor = 0x0003, | ||
109 | .product = 0x0001, | ||
110 | .version = 0x0100, | ||
111 | }, | ||
112 | }; | ||
113 | 81 | ||
114 | static irqreturn_t logibm_interrupt(int irq, void *dev_id, struct pt_regs *regs) | 82 | static irqreturn_t logibm_interrupt(int irq, void *dev_id, struct pt_regs *regs) |
115 | { | 83 | { |
@@ -127,18 +95,34 @@ static irqreturn_t logibm_interrupt(int irq, void *dev_id, struct pt_regs *regs) | |||
127 | dy |= (buttons & 0xf) << 4; | 95 | dy |= (buttons & 0xf) << 4; |
128 | buttons = ~buttons >> 5; | 96 | buttons = ~buttons >> 5; |
129 | 97 | ||
130 | input_regs(&logibm_dev, regs); | 98 | input_regs(logibm_dev, regs); |
131 | input_report_rel(&logibm_dev, REL_X, dx); | 99 | input_report_rel(logibm_dev, REL_X, dx); |
132 | input_report_rel(&logibm_dev, REL_Y, dy); | 100 | input_report_rel(logibm_dev, REL_Y, dy); |
133 | input_report_key(&logibm_dev, BTN_RIGHT, buttons & 1); | 101 | input_report_key(logibm_dev, BTN_RIGHT, buttons & 1); |
134 | input_report_key(&logibm_dev, BTN_MIDDLE, buttons & 2); | 102 | input_report_key(logibm_dev, BTN_MIDDLE, buttons & 2); |
135 | input_report_key(&logibm_dev, BTN_LEFT, buttons & 4); | 103 | input_report_key(logibm_dev, BTN_LEFT, buttons & 4); |
136 | input_sync(&logibm_dev); | 104 | input_sync(logibm_dev); |
137 | 105 | ||
138 | outb(LOGIBM_ENABLE_IRQ, LOGIBM_CONTROL_PORT); | 106 | outb(LOGIBM_ENABLE_IRQ, LOGIBM_CONTROL_PORT); |
139 | return IRQ_HANDLED; | 107 | return IRQ_HANDLED; |
140 | } | 108 | } |
141 | 109 | ||
110 | static int logibm_open(struct input_dev *dev) | ||
111 | { | ||
112 | if (request_irq(logibm_irq, logibm_interrupt, 0, "logibm", NULL)) { | ||
113 | printk(KERN_ERR "logibm.c: Can't allocate irq %d\n", logibm_irq); | ||
114 | return -EBUSY; | ||
115 | } | ||
116 | outb(LOGIBM_ENABLE_IRQ, LOGIBM_CONTROL_PORT); | ||
117 | return 0; | ||
118 | } | ||
119 | |||
120 | static void logibm_close(struct input_dev *dev) | ||
121 | { | ||
122 | outb(LOGIBM_DISABLE_IRQ, LOGIBM_CONTROL_PORT); | ||
123 | free_irq(logibm_irq, NULL); | ||
124 | } | ||
125 | |||
142 | static int __init logibm_init(void) | 126 | static int __init logibm_init(void) |
143 | { | 127 | { |
144 | if (!request_region(LOGIBM_BASE, LOGIBM_EXTENT, "logibm")) { | 128 | if (!request_region(LOGIBM_BASE, LOGIBM_EXTENT, "logibm")) { |
@@ -159,16 +143,34 @@ static int __init logibm_init(void) | |||
159 | outb(LOGIBM_DEFAULT_MODE, LOGIBM_CONFIG_PORT); | 143 | outb(LOGIBM_DEFAULT_MODE, LOGIBM_CONFIG_PORT); |
160 | outb(LOGIBM_DISABLE_IRQ, LOGIBM_CONTROL_PORT); | 144 | outb(LOGIBM_DISABLE_IRQ, LOGIBM_CONTROL_PORT); |
161 | 145 | ||
162 | input_register_device(&logibm_dev); | 146 | if (!(logibm_dev = input_allocate_device())) { |
147 | printk(KERN_ERR "logibm.c: Not enough memory for input device\n"); | ||
148 | release_region(LOGIBM_BASE, LOGIBM_EXTENT); | ||
149 | return -ENOMEM; | ||
150 | } | ||
151 | |||
152 | logibm_dev->name = "Logitech bus mouse"; | ||
153 | logibm_dev->phys = "isa023c/input0"; | ||
154 | logibm_dev->id.bustype = BUS_ISA; | ||
155 | logibm_dev->id.vendor = 0x0003; | ||
156 | logibm_dev->id.product = 0x0001; | ||
157 | logibm_dev->id.version = 0x0100; | ||
158 | |||
159 | logibm_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REL); | ||
160 | logibm_dev->keybit[LONG(BTN_LEFT)] = BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | BIT(BTN_RIGHT); | ||
161 | logibm_dev->relbit[0] = BIT(REL_X) | BIT(REL_Y); | ||
162 | |||
163 | logibm_dev->open = logibm_open; | ||
164 | logibm_dev->close = logibm_close; | ||
163 | 165 | ||
164 | printk(KERN_INFO "input: Logitech bus mouse at %#x irq %d\n", LOGIBM_BASE, logibm_irq); | 166 | input_register_device(logibm_dev); |
165 | 167 | ||
166 | return 0; | 168 | return 0; |
167 | } | 169 | } |
168 | 170 | ||
169 | static void __exit logibm_exit(void) | 171 | static void __exit logibm_exit(void) |
170 | { | 172 | { |
171 | input_unregister_device(&logibm_dev); | 173 | input_unregister_device(logibm_dev); |
172 | release_region(LOGIBM_BASE, LOGIBM_EXTENT); | 174 | release_region(LOGIBM_BASE, LOGIBM_EXTENT); |
173 | } | 175 | } |
174 | 176 | ||
diff --git a/drivers/input/mouse/logips2pp.c b/drivers/input/mouse/logips2pp.c index 7df96525222e..0f69ff46c1ae 100644 --- a/drivers/input/mouse/logips2pp.c +++ b/drivers/input/mouse/logips2pp.c | |||
@@ -40,7 +40,7 @@ struct ps2pp_info { | |||
40 | 40 | ||
41 | static psmouse_ret_t ps2pp_process_byte(struct psmouse *psmouse, struct pt_regs *regs) | 41 | static psmouse_ret_t ps2pp_process_byte(struct psmouse *psmouse, struct pt_regs *regs) |
42 | { | 42 | { |
43 | struct input_dev *dev = &psmouse->dev; | 43 | struct input_dev *dev = psmouse->dev; |
44 | unsigned char *packet = psmouse->packet; | 44 | unsigned char *packet = psmouse->packet; |
45 | 45 | ||
46 | if (psmouse->pktcnt < 3) | 46 | if (psmouse->pktcnt < 3) |
@@ -257,25 +257,27 @@ static struct ps2pp_info *get_model_info(unsigned char model) | |||
257 | static void ps2pp_set_model_properties(struct psmouse *psmouse, struct ps2pp_info *model_info, | 257 | static void ps2pp_set_model_properties(struct psmouse *psmouse, struct ps2pp_info *model_info, |
258 | int using_ps2pp) | 258 | int using_ps2pp) |
259 | { | 259 | { |
260 | struct input_dev *input_dev = psmouse->dev; | ||
261 | |||
260 | if (model_info->features & PS2PP_SIDE_BTN) | 262 | if (model_info->features & PS2PP_SIDE_BTN) |
261 | set_bit(BTN_SIDE, psmouse->dev.keybit); | 263 | set_bit(BTN_SIDE, input_dev->keybit); |
262 | 264 | ||
263 | if (model_info->features & PS2PP_EXTRA_BTN) | 265 | if (model_info->features & PS2PP_EXTRA_BTN) |
264 | set_bit(BTN_EXTRA, psmouse->dev.keybit); | 266 | set_bit(BTN_EXTRA, input_dev->keybit); |
265 | 267 | ||
266 | if (model_info->features & PS2PP_TASK_BTN) | 268 | if (model_info->features & PS2PP_TASK_BTN) |
267 | set_bit(BTN_TASK, psmouse->dev.keybit); | 269 | set_bit(BTN_TASK, input_dev->keybit); |
268 | 270 | ||
269 | if (model_info->features & PS2PP_NAV_BTN) { | 271 | if (model_info->features & PS2PP_NAV_BTN) { |
270 | set_bit(BTN_FORWARD, psmouse->dev.keybit); | 272 | set_bit(BTN_FORWARD, input_dev->keybit); |
271 | set_bit(BTN_BACK, psmouse->dev.keybit); | 273 | set_bit(BTN_BACK, input_dev->keybit); |
272 | } | 274 | } |
273 | 275 | ||
274 | if (model_info->features & PS2PP_WHEEL) | 276 | if (model_info->features & PS2PP_WHEEL) |
275 | set_bit(REL_WHEEL, psmouse->dev.relbit); | 277 | set_bit(REL_WHEEL, input_dev->relbit); |
276 | 278 | ||
277 | if (model_info->features & PS2PP_HWHEEL) | 279 | if (model_info->features & PS2PP_HWHEEL) |
278 | set_bit(REL_HWHEEL, psmouse->dev.relbit); | 280 | set_bit(REL_HWHEEL, input_dev->relbit); |
279 | 281 | ||
280 | switch (model_info->kind) { | 282 | switch (model_info->kind) { |
281 | case PS2PP_KIND_WHEEL: | 283 | case PS2PP_KIND_WHEEL: |
@@ -387,7 +389,7 @@ int ps2pp_init(struct psmouse *psmouse, int set_properties) | |||
387 | } | 389 | } |
388 | 390 | ||
389 | if (buttons < 3) | 391 | if (buttons < 3) |
390 | clear_bit(BTN_MIDDLE, psmouse->dev.keybit); | 392 | clear_bit(BTN_MIDDLE, psmouse->dev->keybit); |
391 | 393 | ||
392 | if (model_info) | 394 | if (model_info) |
393 | ps2pp_set_model_properties(psmouse, model_info, use_ps2pp); | 395 | ps2pp_set_model_properties(psmouse, model_info, use_ps2pp); |
diff --git a/drivers/input/mouse/maplemouse.c b/drivers/input/mouse/maplemouse.c index e90c60cbbf05..b5b34fe4fee8 100644 --- a/drivers/input/mouse/maplemouse.c +++ b/drivers/input/mouse/maplemouse.c | |||
@@ -41,13 +41,12 @@ static int dc_mouse_connect(struct maple_device *dev) | |||
41 | unsigned long data = be32_to_cpu(dev->devinfo.function_data[0]); | 41 | unsigned long data = be32_to_cpu(dev->devinfo.function_data[0]); |
42 | struct input_dev *input_dev; | 42 | struct input_dev *input_dev; |
43 | 43 | ||
44 | if (!(input_dev = kmalloc(sizeof(struct input_dev), GFP_KERNEL))) | 44 | dev->private_data = input_dev = input_allocate_device(); |
45 | return -1; | 45 | if (!input_dev) |
46 | return -ENOMEM; | ||
46 | 47 | ||
47 | dev->private_data = input_dev; | 48 | dev->private_data = input_dev; |
48 | 49 | ||
49 | memset(input_dev, 0, sizeof(struct dc_mouse)); | ||
50 | init_input_dev(input_dev); | ||
51 | input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REL); | 50 | input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REL); |
52 | input_dev->keybit[LONG(BTN_MOUSE)] = BIT(BTN_LEFT) | BIT(BTN_RIGHT) | BIT(BTN_MIDDLE); | 51 | input_dev->keybit[LONG(BTN_MOUSE)] = BIT(BTN_LEFT) | BIT(BTN_RIGHT) | BIT(BTN_MIDDLE); |
53 | input_dev->relbit[0] = BIT(REL_X) | BIT(REL_Y) | BIT(REL_WHEEL); | 52 | input_dev->relbit[0] = BIT(REL_X) | BIT(REL_Y) | BIT(REL_WHEEL); |
@@ -59,8 +58,6 @@ static int dc_mouse_connect(struct maple_device *dev) | |||
59 | 58 | ||
60 | maple_getcond_callback(dev, dc_mouse_callback, 1, MAPLE_FUNC_MOUSE); | 59 | maple_getcond_callback(dev, dc_mouse_callback, 1, MAPLE_FUNC_MOUSE); |
61 | 60 | ||
62 | printk(KERN_INFO "input: mouse(0x%lx): %s\n", data, input_dev->name); | ||
63 | |||
64 | return 0; | 61 | return 0; |
65 | } | 62 | } |
66 | 63 | ||
@@ -70,7 +67,6 @@ static void dc_mouse_disconnect(struct maple_device *dev) | |||
70 | struct input_dev *input_dev = dev->private_data; | 67 | struct input_dev *input_dev = dev->private_data; |
71 | 68 | ||
72 | input_unregister_device(input_dev); | 69 | input_unregister_device(input_dev); |
73 | kfree(input_dev); | ||
74 | } | 70 | } |
75 | 71 | ||
76 | 72 | ||
diff --git a/drivers/input/mouse/pc110pad.c b/drivers/input/mouse/pc110pad.c index 93393d5c0078..d284ea712151 100644 --- a/drivers/input/mouse/pc110pad.c +++ b/drivers/input/mouse/pc110pad.c | |||
@@ -53,13 +53,10 @@ MODULE_LICENSE("GPL"); | |||
53 | static int pc110pad_irq = 10; | 53 | static int pc110pad_irq = 10; |
54 | static int pc110pad_io = 0x15e0; | 54 | static int pc110pad_io = 0x15e0; |
55 | 55 | ||
56 | static struct input_dev pc110pad_dev; | 56 | static struct input_dev *pc110pad_dev; |
57 | static int pc110pad_data[3]; | 57 | static int pc110pad_data[3]; |
58 | static int pc110pad_count; | 58 | static int pc110pad_count; |
59 | 59 | ||
60 | static char *pc110pad_name = "IBM PC110 TouchPad"; | ||
61 | static char *pc110pad_phys = "isa15e0/input0"; | ||
62 | |||
63 | static irqreturn_t pc110pad_interrupt(int irq, void *ptr, struct pt_regs *regs) | 60 | static irqreturn_t pc110pad_interrupt(int irq, void *ptr, struct pt_regs *regs) |
64 | { | 61 | { |
65 | int value = inb_p(pc110pad_io); | 62 | int value = inb_p(pc110pad_io); |
@@ -74,14 +71,14 @@ static irqreturn_t pc110pad_interrupt(int irq, void *ptr, struct pt_regs *regs) | |||
74 | if (pc110pad_count < 3) | 71 | if (pc110pad_count < 3) |
75 | return IRQ_HANDLED; | 72 | return IRQ_HANDLED; |
76 | 73 | ||
77 | input_regs(&pc110pad_dev, regs); | 74 | input_regs(pc110pad_dev, regs); |
78 | input_report_key(&pc110pad_dev, BTN_TOUCH, | 75 | input_report_key(pc110pad_dev, BTN_TOUCH, |
79 | pc110pad_data[0] & 0x01); | 76 | pc110pad_data[0] & 0x01); |
80 | input_report_abs(&pc110pad_dev, ABS_X, | 77 | input_report_abs(pc110pad_dev, ABS_X, |
81 | pc110pad_data[1] | ((pc110pad_data[0] << 3) & 0x80) | ((pc110pad_data[0] << 1) & 0x100)); | 78 | pc110pad_data[1] | ((pc110pad_data[0] << 3) & 0x80) | ((pc110pad_data[0] << 1) & 0x100)); |
82 | input_report_abs(&pc110pad_dev, ABS_Y, | 79 | input_report_abs(pc110pad_dev, ABS_Y, |
83 | pc110pad_data[2] | ((pc110pad_data[0] << 4) & 0x80)); | 80 | pc110pad_data[2] | ((pc110pad_data[0] << 4) & 0x80)); |
84 | input_sync(&pc110pad_dev); | 81 | input_sync(pc110pad_dev); |
85 | 82 | ||
86 | pc110pad_count = 0; | 83 | pc110pad_count = 0; |
87 | return IRQ_HANDLED; | 84 | return IRQ_HANDLED; |
@@ -94,9 +91,9 @@ static void pc110pad_close(struct input_dev *dev) | |||
94 | 91 | ||
95 | static int pc110pad_open(struct input_dev *dev) | 92 | static int pc110pad_open(struct input_dev *dev) |
96 | { | 93 | { |
97 | pc110pad_interrupt(0,NULL,NULL); | 94 | pc110pad_interrupt(0, NULL, NULL); |
98 | pc110pad_interrupt(0,NULL,NULL); | 95 | pc110pad_interrupt(0, NULL, NULL); |
99 | pc110pad_interrupt(0,NULL,NULL); | 96 | pc110pad_interrupt(0, NULL, NULL); |
100 | outb(PC110PAD_ON, pc110pad_io + 2); | 97 | outb(PC110PAD_ON, pc110pad_io + 2); |
101 | pc110pad_count = 0; | 98 | pc110pad_count = 0; |
102 | 99 | ||
@@ -127,45 +124,46 @@ static int __init pc110pad_init(void) | |||
127 | 124 | ||
128 | outb(PC110PAD_OFF, pc110pad_io + 2); | 125 | outb(PC110PAD_OFF, pc110pad_io + 2); |
129 | 126 | ||
130 | if (request_irq(pc110pad_irq, pc110pad_interrupt, 0, "pc110pad", NULL)) | 127 | if (request_irq(pc110pad_irq, pc110pad_interrupt, 0, "pc110pad", NULL)) { |
131 | { | ||
132 | release_region(pc110pad_io, 4); | 128 | release_region(pc110pad_io, 4); |
133 | printk(KERN_ERR "pc110pad: Unable to get irq %d.\n", pc110pad_irq); | 129 | printk(KERN_ERR "pc110pad: Unable to get irq %d.\n", pc110pad_irq); |
134 | return -EBUSY; | 130 | return -EBUSY; |
135 | } | 131 | } |
136 | 132 | ||
137 | pc110pad_dev.evbit[0] = BIT(EV_KEY) | BIT(EV_ABS); | 133 | if (!(pc110pad_dev = input_allocate_device())) { |
138 | pc110pad_dev.absbit[0] = BIT(ABS_X) | BIT(ABS_Y); | 134 | free_irq(pc110pad_irq, NULL); |
139 | pc110pad_dev.keybit[LONG(BTN_TOUCH)] = BIT(BTN_TOUCH); | 135 | release_region(pc110pad_io, 4); |
136 | printk(KERN_ERR "pc110pad: Not enough memory.\n"); | ||
137 | return -ENOMEM; | ||
138 | } | ||
140 | 139 | ||
141 | pc110pad_dev.absmax[ABS_X] = 0x1ff; | 140 | pc110pad_dev->name = "IBM PC110 TouchPad"; |
142 | pc110pad_dev.absmax[ABS_Y] = 0x0ff; | 141 | pc110pad_dev->phys = "isa15e0/input0"; |
142 | pc110pad_dev->id.bustype = BUS_ISA; | ||
143 | pc110pad_dev->id.vendor = 0x0003; | ||
144 | pc110pad_dev->id.product = 0x0001; | ||
145 | pc110pad_dev->id.version = 0x0100; | ||
143 | 146 | ||
144 | pc110pad_dev.open = pc110pad_open; | 147 | pc110pad_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_ABS); |
145 | pc110pad_dev.close = pc110pad_close; | 148 | pc110pad_dev->absbit[0] = BIT(ABS_X) | BIT(ABS_Y); |
149 | pc110pad_dev->keybit[LONG(BTN_TOUCH)] = BIT(BTN_TOUCH); | ||
146 | 150 | ||
147 | pc110pad_dev.name = pc110pad_name; | 151 | pc110pad_dev->absmax[ABS_X] = 0x1ff; |
148 | pc110pad_dev.phys = pc110pad_phys; | 152 | pc110pad_dev->absmax[ABS_Y] = 0x0ff; |
149 | pc110pad_dev.id.bustype = BUS_ISA; | ||
150 | pc110pad_dev.id.vendor = 0x0003; | ||
151 | pc110pad_dev.id.product = 0x0001; | ||
152 | pc110pad_dev.id.version = 0x0100; | ||
153 | 153 | ||
154 | input_register_device(&pc110pad_dev); | 154 | pc110pad_dev->open = pc110pad_open; |
155 | pc110pad_dev->close = pc110pad_close; | ||
155 | 156 | ||
156 | printk(KERN_INFO "input: %s at %#x irq %d\n", | 157 | input_register_device(pc110pad_dev); |
157 | pc110pad_name, pc110pad_io, pc110pad_irq); | ||
158 | 158 | ||
159 | return 0; | 159 | return 0; |
160 | } | 160 | } |
161 | 161 | ||
162 | static void __exit pc110pad_exit(void) | 162 | static void __exit pc110pad_exit(void) |
163 | { | 163 | { |
164 | input_unregister_device(&pc110pad_dev); | ||
165 | |||
166 | outb(PC110PAD_OFF, pc110pad_io + 2); | 164 | outb(PC110PAD_OFF, pc110pad_io + 2); |
167 | |||
168 | free_irq(pc110pad_irq, NULL); | 165 | free_irq(pc110pad_irq, NULL); |
166 | input_unregister_device(pc110pad_dev); | ||
169 | release_region(pc110pad_io, 4); | 167 | release_region(pc110pad_io, 4); |
170 | } | 168 | } |
171 | 169 | ||
diff --git a/drivers/input/mouse/psmouse-base.c b/drivers/input/mouse/psmouse-base.c index af24313ff5bb..6ee9999a2eaa 100644 --- a/drivers/input/mouse/psmouse-base.c +++ b/drivers/input/mouse/psmouse-base.c | |||
@@ -114,7 +114,7 @@ struct psmouse_protocol { | |||
114 | 114 | ||
115 | static psmouse_ret_t psmouse_process_byte(struct psmouse *psmouse, struct pt_regs *regs) | 115 | static psmouse_ret_t psmouse_process_byte(struct psmouse *psmouse, struct pt_regs *regs) |
116 | { | 116 | { |
117 | struct input_dev *dev = &psmouse->dev; | 117 | struct input_dev *dev = psmouse->dev; |
118 | unsigned char *packet = psmouse->packet; | 118 | unsigned char *packet = psmouse->packet; |
119 | 119 | ||
120 | if (psmouse->pktcnt < psmouse->pktsize) | 120 | if (psmouse->pktcnt < psmouse->pktsize) |
@@ -333,12 +333,11 @@ static int genius_detect(struct psmouse *psmouse, int set_properties) | |||
333 | return -1; | 333 | return -1; |
334 | 334 | ||
335 | if (set_properties) { | 335 | if (set_properties) { |
336 | set_bit(BTN_EXTRA, psmouse->dev.keybit); | 336 | set_bit(BTN_EXTRA, psmouse->dev->keybit); |
337 | set_bit(BTN_SIDE, psmouse->dev.keybit); | 337 | set_bit(BTN_SIDE, psmouse->dev->keybit); |
338 | set_bit(REL_WHEEL, psmouse->dev.relbit); | 338 | set_bit(REL_WHEEL, psmouse->dev->relbit); |
339 | 339 | ||
340 | psmouse->vendor = "Genius"; | 340 | psmouse->vendor = "Genius"; |
341 | psmouse->name = "Wheel Mouse"; | ||
342 | psmouse->pktsize = 4; | 341 | psmouse->pktsize = 4; |
343 | } | 342 | } |
344 | 343 | ||
@@ -365,8 +364,8 @@ static int intellimouse_detect(struct psmouse *psmouse, int set_properties) | |||
365 | return -1; | 364 | return -1; |
366 | 365 | ||
367 | if (set_properties) { | 366 | if (set_properties) { |
368 | set_bit(BTN_MIDDLE, psmouse->dev.keybit); | 367 | set_bit(BTN_MIDDLE, psmouse->dev->keybit); |
369 | set_bit(REL_WHEEL, psmouse->dev.relbit); | 368 | set_bit(REL_WHEEL, psmouse->dev->relbit); |
370 | 369 | ||
371 | if (!psmouse->vendor) psmouse->vendor = "Generic"; | 370 | if (!psmouse->vendor) psmouse->vendor = "Generic"; |
372 | if (!psmouse->name) psmouse->name = "Wheel Mouse"; | 371 | if (!psmouse->name) psmouse->name = "Wheel Mouse"; |
@@ -398,10 +397,10 @@ static int im_explorer_detect(struct psmouse *psmouse, int set_properties) | |||
398 | return -1; | 397 | return -1; |
399 | 398 | ||
400 | if (set_properties) { | 399 | if (set_properties) { |
401 | set_bit(BTN_MIDDLE, psmouse->dev.keybit); | 400 | set_bit(BTN_MIDDLE, psmouse->dev->keybit); |
402 | set_bit(REL_WHEEL, psmouse->dev.relbit); | 401 | set_bit(REL_WHEEL, psmouse->dev->relbit); |
403 | set_bit(BTN_SIDE, psmouse->dev.keybit); | 402 | set_bit(BTN_SIDE, psmouse->dev->keybit); |
404 | set_bit(BTN_EXTRA, psmouse->dev.keybit); | 403 | set_bit(BTN_EXTRA, psmouse->dev->keybit); |
405 | 404 | ||
406 | if (!psmouse->vendor) psmouse->vendor = "Generic"; | 405 | if (!psmouse->vendor) psmouse->vendor = "Generic"; |
407 | if (!psmouse->name) psmouse->name = "Explorer Mouse"; | 406 | if (!psmouse->name) psmouse->name = "Explorer Mouse"; |
@@ -433,7 +432,7 @@ static int thinking_detect(struct psmouse *psmouse, int set_properties) | |||
433 | return -1; | 432 | return -1; |
434 | 433 | ||
435 | if (set_properties) { | 434 | if (set_properties) { |
436 | set_bit(BTN_EXTRA, psmouse->dev.keybit); | 435 | set_bit(BTN_EXTRA, psmouse->dev->keybit); |
437 | 436 | ||
438 | psmouse->vendor = "Kensington"; | 437 | psmouse->vendor = "Kensington"; |
439 | psmouse->name = "ThinkingMouse"; | 438 | psmouse->name = "ThinkingMouse"; |
@@ -839,9 +838,9 @@ static void psmouse_disconnect(struct serio *serio) | |||
839 | 838 | ||
840 | psmouse_set_state(psmouse, PSMOUSE_IGNORE); | 839 | psmouse_set_state(psmouse, PSMOUSE_IGNORE); |
841 | 840 | ||
842 | input_unregister_device(&psmouse->dev); | ||
843 | serio_close(serio); | 841 | serio_close(serio); |
844 | serio_set_drvdata(serio, NULL); | 842 | serio_set_drvdata(serio, NULL); |
843 | input_unregister_device(psmouse->dev); | ||
845 | kfree(psmouse); | 844 | kfree(psmouse); |
846 | 845 | ||
847 | if (parent) | 846 | if (parent) |
@@ -852,16 +851,14 @@ static void psmouse_disconnect(struct serio *serio) | |||
852 | 851 | ||
853 | static int psmouse_switch_protocol(struct psmouse *psmouse, struct psmouse_protocol *proto) | 852 | static int psmouse_switch_protocol(struct psmouse *psmouse, struct psmouse_protocol *proto) |
854 | { | 853 | { |
855 | memset(&psmouse->dev, 0, sizeof(struct input_dev)); | 854 | struct input_dev *input_dev = psmouse->dev; |
856 | 855 | ||
857 | init_input_dev(&psmouse->dev); | 856 | input_dev->private = psmouse; |
857 | input_dev->cdev.dev = &psmouse->ps2dev.serio->dev; | ||
858 | 858 | ||
859 | psmouse->dev.private = psmouse; | 859 | input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REL); |
860 | psmouse->dev.dev = &psmouse->ps2dev.serio->dev; | 860 | input_dev->keybit[LONG(BTN_MOUSE)] = BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | BIT(BTN_RIGHT); |
861 | 861 | input_dev->relbit[0] = BIT(REL_X) | BIT(REL_Y); | |
862 | psmouse->dev.evbit[0] = BIT(EV_KEY) | BIT(EV_REL); | ||
863 | psmouse->dev.keybit[LONG(BTN_MOUSE)] = BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | BIT(BTN_RIGHT); | ||
864 | psmouse->dev.relbit[0] = BIT(REL_X) | BIT(REL_Y); | ||
865 | 862 | ||
866 | psmouse->set_rate = psmouse_set_rate; | 863 | psmouse->set_rate = psmouse_set_rate; |
867 | psmouse->set_resolution = psmouse_set_resolution; | 864 | psmouse->set_resolution = psmouse_set_resolution; |
@@ -883,12 +880,12 @@ static int psmouse_switch_protocol(struct psmouse *psmouse, struct psmouse_proto | |||
883 | sprintf(psmouse->devname, "%s %s %s", | 880 | sprintf(psmouse->devname, "%s %s %s", |
884 | psmouse_protocol_by_type(psmouse->type)->name, psmouse->vendor, psmouse->name); | 881 | psmouse_protocol_by_type(psmouse->type)->name, psmouse->vendor, psmouse->name); |
885 | 882 | ||
886 | psmouse->dev.name = psmouse->devname; | 883 | input_dev->name = psmouse->devname; |
887 | psmouse->dev.phys = psmouse->phys; | 884 | input_dev->phys = psmouse->phys; |
888 | psmouse->dev.id.bustype = BUS_I8042; | 885 | input_dev->id.bustype = BUS_I8042; |
889 | psmouse->dev.id.vendor = 0x0002; | 886 | input_dev->id.vendor = 0x0002; |
890 | psmouse->dev.id.product = psmouse->type; | 887 | input_dev->id.product = psmouse->type; |
891 | psmouse->dev.id.version = psmouse->model; | 888 | input_dev->id.version = psmouse->model; |
892 | 889 | ||
893 | return 0; | 890 | return 0; |
894 | } | 891 | } |
@@ -900,7 +897,8 @@ static int psmouse_switch_protocol(struct psmouse *psmouse, struct psmouse_proto | |||
900 | static int psmouse_connect(struct serio *serio, struct serio_driver *drv) | 897 | static int psmouse_connect(struct serio *serio, struct serio_driver *drv) |
901 | { | 898 | { |
902 | struct psmouse *psmouse, *parent = NULL; | 899 | struct psmouse *psmouse, *parent = NULL; |
903 | int retval; | 900 | struct input_dev *input_dev; |
901 | int retval = -ENOMEM; | ||
904 | 902 | ||
905 | down(&psmouse_sem); | 903 | down(&psmouse_sem); |
906 | 904 | ||
@@ -913,12 +911,13 @@ static int psmouse_connect(struct serio *serio, struct serio_driver *drv) | |||
913 | psmouse_deactivate(parent); | 911 | psmouse_deactivate(parent); |
914 | } | 912 | } |
915 | 913 | ||
916 | if (!(psmouse = kzalloc(sizeof(struct psmouse), GFP_KERNEL))) { | 914 | psmouse = kzalloc(sizeof(struct psmouse), GFP_KERNEL); |
917 | retval = -ENOMEM; | 915 | input_dev = input_allocate_device(); |
916 | if (!psmouse || !input_dev) | ||
918 | goto out; | 917 | goto out; |
919 | } | ||
920 | 918 | ||
921 | ps2_init(&psmouse->ps2dev, serio); | 919 | ps2_init(&psmouse->ps2dev, serio); |
920 | psmouse->dev = input_dev; | ||
922 | sprintf(psmouse->phys, "%s/input0", serio->phys); | 921 | sprintf(psmouse->phys, "%s/input0", serio->phys); |
923 | 922 | ||
924 | psmouse_set_state(psmouse, PSMOUSE_INITIALIZING); | 923 | psmouse_set_state(psmouse, PSMOUSE_INITIALIZING); |
@@ -926,16 +925,11 @@ static int psmouse_connect(struct serio *serio, struct serio_driver *drv) | |||
926 | serio_set_drvdata(serio, psmouse); | 925 | serio_set_drvdata(serio, psmouse); |
927 | 926 | ||
928 | retval = serio_open(serio, drv); | 927 | retval = serio_open(serio, drv); |
929 | if (retval) { | 928 | if (retval) |
930 | serio_set_drvdata(serio, NULL); | ||
931 | kfree(psmouse); | ||
932 | goto out; | 929 | goto out; |
933 | } | ||
934 | 930 | ||
935 | if (psmouse_probe(psmouse) < 0) { | 931 | if (psmouse_probe(psmouse) < 0) { |
936 | serio_close(serio); | 932 | serio_close(serio); |
937 | serio_set_drvdata(serio, NULL); | ||
938 | kfree(psmouse); | ||
939 | retval = -ENODEV; | 933 | retval = -ENODEV; |
940 | goto out; | 934 | goto out; |
941 | } | 935 | } |
@@ -947,13 +941,11 @@ static int psmouse_connect(struct serio *serio, struct serio_driver *drv) | |||
947 | 941 | ||
948 | psmouse_switch_protocol(psmouse, NULL); | 942 | psmouse_switch_protocol(psmouse, NULL); |
949 | 943 | ||
950 | input_register_device(&psmouse->dev); | ||
951 | printk(KERN_INFO "input: %s on %s\n", psmouse->devname, serio->phys); | ||
952 | |||
953 | psmouse_set_state(psmouse, PSMOUSE_CMD_MODE); | 944 | psmouse_set_state(psmouse, PSMOUSE_CMD_MODE); |
954 | |||
955 | psmouse_initialize(psmouse); | 945 | psmouse_initialize(psmouse); |
956 | 946 | ||
947 | input_register_device(psmouse->dev); | ||
948 | |||
957 | if (parent && parent->pt_activate) | 949 | if (parent && parent->pt_activate) |
958 | parent->pt_activate(parent); | 950 | parent->pt_activate(parent); |
959 | 951 | ||
@@ -964,6 +956,12 @@ static int psmouse_connect(struct serio *serio, struct serio_driver *drv) | |||
964 | retval = 0; | 956 | retval = 0; |
965 | 957 | ||
966 | out: | 958 | out: |
959 | if (retval) { | ||
960 | serio_set_drvdata(serio, NULL); | ||
961 | input_free_device(input_dev); | ||
962 | kfree(psmouse); | ||
963 | } | ||
964 | |||
967 | /* If this is a pass-through port the parent needs to be re-activated */ | 965 | /* If this is a pass-through port the parent needs to be re-activated */ |
968 | if (parent) | 966 | if (parent) |
969 | psmouse_activate(parent); | 967 | psmouse_activate(parent); |
@@ -1161,6 +1159,7 @@ static ssize_t psmouse_attr_set_protocol(struct psmouse *psmouse, void *data, co | |||
1161 | { | 1159 | { |
1162 | struct serio *serio = psmouse->ps2dev.serio; | 1160 | struct serio *serio = psmouse->ps2dev.serio; |
1163 | struct psmouse *parent = NULL; | 1161 | struct psmouse *parent = NULL; |
1162 | struct input_dev *new_dev; | ||
1164 | struct psmouse_protocol *proto; | 1163 | struct psmouse_protocol *proto; |
1165 | int retry = 0; | 1164 | int retry = 0; |
1166 | 1165 | ||
@@ -1170,9 +1169,13 @@ static ssize_t psmouse_attr_set_protocol(struct psmouse *psmouse, void *data, co | |||
1170 | if (psmouse->type == proto->type) | 1169 | if (psmouse->type == proto->type) |
1171 | return count; | 1170 | return count; |
1172 | 1171 | ||
1172 | if (!(new_dev = input_allocate_device())) | ||
1173 | return -ENOMEM; | ||
1174 | |||
1173 | while (serio->child) { | 1175 | while (serio->child) { |
1174 | if (++retry > 3) { | 1176 | if (++retry > 3) { |
1175 | printk(KERN_WARNING "psmouse: failed to destroy child port, protocol change aborted.\n"); | 1177 | printk(KERN_WARNING "psmouse: failed to destroy child port, protocol change aborted.\n"); |
1178 | input_free_device(new_dev); | ||
1176 | return -EIO; | 1179 | return -EIO; |
1177 | } | 1180 | } |
1178 | 1181 | ||
@@ -1182,11 +1185,15 @@ static ssize_t psmouse_attr_set_protocol(struct psmouse *psmouse, void *data, co | |||
1182 | serio_pin_driver_uninterruptible(serio); | 1185 | serio_pin_driver_uninterruptible(serio); |
1183 | down(&psmouse_sem); | 1186 | down(&psmouse_sem); |
1184 | 1187 | ||
1185 | if (serio->drv != &psmouse_drv) | 1188 | if (serio->drv != &psmouse_drv) { |
1189 | input_free_device(new_dev); | ||
1186 | return -ENODEV; | 1190 | return -ENODEV; |
1191 | } | ||
1187 | 1192 | ||
1188 | if (psmouse->type == proto->type) | 1193 | if (psmouse->type == proto->type) { |
1194 | input_free_device(new_dev); | ||
1189 | return count; /* switched by other thread */ | 1195 | return count; /* switched by other thread */ |
1196 | } | ||
1190 | } | 1197 | } |
1191 | 1198 | ||
1192 | if (serio->parent && serio->id.type == SERIO_PS_PSTHRU) { | 1199 | if (serio->parent && serio->id.type == SERIO_PS_PSTHRU) { |
@@ -1199,8 +1206,9 @@ static ssize_t psmouse_attr_set_protocol(struct psmouse *psmouse, void *data, co | |||
1199 | psmouse->disconnect(psmouse); | 1206 | psmouse->disconnect(psmouse); |
1200 | 1207 | ||
1201 | psmouse_set_state(psmouse, PSMOUSE_IGNORE); | 1208 | psmouse_set_state(psmouse, PSMOUSE_IGNORE); |
1202 | input_unregister_device(&psmouse->dev); | 1209 | input_unregister_device(psmouse->dev); |
1203 | 1210 | ||
1211 | psmouse->dev = new_dev; | ||
1204 | psmouse_set_state(psmouse, PSMOUSE_INITIALIZING); | 1212 | psmouse_set_state(psmouse, PSMOUSE_INITIALIZING); |
1205 | 1213 | ||
1206 | if (psmouse_switch_protocol(psmouse, proto) < 0) { | 1214 | if (psmouse_switch_protocol(psmouse, proto) < 0) { |
@@ -1212,8 +1220,7 @@ static ssize_t psmouse_attr_set_protocol(struct psmouse *psmouse, void *data, co | |||
1212 | psmouse_initialize(psmouse); | 1220 | psmouse_initialize(psmouse); |
1213 | psmouse_set_state(psmouse, PSMOUSE_CMD_MODE); | 1221 | psmouse_set_state(psmouse, PSMOUSE_CMD_MODE); |
1214 | 1222 | ||
1215 | input_register_device(&psmouse->dev); | 1223 | input_register_device(psmouse->dev); |
1216 | printk(KERN_INFO "input: %s on %s\n", psmouse->devname, serio->phys); | ||
1217 | 1224 | ||
1218 | if (parent && parent->pt_activate) | 1225 | if (parent && parent->pt_activate) |
1219 | parent->pt_activate(parent); | 1226 | parent->pt_activate(parent); |
diff --git a/drivers/input/mouse/psmouse.h b/drivers/input/mouse/psmouse.h index 45d2bd774f00..7c4192bd1279 100644 --- a/drivers/input/mouse/psmouse.h +++ b/drivers/input/mouse/psmouse.h | |||
@@ -36,7 +36,7 @@ typedef enum { | |||
36 | 36 | ||
37 | struct psmouse { | 37 | struct psmouse { |
38 | void *private; | 38 | void *private; |
39 | struct input_dev dev; | 39 | struct input_dev *dev; |
40 | struct ps2dev ps2dev; | 40 | struct ps2dev ps2dev; |
41 | char *vendor; | 41 | char *vendor; |
42 | char *name; | 42 | char *name; |
diff --git a/drivers/input/mouse/rpcmouse.c b/drivers/input/mouse/rpcmouse.c index 8fe1212b8fd7..09b6ffdb7582 100644 --- a/drivers/input/mouse/rpcmouse.c +++ b/drivers/input/mouse/rpcmouse.c | |||
@@ -34,20 +34,7 @@ MODULE_DESCRIPTION("Acorn RiscPC mouse driver"); | |||
34 | MODULE_LICENSE("GPL"); | 34 | MODULE_LICENSE("GPL"); |
35 | 35 | ||
36 | static short rpcmouse_lastx, rpcmouse_lasty; | 36 | static short rpcmouse_lastx, rpcmouse_lasty; |
37 | 37 | static struct input_dev *rpcmouse_dev; | |
38 | static struct input_dev rpcmouse_dev = { | ||
39 | .evbit = { BIT(EV_KEY) | BIT(EV_REL) }, | ||
40 | .keybit = { [LONG(BTN_LEFT)] = BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | BIT(BTN_RIGHT) }, | ||
41 | .relbit = { BIT(REL_X) | BIT(REL_Y) }, | ||
42 | .name = "Acorn RiscPC Mouse", | ||
43 | .phys = "rpcmouse/input0", | ||
44 | .id = { | ||
45 | .bustype = BUS_HOST, | ||
46 | .vendor = 0x0005, | ||
47 | .product = 0x0001, | ||
48 | .version = 0x0100, | ||
49 | }, | ||
50 | }; | ||
51 | 38 | ||
52 | static irqreturn_t rpcmouse_irq(int irq, void *dev_id, struct pt_regs *regs) | 39 | static irqreturn_t rpcmouse_irq(int irq, void *dev_id, struct pt_regs *regs) |
53 | { | 40 | { |
@@ -78,29 +65,41 @@ static irqreturn_t rpcmouse_irq(int irq, void *dev_id, struct pt_regs *regs) | |||
78 | return IRQ_HANDLED; | 65 | return IRQ_HANDLED; |
79 | } | 66 | } |
80 | 67 | ||
68 | |||
81 | static int __init rpcmouse_init(void) | 69 | static int __init rpcmouse_init(void) |
82 | { | 70 | { |
83 | init_input_dev(&rpcmouse_dev); | 71 | if (!(rpcmouse_dev = input_allocate_device())) |
72 | return -ENOMEM; | ||
73 | |||
74 | rpcmouse_dev->name = "Acorn RiscPC Mouse"; | ||
75 | rpcmouse_dev->phys = "rpcmouse/input0"; | ||
76 | rpcmouse_dev->id.bustype = BUS_HOST; | ||
77 | rpcmouse_dev->id.vendor = 0x0005; | ||
78 | rpcmouse_dev->id.product = 0x0001; | ||
79 | rpcmouse_dev->id.version = 0x0100; | ||
80 | |||
81 | rpcmouse_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REL); | ||
82 | rpcmouse_dev->keybit[LONG(BTN_LEFT)] = BIT(BTN_LEFT) | BIT(BTN_MIDDLE) | BIT(BTN_RIGHT); | ||
83 | rpcmouse_dev->relbit[0] = BIT(REL_X) | BIT(REL_Y); | ||
84 | 84 | ||
85 | rpcmouse_lastx = (short) iomd_readl(IOMD_MOUSEX); | 85 | rpcmouse_lastx = (short) iomd_readl(IOMD_MOUSEX); |
86 | rpcmouse_lasty = (short) iomd_readl(IOMD_MOUSEY); | 86 | rpcmouse_lasty = (short) iomd_readl(IOMD_MOUSEY); |
87 | 87 | ||
88 | if (request_irq(IRQ_VSYNCPULSE, rpcmouse_irq, SA_SHIRQ, "rpcmouse", &rpcmouse_dev)) { | 88 | if (request_irq(IRQ_VSYNCPULSE, rpcmouse_irq, SA_SHIRQ, "rpcmouse", rpcmouse_dev)) { |
89 | printk(KERN_ERR "rpcmouse: unable to allocate VSYNC interrupt\n"); | 89 | printk(KERN_ERR "rpcmouse: unable to allocate VSYNC interrupt\n"); |
90 | return -1; | 90 | input_free_device(rpcmouse_dev); |
91 | return -EBUSY; | ||
91 | } | 92 | } |
92 | 93 | ||
93 | input_register_device(&rpcmouse_dev); | 94 | input_register_device(rpcmouse_dev); |
94 | |||
95 | printk(KERN_INFO "input: Acorn RiscPC mouse\n"); | ||
96 | 95 | ||
97 | return 0; | 96 | return 0; |
98 | } | 97 | } |
99 | 98 | ||
100 | static void __exit rpcmouse_exit(void) | 99 | static void __exit rpcmouse_exit(void) |
101 | { | 100 | { |
102 | input_unregister_device(&rpcmouse_dev); | 101 | free_irq(IRQ_VSYNCPULSE, rpcmouse_dev); |
103 | free_irq(IRQ_VSYNCPULSE, &rpcmouse_dev); | 102 | input_unregister_device(rpcmouse_dev); |
104 | } | 103 | } |
105 | 104 | ||
106 | module_init(rpcmouse_init); | 105 | module_init(rpcmouse_init); |
diff --git a/drivers/input/mouse/sermouse.c b/drivers/input/mouse/sermouse.c index d12b93ae3900..4bf584364d28 100644 --- a/drivers/input/mouse/sermouse.c +++ b/drivers/input/mouse/sermouse.c | |||
@@ -48,7 +48,7 @@ static char *sermouse_protocols[] = { "None", "Mouse Systems Mouse", "Sun Mouse" | |||
48 | "Logitech MZ++ Mouse"}; | 48 | "Logitech MZ++ Mouse"}; |
49 | 49 | ||
50 | struct sermouse { | 50 | struct sermouse { |
51 | struct input_dev dev; | 51 | struct input_dev *dev; |
52 | signed char buf[8]; | 52 | signed char buf[8]; |
53 | unsigned char count; | 53 | unsigned char count; |
54 | unsigned char type; | 54 | unsigned char type; |
@@ -64,7 +64,7 @@ struct sermouse { | |||
64 | 64 | ||
65 | static void sermouse_process_msc(struct sermouse *sermouse, signed char data, struct pt_regs *regs) | 65 | static void sermouse_process_msc(struct sermouse *sermouse, signed char data, struct pt_regs *regs) |
66 | { | 66 | { |
67 | struct input_dev *dev = &sermouse->dev; | 67 | struct input_dev *dev = sermouse->dev; |
68 | signed char *buf = sermouse->buf; | 68 | signed char *buf = sermouse->buf; |
69 | 69 | ||
70 | input_regs(dev, regs); | 70 | input_regs(dev, regs); |
@@ -107,7 +107,7 @@ static void sermouse_process_msc(struct sermouse *sermouse, signed char data, st | |||
107 | 107 | ||
108 | static void sermouse_process_ms(struct sermouse *sermouse, signed char data, struct pt_regs *regs) | 108 | static void sermouse_process_ms(struct sermouse *sermouse, signed char data, struct pt_regs *regs) |
109 | { | 109 | { |
110 | struct input_dev *dev = &sermouse->dev; | 110 | struct input_dev *dev = sermouse->dev; |
111 | signed char *buf = sermouse->buf; | 111 | signed char *buf = sermouse->buf; |
112 | 112 | ||
113 | if (data & 0x40) sermouse->count = 0; | 113 | if (data & 0x40) sermouse->count = 0; |
@@ -230,9 +230,9 @@ static void sermouse_disconnect(struct serio *serio) | |||
230 | { | 230 | { |
231 | struct sermouse *sermouse = serio_get_drvdata(serio); | 231 | struct sermouse *sermouse = serio_get_drvdata(serio); |
232 | 232 | ||
233 | input_unregister_device(&sermouse->dev); | ||
234 | serio_close(serio); | 233 | serio_close(serio); |
235 | serio_set_drvdata(serio, NULL); | 234 | serio_set_drvdata(serio, NULL); |
235 | input_unregister_device(sermouse->dev); | ||
236 | kfree(sermouse); | 236 | kfree(sermouse); |
237 | } | 237 | } |
238 | 238 | ||
@@ -244,56 +244,52 @@ static void sermouse_disconnect(struct serio *serio) | |||
244 | static int sermouse_connect(struct serio *serio, struct serio_driver *drv) | 244 | static int sermouse_connect(struct serio *serio, struct serio_driver *drv) |
245 | { | 245 | { |
246 | struct sermouse *sermouse; | 246 | struct sermouse *sermouse; |
247 | unsigned char c; | 247 | struct input_dev *input_dev; |
248 | int err; | 248 | unsigned char c = serio->id.extra; |
249 | int err = -ENOMEM; | ||
249 | 250 | ||
250 | if (!serio->id.proto || serio->id.proto > SERIO_MZPP) | 251 | sermouse = kzalloc(sizeof(struct sermouse), GFP_KERNEL); |
251 | return -ENODEV; | 252 | input_dev = input_allocate_device(); |
252 | 253 | if (!sermouse || !input_dev) | |
253 | if (!(sermouse = kmalloc(sizeof(struct sermouse), GFP_KERNEL))) | 254 | goto fail; |
254 | return -ENOMEM; | ||
255 | |||
256 | memset(sermouse, 0, sizeof(struct sermouse)); | ||
257 | |||
258 | init_input_dev(&sermouse->dev); | ||
259 | sermouse->dev.evbit[0] = BIT(EV_KEY) | BIT(EV_REL); | ||
260 | sermouse->dev.keybit[LONG(BTN_MOUSE)] = BIT(BTN_LEFT) | BIT(BTN_RIGHT); | ||
261 | sermouse->dev.relbit[0] = BIT(REL_X) | BIT(REL_Y); | ||
262 | sermouse->dev.private = sermouse; | ||
263 | |||
264 | sermouse->type = serio->id.proto; | ||
265 | c = serio->id.extra; | ||
266 | |||
267 | if (c & 0x01) set_bit(BTN_MIDDLE, sermouse->dev.keybit); | ||
268 | if (c & 0x02) set_bit(BTN_SIDE, sermouse->dev.keybit); | ||
269 | if (c & 0x04) set_bit(BTN_EXTRA, sermouse->dev.keybit); | ||
270 | if (c & 0x10) set_bit(REL_WHEEL, sermouse->dev.relbit); | ||
271 | if (c & 0x20) set_bit(REL_HWHEEL, sermouse->dev.relbit); | ||
272 | 255 | ||
256 | sermouse->dev = input_dev; | ||
273 | sprintf(sermouse->phys, "%s/input0", serio->phys); | 257 | sprintf(sermouse->phys, "%s/input0", serio->phys); |
258 | sermouse->type = serio->id.proto; | ||
274 | 259 | ||
275 | sermouse->dev.name = sermouse_protocols[sermouse->type]; | 260 | input_dev->name = sermouse_protocols[sermouse->type]; |
276 | sermouse->dev.phys = sermouse->phys; | 261 | input_dev->phys = sermouse->phys; |
277 | sermouse->dev.id.bustype = BUS_RS232; | 262 | input_dev->id.bustype = BUS_RS232; |
278 | sermouse->dev.id.vendor = sermouse->type; | 263 | input_dev->id.vendor = sermouse->type; |
279 | sermouse->dev.id.product = c; | 264 | input_dev->id.product = c; |
280 | sermouse->dev.id.version = 0x0100; | 265 | input_dev->id.version = 0x0100; |
281 | sermouse->dev.dev = &serio->dev; | 266 | input_dev->cdev.dev = &serio->dev; |
267 | |||
268 | input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REL); | ||
269 | input_dev->keybit[LONG(BTN_MOUSE)] = BIT(BTN_LEFT) | BIT(BTN_RIGHT); | ||
270 | input_dev->relbit[0] = BIT(REL_X) | BIT(REL_Y); | ||
271 | input_dev->private = sermouse; | ||
272 | |||
273 | if (c & 0x01) set_bit(BTN_MIDDLE, input_dev->keybit); | ||
274 | if (c & 0x02) set_bit(BTN_SIDE, input_dev->keybit); | ||
275 | if (c & 0x04) set_bit(BTN_EXTRA, input_dev->keybit); | ||
276 | if (c & 0x10) set_bit(REL_WHEEL, input_dev->relbit); | ||
277 | if (c & 0x20) set_bit(REL_HWHEEL, input_dev->relbit); | ||
282 | 278 | ||
283 | serio_set_drvdata(serio, sermouse); | 279 | serio_set_drvdata(serio, sermouse); |
284 | 280 | ||
285 | err = serio_open(serio, drv); | 281 | err = serio_open(serio, drv); |
286 | if (err) { | 282 | if (err) |
287 | serio_set_drvdata(serio, NULL); | 283 | goto fail; |
288 | kfree(sermouse); | ||
289 | return err; | ||
290 | } | ||
291 | |||
292 | input_register_device(&sermouse->dev); | ||
293 | 284 | ||
294 | printk(KERN_INFO "input: %s on %s\n", sermouse_protocols[sermouse->type], serio->phys); | 285 | input_register_device(sermouse->dev); |
295 | 286 | ||
296 | return 0; | 287 | return 0; |
288 | |||
289 | fail: serio_set_drvdata(serio, NULL); | ||
290 | input_free_device(input_dev); | ||
291 | kfree(sermouse); | ||
292 | return err; | ||
297 | } | 293 | } |
298 | 294 | ||
299 | static struct serio_device_id sermouse_serio_ids[] = { | 295 | static struct serio_device_id sermouse_serio_ids[] = { |
diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c index 029309422409..97cdfd6acaca 100644 --- a/drivers/input/mouse/synaptics.c +++ b/drivers/input/mouse/synaptics.c | |||
@@ -342,7 +342,7 @@ static void synaptics_parse_hw_state(unsigned char buf[], struct synaptics_data | |||
342 | */ | 342 | */ |
343 | static void synaptics_process_packet(struct psmouse *psmouse) | 343 | static void synaptics_process_packet(struct psmouse *psmouse) |
344 | { | 344 | { |
345 | struct input_dev *dev = &psmouse->dev; | 345 | struct input_dev *dev = psmouse->dev; |
346 | struct synaptics_data *priv = psmouse->private; | 346 | struct synaptics_data *priv = psmouse->private; |
347 | struct synaptics_hw_state hw; | 347 | struct synaptics_hw_state hw; |
348 | int num_fingers; | 348 | int num_fingers; |
@@ -473,7 +473,7 @@ static unsigned char synaptics_detect_pkt_type(struct psmouse *psmouse) | |||
473 | 473 | ||
474 | static psmouse_ret_t synaptics_process_byte(struct psmouse *psmouse, struct pt_regs *regs) | 474 | static psmouse_ret_t synaptics_process_byte(struct psmouse *psmouse, struct pt_regs *regs) |
475 | { | 475 | { |
476 | struct input_dev *dev = &psmouse->dev; | 476 | struct input_dev *dev = psmouse->dev; |
477 | struct synaptics_data *priv = psmouse->private; | 477 | struct synaptics_data *priv = psmouse->private; |
478 | 478 | ||
479 | input_regs(dev, regs); | 479 | input_regs(dev, regs); |
@@ -645,7 +645,7 @@ int synaptics_init(struct psmouse *psmouse) | |||
645 | SYN_ID_MAJOR(priv->identity), SYN_ID_MINOR(priv->identity), | 645 | SYN_ID_MAJOR(priv->identity), SYN_ID_MINOR(priv->identity), |
646 | priv->model_id, priv->capabilities, priv->ext_cap); | 646 | priv->model_id, priv->capabilities, priv->ext_cap); |
647 | 647 | ||
648 | set_input_params(&psmouse->dev, priv); | 648 | set_input_params(psmouse->dev, priv); |
649 | 649 | ||
650 | psmouse->protocol_handler = synaptics_process_byte; | 650 | psmouse->protocol_handler = synaptics_process_byte; |
651 | psmouse->set_rate = synaptics_set_rate; | 651 | psmouse->set_rate = synaptics_set_rate; |
diff --git a/drivers/input/mouse/vsxxxaa.c b/drivers/input/mouse/vsxxxaa.c index f024be9b44d2..36e9442a16b2 100644 --- a/drivers/input/mouse/vsxxxaa.c +++ b/drivers/input/mouse/vsxxxaa.c | |||
@@ -112,7 +112,7 @@ MODULE_LICENSE ("GPL"); | |||
112 | 112 | ||
113 | 113 | ||
114 | struct vsxxxaa { | 114 | struct vsxxxaa { |
115 | struct input_dev dev; | 115 | struct input_dev *dev; |
116 | struct serio *serio; | 116 | struct serio *serio; |
117 | #define BUFLEN 15 /* At least 5 is needed for a full tablet packet */ | 117 | #define BUFLEN 15 /* At least 5 is needed for a full tablet packet */ |
118 | unsigned char buf[BUFLEN]; | 118 | unsigned char buf[BUFLEN]; |
@@ -211,7 +211,7 @@ vsxxxaa_smells_like_packet (struct vsxxxaa *mouse, unsigned char type, size_t le | |||
211 | static void | 211 | static void |
212 | vsxxxaa_handle_REL_packet (struct vsxxxaa *mouse, struct pt_regs *regs) | 212 | vsxxxaa_handle_REL_packet (struct vsxxxaa *mouse, struct pt_regs *regs) |
213 | { | 213 | { |
214 | struct input_dev *dev = &mouse->dev; | 214 | struct input_dev *dev = mouse->dev; |
215 | unsigned char *buf = mouse->buf; | 215 | unsigned char *buf = mouse->buf; |
216 | int left, middle, right; | 216 | int left, middle, right; |
217 | int dx, dy; | 217 | int dx, dy; |
@@ -269,7 +269,7 @@ vsxxxaa_handle_REL_packet (struct vsxxxaa *mouse, struct pt_regs *regs) | |||
269 | static void | 269 | static void |
270 | vsxxxaa_handle_ABS_packet (struct vsxxxaa *mouse, struct pt_regs *regs) | 270 | vsxxxaa_handle_ABS_packet (struct vsxxxaa *mouse, struct pt_regs *regs) |
271 | { | 271 | { |
272 | struct input_dev *dev = &mouse->dev; | 272 | struct input_dev *dev = mouse->dev; |
273 | unsigned char *buf = mouse->buf; | 273 | unsigned char *buf = mouse->buf; |
274 | int left, middle, right, touch; | 274 | int left, middle, right, touch; |
275 | int x, y; | 275 | int x, y; |
@@ -323,7 +323,7 @@ vsxxxaa_handle_ABS_packet (struct vsxxxaa *mouse, struct pt_regs *regs) | |||
323 | static void | 323 | static void |
324 | vsxxxaa_handle_POR_packet (struct vsxxxaa *mouse, struct pt_regs *regs) | 324 | vsxxxaa_handle_POR_packet (struct vsxxxaa *mouse, struct pt_regs *regs) |
325 | { | 325 | { |
326 | struct input_dev *dev = &mouse->dev; | 326 | struct input_dev *dev = mouse->dev; |
327 | unsigned char *buf = mouse->buf; | 327 | unsigned char *buf = mouse->buf; |
328 | int left, middle, right; | 328 | int left, middle, right; |
329 | unsigned char error; | 329 | unsigned char error; |
@@ -483,9 +483,9 @@ vsxxxaa_disconnect (struct serio *serio) | |||
483 | { | 483 | { |
484 | struct vsxxxaa *mouse = serio_get_drvdata (serio); | 484 | struct vsxxxaa *mouse = serio_get_drvdata (serio); |
485 | 485 | ||
486 | input_unregister_device (&mouse->dev); | ||
487 | serio_close (serio); | 486 | serio_close (serio); |
488 | serio_set_drvdata (serio, NULL); | 487 | serio_set_drvdata (serio, NULL); |
488 | input_unregister_device (mouse->dev); | ||
489 | kfree (mouse); | 489 | kfree (mouse); |
490 | } | 490 | } |
491 | 491 | ||
@@ -493,61 +493,57 @@ static int | |||
493 | vsxxxaa_connect (struct serio *serio, struct serio_driver *drv) | 493 | vsxxxaa_connect (struct serio *serio, struct serio_driver *drv) |
494 | { | 494 | { |
495 | struct vsxxxaa *mouse; | 495 | struct vsxxxaa *mouse; |
496 | int err; | 496 | struct input_dev *input_dev; |
497 | int err = -ENOMEM; | ||
497 | 498 | ||
498 | if (!(mouse = kmalloc (sizeof (struct vsxxxaa), GFP_KERNEL))) | 499 | mouse = kzalloc (sizeof (struct vsxxxaa), GFP_KERNEL); |
499 | return -ENOMEM; | 500 | input_dev = input_allocate_device (); |
500 | 501 | if (!mouse || !input_dev) | |
501 | memset (mouse, 0, sizeof (struct vsxxxaa)); | 502 | goto fail; |
502 | |||
503 | init_input_dev (&mouse->dev); | ||
504 | set_bit (EV_KEY, mouse->dev.evbit); /* We have buttons */ | ||
505 | set_bit (EV_REL, mouse->dev.evbit); | ||
506 | set_bit (EV_ABS, mouse->dev.evbit); | ||
507 | set_bit (BTN_LEFT, mouse->dev.keybit); /* We have 3 buttons */ | ||
508 | set_bit (BTN_MIDDLE, mouse->dev.keybit); | ||
509 | set_bit (BTN_RIGHT, mouse->dev.keybit); | ||
510 | set_bit (BTN_TOUCH, mouse->dev.keybit); /* ...and Tablet */ | ||
511 | set_bit (REL_X, mouse->dev.relbit); | ||
512 | set_bit (REL_Y, mouse->dev.relbit); | ||
513 | set_bit (ABS_X, mouse->dev.absbit); | ||
514 | set_bit (ABS_Y, mouse->dev.absbit); | ||
515 | |||
516 | mouse->dev.absmin[ABS_X] = 0; | ||
517 | mouse->dev.absmax[ABS_X] = 1023; | ||
518 | mouse->dev.absmin[ABS_Y] = 0; | ||
519 | mouse->dev.absmax[ABS_Y] = 1023; | ||
520 | |||
521 | mouse->dev.private = mouse; | ||
522 | 503 | ||
504 | mouse->dev = input_dev; | ||
505 | mouse->serio = serio; | ||
523 | sprintf (mouse->name, "DEC VSXXX-AA/-GA mouse or VSXXX-AB digitizer"); | 506 | sprintf (mouse->name, "DEC VSXXX-AA/-GA mouse or VSXXX-AB digitizer"); |
524 | sprintf (mouse->phys, "%s/input0", serio->phys); | 507 | sprintf (mouse->phys, "%s/input0", serio->phys); |
525 | mouse->dev.name = mouse->name; | 508 | |
526 | mouse->dev.phys = mouse->phys; | 509 | input_dev->name = mouse->name; |
527 | mouse->dev.id.bustype = BUS_RS232; | 510 | input_dev->phys = mouse->phys; |
528 | mouse->dev.dev = &serio->dev; | 511 | input_dev->id.bustype = BUS_RS232; |
529 | mouse->serio = serio; | 512 | input_dev->cdev.dev = &serio->dev; |
513 | input_dev->private = mouse; | ||
514 | |||
515 | set_bit (EV_KEY, input_dev->evbit); /* We have buttons */ | ||
516 | set_bit (EV_REL, input_dev->evbit); | ||
517 | set_bit (EV_ABS, input_dev->evbit); | ||
518 | set_bit (BTN_LEFT, input_dev->keybit); /* We have 3 buttons */ | ||
519 | set_bit (BTN_MIDDLE, input_dev->keybit); | ||
520 | set_bit (BTN_RIGHT, input_dev->keybit); | ||
521 | set_bit (BTN_TOUCH, input_dev->keybit); /* ...and Tablet */ | ||
522 | set_bit (REL_X, input_dev->relbit); | ||
523 | set_bit (REL_Y, input_dev->relbit); | ||
524 | input_set_abs_params (input_dev, ABS_X, 0, 1023, 0, 0); | ||
525 | input_set_abs_params (input_dev, ABS_Y, 0, 1023, 0, 0); | ||
530 | 526 | ||
531 | serio_set_drvdata (serio, mouse); | 527 | serio_set_drvdata (serio, mouse); |
532 | 528 | ||
533 | err = serio_open (serio, drv); | 529 | err = serio_open (serio, drv); |
534 | if (err) { | 530 | if (err) |
535 | serio_set_drvdata (serio, NULL); | 531 | goto fail; |
536 | kfree (mouse); | ||
537 | return err; | ||
538 | } | ||
539 | 532 | ||
540 | /* | 533 | /* |
541 | * Request selftest. Standard packet format and differential | 534 | * Request selftest. Standard packet format and differential |
542 | * mode will be requested after the device ID'ed successfully. | 535 | * mode will be requested after the device ID'ed successfully. |
543 | */ | 536 | */ |
544 | mouse->serio->write (mouse->serio, 'T'); /* Test */ | 537 | serio->write (serio, 'T'); /* Test */ |
545 | |||
546 | input_register_device (&mouse->dev); | ||
547 | 538 | ||
548 | printk (KERN_INFO "input: %s on %s\n", mouse->name, mouse->phys); | 539 | input_register_device (input_dev); |
549 | 540 | ||
550 | return 0; | 541 | return 0; |
542 | |||
543 | fail: serio_set_drvdata (serio, NULL); | ||
544 | input_free_device (input_dev); | ||
545 | kfree (mouse); | ||
546 | return err; | ||
551 | } | 547 | } |
552 | 548 | ||
553 | static struct serio_device_id vsxxaa_serio_ids[] = { | 549 | static struct serio_device_id vsxxaa_serio_ids[] = { |