+ if (gt->irq >= 0) {
+ err = request_irq(gt->irq, gpio_test_irq_handler, IRQF_TRIGGER_NONE, "gpio_test_handler", (void *)gt);
+ if (err<0) {
+ pr_err("%s: GPIO #%d IRQ %d can not be requested, got %d\n", DRVNAME, gpi, gt->irq, err);
+ gt->irq = -1;
+ }
+ }
+
+
+ /* ******* GPIO OUTPUT ******* */
+ if (gpo >= 0) {
+ err = gpio_is_valid(gpo);
+ if (err<0) {
+ pr_err("%s: GPIO #%d for output is not usable\n", DRVNAME, gpo);
+ if (gt->irq >= 0) free_irq(gt->irq, (void *)gt);
+ tasklet_kill(>->work_tasklet);
+ gpio_free(gpi);
+ kfree(gt);
+ return err;
+ }
+ err = gpio_request(gpo, LABEL);
+ if (err<0) {
+ pr_err("%s: GPIO #%d for output is can not be requested\n", DRVNAME, gpo);
+ if (gt->irq >= 0) free_irq(gt->irq, (void *)gt);
+ tasklet_kill(>->work_tasklet);
+ gpio_free(gpi);
+ kfree(gt);
+ return err;
+ }
+ gt->out_cansleep = gpio_cansleep(gpo);
+ pr_info("%s: GPIO #%d for output %s sleep\n", DRVNAME, gpo, ((gt->out_cansleep>0) ? "can" : "will not"));
+ err = gpio_direction_output(gpo, val);