aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/staging
diff options
context:
space:
mode:
authorDan Carpenter <dan.carpenter@oracle.com>2013-06-26 09:37:36 -0400
committerMauro Carvalho Chehab <m.chehab@samsung.com>2013-07-29 09:17:33 -0400
commit1444fbf268c4dd8c77790ea28bf7560b815c5b28 (patch)
tree2b7ee008544e2b40d6c7cab598c0cbbee6642baf /drivers/staging
parent51dd4d70fc59564454a4dcb90d6d46d39a4a97ef (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.c56
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
382static int igorplugusb_remote_probe(struct usb_interface *intf, 376static 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
456mem_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
506static void igorplugusb_remote_disconnect(struct usb_interface *intf) 478static 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);