From 441f21c4325e6294f9a36beb57b0cff989b5d693 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Martin=20Szab=C3=B3?= Date: Fri, 19 Aug 2016 13:23:02 +0200 Subject: [PATCH] IRC kernel module driver: correct error path --- src/irc_kernel_modul/zynq_gpio_irc_module.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/irc_kernel_modul/zynq_gpio_irc_module.c b/src/irc_kernel_modul/zynq_gpio_irc_module.c index 79c5770..b638368 100644 --- a/src/irc_kernel_modul/zynq_gpio_irc_module.c +++ b/src/irc_kernel_modul/zynq_gpio_irc_module.c @@ -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; } /* -- 2.39.2