diff options
author | Dan Carpenter <dan.carpenter@oracle.com> | 2013-06-26 09:37:36 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <m.chehab@samsung.com> | 2013-07-29 09:17:33 -0400 |
commit | 1444fbf268c4dd8c77790ea28bf7560b815c5b28 (patch) | |
tree | 2b7ee008544e2b40d6c7cab598c0cbbee6642baf /drivers/staging | |
parent | 51dd4d70fc59564454a4dcb90d6d46d39a4a97ef (diff) |
[media] staging: lirc: clean error handling in probe()
We have reorganized the error handling into a simpler and more canonical
format.
Additionally we removed extra empty lines, switched to devm_kzalloc(), and
substitute 'minor' by 'ret' in the igorplugusb_remote_probe() function.
Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Acked-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
Diffstat (limited to 'drivers/staging')
-rw-r--r-- | drivers/staging/media/lirc/lirc_igorplugusb.c | 56 |
1 files changed, 14 insertions, 42 deletions
diff --git a/drivers/staging/media/lirc/lirc_igorplugusb.c b/drivers/staging/media/lirc/lirc_igorplugusb.c index 2faa391006db..28c8b0bcf5b2 100644 --- a/drivers/staging/media/lirc/lirc_igorplugusb.c +++ b/drivers/staging/media/lirc/lirc_igorplugusb.c | |||
@@ -240,10 +240,6 @@ static int unregister_from_lirc(struct igorplug *ir) | |||
240 | dprintk(DRIVER_NAME "[%d]: calling lirc_unregister_driver\n", devnum); | 240 | dprintk(DRIVER_NAME "[%d]: calling lirc_unregister_driver\n", devnum); |
241 | lirc_unregister_driver(d->minor); | 241 | lirc_unregister_driver(d->minor); |
242 | 242 | ||
243 | kfree(d); | ||
244 | ir->d = NULL; | ||
245 | kfree(ir); | ||
246 | |||
247 | return devnum; | 243 | return devnum; |
248 | } | 244 | } |
249 | 245 | ||
@@ -377,20 +373,16 @@ static int igorplugusb_remote_poll(void *data, struct lirc_buffer *buf) | |||
377 | return -ENODATA; | 373 | return -ENODATA; |
378 | } | 374 | } |
379 | 375 | ||
380 | |||
381 | |||
382 | static int igorplugusb_remote_probe(struct usb_interface *intf, | 376 | static int igorplugusb_remote_probe(struct usb_interface *intf, |
383 | const struct usb_device_id *id) | 377 | const struct usb_device_id *id) |
384 | { | 378 | { |
385 | struct usb_device *dev = NULL; | 379 | struct usb_device *dev; |
386 | struct usb_host_interface *idesc = NULL; | 380 | struct usb_host_interface *idesc = NULL; |
387 | struct usb_endpoint_descriptor *ep; | 381 | struct usb_endpoint_descriptor *ep; |
388 | struct igorplug *ir = NULL; | 382 | struct igorplug *ir = NULL; |
389 | struct lirc_driver *driver = NULL; | 383 | struct lirc_driver *driver = NULL; |
390 | int devnum, pipe, maxp; | 384 | int devnum, pipe, maxp; |
391 | int minor = 0; | ||
392 | char buf[63], name[128] = ""; | 385 | char buf[63], name[128] = ""; |
393 | int mem_failure = 0; | ||
394 | int ret; | 386 | int ret; |
395 | 387 | ||
396 | dprintk(DRIVER_NAME ": usb probe called.\n"); | 388 | dprintk(DRIVER_NAME ": usb probe called.\n"); |
@@ -416,24 +408,18 @@ static int igorplugusb_remote_probe(struct usb_interface *intf, | |||
416 | dprintk(DRIVER_NAME "[%d]: bytes_in_key=%zu maxp=%d\n", | 408 | dprintk(DRIVER_NAME "[%d]: bytes_in_key=%zu maxp=%d\n", |
417 | devnum, CODE_LENGTH, maxp); | 409 | devnum, CODE_LENGTH, maxp); |
418 | 410 | ||
419 | mem_failure = 0; | 411 | ir = devm_kzalloc(&intf->dev, sizeof(*ir), GFP_KERNEL); |
420 | ir = kzalloc(sizeof(struct igorplug), GFP_KERNEL); | 412 | if (!ir) |
421 | if (!ir) { | 413 | return -ENOMEM; |
422 | mem_failure = 1; | 414 | |
423 | goto mem_failure_switch; | 415 | driver = devm_kzalloc(&intf->dev, sizeof(*driver), GFP_KERNEL); |
424 | } | 416 | if (!driver) |
425 | driver = kzalloc(sizeof(struct lirc_driver), GFP_KERNEL); | 417 | return -ENOMEM; |
426 | if (!driver) { | ||
427 | mem_failure = 2; | ||
428 | goto mem_failure_switch; | ||
429 | } | ||
430 | 418 | ||
431 | ir->buf_in = usb_alloc_coherent(dev, DEVICE_BUFLEN + DEVICE_HEADERLEN, | 419 | ir->buf_in = usb_alloc_coherent(dev, DEVICE_BUFLEN + DEVICE_HEADERLEN, |
432 | GFP_ATOMIC, &ir->dma_in); | 420 | GFP_ATOMIC, &ir->dma_in); |
433 | if (!ir->buf_in) { | 421 | if (!ir->buf_in) |
434 | mem_failure = 3; | 422 | return -ENOMEM; |
435 | goto mem_failure_switch; | ||
436 | } | ||
437 | 423 | ||
438 | strcpy(driver->name, DRIVER_NAME " "); | 424 | strcpy(driver->name, DRIVER_NAME " "); |
439 | driver->minor = -1; | 425 | driver->minor = -1; |
@@ -449,27 +435,14 @@ static int igorplugusb_remote_probe(struct usb_interface *intf, | |||
449 | driver->dev = &intf->dev; | 435 | driver->dev = &intf->dev; |
450 | driver->owner = THIS_MODULE; | 436 | driver->owner = THIS_MODULE; |
451 | 437 | ||
452 | minor = lirc_register_driver(driver); | 438 | ret = lirc_register_driver(driver); |
453 | if (minor < 0) | 439 | if (ret < 0) { |
454 | mem_failure = 9; | ||
455 | |||
456 | mem_failure_switch: | ||
457 | |||
458 | switch (mem_failure) { | ||
459 | case 9: | ||
460 | usb_free_coherent(dev, DEVICE_BUFLEN + DEVICE_HEADERLEN, | 440 | usb_free_coherent(dev, DEVICE_BUFLEN + DEVICE_HEADERLEN, |
461 | ir->buf_in, ir->dma_in); | 441 | ir->buf_in, ir->dma_in); |
462 | case 3: | 442 | return ret; |
463 | kfree(driver); | ||
464 | case 2: | ||
465 | kfree(ir); | ||
466 | case 1: | ||
467 | printk(DRIVER_NAME "[%d]: out of memory (code=%d)\n", | ||
468 | devnum, mem_failure); | ||
469 | return -ENOMEM; | ||
470 | } | 443 | } |
471 | 444 | ||
472 | driver->minor = minor; | 445 | driver->minor = ret; |
473 | ir->d = driver; | 446 | ir->d = driver; |
474 | ir->devnum = devnum; | 447 | ir->devnum = devnum; |
475 | ir->usbdev = dev; | 448 | ir->usbdev = dev; |
@@ -502,7 +475,6 @@ mem_failure_switch: | |||
502 | return 0; | 475 | return 0; |
503 | } | 476 | } |
504 | 477 | ||
505 | |||
506 | static void igorplugusb_remote_disconnect(struct usb_interface *intf) | 478 | static void igorplugusb_remote_disconnect(struct usb_interface *intf) |
507 | { | 479 | { |
508 | struct usb_device *usbdev = interface_to_usbdev(intf); | 480 | struct usb_device *usbdev = interface_to_usbdev(intf); |