]> rtime.felk.cvut.cz Git - fpga/zynq/mzed-dc-control-sw.git/commitdiff
IRC kernel module driver: correct error path
authorMartin Szabó <szabomar@fel.cvut.cz>
Fri, 19 Aug 2016 11:23:02 +0000 (13:23 +0200)
committerMartin Szabó <szabomar@fel.cvut.cz>
Fri, 19 Aug 2016 11:23:02 +0000 (13:23 +0200)
src/irc_kernel_modul/zynq_gpio_irc_module.c

index 79c57707f3d1343ba0633cf4a0b42976793cc117..b6383684c5373d1c49141d32b6321b41b875a541 100644 (file)
@@ -270,13 +270,13 @@ static int gpio_irc_init(void)
        if (IS_ERR(this_dev)) {
                pr_err("problem to create device \"irc%d\" in the class \"irc\"\n",
                        dev_minor);
-               return (-1);
+               goto error_unregister_chrdev;
        }
 
        pom = gpio_irc_setup_inputs(ircst);
        if (pom == -1) {
                pr_err("Inicializace GPIO se nezdarila");
-               return (-1);
+               goto error_device_destroy;
        }
 
        ircst->prev_ab_state = irc_ab_state_read(ircst);
@@ -289,7 +289,7 @@ static int gpio_irc_init(void)
                        pr_err("failed get IRQ number for %s\n",
                                ircst->irc_gpio_name[IRC_IRQ_GPIO_INDX]);
                        gpio_irc_free_fn(ircst);
-                       return (-1);
+                       goto error_device_destroy;
                }
                ircst->irc_irq_num[IRC_IRQ_GPIO_INDX] = irq_num;
        }
@@ -298,10 +298,16 @@ static int gpio_irc_init(void)
                        IRQF_TRIGGER_RISING, "irc_irq", ircst) != 0) {
                pr_err("failed request IRQ for %s\n", ircst->irc_gpio_name[IRC_IRQ_GPIO_INDX]);
                gpio_irc_free_fn(ircst);
-               return (-1);
+               goto error_device_destroy;
        }
        pr_notice("gpio_irc init done\n");
        return 0;
+
+error_device_destroy:
+       device_destroy(irc_class, MKDEV(dev_major, dev_minor));
+error_unregister_chrdev:
+       unregister_chrdev(dev_major, DEVICE_NAME);
+       return -1;
 }
 
 /*