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);
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;
}
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;
}
/*