[media] staging: lirc: clean error handling in probe()
authorDan Carpenter <dan.carpenter@oracle.com>
Wed, 26 Jun 2013 13:37:36 +0000 (10:37 -0300)
committerMauro Carvalho Chehab <m.chehab@samsung.com>
Mon, 29 Jul 2013 13:17:33 +0000 (10:17 -0300)
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>
drivers/staging/media/lirc/lirc_igorplugusb.c

index 2faa391006db68165def2bc6badb0be69743d380..28c8b0bcf5b2a2da86f3987389831670ccf574b6 100644 (file)
@@ -240,10 +240,6 @@ static int unregister_from_lirc(struct igorplug *ir)
        dprintk(DRIVER_NAME "[%d]: calling lirc_unregister_driver\n", devnum);
        lirc_unregister_driver(d->minor);
 
-       kfree(d);
-       ir->d = NULL;
-       kfree(ir);
-
        return devnum;
 }
 
@@ -377,20 +373,16 @@ static int igorplugusb_remote_poll(void *data, struct lirc_buffer *buf)
        return -ENODATA;
 }
 
-
-
 static int igorplugusb_remote_probe(struct usb_interface *intf,
                                    const struct usb_device_id *id)
 {
-       struct usb_device *dev = NULL;
+       struct usb_device *dev;
        struct usb_host_interface *idesc = NULL;
        struct usb_endpoint_descriptor *ep;
        struct igorplug *ir = NULL;
        struct lirc_driver *driver = NULL;
        int devnum, pipe, maxp;
-       int minor = 0;
        char buf[63], name[128] = "";
-       int mem_failure = 0;
        int ret;
 
        dprintk(DRIVER_NAME ": usb probe called.\n");
@@ -416,24 +408,18 @@ static int igorplugusb_remote_probe(struct usb_interface *intf,
        dprintk(DRIVER_NAME "[%d]: bytes_in_key=%zu maxp=%d\n",
                devnum, CODE_LENGTH, maxp);
 
-       mem_failure = 0;
-       ir = kzalloc(sizeof(struct igorplug), GFP_KERNEL);
-       if (!ir) {
-               mem_failure = 1;
-               goto mem_failure_switch;
-       }
-       driver = kzalloc(sizeof(struct lirc_driver), GFP_KERNEL);
-       if (!driver) {
-               mem_failure = 2;
-               goto mem_failure_switch;
-       }
+       ir = devm_kzalloc(&intf->dev, sizeof(*ir), GFP_KERNEL);
+       if (!ir)
+               return -ENOMEM;
+
+       driver = devm_kzalloc(&intf->dev, sizeof(*driver), GFP_KERNEL);
+       if (!driver)
+               return -ENOMEM;
 
        ir->buf_in = usb_alloc_coherent(dev, DEVICE_BUFLEN + DEVICE_HEADERLEN,
                                        GFP_ATOMIC, &ir->dma_in);
-       if (!ir->buf_in) {
-               mem_failure = 3;
-               goto mem_failure_switch;
-       }
+       if (!ir->buf_in)
+               return -ENOMEM;
 
        strcpy(driver->name, DRIVER_NAME " ");
        driver->minor = -1;
@@ -449,27 +435,14 @@ static int igorplugusb_remote_probe(struct usb_interface *intf,
        driver->dev = &intf->dev;
        driver->owner = THIS_MODULE;
 
-       minor = lirc_register_driver(driver);
-       if (minor < 0)
-               mem_failure = 9;
-
-mem_failure_switch:
-
-       switch (mem_failure) {
-       case 9:
+       ret = lirc_register_driver(driver);
+       if (ret < 0) {
                usb_free_coherent(dev, DEVICE_BUFLEN + DEVICE_HEADERLEN,
                        ir->buf_in, ir->dma_in);
-       case 3:
-               kfree(driver);
-       case 2:
-               kfree(ir);
-       case 1:
-               printk(DRIVER_NAME "[%d]: out of memory (code=%d)\n",
-                       devnum, mem_failure);
-               return -ENOMEM;
+               return ret;
        }
 
-       driver->minor = minor;
+       driver->minor = ret;
        ir->d = driver;
        ir->devnum = devnum;
        ir->usbdev = dev;
@@ -502,7 +475,6 @@ mem_failure_switch:
        return 0;
 }
 
-
 static void igorplugusb_remote_disconnect(struct usb_interface *intf)
 {
        struct usb_device *usbdev = interface_to_usbdev(intf);