diff options
author | Dmitry Torokhov <dtor@insightbb.com> | 2006-11-05 22:40:09 -0500 |
---|---|---|
committer | Dmitry Torokhov <dtor@insightbb.com> | 2006-11-05 22:40:09 -0500 |
commit | 127278ce2254c61f1346500374d61e33f74a8729 (patch) | |
tree | f7460f3f452d3dbe2d7a52dfa23a51dee0d312f3 | |
parent | 52c1f5704d7555a16641429b2e7af5d26d7b119a (diff) |
Input: joysticks - handle errors when registering input devices
Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
-rw-r--r-- | drivers/input/joystick/adi.c | 10 | ||||
-rw-r--r-- | drivers/input/joystick/amijoy.c | 6 | ||||
-rw-r--r-- | drivers/input/joystick/analog.c | 10 | ||||
-rw-r--r-- | drivers/input/joystick/cobra.c | 7 | ||||
-rw-r--r-- | drivers/input/joystick/gf2k.c | 4 | ||||
-rw-r--r-- | drivers/input/joystick/grip_mp.c | 13 | ||||
-rw-r--r-- | drivers/input/joystick/guillemot.c | 4 | ||||
-rw-r--r-- | drivers/input/joystick/iforce/iforce-main.c | 17 | ||||
-rw-r--r-- | drivers/input/joystick/iforce/iforce-serio.c | 20 | ||||
-rw-r--r-- | drivers/input/joystick/interact.c | 4 | ||||
-rw-r--r-- | drivers/input/joystick/magellan.c | 14 | ||||
-rw-r--r-- | drivers/input/joystick/spaceball.c | 14 | ||||
-rw-r--r-- | drivers/input/joystick/spaceorb.c | 14 | ||||
-rw-r--r-- | drivers/input/joystick/stinger.c | 14 | ||||
-rw-r--r-- | drivers/input/joystick/twidjoy.c | 14 | ||||
-rw-r--r-- | drivers/input/joystick/warrior.c | 14 |
16 files changed, 120 insertions, 59 deletions
diff --git a/drivers/input/joystick/adi.c b/drivers/input/joystick/adi.c index 704bf70f1db7..6279ced8a35b 100644 --- a/drivers/input/joystick/adi.c +++ b/drivers/input/joystick/adi.c | |||
@@ -521,11 +521,19 @@ static int adi_connect(struct gameport *gameport, struct gameport_driver *drv) | |||
521 | for (i = 0; i < 2; i++) | 521 | for (i = 0; i < 2; i++) |
522 | if (port->adi[i].length > 0) { | 522 | if (port->adi[i].length > 0) { |
523 | adi_init_center(port->adi + i); | 523 | adi_init_center(port->adi + i); |
524 | input_register_device(port->adi[i].dev); | 524 | err = input_register_device(port->adi[i].dev); |
525 | if (err) | ||
526 | goto fail3; | ||
525 | } | 527 | } |
526 | 528 | ||
527 | return 0; | 529 | return 0; |
528 | 530 | ||
531 | fail3: while (--i >= 0) { | ||
532 | if (port->adi[i].length > 0) { | ||
533 | input_unregister_device(port->adi[i].dev); | ||
534 | port->adi[i].dev = NULL; | ||
535 | } | ||
536 | } | ||
529 | fail2: for (i = 0; i < 2; i++) | 537 | fail2: for (i = 0; i < 2; i++) |
530 | if (port->adi[i].dev) | 538 | if (port->adi[i].dev) |
531 | input_free_device(port->adi[i].dev); | 539 | input_free_device(port->adi[i].dev); |
diff --git a/drivers/input/joystick/amijoy.c b/drivers/input/joystick/amijoy.c index 650acf3a30b7..e608691b5a61 100644 --- a/drivers/input/joystick/amijoy.c +++ b/drivers/input/joystick/amijoy.c | |||
@@ -147,7 +147,11 @@ static int __init amijoy_init(void) | |||
147 | amijoy_dev[i]->absmax[ABS_X + j] = 1; | 147 | amijoy_dev[i]->absmax[ABS_X + j] = 1; |
148 | } | 148 | } |
149 | 149 | ||
150 | input_register_device(amijoy_dev[i]); | 150 | err = input_register_device(amijoy_dev[i]); |
151 | if (err) { | ||
152 | input_free_device(amijoy_dev[i]); | ||
153 | goto fail; | ||
154 | } | ||
151 | } | 155 | } |
152 | return 0; | 156 | return 0; |
153 | 157 | ||
diff --git a/drivers/input/joystick/analog.c b/drivers/input/joystick/analog.c index e9a02db36ecc..7ef68456d7d6 100644 --- a/drivers/input/joystick/analog.c +++ b/drivers/input/joystick/analog.c | |||
@@ -434,6 +434,7 @@ static int analog_init_device(struct analog_port *port, struct analog *analog, i | |||
434 | { | 434 | { |
435 | struct input_dev *input_dev; | 435 | struct input_dev *input_dev; |
436 | int i, j, t, v, w, x, y, z; | 436 | int i, j, t, v, w, x, y, z; |
437 | int error; | ||
437 | 438 | ||
438 | analog_name(analog); | 439 | analog_name(analog); |
439 | snprintf(analog->phys, sizeof(analog->phys), | 440 | snprintf(analog->phys, sizeof(analog->phys), |
@@ -505,7 +506,11 @@ static int analog_init_device(struct analog_port *port, struct analog *analog, i | |||
505 | 506 | ||
506 | analog_decode(analog, port->axes, port->initial, port->buttons); | 507 | analog_decode(analog, port->axes, port->initial, port->buttons); |
507 | 508 | ||
508 | input_register_device(analog->dev); | 509 | error = input_register_device(analog->dev); |
510 | if (error) { | ||
511 | input_free_device(analog->dev); | ||
512 | return error; | ||
513 | } | ||
509 | 514 | ||
510 | return 0; | 515 | return 0; |
511 | } | 516 | } |
@@ -668,7 +673,8 @@ static int analog_connect(struct gameport *gameport, struct gameport_driver *drv | |||
668 | return 0; | 673 | return 0; |
669 | 674 | ||
670 | fail3: while (--i >= 0) | 675 | fail3: while (--i >= 0) |
671 | input_unregister_device(port->analog[i].dev); | 676 | if (port->analog[i].mask) |
677 | input_unregister_device(port->analog[i].dev); | ||
672 | fail2: gameport_close(gameport); | 678 | fail2: gameport_close(gameport); |
673 | fail1: gameport_set_drvdata(gameport, NULL); | 679 | fail1: gameport_set_drvdata(gameport, NULL); |
674 | kfree(port); | 680 | kfree(port); |
diff --git a/drivers/input/joystick/cobra.c b/drivers/input/joystick/cobra.c index d5e42eb88a20..034ec39c251d 100644 --- a/drivers/input/joystick/cobra.c +++ b/drivers/input/joystick/cobra.c | |||
@@ -223,12 +223,15 @@ static int cobra_connect(struct gameport *gameport, struct gameport_driver *drv) | |||
223 | for (j = 0; cobra_btn[j]; j++) | 223 | for (j = 0; cobra_btn[j]; j++) |
224 | set_bit(cobra_btn[j], input_dev->keybit); | 224 | set_bit(cobra_btn[j], input_dev->keybit); |
225 | 225 | ||
226 | input_register_device(cobra->dev[i]); | 226 | err = input_register_device(cobra->dev[i]); |
227 | if (err) | ||
228 | goto fail4; | ||
227 | } | 229 | } |
228 | 230 | ||
229 | return 0; | 231 | return 0; |
230 | 232 | ||
231 | fail3: for (i = 0; i < 2; i++) | 233 | fail4: input_free_device(cobra->dev[i]); |
234 | fail3: while (--i >= 0) | ||
232 | if (cobra->dev[i]) | 235 | if (cobra->dev[i]) |
233 | input_unregister_device(cobra->dev[i]); | 236 | input_unregister_device(cobra->dev[i]); |
234 | fail2: gameport_close(gameport); | 237 | fail2: gameport_close(gameport); |
diff --git a/drivers/input/joystick/gf2k.c b/drivers/input/joystick/gf2k.c index e4a699f6ec87..bacbab5d1b6f 100644 --- a/drivers/input/joystick/gf2k.c +++ b/drivers/input/joystick/gf2k.c | |||
@@ -341,7 +341,9 @@ static int gf2k_connect(struct gameport *gameport, struct gameport_driver *drv) | |||
341 | input_dev->absflat[gf2k_abs[i]] = (i < 2) ? 24 : 0; | 341 | input_dev->absflat[gf2k_abs[i]] = (i < 2) ? 24 : 0; |
342 | } | 342 | } |
343 | 343 | ||
344 | input_register_device(gf2k->dev); | 344 | err = input_register_device(gf2k->dev); |
345 | if (err) | ||
346 | goto fail2; | ||
345 | 347 | ||
346 | return 0; | 348 | return 0; |
347 | 349 | ||
diff --git a/drivers/input/joystick/grip_mp.c b/drivers/input/joystick/grip_mp.c index 62438944a69a..8120a9c40773 100644 --- a/drivers/input/joystick/grip_mp.c +++ b/drivers/input/joystick/grip_mp.c | |||
@@ -423,7 +423,10 @@ static int get_and_decode_packet(struct grip_mp *grip, int flags) | |||
423 | 423 | ||
424 | if (!port->registered) { | 424 | if (!port->registered) { |
425 | dbg("New Grip pad in multiport slot %d.\n", slot); | 425 | dbg("New Grip pad in multiport slot %d.\n", slot); |
426 | register_slot(slot, grip); | 426 | if (register_slot(slot, grip)) { |
427 | port->mode = GRIP_MODE_RESET; | ||
428 | port->dirty = 0; | ||
429 | } | ||
427 | } | 430 | } |
428 | return flags; | 431 | return flags; |
429 | } | 432 | } |
@@ -585,6 +588,7 @@ static int register_slot(int slot, struct grip_mp *grip) | |||
585 | struct grip_port *port = grip->port[slot]; | 588 | struct grip_port *port = grip->port[slot]; |
586 | struct input_dev *input_dev; | 589 | struct input_dev *input_dev; |
587 | int j, t; | 590 | int j, t; |
591 | int err; | ||
588 | 592 | ||
589 | port->dev = input_dev = input_allocate_device(); | 593 | port->dev = input_dev = input_allocate_device(); |
590 | if (!input_dev) | 594 | if (!input_dev) |
@@ -610,7 +614,12 @@ static int register_slot(int slot, struct grip_mp *grip) | |||
610 | if (t > 0) | 614 | if (t > 0) |
611 | set_bit(t, input_dev->keybit); | 615 | set_bit(t, input_dev->keybit); |
612 | 616 | ||
613 | input_register_device(port->dev); | 617 | err = input_register_device(port->dev); |
618 | if (err) { | ||
619 | input_free_device(port->dev); | ||
620 | return err; | ||
621 | } | ||
622 | |||
614 | port->registered = 1; | 623 | port->registered = 1; |
615 | 624 | ||
616 | if (port->dirty) /* report initial state, if any */ | 625 | if (port->dirty) /* report initial state, if any */ |
diff --git a/drivers/input/joystick/guillemot.c b/drivers/input/joystick/guillemot.c index 840ed9b512b2..dbc5d92858b8 100644 --- a/drivers/input/joystick/guillemot.c +++ b/drivers/input/joystick/guillemot.c | |||
@@ -250,7 +250,9 @@ static int guillemot_connect(struct gameport *gameport, struct gameport_driver * | |||
250 | for (i = 0; (t = guillemot->type->btn[i]) >= 0; i++) | 250 | for (i = 0; (t = guillemot->type->btn[i]) >= 0; i++) |
251 | set_bit(t, input_dev->keybit); | 251 | set_bit(t, input_dev->keybit); |
252 | 252 | ||
253 | input_register_device(guillemot->dev); | 253 | err = input_register_device(guillemot->dev); |
254 | if (err) | ||
255 | goto fail2; | ||
254 | 256 | ||
255 | return 0; | 257 | return 0; |
256 | 258 | ||
diff --git a/drivers/input/joystick/iforce/iforce-main.c b/drivers/input/joystick/iforce/iforce-main.c index 24c684bc6337..706e0aea793c 100644 --- a/drivers/input/joystick/iforce/iforce-main.c +++ b/drivers/input/joystick/iforce/iforce-main.c | |||
@@ -325,8 +325,8 @@ int iforce_init_device(struct iforce *iforce) | |||
325 | 325 | ||
326 | if (i == 20) { /* 5 seconds */ | 326 | if (i == 20) { /* 5 seconds */ |
327 | printk(KERN_ERR "iforce-main.c: Timeout waiting for response from device.\n"); | 327 | printk(KERN_ERR "iforce-main.c: Timeout waiting for response from device.\n"); |
328 | input_free_device(input_dev); | 328 | error = -ENODEV; |
329 | return -ENODEV; | 329 | goto fail; |
330 | } | 330 | } |
331 | 331 | ||
332 | /* | 332 | /* |
@@ -439,10 +439,8 @@ int iforce_init_device(struct iforce *iforce) | |||
439 | set_bit(iforce->type->ff[i], input_dev->ffbit); | 439 | set_bit(iforce->type->ff[i], input_dev->ffbit); |
440 | 440 | ||
441 | error = input_ff_create(input_dev, ff_effects); | 441 | error = input_ff_create(input_dev, ff_effects); |
442 | if (error) { | 442 | if (error) |
443 | input_free_device(input_dev); | 443 | goto fail; |
444 | return error; | ||
445 | } | ||
446 | 444 | ||
447 | ff = input_dev->ff; | 445 | ff = input_dev->ff; |
448 | ff->upload = iforce_upload_effect; | 446 | ff->upload = iforce_upload_effect; |
@@ -455,11 +453,16 @@ int iforce_init_device(struct iforce *iforce) | |||
455 | * Register input device. | 453 | * Register input device. |
456 | */ | 454 | */ |
457 | 455 | ||
458 | input_register_device(iforce->dev); | 456 | error = input_register_device(iforce->dev); |
457 | if (error) | ||
458 | goto fail; | ||
459 | 459 | ||
460 | printk(KERN_DEBUG "iforce->dev->open = %p\n", iforce->dev->open); | 460 | printk(KERN_DEBUG "iforce->dev->open = %p\n", iforce->dev->open); |
461 | 461 | ||
462 | return 0; | 462 | return 0; |
463 | |||
464 | fail: input_free_device(input_dev); | ||
465 | return error; | ||
463 | } | 466 | } |
464 | 467 | ||
465 | static int __init iforce_init(void) | 468 | static int __init iforce_init(void) |
diff --git a/drivers/input/joystick/iforce/iforce-serio.c b/drivers/input/joystick/iforce/iforce-serio.c index ca08f45c2040..ec4be535f483 100644 --- a/drivers/input/joystick/iforce/iforce-serio.c +++ b/drivers/input/joystick/iforce/iforce-serio.c | |||
@@ -141,21 +141,19 @@ static int iforce_serio_connect(struct serio *serio, struct serio_driver *drv) | |||
141 | serio_set_drvdata(serio, iforce); | 141 | serio_set_drvdata(serio, iforce); |
142 | 142 | ||
143 | err = serio_open(serio, drv); | 143 | err = serio_open(serio, drv); |
144 | if (err) { | 144 | if (err) |
145 | serio_set_drvdata(serio, NULL); | 145 | goto fail1; |
146 | kfree(iforce); | ||
147 | return err; | ||
148 | } | ||
149 | 146 | ||
150 | err = iforce_init_device(iforce); | 147 | err = iforce_init_device(iforce); |
151 | if (err) { | 148 | if (err) |
152 | serio_close(serio); | 149 | goto fail2; |
153 | serio_set_drvdata(serio, NULL); | ||
154 | kfree(iforce); | ||
155 | return -ENODEV; | ||
156 | } | ||
157 | 150 | ||
158 | return 0; | 151 | return 0; |
152 | |||
153 | fail2: serio_close(serio); | ||
154 | fail1: serio_set_drvdata(serio, NULL); | ||
155 | kfree(iforce); | ||
156 | return err; | ||
159 | } | 157 | } |
160 | 158 | ||
161 | static void iforce_serio_disconnect(struct serio *serio) | 159 | static void iforce_serio_disconnect(struct serio *serio) |
diff --git a/drivers/input/joystick/interact.c b/drivers/input/joystick/interact.c index bbfeb9c59b87..fec8b3d0967d 100644 --- a/drivers/input/joystick/interact.c +++ b/drivers/input/joystick/interact.c | |||
@@ -283,7 +283,9 @@ static int interact_connect(struct gameport *gameport, struct gameport_driver *d | |||
283 | for (i = 0; (t = interact_type[interact->type].btn[i]) >= 0; i++) | 283 | for (i = 0; (t = interact_type[interact->type].btn[i]) >= 0; i++) |
284 | set_bit(t, input_dev->keybit); | 284 | set_bit(t, input_dev->keybit); |
285 | 285 | ||
286 | input_register_device(interact->dev); | 286 | err = input_register_device(interact->dev); |
287 | if (err) | ||
288 | goto fail2; | ||
287 | 289 | ||
288 | return 0; | 290 | return 0; |
289 | 291 | ||
diff --git a/drivers/input/joystick/magellan.c b/drivers/input/joystick/magellan.c index e3d19444ba2e..d512b0a0282e 100644 --- a/drivers/input/joystick/magellan.c +++ b/drivers/input/joystick/magellan.c | |||
@@ -157,7 +157,7 @@ static int magellan_connect(struct serio *serio, struct serio_driver *drv) | |||
157 | magellan = kzalloc(sizeof(struct magellan), GFP_KERNEL); | 157 | magellan = kzalloc(sizeof(struct magellan), GFP_KERNEL); |
158 | input_dev = input_allocate_device(); | 158 | input_dev = input_allocate_device(); |
159 | if (!magellan || !input_dev) | 159 | if (!magellan || !input_dev) |
160 | goto fail; | 160 | goto fail1; |
161 | 161 | ||
162 | magellan->dev = input_dev; | 162 | magellan->dev = input_dev; |
163 | snprintf(magellan->phys, sizeof(magellan->phys), "%s/input0", serio->phys); | 163 | snprintf(magellan->phys, sizeof(magellan->phys), "%s/input0", serio->phys); |
@@ -183,13 +183,17 @@ static int magellan_connect(struct serio *serio, struct serio_driver *drv) | |||
183 | 183 | ||
184 | err = serio_open(serio, drv); | 184 | err = serio_open(serio, drv); |
185 | if (err) | 185 | if (err) |
186 | goto fail; | 186 | goto fail2; |
187 | |||
188 | err = input_register_device(magellan->dev); | ||
189 | if (err) | ||
190 | goto fail3; | ||
187 | 191 | ||
188 | input_register_device(magellan->dev); | ||
189 | return 0; | 192 | return 0; |
190 | 193 | ||
191 | fail: serio_set_drvdata(serio, NULL); | 194 | fail3: serio_close(serio); |
192 | input_free_device(input_dev); | 195 | fail2: serio_set_drvdata(serio, NULL); |
196 | fail1: input_free_device(input_dev); | ||
193 | kfree(magellan); | 197 | kfree(magellan); |
194 | return err; | 198 | return err; |
195 | } | 199 | } |
diff --git a/drivers/input/joystick/spaceball.c b/drivers/input/joystick/spaceball.c index 2a9808cf826f..9b3597343c1c 100644 --- a/drivers/input/joystick/spaceball.c +++ b/drivers/input/joystick/spaceball.c | |||
@@ -215,7 +215,7 @@ static int spaceball_connect(struct serio *serio, struct serio_driver *drv) | |||
215 | spaceball = kmalloc(sizeof(struct spaceball), GFP_KERNEL); | 215 | spaceball = kmalloc(sizeof(struct spaceball), GFP_KERNEL); |
216 | input_dev = input_allocate_device(); | 216 | input_dev = input_allocate_device(); |
217 | if (!spaceball || !input_dev) | 217 | if (!spaceball || !input_dev) |
218 | goto fail; | 218 | goto fail1; |
219 | 219 | ||
220 | spaceball->dev = input_dev; | 220 | spaceball->dev = input_dev; |
221 | snprintf(spaceball->phys, sizeof(spaceball->phys), "%s/input0", serio->phys); | 221 | snprintf(spaceball->phys, sizeof(spaceball->phys), "%s/input0", serio->phys); |
@@ -252,13 +252,17 @@ static int spaceball_connect(struct serio *serio, struct serio_driver *drv) | |||
252 | 252 | ||
253 | err = serio_open(serio, drv); | 253 | err = serio_open(serio, drv); |
254 | if (err) | 254 | if (err) |
255 | goto fail; | 255 | goto fail2; |
256 | |||
257 | err = input_register_device(spaceball->dev); | ||
258 | if (err) | ||
259 | goto fail3; | ||
256 | 260 | ||
257 | input_register_device(spaceball->dev); | ||
258 | return 0; | 261 | return 0; |
259 | 262 | ||
260 | fail: serio_set_drvdata(serio, NULL); | 263 | fail3: serio_close(serio); |
261 | input_free_device(input_dev); | 264 | fail2: serio_set_drvdata(serio, NULL); |
265 | fail1: input_free_device(input_dev); | ||
262 | kfree(spaceball); | 266 | kfree(spaceball); |
263 | return err; | 267 | return err; |
264 | } | 268 | } |
diff --git a/drivers/input/joystick/spaceorb.c b/drivers/input/joystick/spaceorb.c index c4db0247c5fb..ea9d51e70a12 100644 --- a/drivers/input/joystick/spaceorb.c +++ b/drivers/input/joystick/spaceorb.c | |||
@@ -172,7 +172,7 @@ static int spaceorb_connect(struct serio *serio, struct serio_driver *drv) | |||
172 | spaceorb = kzalloc(sizeof(struct spaceorb), GFP_KERNEL); | 172 | spaceorb = kzalloc(sizeof(struct spaceorb), GFP_KERNEL); |
173 | input_dev = input_allocate_device(); | 173 | input_dev = input_allocate_device(); |
174 | if (!spaceorb || !input_dev) | 174 | if (!spaceorb || !input_dev) |
175 | goto fail; | 175 | goto fail1; |
176 | 176 | ||
177 | spaceorb->dev = input_dev; | 177 | spaceorb->dev = input_dev; |
178 | snprintf(spaceorb->phys, sizeof(spaceorb->phys), "%s/input0", serio->phys); | 178 | snprintf(spaceorb->phys, sizeof(spaceorb->phys), "%s/input0", serio->phys); |
@@ -198,13 +198,17 @@ static int spaceorb_connect(struct serio *serio, struct serio_driver *drv) | |||
198 | 198 | ||
199 | err = serio_open(serio, drv); | 199 | err = serio_open(serio, drv); |
200 | if (err) | 200 | if (err) |
201 | goto fail; | 201 | goto fail2; |
202 | |||
203 | err = input_register_device(spaceorb->dev); | ||
204 | if (err) | ||
205 | goto fail3; | ||
202 | 206 | ||
203 | input_register_device(spaceorb->dev); | ||
204 | return 0; | 207 | return 0; |
205 | 208 | ||
206 | fail: serio_set_drvdata(serio, NULL); | 209 | fail3: serio_close(serio); |
207 | input_free_device(input_dev); | 210 | fail2: serio_set_drvdata(serio, NULL); |
211 | fail1: input_free_device(input_dev); | ||
208 | kfree(spaceorb); | 212 | kfree(spaceorb); |
209 | return err; | 213 | return err; |
210 | } | 214 | } |
diff --git a/drivers/input/joystick/stinger.c b/drivers/input/joystick/stinger.c index 1ffb03223311..b51a4a4c7f60 100644 --- a/drivers/input/joystick/stinger.c +++ b/drivers/input/joystick/stinger.c | |||
@@ -143,7 +143,7 @@ static int stinger_connect(struct serio *serio, struct serio_driver *drv) | |||
143 | stinger = kmalloc(sizeof(struct stinger), GFP_KERNEL); | 143 | stinger = kmalloc(sizeof(struct stinger), GFP_KERNEL); |
144 | input_dev = input_allocate_device(); | 144 | input_dev = input_allocate_device(); |
145 | if (!stinger || !input_dev) | 145 | if (!stinger || !input_dev) |
146 | goto fail; | 146 | goto fail1; |
147 | 147 | ||
148 | stinger->dev = input_dev; | 148 | stinger->dev = input_dev; |
149 | snprintf(stinger->phys, sizeof(stinger->phys), "%s/serio0", serio->phys); | 149 | snprintf(stinger->phys, sizeof(stinger->phys), "%s/serio0", serio->phys); |
@@ -168,13 +168,17 @@ static int stinger_connect(struct serio *serio, struct serio_driver *drv) | |||
168 | 168 | ||
169 | err = serio_open(serio, drv); | 169 | err = serio_open(serio, drv); |
170 | if (err) | 170 | if (err) |
171 | goto fail; | 171 | goto fail2; |
172 | |||
173 | err = input_register_device(stinger->dev); | ||
174 | if (err) | ||
175 | goto fail3; | ||
172 | 176 | ||
173 | input_register_device(stinger->dev); | ||
174 | return 0; | 177 | return 0; |
175 | 178 | ||
176 | fail: serio_set_drvdata(serio, NULL); | 179 | fail3: serio_close(serio); |
177 | input_free_device(input_dev); | 180 | fail2: serio_set_drvdata(serio, NULL); |
181 | fail1: input_free_device(input_dev); | ||
178 | kfree(stinger); | 182 | kfree(stinger); |
179 | return err; | 183 | return err; |
180 | } | 184 | } |
diff --git a/drivers/input/joystick/twidjoy.c b/drivers/input/joystick/twidjoy.c index 49085df2d631..3c1c83e8609a 100644 --- a/drivers/input/joystick/twidjoy.c +++ b/drivers/input/joystick/twidjoy.c | |||
@@ -194,7 +194,7 @@ static int twidjoy_connect(struct serio *serio, struct serio_driver *drv) | |||
194 | twidjoy = kzalloc(sizeof(struct twidjoy), GFP_KERNEL); | 194 | twidjoy = kzalloc(sizeof(struct twidjoy), GFP_KERNEL); |
195 | input_dev = input_allocate_device(); | 195 | input_dev = input_allocate_device(); |
196 | if (!twidjoy || !input_dev) | 196 | if (!twidjoy || !input_dev) |
197 | goto fail; | 197 | goto fail1; |
198 | 198 | ||
199 | twidjoy->dev = input_dev; | 199 | twidjoy->dev = input_dev; |
200 | snprintf(twidjoy->phys, sizeof(twidjoy->phys), "%s/input0", serio->phys); | 200 | snprintf(twidjoy->phys, sizeof(twidjoy->phys), "%s/input0", serio->phys); |
@@ -221,13 +221,17 @@ static int twidjoy_connect(struct serio *serio, struct serio_driver *drv) | |||
221 | 221 | ||
222 | err = serio_open(serio, drv); | 222 | err = serio_open(serio, drv); |
223 | if (err) | 223 | if (err) |
224 | goto fail; | 224 | goto fail2; |
225 | |||
226 | err = input_register_device(twidjoy->dev); | ||
227 | if (err) | ||
228 | goto fail3; | ||
225 | 229 | ||
226 | input_register_device(twidjoy->dev); | ||
227 | return 0; | 230 | return 0; |
228 | 231 | ||
229 | fail: serio_set_drvdata(serio, NULL); | 232 | fail3: serio_close(serio); |
230 | input_free_device(input_dev); | 233 | fail2: serio_set_drvdata(serio, NULL); |
234 | fail1: input_free_device(input_dev); | ||
231 | kfree(twidjoy); | 235 | kfree(twidjoy); |
232 | return err; | 236 | return err; |
233 | } | 237 | } |
diff --git a/drivers/input/joystick/warrior.c b/drivers/input/joystick/warrior.c index 35edea1ab955..1e4828b9a1ab 100644 --- a/drivers/input/joystick/warrior.c +++ b/drivers/input/joystick/warrior.c | |||
@@ -149,7 +149,7 @@ static int warrior_connect(struct serio *serio, struct serio_driver *drv) | |||
149 | warrior = kzalloc(sizeof(struct warrior), GFP_KERNEL); | 149 | warrior = kzalloc(sizeof(struct warrior), GFP_KERNEL); |
150 | input_dev = input_allocate_device(); | 150 | input_dev = input_allocate_device(); |
151 | if (!warrior || !input_dev) | 151 | if (!warrior || !input_dev) |
152 | goto fail; | 152 | goto fail1; |
153 | 153 | ||
154 | warrior->dev = input_dev; | 154 | warrior->dev = input_dev; |
155 | snprintf(warrior->phys, sizeof(warrior->phys), "%s/input0", serio->phys); | 155 | snprintf(warrior->phys, sizeof(warrior->phys), "%s/input0", serio->phys); |
@@ -176,13 +176,17 @@ static int warrior_connect(struct serio *serio, struct serio_driver *drv) | |||
176 | 176 | ||
177 | err = serio_open(serio, drv); | 177 | err = serio_open(serio, drv); |
178 | if (err) | 178 | if (err) |
179 | goto fail; | 179 | goto fail2; |
180 | |||
181 | err = input_register_device(warrior->dev); | ||
182 | if (err) | ||
183 | goto fail3; | ||
180 | 184 | ||
181 | input_register_device(warrior->dev); | ||
182 | return 0; | 185 | return 0; |
183 | 186 | ||
184 | fail: serio_set_drvdata(serio, NULL); | 187 | fail3: serio_close(serio); |
185 | input_free_device(input_dev); | 188 | fail2: serio_set_drvdata(serio, NULL); |
189 | fail1: input_free_device(input_dev); | ||
186 | kfree(warrior); | 190 | kfree(warrior); |
187 | return err; | 191 | return err; |
188 | } | 192 | } |