/** * Convert a GPIO number to its descriptor */ struct gpio_desc *gpio_to_desc(unsigned gpio) { struct gpio_device *gdev; unsigned long flags;
spin_lock_irqsave(&gpio_lock, flags);
list_for_each_entry(gdev, &gpio_devices, list) { if (gdev->base <= gpio && gdev->base + gdev->ngpio > gpio) { spin_unlock_irqrestore(&gpio_lock, flags); return &gdev->descs[gpio - gdev->base]; } }
spin_unlock_irqrestore(&gpio_lock, flags);
if (!gpio_is_valid(gpio)) WARN(1, "invalid GPIO %d\n", gpio);
return NULL; } EXPORT_SYMBOL_GPL(gpio_to_desc);
/** * Get the GPIO descriptor corresponding to the given hw number for this chip. */ struct gpio_desc *gpiochip_get_desc(struct gpio_chip *chip, u16 hwnum) { struct gpio_device *gdev = chip->gpiodev;
if (hwnum >= gdev->ngpio) return ERR_PTR(-EINVAL);
return &gdev->descs[hwnum]; }