diff options
Diffstat (limited to 'drivers/input/joystick/turbografx.c')
-rw-r--r-- | drivers/input/joystick/turbografx.c | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/drivers/input/joystick/turbografx.c b/drivers/input/joystick/turbografx.c index 7e9764937d06..b154938e88a4 100644 --- a/drivers/input/joystick/turbografx.c +++ b/drivers/input/joystick/turbografx.c | |||
@@ -204,14 +204,14 @@ static struct tgfx __init *tgfx_probe(int parport, int *n_buttons, int n_devs) | |||
204 | if (n_buttons[i] > 6) { | 204 | if (n_buttons[i] > 6) { |
205 | printk(KERN_ERR "turbografx.c: Invalid number of buttons %d\n", n_buttons[i]); | 205 | printk(KERN_ERR "turbografx.c: Invalid number of buttons %d\n", n_buttons[i]); |
206 | err = -EINVAL; | 206 | err = -EINVAL; |
207 | goto err_free_devs; | 207 | goto err_unreg_devs; |
208 | } | 208 | } |
209 | 209 | ||
210 | tgfx->dev[i] = input_dev = input_allocate_device(); | 210 | tgfx->dev[i] = input_dev = input_allocate_device(); |
211 | if (!input_dev) { | 211 | if (!input_dev) { |
212 | printk(KERN_ERR "turbografx.c: Not enough memory for input device\n"); | 212 | printk(KERN_ERR "turbografx.c: Not enough memory for input device\n"); |
213 | err = -ENOMEM; | 213 | err = -ENOMEM; |
214 | goto err_free_devs; | 214 | goto err_unreg_devs; |
215 | } | 215 | } |
216 | 216 | ||
217 | tgfx->sticks |= (1 << i); | 217 | tgfx->sticks |= (1 << i); |
@@ -238,7 +238,9 @@ static struct tgfx __init *tgfx_probe(int parport, int *n_buttons, int n_devs) | |||
238 | for (j = 0; j < n_buttons[i]; j++) | 238 | for (j = 0; j < n_buttons[i]; j++) |
239 | set_bit(tgfx_buttons[j], input_dev->keybit); | 239 | set_bit(tgfx_buttons[j], input_dev->keybit); |
240 | 240 | ||
241 | input_register_device(tgfx->dev[i]); | 241 | err = input_register_device(tgfx->dev[i]); |
242 | if (err) | ||
243 | goto err_free_dev; | ||
242 | } | 244 | } |
243 | 245 | ||
244 | if (!tgfx->sticks) { | 246 | if (!tgfx->sticks) { |
@@ -249,9 +251,12 @@ static struct tgfx __init *tgfx_probe(int parport, int *n_buttons, int n_devs) | |||
249 | 251 | ||
250 | return tgfx; | 252 | return tgfx; |
251 | 253 | ||
252 | err_free_devs: | 254 | err_free_dev: |
255 | input_free_device(tgfx->dev[i]); | ||
256 | err_unreg_devs: | ||
253 | while (--i >= 0) | 257 | while (--i >= 0) |
254 | input_unregister_device(tgfx->dev[i]); | 258 | if (tgfx->dev[i]) |
259 | input_unregister_device(tgfx->dev[i]); | ||
255 | err_free_tgfx: | 260 | err_free_tgfx: |
256 | kfree(tgfx); | 261 | kfree(tgfx); |
257 | err_unreg_pardev: | 262 | err_unreg_pardev: |
@@ -262,7 +267,7 @@ static struct tgfx __init *tgfx_probe(int parport, int *n_buttons, int n_devs) | |||
262 | return ERR_PTR(err); | 267 | return ERR_PTR(err); |
263 | } | 268 | } |
264 | 269 | ||
265 | static void __exit tgfx_remove(struct tgfx *tgfx) | 270 | static void tgfx_remove(struct tgfx *tgfx) |
266 | { | 271 | { |
267 | int i; | 272 | int i; |
268 | 273 | ||
@@ -300,7 +305,8 @@ static int __init tgfx_init(void) | |||
300 | 305 | ||
301 | if (err) { | 306 | if (err) { |
302 | while (--i >= 0) | 307 | while (--i >= 0) |
303 | tgfx_remove(tgfx_base[i]); | 308 | if (tgfx_base[i]) |
309 | tgfx_remove(tgfx_base[i]); | ||
304 | return err; | 310 | return err; |
305 | } | 311 | } |
306 | 312 | ||