static void nokia_modem_gpio_unexport(struct device *dev) { struct nokia_modem_device *modem = dev_get_drvdata(dev); int i; for (i = 0; i < modem->gpio_amount; i++) { sysfs_remove_link(&dev->kobj, modem->gpios[i].name); gpiod_unexport(modem->gpios[i].gpio); } }
static int setup_gpio(struct pi433_device *device) { char name[5]; int retval; int i; const irq_handler_t DIO_irq_handler[NUM_DIO] = { DIO0_irq_handler, DIO1_irq_handler }; for (i = 0; i < NUM_DIO; i++) { /* "construct" name and get the gpio descriptor */ snprintf(name, sizeof(name), "DIO%d", i); device->gpiod[i] = gpiod_get(&device->spi->dev, name, 0 /*GPIOD_IN*/); if (device->gpiod[i] == ERR_PTR(-ENOENT)) { dev_dbg(&device->spi->dev, "Could not find entry for %s. Ignoring.", name); continue; } if (device->gpiod[i] == ERR_PTR(-EBUSY)) dev_dbg(&device->spi->dev, "%s is busy.", name); if (IS_ERR(device->gpiod[i])) { retval = PTR_ERR(device->gpiod[i]); /* release already allocated gpios */ for (i--; i >= 0; i--) { free_irq(device->irq_num[i], device); gpiod_put(device->gpiod[i]); } return retval; } /* configure the pin */ gpiod_unexport(device->gpiod[i]); retval = gpiod_direction_input(device->gpiod[i]); if (retval) return retval; /* configure irq */ device->irq_num[i] = gpiod_to_irq(device->gpiod[i]); if (device->irq_num[i] < 0) { device->gpiod[i] = ERR_PTR(-EINVAL); return device->irq_num[i]; } retval = request_irq(device->irq_num[i], DIO_irq_handler[i], 0, /* flags */ name, device); if (retval) return retval; dev_dbg(&device->spi->dev, "%s successfully configured", name); } return 0; }