xref: /kernel/linux/linux-6.6/drivers/gpio/gpiolib.c (revision 62306a36)
162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci
362306a36Sopenharmony_ci#include <linux/acpi.h>
462306a36Sopenharmony_ci#include <linux/bitmap.h>
562306a36Sopenharmony_ci#include <linux/compat.h>
662306a36Sopenharmony_ci#include <linux/debugfs.h>
762306a36Sopenharmony_ci#include <linux/device.h>
862306a36Sopenharmony_ci#include <linux/err.h>
962306a36Sopenharmony_ci#include <linux/errno.h>
1062306a36Sopenharmony_ci#include <linux/file.h>
1162306a36Sopenharmony_ci#include <linux/fs.h>
1262306a36Sopenharmony_ci#include <linux/idr.h>
1362306a36Sopenharmony_ci#include <linux/interrupt.h>
1462306a36Sopenharmony_ci#include <linux/irq.h>
1562306a36Sopenharmony_ci#include <linux/kernel.h>
1662306a36Sopenharmony_ci#include <linux/list.h>
1762306a36Sopenharmony_ci#include <linux/module.h>
1862306a36Sopenharmony_ci#include <linux/of.h>
1962306a36Sopenharmony_ci#include <linux/pinctrl/consumer.h>
2062306a36Sopenharmony_ci#include <linux/seq_file.h>
2162306a36Sopenharmony_ci#include <linux/slab.h>
2262306a36Sopenharmony_ci#include <linux/spinlock.h>
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci#include <linux/gpio.h>
2562306a36Sopenharmony_ci#include <linux/gpio/driver.h>
2662306a36Sopenharmony_ci#include <linux/gpio/machine.h>
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ci#include <uapi/linux/gpio.h>
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci#include "gpiolib-acpi.h"
3162306a36Sopenharmony_ci#include "gpiolib-cdev.h"
3262306a36Sopenharmony_ci#include "gpiolib-of.h"
3362306a36Sopenharmony_ci#include "gpiolib-swnode.h"
3462306a36Sopenharmony_ci#include "gpiolib-sysfs.h"
3562306a36Sopenharmony_ci#include "gpiolib.h"
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci#define CREATE_TRACE_POINTS
3862306a36Sopenharmony_ci#include <trace/events/gpio.h>
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci/* Implementation infrastructure for GPIO interfaces.
4162306a36Sopenharmony_ci *
4262306a36Sopenharmony_ci * The GPIO programming interface allows for inlining speed-critical
4362306a36Sopenharmony_ci * get/set operations for common cases, so that access to SOC-integrated
4462306a36Sopenharmony_ci * GPIOs can sometimes cost only an instruction or two per bit.
4562306a36Sopenharmony_ci */
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci/* When debugging, extend minimal trust to callers and platform code.
4962306a36Sopenharmony_ci * Also emit diagnostic messages that may help initial bringup, when
5062306a36Sopenharmony_ci * board setup or driver bugs are most common.
5162306a36Sopenharmony_ci *
5262306a36Sopenharmony_ci * Otherwise, minimize overhead in what may be bitbanging codepaths.
5362306a36Sopenharmony_ci */
5462306a36Sopenharmony_ci#ifdef	DEBUG
5562306a36Sopenharmony_ci#define	extra_checks	1
5662306a36Sopenharmony_ci#else
5762306a36Sopenharmony_ci#define	extra_checks	0
5862306a36Sopenharmony_ci#endif
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_ci/* Device and char device-related information */
6162306a36Sopenharmony_cistatic DEFINE_IDA(gpio_ida);
6262306a36Sopenharmony_cistatic dev_t gpio_devt;
6362306a36Sopenharmony_ci#define GPIO_DEV_MAX 256 /* 256 GPIO chip devices supported */
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_cistatic int gpio_bus_match(struct device *dev, struct device_driver *drv)
6662306a36Sopenharmony_ci{
6762306a36Sopenharmony_ci	struct fwnode_handle *fwnode = dev_fwnode(dev);
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci	/*
7062306a36Sopenharmony_ci	 * Only match if the fwnode doesn't already have a proper struct device
7162306a36Sopenharmony_ci	 * created for it.
7262306a36Sopenharmony_ci	 */
7362306a36Sopenharmony_ci	if (fwnode && fwnode->dev != dev)
7462306a36Sopenharmony_ci		return 0;
7562306a36Sopenharmony_ci	return 1;
7662306a36Sopenharmony_ci}
7762306a36Sopenharmony_ci
7862306a36Sopenharmony_cistatic struct bus_type gpio_bus_type = {
7962306a36Sopenharmony_ci	.name = "gpio",
8062306a36Sopenharmony_ci	.match = gpio_bus_match,
8162306a36Sopenharmony_ci};
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_ci/*
8462306a36Sopenharmony_ci * Number of GPIOs to use for the fast path in set array
8562306a36Sopenharmony_ci */
8662306a36Sopenharmony_ci#define FASTPATH_NGPIO CONFIG_GPIOLIB_FASTPATH_LIMIT
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_ci/* gpio_lock prevents conflicts during gpio_desc[] table updates.
8962306a36Sopenharmony_ci * While any GPIO is requested, its gpio_chip is not removable;
9062306a36Sopenharmony_ci * each GPIO's "requested" flag serves as a lock and refcount.
9162306a36Sopenharmony_ci */
9262306a36Sopenharmony_ciDEFINE_SPINLOCK(gpio_lock);
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_cistatic DEFINE_MUTEX(gpio_lookup_lock);
9562306a36Sopenharmony_cistatic LIST_HEAD(gpio_lookup_list);
9662306a36Sopenharmony_ciLIST_HEAD(gpio_devices);
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_cistatic DEFINE_MUTEX(gpio_machine_hogs_mutex);
9962306a36Sopenharmony_cistatic LIST_HEAD(gpio_machine_hogs);
10062306a36Sopenharmony_ci
10162306a36Sopenharmony_cistatic void gpiochip_free_hogs(struct gpio_chip *gc);
10262306a36Sopenharmony_cistatic int gpiochip_add_irqchip(struct gpio_chip *gc,
10362306a36Sopenharmony_ci				struct lock_class_key *lock_key,
10462306a36Sopenharmony_ci				struct lock_class_key *request_key);
10562306a36Sopenharmony_cistatic void gpiochip_irqchip_remove(struct gpio_chip *gc);
10662306a36Sopenharmony_cistatic int gpiochip_irqchip_init_hw(struct gpio_chip *gc);
10762306a36Sopenharmony_cistatic int gpiochip_irqchip_init_valid_mask(struct gpio_chip *gc);
10862306a36Sopenharmony_cistatic void gpiochip_irqchip_free_valid_mask(struct gpio_chip *gc);
10962306a36Sopenharmony_ci
11062306a36Sopenharmony_cistatic bool gpiolib_initialized;
11162306a36Sopenharmony_ci
11262306a36Sopenharmony_cistatic inline void desc_set_label(struct gpio_desc *d, const char *label)
11362306a36Sopenharmony_ci{
11462306a36Sopenharmony_ci	d->label = label;
11562306a36Sopenharmony_ci}
11662306a36Sopenharmony_ci
11762306a36Sopenharmony_ci/**
11862306a36Sopenharmony_ci * gpio_to_desc - Convert a GPIO number to its descriptor
11962306a36Sopenharmony_ci * @gpio: global GPIO number
12062306a36Sopenharmony_ci *
12162306a36Sopenharmony_ci * Returns:
12262306a36Sopenharmony_ci * The GPIO descriptor associated with the given GPIO, or %NULL if no GPIO
12362306a36Sopenharmony_ci * with the given number exists in the system.
12462306a36Sopenharmony_ci */
12562306a36Sopenharmony_cistruct gpio_desc *gpio_to_desc(unsigned gpio)
12662306a36Sopenharmony_ci{
12762306a36Sopenharmony_ci	struct gpio_device *gdev;
12862306a36Sopenharmony_ci	unsigned long flags;
12962306a36Sopenharmony_ci
13062306a36Sopenharmony_ci	spin_lock_irqsave(&gpio_lock, flags);
13162306a36Sopenharmony_ci
13262306a36Sopenharmony_ci	list_for_each_entry(gdev, &gpio_devices, list) {
13362306a36Sopenharmony_ci		if (gdev->base <= gpio &&
13462306a36Sopenharmony_ci		    gdev->base + gdev->ngpio > gpio) {
13562306a36Sopenharmony_ci			spin_unlock_irqrestore(&gpio_lock, flags);
13662306a36Sopenharmony_ci			return &gdev->descs[gpio - gdev->base];
13762306a36Sopenharmony_ci		}
13862306a36Sopenharmony_ci	}
13962306a36Sopenharmony_ci
14062306a36Sopenharmony_ci	spin_unlock_irqrestore(&gpio_lock, flags);
14162306a36Sopenharmony_ci
14262306a36Sopenharmony_ci	if (!gpio_is_valid(gpio))
14362306a36Sopenharmony_ci		pr_warn("invalid GPIO %d\n", gpio);
14462306a36Sopenharmony_ci
14562306a36Sopenharmony_ci	return NULL;
14662306a36Sopenharmony_ci}
14762306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpio_to_desc);
14862306a36Sopenharmony_ci
14962306a36Sopenharmony_ci/**
15062306a36Sopenharmony_ci * gpiochip_get_desc - get the GPIO descriptor corresponding to the given
15162306a36Sopenharmony_ci *                     hardware number for this chip
15262306a36Sopenharmony_ci * @gc: GPIO chip
15362306a36Sopenharmony_ci * @hwnum: hardware number of the GPIO for this chip
15462306a36Sopenharmony_ci *
15562306a36Sopenharmony_ci * Returns:
15662306a36Sopenharmony_ci * A pointer to the GPIO descriptor or ``ERR_PTR(-EINVAL)`` if no GPIO exists
15762306a36Sopenharmony_ci * in the given chip for the specified hardware number.
15862306a36Sopenharmony_ci */
15962306a36Sopenharmony_cistruct gpio_desc *gpiochip_get_desc(struct gpio_chip *gc,
16062306a36Sopenharmony_ci				    unsigned int hwnum)
16162306a36Sopenharmony_ci{
16262306a36Sopenharmony_ci	struct gpio_device *gdev = gc->gpiodev;
16362306a36Sopenharmony_ci
16462306a36Sopenharmony_ci	if (hwnum >= gdev->ngpio)
16562306a36Sopenharmony_ci		return ERR_PTR(-EINVAL);
16662306a36Sopenharmony_ci
16762306a36Sopenharmony_ci	return &gdev->descs[hwnum];
16862306a36Sopenharmony_ci}
16962306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiochip_get_desc);
17062306a36Sopenharmony_ci
17162306a36Sopenharmony_ci/**
17262306a36Sopenharmony_ci * desc_to_gpio - convert a GPIO descriptor to the integer namespace
17362306a36Sopenharmony_ci * @desc: GPIO descriptor
17462306a36Sopenharmony_ci *
17562306a36Sopenharmony_ci * This should disappear in the future but is needed since we still
17662306a36Sopenharmony_ci * use GPIO numbers for error messages and sysfs nodes.
17762306a36Sopenharmony_ci *
17862306a36Sopenharmony_ci * Returns:
17962306a36Sopenharmony_ci * The global GPIO number for the GPIO specified by its descriptor.
18062306a36Sopenharmony_ci */
18162306a36Sopenharmony_ciint desc_to_gpio(const struct gpio_desc *desc)
18262306a36Sopenharmony_ci{
18362306a36Sopenharmony_ci	return desc->gdev->base + (desc - &desc->gdev->descs[0]);
18462306a36Sopenharmony_ci}
18562306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(desc_to_gpio);
18662306a36Sopenharmony_ci
18762306a36Sopenharmony_ci
18862306a36Sopenharmony_ci/**
18962306a36Sopenharmony_ci * gpiod_to_chip - Return the GPIO chip to which a GPIO descriptor belongs
19062306a36Sopenharmony_ci * @desc:	descriptor to return the chip of
19162306a36Sopenharmony_ci */
19262306a36Sopenharmony_cistruct gpio_chip *gpiod_to_chip(const struct gpio_desc *desc)
19362306a36Sopenharmony_ci{
19462306a36Sopenharmony_ci	if (!desc || !desc->gdev)
19562306a36Sopenharmony_ci		return NULL;
19662306a36Sopenharmony_ci	return desc->gdev->chip;
19762306a36Sopenharmony_ci}
19862306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiod_to_chip);
19962306a36Sopenharmony_ci
20062306a36Sopenharmony_ci/* dynamic allocation of GPIOs, e.g. on a hotplugged device */
20162306a36Sopenharmony_cistatic int gpiochip_find_base(int ngpio)
20262306a36Sopenharmony_ci{
20362306a36Sopenharmony_ci	struct gpio_device *gdev;
20462306a36Sopenharmony_ci	int base = GPIO_DYNAMIC_BASE;
20562306a36Sopenharmony_ci
20662306a36Sopenharmony_ci	list_for_each_entry(gdev, &gpio_devices, list) {
20762306a36Sopenharmony_ci		/* found a free space? */
20862306a36Sopenharmony_ci		if (gdev->base >= base + ngpio)
20962306a36Sopenharmony_ci			break;
21062306a36Sopenharmony_ci		/* nope, check the space right after the chip */
21162306a36Sopenharmony_ci		base = gdev->base + gdev->ngpio;
21262306a36Sopenharmony_ci		if (base < GPIO_DYNAMIC_BASE)
21362306a36Sopenharmony_ci			base = GPIO_DYNAMIC_BASE;
21462306a36Sopenharmony_ci	}
21562306a36Sopenharmony_ci
21662306a36Sopenharmony_ci	if (gpio_is_valid(base)) {
21762306a36Sopenharmony_ci		pr_debug("%s: found new base at %d\n", __func__, base);
21862306a36Sopenharmony_ci		return base;
21962306a36Sopenharmony_ci	} else {
22062306a36Sopenharmony_ci		pr_err("%s: cannot find free range\n", __func__);
22162306a36Sopenharmony_ci		return -ENOSPC;
22262306a36Sopenharmony_ci	}
22362306a36Sopenharmony_ci}
22462306a36Sopenharmony_ci
22562306a36Sopenharmony_ci/**
22662306a36Sopenharmony_ci * gpiod_get_direction - return the current direction of a GPIO
22762306a36Sopenharmony_ci * @desc:	GPIO to get the direction of
22862306a36Sopenharmony_ci *
22962306a36Sopenharmony_ci * Returns 0 for output, 1 for input, or an error code in case of error.
23062306a36Sopenharmony_ci *
23162306a36Sopenharmony_ci * This function may sleep if gpiod_cansleep() is true.
23262306a36Sopenharmony_ci */
23362306a36Sopenharmony_ciint gpiod_get_direction(struct gpio_desc *desc)
23462306a36Sopenharmony_ci{
23562306a36Sopenharmony_ci	struct gpio_chip *gc;
23662306a36Sopenharmony_ci	unsigned int offset;
23762306a36Sopenharmony_ci	int ret;
23862306a36Sopenharmony_ci
23962306a36Sopenharmony_ci	gc = gpiod_to_chip(desc);
24062306a36Sopenharmony_ci	offset = gpio_chip_hwgpio(desc);
24162306a36Sopenharmony_ci
24262306a36Sopenharmony_ci	/*
24362306a36Sopenharmony_ci	 * Open drain emulation using input mode may incorrectly report
24462306a36Sopenharmony_ci	 * input here, fix that up.
24562306a36Sopenharmony_ci	 */
24662306a36Sopenharmony_ci	if (test_bit(FLAG_OPEN_DRAIN, &desc->flags) &&
24762306a36Sopenharmony_ci	    test_bit(FLAG_IS_OUT, &desc->flags))
24862306a36Sopenharmony_ci		return 0;
24962306a36Sopenharmony_ci
25062306a36Sopenharmony_ci	if (!gc->get_direction)
25162306a36Sopenharmony_ci		return -ENOTSUPP;
25262306a36Sopenharmony_ci
25362306a36Sopenharmony_ci	ret = gc->get_direction(gc, offset);
25462306a36Sopenharmony_ci	if (ret < 0)
25562306a36Sopenharmony_ci		return ret;
25662306a36Sopenharmony_ci
25762306a36Sopenharmony_ci	/* GPIOF_DIR_IN or other positive, otherwise GPIOF_DIR_OUT */
25862306a36Sopenharmony_ci	if (ret > 0)
25962306a36Sopenharmony_ci		ret = 1;
26062306a36Sopenharmony_ci
26162306a36Sopenharmony_ci	assign_bit(FLAG_IS_OUT, &desc->flags, !ret);
26262306a36Sopenharmony_ci
26362306a36Sopenharmony_ci	return ret;
26462306a36Sopenharmony_ci}
26562306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiod_get_direction);
26662306a36Sopenharmony_ci
26762306a36Sopenharmony_ci/*
26862306a36Sopenharmony_ci * Add a new chip to the global chips list, keeping the list of chips sorted
26962306a36Sopenharmony_ci * by range(means [base, base + ngpio - 1]) order.
27062306a36Sopenharmony_ci *
27162306a36Sopenharmony_ci * Return -EBUSY if the new chip overlaps with some other chip's integer
27262306a36Sopenharmony_ci * space.
27362306a36Sopenharmony_ci */
27462306a36Sopenharmony_cistatic int gpiodev_add_to_list(struct gpio_device *gdev)
27562306a36Sopenharmony_ci{
27662306a36Sopenharmony_ci	struct gpio_device *prev, *next;
27762306a36Sopenharmony_ci
27862306a36Sopenharmony_ci	if (list_empty(&gpio_devices)) {
27962306a36Sopenharmony_ci		/* initial entry in list */
28062306a36Sopenharmony_ci		list_add_tail(&gdev->list, &gpio_devices);
28162306a36Sopenharmony_ci		return 0;
28262306a36Sopenharmony_ci	}
28362306a36Sopenharmony_ci
28462306a36Sopenharmony_ci	next = list_first_entry(&gpio_devices, struct gpio_device, list);
28562306a36Sopenharmony_ci	if (gdev->base + gdev->ngpio <= next->base) {
28662306a36Sopenharmony_ci		/* add before first entry */
28762306a36Sopenharmony_ci		list_add(&gdev->list, &gpio_devices);
28862306a36Sopenharmony_ci		return 0;
28962306a36Sopenharmony_ci	}
29062306a36Sopenharmony_ci
29162306a36Sopenharmony_ci	prev = list_last_entry(&gpio_devices, struct gpio_device, list);
29262306a36Sopenharmony_ci	if (prev->base + prev->ngpio <= gdev->base) {
29362306a36Sopenharmony_ci		/* add behind last entry */
29462306a36Sopenharmony_ci		list_add_tail(&gdev->list, &gpio_devices);
29562306a36Sopenharmony_ci		return 0;
29662306a36Sopenharmony_ci	}
29762306a36Sopenharmony_ci
29862306a36Sopenharmony_ci	list_for_each_entry_safe(prev, next, &gpio_devices, list) {
29962306a36Sopenharmony_ci		/* at the end of the list */
30062306a36Sopenharmony_ci		if (&next->list == &gpio_devices)
30162306a36Sopenharmony_ci			break;
30262306a36Sopenharmony_ci
30362306a36Sopenharmony_ci		/* add between prev and next */
30462306a36Sopenharmony_ci		if (prev->base + prev->ngpio <= gdev->base
30562306a36Sopenharmony_ci				&& gdev->base + gdev->ngpio <= next->base) {
30662306a36Sopenharmony_ci			list_add(&gdev->list, &prev->list);
30762306a36Sopenharmony_ci			return 0;
30862306a36Sopenharmony_ci		}
30962306a36Sopenharmony_ci	}
31062306a36Sopenharmony_ci
31162306a36Sopenharmony_ci	return -EBUSY;
31262306a36Sopenharmony_ci}
31362306a36Sopenharmony_ci
31462306a36Sopenharmony_ci/*
31562306a36Sopenharmony_ci * Convert a GPIO name to its descriptor
31662306a36Sopenharmony_ci * Note that there is no guarantee that GPIO names are globally unique!
31762306a36Sopenharmony_ci * Hence this function will return, if it exists, a reference to the first GPIO
31862306a36Sopenharmony_ci * line found that matches the given name.
31962306a36Sopenharmony_ci */
32062306a36Sopenharmony_cistatic struct gpio_desc *gpio_name_to_desc(const char * const name)
32162306a36Sopenharmony_ci{
32262306a36Sopenharmony_ci	struct gpio_device *gdev;
32362306a36Sopenharmony_ci	unsigned long flags;
32462306a36Sopenharmony_ci
32562306a36Sopenharmony_ci	if (!name)
32662306a36Sopenharmony_ci		return NULL;
32762306a36Sopenharmony_ci
32862306a36Sopenharmony_ci	spin_lock_irqsave(&gpio_lock, flags);
32962306a36Sopenharmony_ci
33062306a36Sopenharmony_ci	list_for_each_entry(gdev, &gpio_devices, list) {
33162306a36Sopenharmony_ci		struct gpio_desc *desc;
33262306a36Sopenharmony_ci
33362306a36Sopenharmony_ci		for_each_gpio_desc(gdev->chip, desc) {
33462306a36Sopenharmony_ci			if (desc->name && !strcmp(desc->name, name)) {
33562306a36Sopenharmony_ci				spin_unlock_irqrestore(&gpio_lock, flags);
33662306a36Sopenharmony_ci				return desc;
33762306a36Sopenharmony_ci			}
33862306a36Sopenharmony_ci		}
33962306a36Sopenharmony_ci	}
34062306a36Sopenharmony_ci
34162306a36Sopenharmony_ci	spin_unlock_irqrestore(&gpio_lock, flags);
34262306a36Sopenharmony_ci
34362306a36Sopenharmony_ci	return NULL;
34462306a36Sopenharmony_ci}
34562306a36Sopenharmony_ci
34662306a36Sopenharmony_ci/*
34762306a36Sopenharmony_ci * Take the names from gc->names and assign them to their GPIO descriptors.
34862306a36Sopenharmony_ci * Warn if a name is already used for a GPIO line on a different GPIO chip.
34962306a36Sopenharmony_ci *
35062306a36Sopenharmony_ci * Note that:
35162306a36Sopenharmony_ci *   1. Non-unique names are still accepted,
35262306a36Sopenharmony_ci *   2. Name collisions within the same GPIO chip are not reported.
35362306a36Sopenharmony_ci */
35462306a36Sopenharmony_cistatic int gpiochip_set_desc_names(struct gpio_chip *gc)
35562306a36Sopenharmony_ci{
35662306a36Sopenharmony_ci	struct gpio_device *gdev = gc->gpiodev;
35762306a36Sopenharmony_ci	int i;
35862306a36Sopenharmony_ci
35962306a36Sopenharmony_ci	/* First check all names if they are unique */
36062306a36Sopenharmony_ci	for (i = 0; i != gc->ngpio; ++i) {
36162306a36Sopenharmony_ci		struct gpio_desc *gpio;
36262306a36Sopenharmony_ci
36362306a36Sopenharmony_ci		gpio = gpio_name_to_desc(gc->names[i]);
36462306a36Sopenharmony_ci		if (gpio)
36562306a36Sopenharmony_ci			dev_warn(&gdev->dev,
36662306a36Sopenharmony_ci				 "Detected name collision for GPIO name '%s'\n",
36762306a36Sopenharmony_ci				 gc->names[i]);
36862306a36Sopenharmony_ci	}
36962306a36Sopenharmony_ci
37062306a36Sopenharmony_ci	/* Then add all names to the GPIO descriptors */
37162306a36Sopenharmony_ci	for (i = 0; i != gc->ngpio; ++i)
37262306a36Sopenharmony_ci		gdev->descs[i].name = gc->names[i];
37362306a36Sopenharmony_ci
37462306a36Sopenharmony_ci	return 0;
37562306a36Sopenharmony_ci}
37662306a36Sopenharmony_ci
37762306a36Sopenharmony_ci/*
37862306a36Sopenharmony_ci * gpiochip_set_names - Set GPIO line names using device properties
37962306a36Sopenharmony_ci * @chip: GPIO chip whose lines should be named, if possible
38062306a36Sopenharmony_ci *
38162306a36Sopenharmony_ci * Looks for device property "gpio-line-names" and if it exists assigns
38262306a36Sopenharmony_ci * GPIO line names for the chip. The memory allocated for the assigned
38362306a36Sopenharmony_ci * names belong to the underlying firmware node and should not be released
38462306a36Sopenharmony_ci * by the caller.
38562306a36Sopenharmony_ci */
38662306a36Sopenharmony_cistatic int gpiochip_set_names(struct gpio_chip *chip)
38762306a36Sopenharmony_ci{
38862306a36Sopenharmony_ci	struct gpio_device *gdev = chip->gpiodev;
38962306a36Sopenharmony_ci	struct device *dev = &gdev->dev;
39062306a36Sopenharmony_ci	const char **names;
39162306a36Sopenharmony_ci	int ret, i;
39262306a36Sopenharmony_ci	int count;
39362306a36Sopenharmony_ci
39462306a36Sopenharmony_ci	count = device_property_string_array_count(dev, "gpio-line-names");
39562306a36Sopenharmony_ci	if (count < 0)
39662306a36Sopenharmony_ci		return 0;
39762306a36Sopenharmony_ci
39862306a36Sopenharmony_ci	/*
39962306a36Sopenharmony_ci	 * When offset is set in the driver side we assume the driver internally
40062306a36Sopenharmony_ci	 * is using more than one gpiochip per the same device. We have to stop
40162306a36Sopenharmony_ci	 * setting friendly names if the specified ones with 'gpio-line-names'
40262306a36Sopenharmony_ci	 * are less than the offset in the device itself. This means all the
40362306a36Sopenharmony_ci	 * lines are not present for every single pin within all the internal
40462306a36Sopenharmony_ci	 * gpiochips.
40562306a36Sopenharmony_ci	 */
40662306a36Sopenharmony_ci	if (count <= chip->offset) {
40762306a36Sopenharmony_ci		dev_warn(dev, "gpio-line-names too short (length %d), cannot map names for the gpiochip at offset %u\n",
40862306a36Sopenharmony_ci			 count, chip->offset);
40962306a36Sopenharmony_ci		return 0;
41062306a36Sopenharmony_ci	}
41162306a36Sopenharmony_ci
41262306a36Sopenharmony_ci	names = kcalloc(count, sizeof(*names), GFP_KERNEL);
41362306a36Sopenharmony_ci	if (!names)
41462306a36Sopenharmony_ci		return -ENOMEM;
41562306a36Sopenharmony_ci
41662306a36Sopenharmony_ci	ret = device_property_read_string_array(dev, "gpio-line-names",
41762306a36Sopenharmony_ci						names, count);
41862306a36Sopenharmony_ci	if (ret < 0) {
41962306a36Sopenharmony_ci		dev_warn(dev, "failed to read GPIO line names\n");
42062306a36Sopenharmony_ci		kfree(names);
42162306a36Sopenharmony_ci		return ret;
42262306a36Sopenharmony_ci	}
42362306a36Sopenharmony_ci
42462306a36Sopenharmony_ci	/*
42562306a36Sopenharmony_ci	 * When more that one gpiochip per device is used, 'count' can
42662306a36Sopenharmony_ci	 * contain at most number gpiochips x chip->ngpio. We have to
42762306a36Sopenharmony_ci	 * correctly distribute all defined lines taking into account
42862306a36Sopenharmony_ci	 * chip->offset as starting point from where we will assign
42962306a36Sopenharmony_ci	 * the names to pins from the 'names' array. Since property
43062306a36Sopenharmony_ci	 * 'gpio-line-names' cannot contains gaps, we have to be sure
43162306a36Sopenharmony_ci	 * we only assign those pins that really exists since chip->ngpio
43262306a36Sopenharmony_ci	 * can be different of the chip->offset.
43362306a36Sopenharmony_ci	 */
43462306a36Sopenharmony_ci	count = (count > chip->offset) ? count - chip->offset : count;
43562306a36Sopenharmony_ci	if (count > chip->ngpio)
43662306a36Sopenharmony_ci		count = chip->ngpio;
43762306a36Sopenharmony_ci
43862306a36Sopenharmony_ci	for (i = 0; i < count; i++) {
43962306a36Sopenharmony_ci		/*
44062306a36Sopenharmony_ci		 * Allow overriding "fixed" names provided by the GPIO
44162306a36Sopenharmony_ci		 * provider. The "fixed" names are more often than not
44262306a36Sopenharmony_ci		 * generic and less informative than the names given in
44362306a36Sopenharmony_ci		 * device properties.
44462306a36Sopenharmony_ci		 */
44562306a36Sopenharmony_ci		if (names[chip->offset + i] && names[chip->offset + i][0])
44662306a36Sopenharmony_ci			gdev->descs[i].name = names[chip->offset + i];
44762306a36Sopenharmony_ci	}
44862306a36Sopenharmony_ci
44962306a36Sopenharmony_ci	kfree(names);
45062306a36Sopenharmony_ci
45162306a36Sopenharmony_ci	return 0;
45262306a36Sopenharmony_ci}
45362306a36Sopenharmony_ci
45462306a36Sopenharmony_cistatic unsigned long *gpiochip_allocate_mask(struct gpio_chip *gc)
45562306a36Sopenharmony_ci{
45662306a36Sopenharmony_ci	unsigned long *p;
45762306a36Sopenharmony_ci
45862306a36Sopenharmony_ci	p = bitmap_alloc(gc->ngpio, GFP_KERNEL);
45962306a36Sopenharmony_ci	if (!p)
46062306a36Sopenharmony_ci		return NULL;
46162306a36Sopenharmony_ci
46262306a36Sopenharmony_ci	/* Assume by default all GPIOs are valid */
46362306a36Sopenharmony_ci	bitmap_fill(p, gc->ngpio);
46462306a36Sopenharmony_ci
46562306a36Sopenharmony_ci	return p;
46662306a36Sopenharmony_ci}
46762306a36Sopenharmony_ci
46862306a36Sopenharmony_cistatic void gpiochip_free_mask(unsigned long **p)
46962306a36Sopenharmony_ci{
47062306a36Sopenharmony_ci	bitmap_free(*p);
47162306a36Sopenharmony_ci	*p = NULL;
47262306a36Sopenharmony_ci}
47362306a36Sopenharmony_ci
47462306a36Sopenharmony_cistatic unsigned int gpiochip_count_reserved_ranges(struct gpio_chip *gc)
47562306a36Sopenharmony_ci{
47662306a36Sopenharmony_ci	struct device *dev = &gc->gpiodev->dev;
47762306a36Sopenharmony_ci	int size;
47862306a36Sopenharmony_ci
47962306a36Sopenharmony_ci	/* Format is "start, count, ..." */
48062306a36Sopenharmony_ci	size = device_property_count_u32(dev, "gpio-reserved-ranges");
48162306a36Sopenharmony_ci	if (size > 0 && size % 2 == 0)
48262306a36Sopenharmony_ci		return size;
48362306a36Sopenharmony_ci
48462306a36Sopenharmony_ci	return 0;
48562306a36Sopenharmony_ci}
48662306a36Sopenharmony_ci
48762306a36Sopenharmony_cistatic int gpiochip_apply_reserved_ranges(struct gpio_chip *gc)
48862306a36Sopenharmony_ci{
48962306a36Sopenharmony_ci	struct device *dev = &gc->gpiodev->dev;
49062306a36Sopenharmony_ci	unsigned int size;
49162306a36Sopenharmony_ci	u32 *ranges;
49262306a36Sopenharmony_ci	int ret;
49362306a36Sopenharmony_ci
49462306a36Sopenharmony_ci	size = gpiochip_count_reserved_ranges(gc);
49562306a36Sopenharmony_ci	if (size == 0)
49662306a36Sopenharmony_ci		return 0;
49762306a36Sopenharmony_ci
49862306a36Sopenharmony_ci	ranges = kmalloc_array(size, sizeof(*ranges), GFP_KERNEL);
49962306a36Sopenharmony_ci	if (!ranges)
50062306a36Sopenharmony_ci		return -ENOMEM;
50162306a36Sopenharmony_ci
50262306a36Sopenharmony_ci	ret = device_property_read_u32_array(dev, "gpio-reserved-ranges",
50362306a36Sopenharmony_ci					     ranges, size);
50462306a36Sopenharmony_ci	if (ret) {
50562306a36Sopenharmony_ci		kfree(ranges);
50662306a36Sopenharmony_ci		return ret;
50762306a36Sopenharmony_ci	}
50862306a36Sopenharmony_ci
50962306a36Sopenharmony_ci	while (size) {
51062306a36Sopenharmony_ci		u32 count = ranges[--size];
51162306a36Sopenharmony_ci		u32 start = ranges[--size];
51262306a36Sopenharmony_ci
51362306a36Sopenharmony_ci		if (start >= gc->ngpio || start + count > gc->ngpio)
51462306a36Sopenharmony_ci			continue;
51562306a36Sopenharmony_ci
51662306a36Sopenharmony_ci		bitmap_clear(gc->valid_mask, start, count);
51762306a36Sopenharmony_ci	}
51862306a36Sopenharmony_ci
51962306a36Sopenharmony_ci	kfree(ranges);
52062306a36Sopenharmony_ci	return 0;
52162306a36Sopenharmony_ci}
52262306a36Sopenharmony_ci
52362306a36Sopenharmony_cistatic int gpiochip_init_valid_mask(struct gpio_chip *gc)
52462306a36Sopenharmony_ci{
52562306a36Sopenharmony_ci	int ret;
52662306a36Sopenharmony_ci
52762306a36Sopenharmony_ci	if (!(gpiochip_count_reserved_ranges(gc) || gc->init_valid_mask))
52862306a36Sopenharmony_ci		return 0;
52962306a36Sopenharmony_ci
53062306a36Sopenharmony_ci	gc->valid_mask = gpiochip_allocate_mask(gc);
53162306a36Sopenharmony_ci	if (!gc->valid_mask)
53262306a36Sopenharmony_ci		return -ENOMEM;
53362306a36Sopenharmony_ci
53462306a36Sopenharmony_ci	ret = gpiochip_apply_reserved_ranges(gc);
53562306a36Sopenharmony_ci	if (ret)
53662306a36Sopenharmony_ci		return ret;
53762306a36Sopenharmony_ci
53862306a36Sopenharmony_ci	if (gc->init_valid_mask)
53962306a36Sopenharmony_ci		return gc->init_valid_mask(gc,
54062306a36Sopenharmony_ci					   gc->valid_mask,
54162306a36Sopenharmony_ci					   gc->ngpio);
54262306a36Sopenharmony_ci
54362306a36Sopenharmony_ci	return 0;
54462306a36Sopenharmony_ci}
54562306a36Sopenharmony_ci
54662306a36Sopenharmony_cistatic void gpiochip_free_valid_mask(struct gpio_chip *gc)
54762306a36Sopenharmony_ci{
54862306a36Sopenharmony_ci	gpiochip_free_mask(&gc->valid_mask);
54962306a36Sopenharmony_ci}
55062306a36Sopenharmony_ci
55162306a36Sopenharmony_cistatic int gpiochip_add_pin_ranges(struct gpio_chip *gc)
55262306a36Sopenharmony_ci{
55362306a36Sopenharmony_ci	/*
55462306a36Sopenharmony_ci	 * Device Tree platforms are supposed to use "gpio-ranges"
55562306a36Sopenharmony_ci	 * property. This check ensures that the ->add_pin_ranges()
55662306a36Sopenharmony_ci	 * won't be called for them.
55762306a36Sopenharmony_ci	 */
55862306a36Sopenharmony_ci	if (device_property_present(&gc->gpiodev->dev, "gpio-ranges"))
55962306a36Sopenharmony_ci		return 0;
56062306a36Sopenharmony_ci
56162306a36Sopenharmony_ci	if (gc->add_pin_ranges)
56262306a36Sopenharmony_ci		return gc->add_pin_ranges(gc);
56362306a36Sopenharmony_ci
56462306a36Sopenharmony_ci	return 0;
56562306a36Sopenharmony_ci}
56662306a36Sopenharmony_ci
56762306a36Sopenharmony_cibool gpiochip_line_is_valid(const struct gpio_chip *gc,
56862306a36Sopenharmony_ci				unsigned int offset)
56962306a36Sopenharmony_ci{
57062306a36Sopenharmony_ci	/* No mask means all valid */
57162306a36Sopenharmony_ci	if (likely(!gc->valid_mask))
57262306a36Sopenharmony_ci		return true;
57362306a36Sopenharmony_ci	return test_bit(offset, gc->valid_mask);
57462306a36Sopenharmony_ci}
57562306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiochip_line_is_valid);
57662306a36Sopenharmony_ci
57762306a36Sopenharmony_cistatic void gpiodev_release(struct device *dev)
57862306a36Sopenharmony_ci{
57962306a36Sopenharmony_ci	struct gpio_device *gdev = to_gpio_device(dev);
58062306a36Sopenharmony_ci	unsigned long flags;
58162306a36Sopenharmony_ci
58262306a36Sopenharmony_ci	spin_lock_irqsave(&gpio_lock, flags);
58362306a36Sopenharmony_ci	list_del(&gdev->list);
58462306a36Sopenharmony_ci	spin_unlock_irqrestore(&gpio_lock, flags);
58562306a36Sopenharmony_ci
58662306a36Sopenharmony_ci	ida_free(&gpio_ida, gdev->id);
58762306a36Sopenharmony_ci	kfree_const(gdev->label);
58862306a36Sopenharmony_ci	kfree(gdev->descs);
58962306a36Sopenharmony_ci	kfree(gdev);
59062306a36Sopenharmony_ci}
59162306a36Sopenharmony_ci
59262306a36Sopenharmony_ci#ifdef CONFIG_GPIO_CDEV
59362306a36Sopenharmony_ci#define gcdev_register(gdev, devt)	gpiolib_cdev_register((gdev), (devt))
59462306a36Sopenharmony_ci#define gcdev_unregister(gdev)		gpiolib_cdev_unregister((gdev))
59562306a36Sopenharmony_ci#else
59662306a36Sopenharmony_ci/*
59762306a36Sopenharmony_ci * gpiolib_cdev_register() indirectly calls device_add(), which is still
59862306a36Sopenharmony_ci * required even when cdev is not selected.
59962306a36Sopenharmony_ci */
60062306a36Sopenharmony_ci#define gcdev_register(gdev, devt)	device_add(&(gdev)->dev)
60162306a36Sopenharmony_ci#define gcdev_unregister(gdev)		device_del(&(gdev)->dev)
60262306a36Sopenharmony_ci#endif
60362306a36Sopenharmony_ci
60462306a36Sopenharmony_cistatic int gpiochip_setup_dev(struct gpio_device *gdev)
60562306a36Sopenharmony_ci{
60662306a36Sopenharmony_ci	struct fwnode_handle *fwnode = dev_fwnode(&gdev->dev);
60762306a36Sopenharmony_ci	int ret;
60862306a36Sopenharmony_ci
60962306a36Sopenharmony_ci	/*
61062306a36Sopenharmony_ci	 * If fwnode doesn't belong to another device, it's safe to clear its
61162306a36Sopenharmony_ci	 * initialized flag.
61262306a36Sopenharmony_ci	 */
61362306a36Sopenharmony_ci	if (fwnode && !fwnode->dev)
61462306a36Sopenharmony_ci		fwnode_dev_initialized(fwnode, false);
61562306a36Sopenharmony_ci
61662306a36Sopenharmony_ci	ret = gcdev_register(gdev, gpio_devt);
61762306a36Sopenharmony_ci	if (ret)
61862306a36Sopenharmony_ci		return ret;
61962306a36Sopenharmony_ci
62062306a36Sopenharmony_ci	/* From this point, the .release() function cleans up gpio_device */
62162306a36Sopenharmony_ci	gdev->dev.release = gpiodev_release;
62262306a36Sopenharmony_ci
62362306a36Sopenharmony_ci	ret = gpiochip_sysfs_register(gdev);
62462306a36Sopenharmony_ci	if (ret)
62562306a36Sopenharmony_ci		goto err_remove_device;
62662306a36Sopenharmony_ci
62762306a36Sopenharmony_ci	dev_dbg(&gdev->dev, "registered GPIOs %d to %d on %s\n", gdev->base,
62862306a36Sopenharmony_ci		gdev->base + gdev->ngpio - 1, gdev->chip->label ? : "generic");
62962306a36Sopenharmony_ci
63062306a36Sopenharmony_ci	return 0;
63162306a36Sopenharmony_ci
63262306a36Sopenharmony_cierr_remove_device:
63362306a36Sopenharmony_ci	gcdev_unregister(gdev);
63462306a36Sopenharmony_ci	return ret;
63562306a36Sopenharmony_ci}
63662306a36Sopenharmony_ci
63762306a36Sopenharmony_cistatic void gpiochip_machine_hog(struct gpio_chip *gc, struct gpiod_hog *hog)
63862306a36Sopenharmony_ci{
63962306a36Sopenharmony_ci	struct gpio_desc *desc;
64062306a36Sopenharmony_ci	int rv;
64162306a36Sopenharmony_ci
64262306a36Sopenharmony_ci	desc = gpiochip_get_desc(gc, hog->chip_hwnum);
64362306a36Sopenharmony_ci	if (IS_ERR(desc)) {
64462306a36Sopenharmony_ci		chip_err(gc, "%s: unable to get GPIO desc: %ld\n", __func__,
64562306a36Sopenharmony_ci			 PTR_ERR(desc));
64662306a36Sopenharmony_ci		return;
64762306a36Sopenharmony_ci	}
64862306a36Sopenharmony_ci
64962306a36Sopenharmony_ci	if (test_bit(FLAG_IS_HOGGED, &desc->flags))
65062306a36Sopenharmony_ci		return;
65162306a36Sopenharmony_ci
65262306a36Sopenharmony_ci	rv = gpiod_hog(desc, hog->line_name, hog->lflags, hog->dflags);
65362306a36Sopenharmony_ci	if (rv)
65462306a36Sopenharmony_ci		gpiod_err(desc, "%s: unable to hog GPIO line (%s:%u): %d\n",
65562306a36Sopenharmony_ci			  __func__, gc->label, hog->chip_hwnum, rv);
65662306a36Sopenharmony_ci}
65762306a36Sopenharmony_ci
65862306a36Sopenharmony_cistatic void machine_gpiochip_add(struct gpio_chip *gc)
65962306a36Sopenharmony_ci{
66062306a36Sopenharmony_ci	struct gpiod_hog *hog;
66162306a36Sopenharmony_ci
66262306a36Sopenharmony_ci	mutex_lock(&gpio_machine_hogs_mutex);
66362306a36Sopenharmony_ci
66462306a36Sopenharmony_ci	list_for_each_entry(hog, &gpio_machine_hogs, list) {
66562306a36Sopenharmony_ci		if (!strcmp(gc->label, hog->chip_label))
66662306a36Sopenharmony_ci			gpiochip_machine_hog(gc, hog);
66762306a36Sopenharmony_ci	}
66862306a36Sopenharmony_ci
66962306a36Sopenharmony_ci	mutex_unlock(&gpio_machine_hogs_mutex);
67062306a36Sopenharmony_ci}
67162306a36Sopenharmony_ci
67262306a36Sopenharmony_cistatic void gpiochip_setup_devs(void)
67362306a36Sopenharmony_ci{
67462306a36Sopenharmony_ci	struct gpio_device *gdev;
67562306a36Sopenharmony_ci	int ret;
67662306a36Sopenharmony_ci
67762306a36Sopenharmony_ci	list_for_each_entry(gdev, &gpio_devices, list) {
67862306a36Sopenharmony_ci		ret = gpiochip_setup_dev(gdev);
67962306a36Sopenharmony_ci		if (ret)
68062306a36Sopenharmony_ci			dev_err(&gdev->dev,
68162306a36Sopenharmony_ci				"Failed to initialize gpio device (%d)\n", ret);
68262306a36Sopenharmony_ci	}
68362306a36Sopenharmony_ci}
68462306a36Sopenharmony_ci
68562306a36Sopenharmony_cistatic void gpiochip_set_data(struct gpio_chip *gc, void *data)
68662306a36Sopenharmony_ci{
68762306a36Sopenharmony_ci	gc->gpiodev->data = data;
68862306a36Sopenharmony_ci}
68962306a36Sopenharmony_ci
69062306a36Sopenharmony_ci/**
69162306a36Sopenharmony_ci * gpiochip_get_data() - get per-subdriver data for the chip
69262306a36Sopenharmony_ci * @gc: GPIO chip
69362306a36Sopenharmony_ci *
69462306a36Sopenharmony_ci * Returns:
69562306a36Sopenharmony_ci * The per-subdriver data for the chip.
69662306a36Sopenharmony_ci */
69762306a36Sopenharmony_civoid *gpiochip_get_data(struct gpio_chip *gc)
69862306a36Sopenharmony_ci{
69962306a36Sopenharmony_ci	return gc->gpiodev->data;
70062306a36Sopenharmony_ci}
70162306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiochip_get_data);
70262306a36Sopenharmony_ci
70362306a36Sopenharmony_ciint gpiochip_get_ngpios(struct gpio_chip *gc, struct device *dev)
70462306a36Sopenharmony_ci{
70562306a36Sopenharmony_ci	u32 ngpios = gc->ngpio;
70662306a36Sopenharmony_ci	int ret;
70762306a36Sopenharmony_ci
70862306a36Sopenharmony_ci	if (ngpios == 0) {
70962306a36Sopenharmony_ci		ret = device_property_read_u32(dev, "ngpios", &ngpios);
71062306a36Sopenharmony_ci		if (ret == -ENODATA)
71162306a36Sopenharmony_ci			/*
71262306a36Sopenharmony_ci			 * -ENODATA means that there is no property found and
71362306a36Sopenharmony_ci			 * we want to issue the error message to the user.
71462306a36Sopenharmony_ci			 * Besides that, we want to return different error code
71562306a36Sopenharmony_ci			 * to state that supplied value is not valid.
71662306a36Sopenharmony_ci			 */
71762306a36Sopenharmony_ci			ngpios = 0;
71862306a36Sopenharmony_ci		else if (ret)
71962306a36Sopenharmony_ci			return ret;
72062306a36Sopenharmony_ci
72162306a36Sopenharmony_ci		gc->ngpio = ngpios;
72262306a36Sopenharmony_ci	}
72362306a36Sopenharmony_ci
72462306a36Sopenharmony_ci	if (gc->ngpio == 0) {
72562306a36Sopenharmony_ci		chip_err(gc, "tried to insert a GPIO chip with zero lines\n");
72662306a36Sopenharmony_ci		return -EINVAL;
72762306a36Sopenharmony_ci	}
72862306a36Sopenharmony_ci
72962306a36Sopenharmony_ci	if (gc->ngpio > FASTPATH_NGPIO)
73062306a36Sopenharmony_ci		chip_warn(gc, "line cnt %u is greater than fast path cnt %u\n",
73162306a36Sopenharmony_ci			gc->ngpio, FASTPATH_NGPIO);
73262306a36Sopenharmony_ci
73362306a36Sopenharmony_ci	return 0;
73462306a36Sopenharmony_ci}
73562306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiochip_get_ngpios);
73662306a36Sopenharmony_ci
73762306a36Sopenharmony_ciint gpiochip_add_data_with_key(struct gpio_chip *gc, void *data,
73862306a36Sopenharmony_ci			       struct lock_class_key *lock_key,
73962306a36Sopenharmony_ci			       struct lock_class_key *request_key)
74062306a36Sopenharmony_ci{
74162306a36Sopenharmony_ci	struct gpio_device *gdev;
74262306a36Sopenharmony_ci	unsigned long flags;
74362306a36Sopenharmony_ci	unsigned int i;
74462306a36Sopenharmony_ci	int base = 0;
74562306a36Sopenharmony_ci	int ret = 0;
74662306a36Sopenharmony_ci
74762306a36Sopenharmony_ci	/*
74862306a36Sopenharmony_ci	 * First: allocate and populate the internal stat container, and
74962306a36Sopenharmony_ci	 * set up the struct device.
75062306a36Sopenharmony_ci	 */
75162306a36Sopenharmony_ci	gdev = kzalloc(sizeof(*gdev), GFP_KERNEL);
75262306a36Sopenharmony_ci	if (!gdev)
75362306a36Sopenharmony_ci		return -ENOMEM;
75462306a36Sopenharmony_ci	gdev->dev.bus = &gpio_bus_type;
75562306a36Sopenharmony_ci	gdev->dev.parent = gc->parent;
75662306a36Sopenharmony_ci	gdev->chip = gc;
75762306a36Sopenharmony_ci
75862306a36Sopenharmony_ci	gc->gpiodev = gdev;
75962306a36Sopenharmony_ci	gpiochip_set_data(gc, data);
76062306a36Sopenharmony_ci
76162306a36Sopenharmony_ci	/*
76262306a36Sopenharmony_ci	 * If the calling driver did not initialize firmware node,
76362306a36Sopenharmony_ci	 * do it here using the parent device, if any.
76462306a36Sopenharmony_ci	 */
76562306a36Sopenharmony_ci	if (gc->fwnode)
76662306a36Sopenharmony_ci		device_set_node(&gdev->dev, gc->fwnode);
76762306a36Sopenharmony_ci	else if (gc->parent)
76862306a36Sopenharmony_ci		device_set_node(&gdev->dev, dev_fwnode(gc->parent));
76962306a36Sopenharmony_ci
77062306a36Sopenharmony_ci	gdev->id = ida_alloc(&gpio_ida, GFP_KERNEL);
77162306a36Sopenharmony_ci	if (gdev->id < 0) {
77262306a36Sopenharmony_ci		ret = gdev->id;
77362306a36Sopenharmony_ci		goto err_free_gdev;
77462306a36Sopenharmony_ci	}
77562306a36Sopenharmony_ci
77662306a36Sopenharmony_ci	ret = dev_set_name(&gdev->dev, GPIOCHIP_NAME "%d", gdev->id);
77762306a36Sopenharmony_ci	if (ret)
77862306a36Sopenharmony_ci		goto err_free_ida;
77962306a36Sopenharmony_ci
78062306a36Sopenharmony_ci	device_initialize(&gdev->dev);
78162306a36Sopenharmony_ci	if (gc->parent && gc->parent->driver)
78262306a36Sopenharmony_ci		gdev->owner = gc->parent->driver->owner;
78362306a36Sopenharmony_ci	else if (gc->owner)
78462306a36Sopenharmony_ci		/* TODO: remove chip->owner */
78562306a36Sopenharmony_ci		gdev->owner = gc->owner;
78662306a36Sopenharmony_ci	else
78762306a36Sopenharmony_ci		gdev->owner = THIS_MODULE;
78862306a36Sopenharmony_ci
78962306a36Sopenharmony_ci	ret = gpiochip_get_ngpios(gc, &gdev->dev);
79062306a36Sopenharmony_ci	if (ret)
79162306a36Sopenharmony_ci		goto err_free_dev_name;
79262306a36Sopenharmony_ci
79362306a36Sopenharmony_ci	gdev->descs = kcalloc(gc->ngpio, sizeof(*gdev->descs), GFP_KERNEL);
79462306a36Sopenharmony_ci	if (!gdev->descs) {
79562306a36Sopenharmony_ci		ret = -ENOMEM;
79662306a36Sopenharmony_ci		goto err_free_dev_name;
79762306a36Sopenharmony_ci	}
79862306a36Sopenharmony_ci
79962306a36Sopenharmony_ci	gdev->label = kstrdup_const(gc->label ?: "unknown", GFP_KERNEL);
80062306a36Sopenharmony_ci	if (!gdev->label) {
80162306a36Sopenharmony_ci		ret = -ENOMEM;
80262306a36Sopenharmony_ci		goto err_free_descs;
80362306a36Sopenharmony_ci	}
80462306a36Sopenharmony_ci
80562306a36Sopenharmony_ci	gdev->ngpio = gc->ngpio;
80662306a36Sopenharmony_ci
80762306a36Sopenharmony_ci	spin_lock_irqsave(&gpio_lock, flags);
80862306a36Sopenharmony_ci
80962306a36Sopenharmony_ci	/*
81062306a36Sopenharmony_ci	 * TODO: this allocates a Linux GPIO number base in the global
81162306a36Sopenharmony_ci	 * GPIO numberspace for this chip. In the long run we want to
81262306a36Sopenharmony_ci	 * get *rid* of this numberspace and use only descriptors, but
81362306a36Sopenharmony_ci	 * it may be a pipe dream. It will not happen before we get rid
81462306a36Sopenharmony_ci	 * of the sysfs interface anyways.
81562306a36Sopenharmony_ci	 */
81662306a36Sopenharmony_ci	base = gc->base;
81762306a36Sopenharmony_ci	if (base < 0) {
81862306a36Sopenharmony_ci		base = gpiochip_find_base(gc->ngpio);
81962306a36Sopenharmony_ci		if (base < 0) {
82062306a36Sopenharmony_ci			spin_unlock_irqrestore(&gpio_lock, flags);
82162306a36Sopenharmony_ci			ret = base;
82262306a36Sopenharmony_ci			base = 0;
82362306a36Sopenharmony_ci			goto err_free_label;
82462306a36Sopenharmony_ci		}
82562306a36Sopenharmony_ci		/*
82662306a36Sopenharmony_ci		 * TODO: it should not be necessary to reflect the assigned
82762306a36Sopenharmony_ci		 * base outside of the GPIO subsystem. Go over drivers and
82862306a36Sopenharmony_ci		 * see if anyone makes use of this, else drop this and assign
82962306a36Sopenharmony_ci		 * a poison instead.
83062306a36Sopenharmony_ci		 */
83162306a36Sopenharmony_ci		gc->base = base;
83262306a36Sopenharmony_ci	} else {
83362306a36Sopenharmony_ci		dev_warn(&gdev->dev,
83462306a36Sopenharmony_ci			 "Static allocation of GPIO base is deprecated, use dynamic allocation.\n");
83562306a36Sopenharmony_ci	}
83662306a36Sopenharmony_ci	gdev->base = base;
83762306a36Sopenharmony_ci
83862306a36Sopenharmony_ci	ret = gpiodev_add_to_list(gdev);
83962306a36Sopenharmony_ci	if (ret) {
84062306a36Sopenharmony_ci		spin_unlock_irqrestore(&gpio_lock, flags);
84162306a36Sopenharmony_ci		chip_err(gc, "GPIO integer space overlap, cannot add chip\n");
84262306a36Sopenharmony_ci		goto err_free_label;
84362306a36Sopenharmony_ci	}
84462306a36Sopenharmony_ci
84562306a36Sopenharmony_ci	for (i = 0; i < gc->ngpio; i++)
84662306a36Sopenharmony_ci		gdev->descs[i].gdev = gdev;
84762306a36Sopenharmony_ci
84862306a36Sopenharmony_ci	spin_unlock_irqrestore(&gpio_lock, flags);
84962306a36Sopenharmony_ci
85062306a36Sopenharmony_ci	BLOCKING_INIT_NOTIFIER_HEAD(&gdev->line_state_notifier);
85162306a36Sopenharmony_ci	BLOCKING_INIT_NOTIFIER_HEAD(&gdev->device_notifier);
85262306a36Sopenharmony_ci	init_rwsem(&gdev->sem);
85362306a36Sopenharmony_ci
85462306a36Sopenharmony_ci#ifdef CONFIG_PINCTRL
85562306a36Sopenharmony_ci	INIT_LIST_HEAD(&gdev->pin_ranges);
85662306a36Sopenharmony_ci#endif
85762306a36Sopenharmony_ci
85862306a36Sopenharmony_ci	if (gc->names) {
85962306a36Sopenharmony_ci		ret = gpiochip_set_desc_names(gc);
86062306a36Sopenharmony_ci		if (ret)
86162306a36Sopenharmony_ci			goto err_remove_from_list;
86262306a36Sopenharmony_ci	}
86362306a36Sopenharmony_ci	ret = gpiochip_set_names(gc);
86462306a36Sopenharmony_ci	if (ret)
86562306a36Sopenharmony_ci		goto err_remove_from_list;
86662306a36Sopenharmony_ci
86762306a36Sopenharmony_ci	ret = gpiochip_init_valid_mask(gc);
86862306a36Sopenharmony_ci	if (ret)
86962306a36Sopenharmony_ci		goto err_remove_from_list;
87062306a36Sopenharmony_ci
87162306a36Sopenharmony_ci	ret = of_gpiochip_add(gc);
87262306a36Sopenharmony_ci	if (ret)
87362306a36Sopenharmony_ci		goto err_free_gpiochip_mask;
87462306a36Sopenharmony_ci
87562306a36Sopenharmony_ci	for (i = 0; i < gc->ngpio; i++) {
87662306a36Sopenharmony_ci		struct gpio_desc *desc = &gdev->descs[i];
87762306a36Sopenharmony_ci
87862306a36Sopenharmony_ci		if (gc->get_direction && gpiochip_line_is_valid(gc, i)) {
87962306a36Sopenharmony_ci			assign_bit(FLAG_IS_OUT,
88062306a36Sopenharmony_ci				   &desc->flags, !gc->get_direction(gc, i));
88162306a36Sopenharmony_ci		} else {
88262306a36Sopenharmony_ci			assign_bit(FLAG_IS_OUT,
88362306a36Sopenharmony_ci				   &desc->flags, !gc->direction_input);
88462306a36Sopenharmony_ci		}
88562306a36Sopenharmony_ci	}
88662306a36Sopenharmony_ci
88762306a36Sopenharmony_ci	ret = gpiochip_add_pin_ranges(gc);
88862306a36Sopenharmony_ci	if (ret)
88962306a36Sopenharmony_ci		goto err_remove_of_chip;
89062306a36Sopenharmony_ci
89162306a36Sopenharmony_ci	acpi_gpiochip_add(gc);
89262306a36Sopenharmony_ci
89362306a36Sopenharmony_ci	machine_gpiochip_add(gc);
89462306a36Sopenharmony_ci
89562306a36Sopenharmony_ci	ret = gpiochip_irqchip_init_valid_mask(gc);
89662306a36Sopenharmony_ci	if (ret)
89762306a36Sopenharmony_ci		goto err_free_hogs;
89862306a36Sopenharmony_ci
89962306a36Sopenharmony_ci	ret = gpiochip_irqchip_init_hw(gc);
90062306a36Sopenharmony_ci	if (ret)
90162306a36Sopenharmony_ci		goto err_remove_irqchip_mask;
90262306a36Sopenharmony_ci
90362306a36Sopenharmony_ci	ret = gpiochip_add_irqchip(gc, lock_key, request_key);
90462306a36Sopenharmony_ci	if (ret)
90562306a36Sopenharmony_ci		goto err_remove_irqchip_mask;
90662306a36Sopenharmony_ci
90762306a36Sopenharmony_ci	/*
90862306a36Sopenharmony_ci	 * By first adding the chardev, and then adding the device,
90962306a36Sopenharmony_ci	 * we get a device node entry in sysfs under
91062306a36Sopenharmony_ci	 * /sys/bus/gpio/devices/gpiochipN/dev that can be used for
91162306a36Sopenharmony_ci	 * coldplug of device nodes and other udev business.
91262306a36Sopenharmony_ci	 * We can do this only if gpiolib has been initialized.
91362306a36Sopenharmony_ci	 * Otherwise, defer until later.
91462306a36Sopenharmony_ci	 */
91562306a36Sopenharmony_ci	if (gpiolib_initialized) {
91662306a36Sopenharmony_ci		ret = gpiochip_setup_dev(gdev);
91762306a36Sopenharmony_ci		if (ret)
91862306a36Sopenharmony_ci			goto err_remove_irqchip;
91962306a36Sopenharmony_ci	}
92062306a36Sopenharmony_ci	return 0;
92162306a36Sopenharmony_ci
92262306a36Sopenharmony_cierr_remove_irqchip:
92362306a36Sopenharmony_ci	gpiochip_irqchip_remove(gc);
92462306a36Sopenharmony_cierr_remove_irqchip_mask:
92562306a36Sopenharmony_ci	gpiochip_irqchip_free_valid_mask(gc);
92662306a36Sopenharmony_cierr_free_hogs:
92762306a36Sopenharmony_ci	gpiochip_free_hogs(gc);
92862306a36Sopenharmony_ci	acpi_gpiochip_remove(gc);
92962306a36Sopenharmony_ci	gpiochip_remove_pin_ranges(gc);
93062306a36Sopenharmony_cierr_remove_of_chip:
93162306a36Sopenharmony_ci	of_gpiochip_remove(gc);
93262306a36Sopenharmony_cierr_free_gpiochip_mask:
93362306a36Sopenharmony_ci	gpiochip_free_valid_mask(gc);
93462306a36Sopenharmony_ci	if (gdev->dev.release) {
93562306a36Sopenharmony_ci		/* release() has been registered by gpiochip_setup_dev() */
93662306a36Sopenharmony_ci		gpio_device_put(gdev);
93762306a36Sopenharmony_ci		goto err_print_message;
93862306a36Sopenharmony_ci	}
93962306a36Sopenharmony_cierr_remove_from_list:
94062306a36Sopenharmony_ci	spin_lock_irqsave(&gpio_lock, flags);
94162306a36Sopenharmony_ci	list_del(&gdev->list);
94262306a36Sopenharmony_ci	spin_unlock_irqrestore(&gpio_lock, flags);
94362306a36Sopenharmony_cierr_free_label:
94462306a36Sopenharmony_ci	kfree_const(gdev->label);
94562306a36Sopenharmony_cierr_free_descs:
94662306a36Sopenharmony_ci	kfree(gdev->descs);
94762306a36Sopenharmony_cierr_free_dev_name:
94862306a36Sopenharmony_ci	kfree(dev_name(&gdev->dev));
94962306a36Sopenharmony_cierr_free_ida:
95062306a36Sopenharmony_ci	ida_free(&gpio_ida, gdev->id);
95162306a36Sopenharmony_cierr_free_gdev:
95262306a36Sopenharmony_ci	kfree(gdev);
95362306a36Sopenharmony_cierr_print_message:
95462306a36Sopenharmony_ci	/* failures here can mean systems won't boot... */
95562306a36Sopenharmony_ci	if (ret != -EPROBE_DEFER) {
95662306a36Sopenharmony_ci		pr_err("%s: GPIOs %d..%d (%s) failed to register, %d\n", __func__,
95762306a36Sopenharmony_ci		       base, base + (int)gc->ngpio - 1,
95862306a36Sopenharmony_ci		       gc->label ? : "generic", ret);
95962306a36Sopenharmony_ci	}
96062306a36Sopenharmony_ci	return ret;
96162306a36Sopenharmony_ci}
96262306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiochip_add_data_with_key);
96362306a36Sopenharmony_ci
96462306a36Sopenharmony_ci/**
96562306a36Sopenharmony_ci * gpiochip_remove() - unregister a gpio_chip
96662306a36Sopenharmony_ci * @gc: the chip to unregister
96762306a36Sopenharmony_ci *
96862306a36Sopenharmony_ci * A gpio_chip with any GPIOs still requested may not be removed.
96962306a36Sopenharmony_ci */
97062306a36Sopenharmony_civoid gpiochip_remove(struct gpio_chip *gc)
97162306a36Sopenharmony_ci{
97262306a36Sopenharmony_ci	struct gpio_device *gdev = gc->gpiodev;
97362306a36Sopenharmony_ci	unsigned long	flags;
97462306a36Sopenharmony_ci	unsigned int	i;
97562306a36Sopenharmony_ci
97662306a36Sopenharmony_ci	down_write(&gdev->sem);
97762306a36Sopenharmony_ci
97862306a36Sopenharmony_ci	/* FIXME: should the legacy sysfs handling be moved to gpio_device? */
97962306a36Sopenharmony_ci	gpiochip_sysfs_unregister(gdev);
98062306a36Sopenharmony_ci	gpiochip_free_hogs(gc);
98162306a36Sopenharmony_ci	/* Numb the device, cancelling all outstanding operations */
98262306a36Sopenharmony_ci	gdev->chip = NULL;
98362306a36Sopenharmony_ci	gpiochip_irqchip_remove(gc);
98462306a36Sopenharmony_ci	acpi_gpiochip_remove(gc);
98562306a36Sopenharmony_ci	of_gpiochip_remove(gc);
98662306a36Sopenharmony_ci	gpiochip_remove_pin_ranges(gc);
98762306a36Sopenharmony_ci	gpiochip_free_valid_mask(gc);
98862306a36Sopenharmony_ci	/*
98962306a36Sopenharmony_ci	 * We accept no more calls into the driver from this point, so
99062306a36Sopenharmony_ci	 * NULL the driver data pointer.
99162306a36Sopenharmony_ci	 */
99262306a36Sopenharmony_ci	gpiochip_set_data(gc, NULL);
99362306a36Sopenharmony_ci
99462306a36Sopenharmony_ci	spin_lock_irqsave(&gpio_lock, flags);
99562306a36Sopenharmony_ci	for (i = 0; i < gdev->ngpio; i++) {
99662306a36Sopenharmony_ci		if (gpiochip_is_requested(gc, i))
99762306a36Sopenharmony_ci			break;
99862306a36Sopenharmony_ci	}
99962306a36Sopenharmony_ci	spin_unlock_irqrestore(&gpio_lock, flags);
100062306a36Sopenharmony_ci
100162306a36Sopenharmony_ci	if (i != gdev->ngpio)
100262306a36Sopenharmony_ci		dev_crit(&gdev->dev,
100362306a36Sopenharmony_ci			 "REMOVING GPIOCHIP WITH GPIOS STILL REQUESTED\n");
100462306a36Sopenharmony_ci
100562306a36Sopenharmony_ci	/*
100662306a36Sopenharmony_ci	 * The gpiochip side puts its use of the device to rest here:
100762306a36Sopenharmony_ci	 * if there are no userspace clients, the chardev and device will
100862306a36Sopenharmony_ci	 * be removed, else it will be dangling until the last user is
100962306a36Sopenharmony_ci	 * gone.
101062306a36Sopenharmony_ci	 */
101162306a36Sopenharmony_ci	gcdev_unregister(gdev);
101262306a36Sopenharmony_ci	up_write(&gdev->sem);
101362306a36Sopenharmony_ci	gpio_device_put(gdev);
101462306a36Sopenharmony_ci}
101562306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiochip_remove);
101662306a36Sopenharmony_ci
101762306a36Sopenharmony_ci/*
101862306a36Sopenharmony_ci * FIXME: This will be removed soon.
101962306a36Sopenharmony_ci *
102062306a36Sopenharmony_ci * This function is depracated, don't use.
102162306a36Sopenharmony_ci */
102262306a36Sopenharmony_cistruct gpio_chip *gpiochip_find(void *data,
102362306a36Sopenharmony_ci				int (*match)(struct gpio_chip *gc,
102462306a36Sopenharmony_ci					     void *data))
102562306a36Sopenharmony_ci{
102662306a36Sopenharmony_ci	struct gpio_device *gdev;
102762306a36Sopenharmony_ci	struct gpio_chip *gc = NULL;
102862306a36Sopenharmony_ci
102962306a36Sopenharmony_ci	gdev = gpio_device_find(data, match);
103062306a36Sopenharmony_ci	if (gdev) {
103162306a36Sopenharmony_ci		gc = gdev->chip;
103262306a36Sopenharmony_ci		gpio_device_put(gdev);
103362306a36Sopenharmony_ci	}
103462306a36Sopenharmony_ci
103562306a36Sopenharmony_ci	return gc;
103662306a36Sopenharmony_ci}
103762306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiochip_find);
103862306a36Sopenharmony_ci
103962306a36Sopenharmony_ci/**
104062306a36Sopenharmony_ci * gpio_device_find() - find a specific GPIO device
104162306a36Sopenharmony_ci * @data: data to pass to match function
104262306a36Sopenharmony_ci * @match: Callback function to check gpio_chip
104362306a36Sopenharmony_ci *
104462306a36Sopenharmony_ci * Returns:
104562306a36Sopenharmony_ci * New reference to struct gpio_device.
104662306a36Sopenharmony_ci *
104762306a36Sopenharmony_ci * Similar to bus_find_device(). It returns a reference to a gpio_device as
104862306a36Sopenharmony_ci * determined by a user supplied @match callback. The callback should return
104962306a36Sopenharmony_ci * 0 if the device doesn't match and non-zero if it does. If the callback
105062306a36Sopenharmony_ci * returns non-zero, this function will return to the caller and not iterate
105162306a36Sopenharmony_ci * over any more gpio_devices.
105262306a36Sopenharmony_ci *
105362306a36Sopenharmony_ci * The callback takes the GPIO chip structure as argument. During the execution
105462306a36Sopenharmony_ci * of the callback function the chip is protected from being freed. TODO: This
105562306a36Sopenharmony_ci * actually has yet to be implemented.
105662306a36Sopenharmony_ci *
105762306a36Sopenharmony_ci * If the function returns non-NULL, the returned reference must be freed by
105862306a36Sopenharmony_ci * the caller using gpio_device_put().
105962306a36Sopenharmony_ci */
106062306a36Sopenharmony_cistruct gpio_device *gpio_device_find(void *data,
106162306a36Sopenharmony_ci				     int (*match)(struct gpio_chip *gc,
106262306a36Sopenharmony_ci						  void *data))
106362306a36Sopenharmony_ci{
106462306a36Sopenharmony_ci	struct gpio_device *gdev;
106562306a36Sopenharmony_ci
106662306a36Sopenharmony_ci	/*
106762306a36Sopenharmony_ci	 * Not yet but in the future the spinlock below will become a mutex.
106862306a36Sopenharmony_ci	 * Annotate this function before anyone tries to use it in interrupt
106962306a36Sopenharmony_ci	 * context like it happened with gpiochip_find().
107062306a36Sopenharmony_ci	 */
107162306a36Sopenharmony_ci	might_sleep();
107262306a36Sopenharmony_ci
107362306a36Sopenharmony_ci	guard(spinlock_irqsave)(&gpio_lock);
107462306a36Sopenharmony_ci
107562306a36Sopenharmony_ci	list_for_each_entry(gdev, &gpio_devices, list) {
107662306a36Sopenharmony_ci		if (gdev->chip && match(gdev->chip, data))
107762306a36Sopenharmony_ci			return gpio_device_get(gdev);
107862306a36Sopenharmony_ci	}
107962306a36Sopenharmony_ci
108062306a36Sopenharmony_ci	return NULL;
108162306a36Sopenharmony_ci}
108262306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpio_device_find);
108362306a36Sopenharmony_ci
108462306a36Sopenharmony_cistatic int gpiochip_match_name(struct gpio_chip *gc, void *data)
108562306a36Sopenharmony_ci{
108662306a36Sopenharmony_ci	const char *name = data;
108762306a36Sopenharmony_ci
108862306a36Sopenharmony_ci	return !strcmp(gc->label, name);
108962306a36Sopenharmony_ci}
109062306a36Sopenharmony_ci
109162306a36Sopenharmony_cistatic struct gpio_chip *find_chip_by_name(const char *name)
109262306a36Sopenharmony_ci{
109362306a36Sopenharmony_ci	return gpiochip_find((void *)name, gpiochip_match_name);
109462306a36Sopenharmony_ci}
109562306a36Sopenharmony_ci
109662306a36Sopenharmony_ci/**
109762306a36Sopenharmony_ci * gpio_device_get() - Increase the reference count of this GPIO device
109862306a36Sopenharmony_ci * @gdev: GPIO device to increase the refcount for
109962306a36Sopenharmony_ci *
110062306a36Sopenharmony_ci * Returns:
110162306a36Sopenharmony_ci * Pointer to @gdev.
110262306a36Sopenharmony_ci */
110362306a36Sopenharmony_cistruct gpio_device *gpio_device_get(struct gpio_device *gdev)
110462306a36Sopenharmony_ci{
110562306a36Sopenharmony_ci	return to_gpio_device(get_device(&gdev->dev));
110662306a36Sopenharmony_ci}
110762306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpio_device_get);
110862306a36Sopenharmony_ci
110962306a36Sopenharmony_ci/**
111062306a36Sopenharmony_ci * gpio_device_put() - Decrease the reference count of this GPIO device and
111162306a36Sopenharmony_ci *                     possibly free all resources associated with it.
111262306a36Sopenharmony_ci * @gdev: GPIO device to decrease the reference count for
111362306a36Sopenharmony_ci */
111462306a36Sopenharmony_civoid gpio_device_put(struct gpio_device *gdev)
111562306a36Sopenharmony_ci{
111662306a36Sopenharmony_ci	put_device(&gdev->dev);
111762306a36Sopenharmony_ci}
111862306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpio_device_put);
111962306a36Sopenharmony_ci
112062306a36Sopenharmony_ci#ifdef CONFIG_GPIOLIB_IRQCHIP
112162306a36Sopenharmony_ci
112262306a36Sopenharmony_ci/*
112362306a36Sopenharmony_ci * The following is irqchip helper code for gpiochips.
112462306a36Sopenharmony_ci */
112562306a36Sopenharmony_ci
112662306a36Sopenharmony_cistatic int gpiochip_irqchip_init_hw(struct gpio_chip *gc)
112762306a36Sopenharmony_ci{
112862306a36Sopenharmony_ci	struct gpio_irq_chip *girq = &gc->irq;
112962306a36Sopenharmony_ci
113062306a36Sopenharmony_ci	if (!girq->init_hw)
113162306a36Sopenharmony_ci		return 0;
113262306a36Sopenharmony_ci
113362306a36Sopenharmony_ci	return girq->init_hw(gc);
113462306a36Sopenharmony_ci}
113562306a36Sopenharmony_ci
113662306a36Sopenharmony_cistatic int gpiochip_irqchip_init_valid_mask(struct gpio_chip *gc)
113762306a36Sopenharmony_ci{
113862306a36Sopenharmony_ci	struct gpio_irq_chip *girq = &gc->irq;
113962306a36Sopenharmony_ci
114062306a36Sopenharmony_ci	if (!girq->init_valid_mask)
114162306a36Sopenharmony_ci		return 0;
114262306a36Sopenharmony_ci
114362306a36Sopenharmony_ci	girq->valid_mask = gpiochip_allocate_mask(gc);
114462306a36Sopenharmony_ci	if (!girq->valid_mask)
114562306a36Sopenharmony_ci		return -ENOMEM;
114662306a36Sopenharmony_ci
114762306a36Sopenharmony_ci	girq->init_valid_mask(gc, girq->valid_mask, gc->ngpio);
114862306a36Sopenharmony_ci
114962306a36Sopenharmony_ci	return 0;
115062306a36Sopenharmony_ci}
115162306a36Sopenharmony_ci
115262306a36Sopenharmony_cistatic void gpiochip_irqchip_free_valid_mask(struct gpio_chip *gc)
115362306a36Sopenharmony_ci{
115462306a36Sopenharmony_ci	gpiochip_free_mask(&gc->irq.valid_mask);
115562306a36Sopenharmony_ci}
115662306a36Sopenharmony_ci
115762306a36Sopenharmony_cibool gpiochip_irqchip_irq_valid(const struct gpio_chip *gc,
115862306a36Sopenharmony_ci				unsigned int offset)
115962306a36Sopenharmony_ci{
116062306a36Sopenharmony_ci	if (!gpiochip_line_is_valid(gc, offset))
116162306a36Sopenharmony_ci		return false;
116262306a36Sopenharmony_ci	/* No mask means all valid */
116362306a36Sopenharmony_ci	if (likely(!gc->irq.valid_mask))
116462306a36Sopenharmony_ci		return true;
116562306a36Sopenharmony_ci	return test_bit(offset, gc->irq.valid_mask);
116662306a36Sopenharmony_ci}
116762306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiochip_irqchip_irq_valid);
116862306a36Sopenharmony_ci
116962306a36Sopenharmony_ci#ifdef CONFIG_IRQ_DOMAIN_HIERARCHY
117062306a36Sopenharmony_ci
117162306a36Sopenharmony_ci/**
117262306a36Sopenharmony_ci * gpiochip_set_hierarchical_irqchip() - connects a hierarchical irqchip
117362306a36Sopenharmony_ci * to a gpiochip
117462306a36Sopenharmony_ci * @gc: the gpiochip to set the irqchip hierarchical handler to
117562306a36Sopenharmony_ci * @irqchip: the irqchip to handle this level of the hierarchy, the interrupt
117662306a36Sopenharmony_ci * will then percolate up to the parent
117762306a36Sopenharmony_ci */
117862306a36Sopenharmony_cistatic void gpiochip_set_hierarchical_irqchip(struct gpio_chip *gc,
117962306a36Sopenharmony_ci					      struct irq_chip *irqchip)
118062306a36Sopenharmony_ci{
118162306a36Sopenharmony_ci	/* DT will deal with mapping each IRQ as we go along */
118262306a36Sopenharmony_ci	if (is_of_node(gc->irq.fwnode))
118362306a36Sopenharmony_ci		return;
118462306a36Sopenharmony_ci
118562306a36Sopenharmony_ci	/*
118662306a36Sopenharmony_ci	 * This is for legacy and boardfile "irqchip" fwnodes: allocate
118762306a36Sopenharmony_ci	 * irqs upfront instead of dynamically since we don't have the
118862306a36Sopenharmony_ci	 * dynamic type of allocation that hardware description languages
118962306a36Sopenharmony_ci	 * provide. Once all GPIO drivers using board files are gone from
119062306a36Sopenharmony_ci	 * the kernel we can delete this code, but for a transitional period
119162306a36Sopenharmony_ci	 * it is necessary to keep this around.
119262306a36Sopenharmony_ci	 */
119362306a36Sopenharmony_ci	if (is_fwnode_irqchip(gc->irq.fwnode)) {
119462306a36Sopenharmony_ci		int i;
119562306a36Sopenharmony_ci		int ret;
119662306a36Sopenharmony_ci
119762306a36Sopenharmony_ci		for (i = 0; i < gc->ngpio; i++) {
119862306a36Sopenharmony_ci			struct irq_fwspec fwspec;
119962306a36Sopenharmony_ci			unsigned int parent_hwirq;
120062306a36Sopenharmony_ci			unsigned int parent_type;
120162306a36Sopenharmony_ci			struct gpio_irq_chip *girq = &gc->irq;
120262306a36Sopenharmony_ci
120362306a36Sopenharmony_ci			/*
120462306a36Sopenharmony_ci			 * We call the child to parent translation function
120562306a36Sopenharmony_ci			 * only to check if the child IRQ is valid or not.
120662306a36Sopenharmony_ci			 * Just pick the rising edge type here as that is what
120762306a36Sopenharmony_ci			 * we likely need to support.
120862306a36Sopenharmony_ci			 */
120962306a36Sopenharmony_ci			ret = girq->child_to_parent_hwirq(gc, i,
121062306a36Sopenharmony_ci							  IRQ_TYPE_EDGE_RISING,
121162306a36Sopenharmony_ci							  &parent_hwirq,
121262306a36Sopenharmony_ci							  &parent_type);
121362306a36Sopenharmony_ci			if (ret) {
121462306a36Sopenharmony_ci				chip_err(gc, "skip set-up on hwirq %d\n",
121562306a36Sopenharmony_ci					 i);
121662306a36Sopenharmony_ci				continue;
121762306a36Sopenharmony_ci			}
121862306a36Sopenharmony_ci
121962306a36Sopenharmony_ci			fwspec.fwnode = gc->irq.fwnode;
122062306a36Sopenharmony_ci			/* This is the hwirq for the GPIO line side of things */
122162306a36Sopenharmony_ci			fwspec.param[0] = girq->child_offset_to_irq(gc, i);
122262306a36Sopenharmony_ci			/* Just pick something */
122362306a36Sopenharmony_ci			fwspec.param[1] = IRQ_TYPE_EDGE_RISING;
122462306a36Sopenharmony_ci			fwspec.param_count = 2;
122562306a36Sopenharmony_ci			ret = irq_domain_alloc_irqs(gc->irq.domain, 1,
122662306a36Sopenharmony_ci						    NUMA_NO_NODE, &fwspec);
122762306a36Sopenharmony_ci			if (ret < 0) {
122862306a36Sopenharmony_ci				chip_err(gc,
122962306a36Sopenharmony_ci					 "can not allocate irq for GPIO line %d parent hwirq %d in hierarchy domain: %d\n",
123062306a36Sopenharmony_ci					 i, parent_hwirq,
123162306a36Sopenharmony_ci					 ret);
123262306a36Sopenharmony_ci			}
123362306a36Sopenharmony_ci		}
123462306a36Sopenharmony_ci	}
123562306a36Sopenharmony_ci
123662306a36Sopenharmony_ci	chip_err(gc, "%s unknown fwnode type proceed anyway\n", __func__);
123762306a36Sopenharmony_ci
123862306a36Sopenharmony_ci	return;
123962306a36Sopenharmony_ci}
124062306a36Sopenharmony_ci
124162306a36Sopenharmony_cistatic int gpiochip_hierarchy_irq_domain_translate(struct irq_domain *d,
124262306a36Sopenharmony_ci						   struct irq_fwspec *fwspec,
124362306a36Sopenharmony_ci						   unsigned long *hwirq,
124462306a36Sopenharmony_ci						   unsigned int *type)
124562306a36Sopenharmony_ci{
124662306a36Sopenharmony_ci	/* We support standard DT translation */
124762306a36Sopenharmony_ci	if (is_of_node(fwspec->fwnode) && fwspec->param_count == 2) {
124862306a36Sopenharmony_ci		return irq_domain_translate_twocell(d, fwspec, hwirq, type);
124962306a36Sopenharmony_ci	}
125062306a36Sopenharmony_ci
125162306a36Sopenharmony_ci	/* This is for board files and others not using DT */
125262306a36Sopenharmony_ci	if (is_fwnode_irqchip(fwspec->fwnode)) {
125362306a36Sopenharmony_ci		int ret;
125462306a36Sopenharmony_ci
125562306a36Sopenharmony_ci		ret = irq_domain_translate_twocell(d, fwspec, hwirq, type);
125662306a36Sopenharmony_ci		if (ret)
125762306a36Sopenharmony_ci			return ret;
125862306a36Sopenharmony_ci		WARN_ON(*type == IRQ_TYPE_NONE);
125962306a36Sopenharmony_ci		return 0;
126062306a36Sopenharmony_ci	}
126162306a36Sopenharmony_ci	return -EINVAL;
126262306a36Sopenharmony_ci}
126362306a36Sopenharmony_ci
126462306a36Sopenharmony_cistatic int gpiochip_hierarchy_irq_domain_alloc(struct irq_domain *d,
126562306a36Sopenharmony_ci					       unsigned int irq,
126662306a36Sopenharmony_ci					       unsigned int nr_irqs,
126762306a36Sopenharmony_ci					       void *data)
126862306a36Sopenharmony_ci{
126962306a36Sopenharmony_ci	struct gpio_chip *gc = d->host_data;
127062306a36Sopenharmony_ci	irq_hw_number_t hwirq;
127162306a36Sopenharmony_ci	unsigned int type = IRQ_TYPE_NONE;
127262306a36Sopenharmony_ci	struct irq_fwspec *fwspec = data;
127362306a36Sopenharmony_ci	union gpio_irq_fwspec gpio_parent_fwspec = {};
127462306a36Sopenharmony_ci	unsigned int parent_hwirq;
127562306a36Sopenharmony_ci	unsigned int parent_type;
127662306a36Sopenharmony_ci	struct gpio_irq_chip *girq = &gc->irq;
127762306a36Sopenharmony_ci	int ret;
127862306a36Sopenharmony_ci
127962306a36Sopenharmony_ci	/*
128062306a36Sopenharmony_ci	 * The nr_irqs parameter is always one except for PCI multi-MSI
128162306a36Sopenharmony_ci	 * so this should not happen.
128262306a36Sopenharmony_ci	 */
128362306a36Sopenharmony_ci	WARN_ON(nr_irqs != 1);
128462306a36Sopenharmony_ci
128562306a36Sopenharmony_ci	ret = gc->irq.child_irq_domain_ops.translate(d, fwspec, &hwirq, &type);
128662306a36Sopenharmony_ci	if (ret)
128762306a36Sopenharmony_ci		return ret;
128862306a36Sopenharmony_ci
128962306a36Sopenharmony_ci	chip_dbg(gc, "allocate IRQ %d, hwirq %lu\n", irq, hwirq);
129062306a36Sopenharmony_ci
129162306a36Sopenharmony_ci	ret = girq->child_to_parent_hwirq(gc, hwirq, type,
129262306a36Sopenharmony_ci					  &parent_hwirq, &parent_type);
129362306a36Sopenharmony_ci	if (ret) {
129462306a36Sopenharmony_ci		chip_err(gc, "can't look up hwirq %lu\n", hwirq);
129562306a36Sopenharmony_ci		return ret;
129662306a36Sopenharmony_ci	}
129762306a36Sopenharmony_ci	chip_dbg(gc, "found parent hwirq %u\n", parent_hwirq);
129862306a36Sopenharmony_ci
129962306a36Sopenharmony_ci	/*
130062306a36Sopenharmony_ci	 * We set handle_bad_irq because the .set_type() should
130162306a36Sopenharmony_ci	 * always be invoked and set the right type of handler.
130262306a36Sopenharmony_ci	 */
130362306a36Sopenharmony_ci	irq_domain_set_info(d,
130462306a36Sopenharmony_ci			    irq,
130562306a36Sopenharmony_ci			    hwirq,
130662306a36Sopenharmony_ci			    gc->irq.chip,
130762306a36Sopenharmony_ci			    gc,
130862306a36Sopenharmony_ci			    girq->handler,
130962306a36Sopenharmony_ci			    NULL, NULL);
131062306a36Sopenharmony_ci	irq_set_probe(irq);
131162306a36Sopenharmony_ci
131262306a36Sopenharmony_ci	/* This parent only handles asserted level IRQs */
131362306a36Sopenharmony_ci	ret = girq->populate_parent_alloc_arg(gc, &gpio_parent_fwspec,
131462306a36Sopenharmony_ci					      parent_hwirq, parent_type);
131562306a36Sopenharmony_ci	if (ret)
131662306a36Sopenharmony_ci		return ret;
131762306a36Sopenharmony_ci
131862306a36Sopenharmony_ci	chip_dbg(gc, "alloc_irqs_parent for %d parent hwirq %d\n",
131962306a36Sopenharmony_ci		  irq, parent_hwirq);
132062306a36Sopenharmony_ci	irq_set_lockdep_class(irq, gc->irq.lock_key, gc->irq.request_key);
132162306a36Sopenharmony_ci	ret = irq_domain_alloc_irqs_parent(d, irq, 1, &gpio_parent_fwspec);
132262306a36Sopenharmony_ci	/*
132362306a36Sopenharmony_ci	 * If the parent irqdomain is msi, the interrupts have already
132462306a36Sopenharmony_ci	 * been allocated, so the EEXIST is good.
132562306a36Sopenharmony_ci	 */
132662306a36Sopenharmony_ci	if (irq_domain_is_msi(d->parent) && (ret == -EEXIST))
132762306a36Sopenharmony_ci		ret = 0;
132862306a36Sopenharmony_ci	if (ret)
132962306a36Sopenharmony_ci		chip_err(gc,
133062306a36Sopenharmony_ci			 "failed to allocate parent hwirq %d for hwirq %lu\n",
133162306a36Sopenharmony_ci			 parent_hwirq, hwirq);
133262306a36Sopenharmony_ci
133362306a36Sopenharmony_ci	return ret;
133462306a36Sopenharmony_ci}
133562306a36Sopenharmony_ci
133662306a36Sopenharmony_cistatic unsigned int gpiochip_child_offset_to_irq_noop(struct gpio_chip *gc,
133762306a36Sopenharmony_ci						      unsigned int offset)
133862306a36Sopenharmony_ci{
133962306a36Sopenharmony_ci	return offset;
134062306a36Sopenharmony_ci}
134162306a36Sopenharmony_ci
134262306a36Sopenharmony_cistatic void gpiochip_hierarchy_setup_domain_ops(struct irq_domain_ops *ops)
134362306a36Sopenharmony_ci{
134462306a36Sopenharmony_ci	ops->activate = gpiochip_irq_domain_activate;
134562306a36Sopenharmony_ci	ops->deactivate = gpiochip_irq_domain_deactivate;
134662306a36Sopenharmony_ci	ops->alloc = gpiochip_hierarchy_irq_domain_alloc;
134762306a36Sopenharmony_ci
134862306a36Sopenharmony_ci	/*
134962306a36Sopenharmony_ci	 * We only allow overriding the translate() and free() functions for
135062306a36Sopenharmony_ci	 * hierarchical chips, and this should only be done if the user
135162306a36Sopenharmony_ci	 * really need something other than 1:1 translation for translate()
135262306a36Sopenharmony_ci	 * callback and free if user wants to free up any resources which
135362306a36Sopenharmony_ci	 * were allocated during callbacks, for example populate_parent_alloc_arg.
135462306a36Sopenharmony_ci	 */
135562306a36Sopenharmony_ci	if (!ops->translate)
135662306a36Sopenharmony_ci		ops->translate = gpiochip_hierarchy_irq_domain_translate;
135762306a36Sopenharmony_ci	if (!ops->free)
135862306a36Sopenharmony_ci		ops->free = irq_domain_free_irqs_common;
135962306a36Sopenharmony_ci}
136062306a36Sopenharmony_ci
136162306a36Sopenharmony_cistatic struct irq_domain *gpiochip_hierarchy_create_domain(struct gpio_chip *gc)
136262306a36Sopenharmony_ci{
136362306a36Sopenharmony_ci	struct irq_domain *domain;
136462306a36Sopenharmony_ci
136562306a36Sopenharmony_ci	if (!gc->irq.child_to_parent_hwirq ||
136662306a36Sopenharmony_ci	    !gc->irq.fwnode) {
136762306a36Sopenharmony_ci		chip_err(gc, "missing irqdomain vital data\n");
136862306a36Sopenharmony_ci		return ERR_PTR(-EINVAL);
136962306a36Sopenharmony_ci	}
137062306a36Sopenharmony_ci
137162306a36Sopenharmony_ci	if (!gc->irq.child_offset_to_irq)
137262306a36Sopenharmony_ci		gc->irq.child_offset_to_irq = gpiochip_child_offset_to_irq_noop;
137362306a36Sopenharmony_ci
137462306a36Sopenharmony_ci	if (!gc->irq.populate_parent_alloc_arg)
137562306a36Sopenharmony_ci		gc->irq.populate_parent_alloc_arg =
137662306a36Sopenharmony_ci			gpiochip_populate_parent_fwspec_twocell;
137762306a36Sopenharmony_ci
137862306a36Sopenharmony_ci	gpiochip_hierarchy_setup_domain_ops(&gc->irq.child_irq_domain_ops);
137962306a36Sopenharmony_ci
138062306a36Sopenharmony_ci	domain = irq_domain_create_hierarchy(
138162306a36Sopenharmony_ci		gc->irq.parent_domain,
138262306a36Sopenharmony_ci		0,
138362306a36Sopenharmony_ci		gc->ngpio,
138462306a36Sopenharmony_ci		gc->irq.fwnode,
138562306a36Sopenharmony_ci		&gc->irq.child_irq_domain_ops,
138662306a36Sopenharmony_ci		gc);
138762306a36Sopenharmony_ci
138862306a36Sopenharmony_ci	if (!domain)
138962306a36Sopenharmony_ci		return ERR_PTR(-ENOMEM);
139062306a36Sopenharmony_ci
139162306a36Sopenharmony_ci	gpiochip_set_hierarchical_irqchip(gc, gc->irq.chip);
139262306a36Sopenharmony_ci
139362306a36Sopenharmony_ci	return domain;
139462306a36Sopenharmony_ci}
139562306a36Sopenharmony_ci
139662306a36Sopenharmony_cistatic bool gpiochip_hierarchy_is_hierarchical(struct gpio_chip *gc)
139762306a36Sopenharmony_ci{
139862306a36Sopenharmony_ci	return !!gc->irq.parent_domain;
139962306a36Sopenharmony_ci}
140062306a36Sopenharmony_ci
140162306a36Sopenharmony_ciint gpiochip_populate_parent_fwspec_twocell(struct gpio_chip *gc,
140262306a36Sopenharmony_ci					    union gpio_irq_fwspec *gfwspec,
140362306a36Sopenharmony_ci					    unsigned int parent_hwirq,
140462306a36Sopenharmony_ci					    unsigned int parent_type)
140562306a36Sopenharmony_ci{
140662306a36Sopenharmony_ci	struct irq_fwspec *fwspec = &gfwspec->fwspec;
140762306a36Sopenharmony_ci
140862306a36Sopenharmony_ci	fwspec->fwnode = gc->irq.parent_domain->fwnode;
140962306a36Sopenharmony_ci	fwspec->param_count = 2;
141062306a36Sopenharmony_ci	fwspec->param[0] = parent_hwirq;
141162306a36Sopenharmony_ci	fwspec->param[1] = parent_type;
141262306a36Sopenharmony_ci
141362306a36Sopenharmony_ci	return 0;
141462306a36Sopenharmony_ci}
141562306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiochip_populate_parent_fwspec_twocell);
141662306a36Sopenharmony_ci
141762306a36Sopenharmony_ciint gpiochip_populate_parent_fwspec_fourcell(struct gpio_chip *gc,
141862306a36Sopenharmony_ci					     union gpio_irq_fwspec *gfwspec,
141962306a36Sopenharmony_ci					     unsigned int parent_hwirq,
142062306a36Sopenharmony_ci					     unsigned int parent_type)
142162306a36Sopenharmony_ci{
142262306a36Sopenharmony_ci	struct irq_fwspec *fwspec = &gfwspec->fwspec;
142362306a36Sopenharmony_ci
142462306a36Sopenharmony_ci	fwspec->fwnode = gc->irq.parent_domain->fwnode;
142562306a36Sopenharmony_ci	fwspec->param_count = 4;
142662306a36Sopenharmony_ci	fwspec->param[0] = 0;
142762306a36Sopenharmony_ci	fwspec->param[1] = parent_hwirq;
142862306a36Sopenharmony_ci	fwspec->param[2] = 0;
142962306a36Sopenharmony_ci	fwspec->param[3] = parent_type;
143062306a36Sopenharmony_ci
143162306a36Sopenharmony_ci	return 0;
143262306a36Sopenharmony_ci}
143362306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiochip_populate_parent_fwspec_fourcell);
143462306a36Sopenharmony_ci
143562306a36Sopenharmony_ci#else
143662306a36Sopenharmony_ci
143762306a36Sopenharmony_cistatic struct irq_domain *gpiochip_hierarchy_create_domain(struct gpio_chip *gc)
143862306a36Sopenharmony_ci{
143962306a36Sopenharmony_ci	return ERR_PTR(-EINVAL);
144062306a36Sopenharmony_ci}
144162306a36Sopenharmony_ci
144262306a36Sopenharmony_cistatic bool gpiochip_hierarchy_is_hierarchical(struct gpio_chip *gc)
144362306a36Sopenharmony_ci{
144462306a36Sopenharmony_ci	return false;
144562306a36Sopenharmony_ci}
144662306a36Sopenharmony_ci
144762306a36Sopenharmony_ci#endif /* CONFIG_IRQ_DOMAIN_HIERARCHY */
144862306a36Sopenharmony_ci
144962306a36Sopenharmony_ci/**
145062306a36Sopenharmony_ci * gpiochip_irq_map() - maps an IRQ into a GPIO irqchip
145162306a36Sopenharmony_ci * @d: the irqdomain used by this irqchip
145262306a36Sopenharmony_ci * @irq: the global irq number used by this GPIO irqchip irq
145362306a36Sopenharmony_ci * @hwirq: the local IRQ/GPIO line offset on this gpiochip
145462306a36Sopenharmony_ci *
145562306a36Sopenharmony_ci * This function will set up the mapping for a certain IRQ line on a
145662306a36Sopenharmony_ci * gpiochip by assigning the gpiochip as chip data, and using the irqchip
145762306a36Sopenharmony_ci * stored inside the gpiochip.
145862306a36Sopenharmony_ci */
145962306a36Sopenharmony_ciint gpiochip_irq_map(struct irq_domain *d, unsigned int irq, irq_hw_number_t hwirq)
146062306a36Sopenharmony_ci{
146162306a36Sopenharmony_ci	struct gpio_chip *gc = d->host_data;
146262306a36Sopenharmony_ci	int ret = 0;
146362306a36Sopenharmony_ci
146462306a36Sopenharmony_ci	if (!gpiochip_irqchip_irq_valid(gc, hwirq))
146562306a36Sopenharmony_ci		return -ENXIO;
146662306a36Sopenharmony_ci
146762306a36Sopenharmony_ci	irq_set_chip_data(irq, gc);
146862306a36Sopenharmony_ci	/*
146962306a36Sopenharmony_ci	 * This lock class tells lockdep that GPIO irqs are in a different
147062306a36Sopenharmony_ci	 * category than their parents, so it won't report false recursion.
147162306a36Sopenharmony_ci	 */
147262306a36Sopenharmony_ci	irq_set_lockdep_class(irq, gc->irq.lock_key, gc->irq.request_key);
147362306a36Sopenharmony_ci	irq_set_chip_and_handler(irq, gc->irq.chip, gc->irq.handler);
147462306a36Sopenharmony_ci	/* Chips that use nested thread handlers have them marked */
147562306a36Sopenharmony_ci	if (gc->irq.threaded)
147662306a36Sopenharmony_ci		irq_set_nested_thread(irq, 1);
147762306a36Sopenharmony_ci	irq_set_noprobe(irq);
147862306a36Sopenharmony_ci
147962306a36Sopenharmony_ci	if (gc->irq.num_parents == 1)
148062306a36Sopenharmony_ci		ret = irq_set_parent(irq, gc->irq.parents[0]);
148162306a36Sopenharmony_ci	else if (gc->irq.map)
148262306a36Sopenharmony_ci		ret = irq_set_parent(irq, gc->irq.map[hwirq]);
148362306a36Sopenharmony_ci
148462306a36Sopenharmony_ci	if (ret < 0)
148562306a36Sopenharmony_ci		return ret;
148662306a36Sopenharmony_ci
148762306a36Sopenharmony_ci	/*
148862306a36Sopenharmony_ci	 * No set-up of the hardware will happen if IRQ_TYPE_NONE
148962306a36Sopenharmony_ci	 * is passed as default type.
149062306a36Sopenharmony_ci	 */
149162306a36Sopenharmony_ci	if (gc->irq.default_type != IRQ_TYPE_NONE)
149262306a36Sopenharmony_ci		irq_set_irq_type(irq, gc->irq.default_type);
149362306a36Sopenharmony_ci
149462306a36Sopenharmony_ci	return 0;
149562306a36Sopenharmony_ci}
149662306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiochip_irq_map);
149762306a36Sopenharmony_ci
149862306a36Sopenharmony_civoid gpiochip_irq_unmap(struct irq_domain *d, unsigned int irq)
149962306a36Sopenharmony_ci{
150062306a36Sopenharmony_ci	struct gpio_chip *gc = d->host_data;
150162306a36Sopenharmony_ci
150262306a36Sopenharmony_ci	if (gc->irq.threaded)
150362306a36Sopenharmony_ci		irq_set_nested_thread(irq, 0);
150462306a36Sopenharmony_ci	irq_set_chip_and_handler(irq, NULL, NULL);
150562306a36Sopenharmony_ci	irq_set_chip_data(irq, NULL);
150662306a36Sopenharmony_ci}
150762306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiochip_irq_unmap);
150862306a36Sopenharmony_ci
150962306a36Sopenharmony_cistatic const struct irq_domain_ops gpiochip_domain_ops = {
151062306a36Sopenharmony_ci	.map	= gpiochip_irq_map,
151162306a36Sopenharmony_ci	.unmap	= gpiochip_irq_unmap,
151262306a36Sopenharmony_ci	/* Virtually all GPIO irqchips are twocell:ed */
151362306a36Sopenharmony_ci	.xlate	= irq_domain_xlate_twocell,
151462306a36Sopenharmony_ci};
151562306a36Sopenharmony_ci
151662306a36Sopenharmony_cistatic struct irq_domain *gpiochip_simple_create_domain(struct gpio_chip *gc)
151762306a36Sopenharmony_ci{
151862306a36Sopenharmony_ci	struct fwnode_handle *fwnode = dev_fwnode(&gc->gpiodev->dev);
151962306a36Sopenharmony_ci	struct irq_domain *domain;
152062306a36Sopenharmony_ci
152162306a36Sopenharmony_ci	domain = irq_domain_create_simple(fwnode, gc->ngpio, gc->irq.first,
152262306a36Sopenharmony_ci					  &gpiochip_domain_ops, gc);
152362306a36Sopenharmony_ci	if (!domain)
152462306a36Sopenharmony_ci		return ERR_PTR(-EINVAL);
152562306a36Sopenharmony_ci
152662306a36Sopenharmony_ci	return domain;
152762306a36Sopenharmony_ci}
152862306a36Sopenharmony_ci
152962306a36Sopenharmony_ci/*
153062306a36Sopenharmony_ci * TODO: move these activate/deactivate in under the hierarchicial
153162306a36Sopenharmony_ci * irqchip implementation as static once SPMI and SSBI (all external
153262306a36Sopenharmony_ci * users) are phased over.
153362306a36Sopenharmony_ci */
153462306a36Sopenharmony_ci/**
153562306a36Sopenharmony_ci * gpiochip_irq_domain_activate() - Lock a GPIO to be used as an IRQ
153662306a36Sopenharmony_ci * @domain: The IRQ domain used by this IRQ chip
153762306a36Sopenharmony_ci * @data: Outermost irq_data associated with the IRQ
153862306a36Sopenharmony_ci * @reserve: If set, only reserve an interrupt vector instead of assigning one
153962306a36Sopenharmony_ci *
154062306a36Sopenharmony_ci * This function is a wrapper that calls gpiochip_lock_as_irq() and is to be
154162306a36Sopenharmony_ci * used as the activate function for the &struct irq_domain_ops. The host_data
154262306a36Sopenharmony_ci * for the IRQ domain must be the &struct gpio_chip.
154362306a36Sopenharmony_ci */
154462306a36Sopenharmony_ciint gpiochip_irq_domain_activate(struct irq_domain *domain,
154562306a36Sopenharmony_ci				 struct irq_data *data, bool reserve)
154662306a36Sopenharmony_ci{
154762306a36Sopenharmony_ci	struct gpio_chip *gc = domain->host_data;
154862306a36Sopenharmony_ci	unsigned int hwirq = irqd_to_hwirq(data);
154962306a36Sopenharmony_ci
155062306a36Sopenharmony_ci	return gpiochip_lock_as_irq(gc, hwirq);
155162306a36Sopenharmony_ci}
155262306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiochip_irq_domain_activate);
155362306a36Sopenharmony_ci
155462306a36Sopenharmony_ci/**
155562306a36Sopenharmony_ci * gpiochip_irq_domain_deactivate() - Unlock a GPIO used as an IRQ
155662306a36Sopenharmony_ci * @domain: The IRQ domain used by this IRQ chip
155762306a36Sopenharmony_ci * @data: Outermost irq_data associated with the IRQ
155862306a36Sopenharmony_ci *
155962306a36Sopenharmony_ci * This function is a wrapper that will call gpiochip_unlock_as_irq() and is to
156062306a36Sopenharmony_ci * be used as the deactivate function for the &struct irq_domain_ops. The
156162306a36Sopenharmony_ci * host_data for the IRQ domain must be the &struct gpio_chip.
156262306a36Sopenharmony_ci */
156362306a36Sopenharmony_civoid gpiochip_irq_domain_deactivate(struct irq_domain *domain,
156462306a36Sopenharmony_ci				    struct irq_data *data)
156562306a36Sopenharmony_ci{
156662306a36Sopenharmony_ci	struct gpio_chip *gc = domain->host_data;
156762306a36Sopenharmony_ci	unsigned int hwirq = irqd_to_hwirq(data);
156862306a36Sopenharmony_ci
156962306a36Sopenharmony_ci	return gpiochip_unlock_as_irq(gc, hwirq);
157062306a36Sopenharmony_ci}
157162306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiochip_irq_domain_deactivate);
157262306a36Sopenharmony_ci
157362306a36Sopenharmony_cistatic int gpiochip_to_irq(struct gpio_chip *gc, unsigned int offset)
157462306a36Sopenharmony_ci{
157562306a36Sopenharmony_ci	struct irq_domain *domain = gc->irq.domain;
157662306a36Sopenharmony_ci
157762306a36Sopenharmony_ci#ifdef CONFIG_GPIOLIB_IRQCHIP
157862306a36Sopenharmony_ci	/*
157962306a36Sopenharmony_ci	 * Avoid race condition with other code, which tries to lookup
158062306a36Sopenharmony_ci	 * an IRQ before the irqchip has been properly registered,
158162306a36Sopenharmony_ci	 * i.e. while gpiochip is still being brought up.
158262306a36Sopenharmony_ci	 */
158362306a36Sopenharmony_ci	if (!gc->irq.initialized)
158462306a36Sopenharmony_ci		return -EPROBE_DEFER;
158562306a36Sopenharmony_ci#endif
158662306a36Sopenharmony_ci
158762306a36Sopenharmony_ci	if (!gpiochip_irqchip_irq_valid(gc, offset))
158862306a36Sopenharmony_ci		return -ENXIO;
158962306a36Sopenharmony_ci
159062306a36Sopenharmony_ci#ifdef CONFIG_IRQ_DOMAIN_HIERARCHY
159162306a36Sopenharmony_ci	if (irq_domain_is_hierarchy(domain)) {
159262306a36Sopenharmony_ci		struct irq_fwspec spec;
159362306a36Sopenharmony_ci
159462306a36Sopenharmony_ci		spec.fwnode = domain->fwnode;
159562306a36Sopenharmony_ci		spec.param_count = 2;
159662306a36Sopenharmony_ci		spec.param[0] = gc->irq.child_offset_to_irq(gc, offset);
159762306a36Sopenharmony_ci		spec.param[1] = IRQ_TYPE_NONE;
159862306a36Sopenharmony_ci
159962306a36Sopenharmony_ci		return irq_create_fwspec_mapping(&spec);
160062306a36Sopenharmony_ci	}
160162306a36Sopenharmony_ci#endif
160262306a36Sopenharmony_ci
160362306a36Sopenharmony_ci	return irq_create_mapping(domain, offset);
160462306a36Sopenharmony_ci}
160562306a36Sopenharmony_ci
160662306a36Sopenharmony_ciint gpiochip_irq_reqres(struct irq_data *d)
160762306a36Sopenharmony_ci{
160862306a36Sopenharmony_ci	struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
160962306a36Sopenharmony_ci	unsigned int hwirq = irqd_to_hwirq(d);
161062306a36Sopenharmony_ci
161162306a36Sopenharmony_ci	return gpiochip_reqres_irq(gc, hwirq);
161262306a36Sopenharmony_ci}
161362306a36Sopenharmony_ciEXPORT_SYMBOL(gpiochip_irq_reqres);
161462306a36Sopenharmony_ci
161562306a36Sopenharmony_civoid gpiochip_irq_relres(struct irq_data *d)
161662306a36Sopenharmony_ci{
161762306a36Sopenharmony_ci	struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
161862306a36Sopenharmony_ci	unsigned int hwirq = irqd_to_hwirq(d);
161962306a36Sopenharmony_ci
162062306a36Sopenharmony_ci	gpiochip_relres_irq(gc, hwirq);
162162306a36Sopenharmony_ci}
162262306a36Sopenharmony_ciEXPORT_SYMBOL(gpiochip_irq_relres);
162362306a36Sopenharmony_ci
162462306a36Sopenharmony_cistatic void gpiochip_irq_mask(struct irq_data *d)
162562306a36Sopenharmony_ci{
162662306a36Sopenharmony_ci	struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
162762306a36Sopenharmony_ci	unsigned int hwirq = irqd_to_hwirq(d);
162862306a36Sopenharmony_ci
162962306a36Sopenharmony_ci	if (gc->irq.irq_mask)
163062306a36Sopenharmony_ci		gc->irq.irq_mask(d);
163162306a36Sopenharmony_ci	gpiochip_disable_irq(gc, hwirq);
163262306a36Sopenharmony_ci}
163362306a36Sopenharmony_ci
163462306a36Sopenharmony_cistatic void gpiochip_irq_unmask(struct irq_data *d)
163562306a36Sopenharmony_ci{
163662306a36Sopenharmony_ci	struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
163762306a36Sopenharmony_ci	unsigned int hwirq = irqd_to_hwirq(d);
163862306a36Sopenharmony_ci
163962306a36Sopenharmony_ci	gpiochip_enable_irq(gc, hwirq);
164062306a36Sopenharmony_ci	if (gc->irq.irq_unmask)
164162306a36Sopenharmony_ci		gc->irq.irq_unmask(d);
164262306a36Sopenharmony_ci}
164362306a36Sopenharmony_ci
164462306a36Sopenharmony_cistatic void gpiochip_irq_enable(struct irq_data *d)
164562306a36Sopenharmony_ci{
164662306a36Sopenharmony_ci	struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
164762306a36Sopenharmony_ci	unsigned int hwirq = irqd_to_hwirq(d);
164862306a36Sopenharmony_ci
164962306a36Sopenharmony_ci	gpiochip_enable_irq(gc, hwirq);
165062306a36Sopenharmony_ci	gc->irq.irq_enable(d);
165162306a36Sopenharmony_ci}
165262306a36Sopenharmony_ci
165362306a36Sopenharmony_cistatic void gpiochip_irq_disable(struct irq_data *d)
165462306a36Sopenharmony_ci{
165562306a36Sopenharmony_ci	struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
165662306a36Sopenharmony_ci	unsigned int hwirq = irqd_to_hwirq(d);
165762306a36Sopenharmony_ci
165862306a36Sopenharmony_ci	gc->irq.irq_disable(d);
165962306a36Sopenharmony_ci	gpiochip_disable_irq(gc, hwirq);
166062306a36Sopenharmony_ci}
166162306a36Sopenharmony_ci
166262306a36Sopenharmony_cistatic void gpiochip_set_irq_hooks(struct gpio_chip *gc)
166362306a36Sopenharmony_ci{
166462306a36Sopenharmony_ci	struct irq_chip *irqchip = gc->irq.chip;
166562306a36Sopenharmony_ci
166662306a36Sopenharmony_ci	if (irqchip->flags & IRQCHIP_IMMUTABLE)
166762306a36Sopenharmony_ci		return;
166862306a36Sopenharmony_ci
166962306a36Sopenharmony_ci	chip_warn(gc, "not an immutable chip, please consider fixing it!\n");
167062306a36Sopenharmony_ci
167162306a36Sopenharmony_ci	if (!irqchip->irq_request_resources &&
167262306a36Sopenharmony_ci	    !irqchip->irq_release_resources) {
167362306a36Sopenharmony_ci		irqchip->irq_request_resources = gpiochip_irq_reqres;
167462306a36Sopenharmony_ci		irqchip->irq_release_resources = gpiochip_irq_relres;
167562306a36Sopenharmony_ci	}
167662306a36Sopenharmony_ci	if (WARN_ON(gc->irq.irq_enable))
167762306a36Sopenharmony_ci		return;
167862306a36Sopenharmony_ci	/* Check if the irqchip already has this hook... */
167962306a36Sopenharmony_ci	if (irqchip->irq_enable == gpiochip_irq_enable ||
168062306a36Sopenharmony_ci		irqchip->irq_mask == gpiochip_irq_mask) {
168162306a36Sopenharmony_ci		/*
168262306a36Sopenharmony_ci		 * ...and if so, give a gentle warning that this is bad
168362306a36Sopenharmony_ci		 * practice.
168462306a36Sopenharmony_ci		 */
168562306a36Sopenharmony_ci		chip_info(gc,
168662306a36Sopenharmony_ci			  "detected irqchip that is shared with multiple gpiochips: please fix the driver.\n");
168762306a36Sopenharmony_ci		return;
168862306a36Sopenharmony_ci	}
168962306a36Sopenharmony_ci
169062306a36Sopenharmony_ci	if (irqchip->irq_disable) {
169162306a36Sopenharmony_ci		gc->irq.irq_disable = irqchip->irq_disable;
169262306a36Sopenharmony_ci		irqchip->irq_disable = gpiochip_irq_disable;
169362306a36Sopenharmony_ci	} else {
169462306a36Sopenharmony_ci		gc->irq.irq_mask = irqchip->irq_mask;
169562306a36Sopenharmony_ci		irqchip->irq_mask = gpiochip_irq_mask;
169662306a36Sopenharmony_ci	}
169762306a36Sopenharmony_ci
169862306a36Sopenharmony_ci	if (irqchip->irq_enable) {
169962306a36Sopenharmony_ci		gc->irq.irq_enable = irqchip->irq_enable;
170062306a36Sopenharmony_ci		irqchip->irq_enable = gpiochip_irq_enable;
170162306a36Sopenharmony_ci	} else {
170262306a36Sopenharmony_ci		gc->irq.irq_unmask = irqchip->irq_unmask;
170362306a36Sopenharmony_ci		irqchip->irq_unmask = gpiochip_irq_unmask;
170462306a36Sopenharmony_ci	}
170562306a36Sopenharmony_ci}
170662306a36Sopenharmony_ci
170762306a36Sopenharmony_cistatic int gpiochip_irqchip_add_allocated_domain(struct gpio_chip *gc,
170862306a36Sopenharmony_ci						 struct irq_domain *domain,
170962306a36Sopenharmony_ci						 bool allocated_externally)
171062306a36Sopenharmony_ci{
171162306a36Sopenharmony_ci	if (!domain)
171262306a36Sopenharmony_ci		return -EINVAL;
171362306a36Sopenharmony_ci
171462306a36Sopenharmony_ci	if (gc->to_irq)
171562306a36Sopenharmony_ci		chip_warn(gc, "to_irq is redefined in %s and you shouldn't rely on it\n", __func__);
171662306a36Sopenharmony_ci
171762306a36Sopenharmony_ci	gc->to_irq = gpiochip_to_irq;
171862306a36Sopenharmony_ci	gc->irq.domain = domain;
171962306a36Sopenharmony_ci	gc->irq.domain_is_allocated_externally = allocated_externally;
172062306a36Sopenharmony_ci
172162306a36Sopenharmony_ci	/*
172262306a36Sopenharmony_ci	 * Using barrier() here to prevent compiler from reordering
172362306a36Sopenharmony_ci	 * gc->irq.initialized before adding irqdomain.
172462306a36Sopenharmony_ci	 */
172562306a36Sopenharmony_ci	barrier();
172662306a36Sopenharmony_ci
172762306a36Sopenharmony_ci	gc->irq.initialized = true;
172862306a36Sopenharmony_ci
172962306a36Sopenharmony_ci	return 0;
173062306a36Sopenharmony_ci}
173162306a36Sopenharmony_ci
173262306a36Sopenharmony_ci/**
173362306a36Sopenharmony_ci * gpiochip_add_irqchip() - adds an IRQ chip to a GPIO chip
173462306a36Sopenharmony_ci * @gc: the GPIO chip to add the IRQ chip to
173562306a36Sopenharmony_ci * @lock_key: lockdep class for IRQ lock
173662306a36Sopenharmony_ci * @request_key: lockdep class for IRQ request
173762306a36Sopenharmony_ci */
173862306a36Sopenharmony_cistatic int gpiochip_add_irqchip(struct gpio_chip *gc,
173962306a36Sopenharmony_ci				struct lock_class_key *lock_key,
174062306a36Sopenharmony_ci				struct lock_class_key *request_key)
174162306a36Sopenharmony_ci{
174262306a36Sopenharmony_ci	struct fwnode_handle *fwnode = dev_fwnode(&gc->gpiodev->dev);
174362306a36Sopenharmony_ci	struct irq_chip *irqchip = gc->irq.chip;
174462306a36Sopenharmony_ci	struct irq_domain *domain;
174562306a36Sopenharmony_ci	unsigned int type;
174662306a36Sopenharmony_ci	unsigned int i;
174762306a36Sopenharmony_ci	int ret;
174862306a36Sopenharmony_ci
174962306a36Sopenharmony_ci	if (!irqchip)
175062306a36Sopenharmony_ci		return 0;
175162306a36Sopenharmony_ci
175262306a36Sopenharmony_ci	if (gc->irq.parent_handler && gc->can_sleep) {
175362306a36Sopenharmony_ci		chip_err(gc, "you cannot have chained interrupts on a chip that may sleep\n");
175462306a36Sopenharmony_ci		return -EINVAL;
175562306a36Sopenharmony_ci	}
175662306a36Sopenharmony_ci
175762306a36Sopenharmony_ci	type = gc->irq.default_type;
175862306a36Sopenharmony_ci
175962306a36Sopenharmony_ci	/*
176062306a36Sopenharmony_ci	 * Specifying a default trigger is a terrible idea if DT or ACPI is
176162306a36Sopenharmony_ci	 * used to configure the interrupts, as you may end up with
176262306a36Sopenharmony_ci	 * conflicting triggers. Tell the user, and reset to NONE.
176362306a36Sopenharmony_ci	 */
176462306a36Sopenharmony_ci	if (WARN(fwnode && type != IRQ_TYPE_NONE,
176562306a36Sopenharmony_ci		 "%pfw: Ignoring %u default trigger\n", fwnode, type))
176662306a36Sopenharmony_ci		type = IRQ_TYPE_NONE;
176762306a36Sopenharmony_ci
176862306a36Sopenharmony_ci	gc->irq.default_type = type;
176962306a36Sopenharmony_ci	gc->irq.lock_key = lock_key;
177062306a36Sopenharmony_ci	gc->irq.request_key = request_key;
177162306a36Sopenharmony_ci
177262306a36Sopenharmony_ci	/* If a parent irqdomain is provided, let's build a hierarchy */
177362306a36Sopenharmony_ci	if (gpiochip_hierarchy_is_hierarchical(gc)) {
177462306a36Sopenharmony_ci		domain = gpiochip_hierarchy_create_domain(gc);
177562306a36Sopenharmony_ci	} else {
177662306a36Sopenharmony_ci		domain = gpiochip_simple_create_domain(gc);
177762306a36Sopenharmony_ci	}
177862306a36Sopenharmony_ci	if (IS_ERR(domain))
177962306a36Sopenharmony_ci		return PTR_ERR(domain);
178062306a36Sopenharmony_ci
178162306a36Sopenharmony_ci	if (gc->irq.parent_handler) {
178262306a36Sopenharmony_ci		for (i = 0; i < gc->irq.num_parents; i++) {
178362306a36Sopenharmony_ci			void *data;
178462306a36Sopenharmony_ci
178562306a36Sopenharmony_ci			if (gc->irq.per_parent_data)
178662306a36Sopenharmony_ci				data = gc->irq.parent_handler_data_array[i];
178762306a36Sopenharmony_ci			else
178862306a36Sopenharmony_ci				data = gc->irq.parent_handler_data ?: gc;
178962306a36Sopenharmony_ci
179062306a36Sopenharmony_ci			/*
179162306a36Sopenharmony_ci			 * The parent IRQ chip is already using the chip_data
179262306a36Sopenharmony_ci			 * for this IRQ chip, so our callbacks simply use the
179362306a36Sopenharmony_ci			 * handler_data.
179462306a36Sopenharmony_ci			 */
179562306a36Sopenharmony_ci			irq_set_chained_handler_and_data(gc->irq.parents[i],
179662306a36Sopenharmony_ci							 gc->irq.parent_handler,
179762306a36Sopenharmony_ci							 data);
179862306a36Sopenharmony_ci		}
179962306a36Sopenharmony_ci	}
180062306a36Sopenharmony_ci
180162306a36Sopenharmony_ci	gpiochip_set_irq_hooks(gc);
180262306a36Sopenharmony_ci
180362306a36Sopenharmony_ci	ret = gpiochip_irqchip_add_allocated_domain(gc, domain, false);
180462306a36Sopenharmony_ci	if (ret)
180562306a36Sopenharmony_ci		return ret;
180662306a36Sopenharmony_ci
180762306a36Sopenharmony_ci	acpi_gpiochip_request_interrupts(gc);
180862306a36Sopenharmony_ci
180962306a36Sopenharmony_ci	return 0;
181062306a36Sopenharmony_ci}
181162306a36Sopenharmony_ci
181262306a36Sopenharmony_ci/**
181362306a36Sopenharmony_ci * gpiochip_irqchip_remove() - removes an irqchip added to a gpiochip
181462306a36Sopenharmony_ci * @gc: the gpiochip to remove the irqchip from
181562306a36Sopenharmony_ci *
181662306a36Sopenharmony_ci * This is called only from gpiochip_remove()
181762306a36Sopenharmony_ci */
181862306a36Sopenharmony_cistatic void gpiochip_irqchip_remove(struct gpio_chip *gc)
181962306a36Sopenharmony_ci{
182062306a36Sopenharmony_ci	struct irq_chip *irqchip = gc->irq.chip;
182162306a36Sopenharmony_ci	unsigned int offset;
182262306a36Sopenharmony_ci
182362306a36Sopenharmony_ci	acpi_gpiochip_free_interrupts(gc);
182462306a36Sopenharmony_ci
182562306a36Sopenharmony_ci	if (irqchip && gc->irq.parent_handler) {
182662306a36Sopenharmony_ci		struct gpio_irq_chip *irq = &gc->irq;
182762306a36Sopenharmony_ci		unsigned int i;
182862306a36Sopenharmony_ci
182962306a36Sopenharmony_ci		for (i = 0; i < irq->num_parents; i++)
183062306a36Sopenharmony_ci			irq_set_chained_handler_and_data(irq->parents[i],
183162306a36Sopenharmony_ci							 NULL, NULL);
183262306a36Sopenharmony_ci	}
183362306a36Sopenharmony_ci
183462306a36Sopenharmony_ci	/* Remove all IRQ mappings and delete the domain */
183562306a36Sopenharmony_ci	if (!gc->irq.domain_is_allocated_externally && gc->irq.domain) {
183662306a36Sopenharmony_ci		unsigned int irq;
183762306a36Sopenharmony_ci
183862306a36Sopenharmony_ci		for (offset = 0; offset < gc->ngpio; offset++) {
183962306a36Sopenharmony_ci			if (!gpiochip_irqchip_irq_valid(gc, offset))
184062306a36Sopenharmony_ci				continue;
184162306a36Sopenharmony_ci
184262306a36Sopenharmony_ci			irq = irq_find_mapping(gc->irq.domain, offset);
184362306a36Sopenharmony_ci			irq_dispose_mapping(irq);
184462306a36Sopenharmony_ci		}
184562306a36Sopenharmony_ci
184662306a36Sopenharmony_ci		irq_domain_remove(gc->irq.domain);
184762306a36Sopenharmony_ci	}
184862306a36Sopenharmony_ci
184962306a36Sopenharmony_ci	if (irqchip && !(irqchip->flags & IRQCHIP_IMMUTABLE)) {
185062306a36Sopenharmony_ci		if (irqchip->irq_request_resources == gpiochip_irq_reqres) {
185162306a36Sopenharmony_ci			irqchip->irq_request_resources = NULL;
185262306a36Sopenharmony_ci			irqchip->irq_release_resources = NULL;
185362306a36Sopenharmony_ci		}
185462306a36Sopenharmony_ci		if (irqchip->irq_enable == gpiochip_irq_enable) {
185562306a36Sopenharmony_ci			irqchip->irq_enable = gc->irq.irq_enable;
185662306a36Sopenharmony_ci			irqchip->irq_disable = gc->irq.irq_disable;
185762306a36Sopenharmony_ci		}
185862306a36Sopenharmony_ci	}
185962306a36Sopenharmony_ci	gc->irq.irq_enable = NULL;
186062306a36Sopenharmony_ci	gc->irq.irq_disable = NULL;
186162306a36Sopenharmony_ci	gc->irq.chip = NULL;
186262306a36Sopenharmony_ci
186362306a36Sopenharmony_ci	gpiochip_irqchip_free_valid_mask(gc);
186462306a36Sopenharmony_ci}
186562306a36Sopenharmony_ci
186662306a36Sopenharmony_ci/**
186762306a36Sopenharmony_ci * gpiochip_irqchip_add_domain() - adds an irqdomain to a gpiochip
186862306a36Sopenharmony_ci * @gc: the gpiochip to add the irqchip to
186962306a36Sopenharmony_ci * @domain: the irqdomain to add to the gpiochip
187062306a36Sopenharmony_ci *
187162306a36Sopenharmony_ci * This function adds an IRQ domain to the gpiochip.
187262306a36Sopenharmony_ci */
187362306a36Sopenharmony_ciint gpiochip_irqchip_add_domain(struct gpio_chip *gc,
187462306a36Sopenharmony_ci				struct irq_domain *domain)
187562306a36Sopenharmony_ci{
187662306a36Sopenharmony_ci	return gpiochip_irqchip_add_allocated_domain(gc, domain, true);
187762306a36Sopenharmony_ci}
187862306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiochip_irqchip_add_domain);
187962306a36Sopenharmony_ci
188062306a36Sopenharmony_ci#else /* CONFIG_GPIOLIB_IRQCHIP */
188162306a36Sopenharmony_ci
188262306a36Sopenharmony_cistatic inline int gpiochip_add_irqchip(struct gpio_chip *gc,
188362306a36Sopenharmony_ci				       struct lock_class_key *lock_key,
188462306a36Sopenharmony_ci				       struct lock_class_key *request_key)
188562306a36Sopenharmony_ci{
188662306a36Sopenharmony_ci	return 0;
188762306a36Sopenharmony_ci}
188862306a36Sopenharmony_cistatic void gpiochip_irqchip_remove(struct gpio_chip *gc) {}
188962306a36Sopenharmony_ci
189062306a36Sopenharmony_cistatic inline int gpiochip_irqchip_init_hw(struct gpio_chip *gc)
189162306a36Sopenharmony_ci{
189262306a36Sopenharmony_ci	return 0;
189362306a36Sopenharmony_ci}
189462306a36Sopenharmony_ci
189562306a36Sopenharmony_cistatic inline int gpiochip_irqchip_init_valid_mask(struct gpio_chip *gc)
189662306a36Sopenharmony_ci{
189762306a36Sopenharmony_ci	return 0;
189862306a36Sopenharmony_ci}
189962306a36Sopenharmony_cistatic inline void gpiochip_irqchip_free_valid_mask(struct gpio_chip *gc)
190062306a36Sopenharmony_ci{ }
190162306a36Sopenharmony_ci
190262306a36Sopenharmony_ci#endif /* CONFIG_GPIOLIB_IRQCHIP */
190362306a36Sopenharmony_ci
190462306a36Sopenharmony_ci/**
190562306a36Sopenharmony_ci * gpiochip_generic_request() - request the gpio function for a pin
190662306a36Sopenharmony_ci * @gc: the gpiochip owning the GPIO
190762306a36Sopenharmony_ci * @offset: the offset of the GPIO to request for GPIO function
190862306a36Sopenharmony_ci */
190962306a36Sopenharmony_ciint gpiochip_generic_request(struct gpio_chip *gc, unsigned int offset)
191062306a36Sopenharmony_ci{
191162306a36Sopenharmony_ci#ifdef CONFIG_PINCTRL
191262306a36Sopenharmony_ci	if (list_empty(&gc->gpiodev->pin_ranges))
191362306a36Sopenharmony_ci		return 0;
191462306a36Sopenharmony_ci#endif
191562306a36Sopenharmony_ci
191662306a36Sopenharmony_ci	return pinctrl_gpio_request(gc->gpiodev->base + offset);
191762306a36Sopenharmony_ci}
191862306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiochip_generic_request);
191962306a36Sopenharmony_ci
192062306a36Sopenharmony_ci/**
192162306a36Sopenharmony_ci * gpiochip_generic_free() - free the gpio function from a pin
192262306a36Sopenharmony_ci * @gc: the gpiochip to request the gpio function for
192362306a36Sopenharmony_ci * @offset: the offset of the GPIO to free from GPIO function
192462306a36Sopenharmony_ci */
192562306a36Sopenharmony_civoid gpiochip_generic_free(struct gpio_chip *gc, unsigned int offset)
192662306a36Sopenharmony_ci{
192762306a36Sopenharmony_ci#ifdef CONFIG_PINCTRL
192862306a36Sopenharmony_ci	if (list_empty(&gc->gpiodev->pin_ranges))
192962306a36Sopenharmony_ci		return;
193062306a36Sopenharmony_ci#endif
193162306a36Sopenharmony_ci
193262306a36Sopenharmony_ci	pinctrl_gpio_free(gc->gpiodev->base + offset);
193362306a36Sopenharmony_ci}
193462306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiochip_generic_free);
193562306a36Sopenharmony_ci
193662306a36Sopenharmony_ci/**
193762306a36Sopenharmony_ci * gpiochip_generic_config() - apply configuration for a pin
193862306a36Sopenharmony_ci * @gc: the gpiochip owning the GPIO
193962306a36Sopenharmony_ci * @offset: the offset of the GPIO to apply the configuration
194062306a36Sopenharmony_ci * @config: the configuration to be applied
194162306a36Sopenharmony_ci */
194262306a36Sopenharmony_ciint gpiochip_generic_config(struct gpio_chip *gc, unsigned int offset,
194362306a36Sopenharmony_ci			    unsigned long config)
194462306a36Sopenharmony_ci{
194562306a36Sopenharmony_ci	return pinctrl_gpio_set_config(gc->gpiodev->base + offset, config);
194662306a36Sopenharmony_ci}
194762306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiochip_generic_config);
194862306a36Sopenharmony_ci
194962306a36Sopenharmony_ci#ifdef CONFIG_PINCTRL
195062306a36Sopenharmony_ci
195162306a36Sopenharmony_ci/**
195262306a36Sopenharmony_ci * gpiochip_add_pingroup_range() - add a range for GPIO <-> pin mapping
195362306a36Sopenharmony_ci * @gc: the gpiochip to add the range for
195462306a36Sopenharmony_ci * @pctldev: the pin controller to map to
195562306a36Sopenharmony_ci * @gpio_offset: the start offset in the current gpio_chip number space
195662306a36Sopenharmony_ci * @pin_group: name of the pin group inside the pin controller
195762306a36Sopenharmony_ci *
195862306a36Sopenharmony_ci * Calling this function directly from a DeviceTree-supported
195962306a36Sopenharmony_ci * pinctrl driver is DEPRECATED. Please see Section 2.1 of
196062306a36Sopenharmony_ci * Documentation/devicetree/bindings/gpio/gpio.txt on how to
196162306a36Sopenharmony_ci * bind pinctrl and gpio drivers via the "gpio-ranges" property.
196262306a36Sopenharmony_ci */
196362306a36Sopenharmony_ciint gpiochip_add_pingroup_range(struct gpio_chip *gc,
196462306a36Sopenharmony_ci			struct pinctrl_dev *pctldev,
196562306a36Sopenharmony_ci			unsigned int gpio_offset, const char *pin_group)
196662306a36Sopenharmony_ci{
196762306a36Sopenharmony_ci	struct gpio_pin_range *pin_range;
196862306a36Sopenharmony_ci	struct gpio_device *gdev = gc->gpiodev;
196962306a36Sopenharmony_ci	int ret;
197062306a36Sopenharmony_ci
197162306a36Sopenharmony_ci	pin_range = kzalloc(sizeof(*pin_range), GFP_KERNEL);
197262306a36Sopenharmony_ci	if (!pin_range) {
197362306a36Sopenharmony_ci		chip_err(gc, "failed to allocate pin ranges\n");
197462306a36Sopenharmony_ci		return -ENOMEM;
197562306a36Sopenharmony_ci	}
197662306a36Sopenharmony_ci
197762306a36Sopenharmony_ci	/* Use local offset as range ID */
197862306a36Sopenharmony_ci	pin_range->range.id = gpio_offset;
197962306a36Sopenharmony_ci	pin_range->range.gc = gc;
198062306a36Sopenharmony_ci	pin_range->range.name = gc->label;
198162306a36Sopenharmony_ci	pin_range->range.base = gdev->base + gpio_offset;
198262306a36Sopenharmony_ci	pin_range->pctldev = pctldev;
198362306a36Sopenharmony_ci
198462306a36Sopenharmony_ci	ret = pinctrl_get_group_pins(pctldev, pin_group,
198562306a36Sopenharmony_ci					&pin_range->range.pins,
198662306a36Sopenharmony_ci					&pin_range->range.npins);
198762306a36Sopenharmony_ci	if (ret < 0) {
198862306a36Sopenharmony_ci		kfree(pin_range);
198962306a36Sopenharmony_ci		return ret;
199062306a36Sopenharmony_ci	}
199162306a36Sopenharmony_ci
199262306a36Sopenharmony_ci	pinctrl_add_gpio_range(pctldev, &pin_range->range);
199362306a36Sopenharmony_ci
199462306a36Sopenharmony_ci	chip_dbg(gc, "created GPIO range %d->%d ==> %s PINGRP %s\n",
199562306a36Sopenharmony_ci		 gpio_offset, gpio_offset + pin_range->range.npins - 1,
199662306a36Sopenharmony_ci		 pinctrl_dev_get_devname(pctldev), pin_group);
199762306a36Sopenharmony_ci
199862306a36Sopenharmony_ci	list_add_tail(&pin_range->node, &gdev->pin_ranges);
199962306a36Sopenharmony_ci
200062306a36Sopenharmony_ci	return 0;
200162306a36Sopenharmony_ci}
200262306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiochip_add_pingroup_range);
200362306a36Sopenharmony_ci
200462306a36Sopenharmony_ci/**
200562306a36Sopenharmony_ci * gpiochip_add_pin_range() - add a range for GPIO <-> pin mapping
200662306a36Sopenharmony_ci * @gc: the gpiochip to add the range for
200762306a36Sopenharmony_ci * @pinctl_name: the dev_name() of the pin controller to map to
200862306a36Sopenharmony_ci * @gpio_offset: the start offset in the current gpio_chip number space
200962306a36Sopenharmony_ci * @pin_offset: the start offset in the pin controller number space
201062306a36Sopenharmony_ci * @npins: the number of pins from the offset of each pin space (GPIO and
201162306a36Sopenharmony_ci *	pin controller) to accumulate in this range
201262306a36Sopenharmony_ci *
201362306a36Sopenharmony_ci * Returns:
201462306a36Sopenharmony_ci * 0 on success, or a negative error-code on failure.
201562306a36Sopenharmony_ci *
201662306a36Sopenharmony_ci * Calling this function directly from a DeviceTree-supported
201762306a36Sopenharmony_ci * pinctrl driver is DEPRECATED. Please see Section 2.1 of
201862306a36Sopenharmony_ci * Documentation/devicetree/bindings/gpio/gpio.txt on how to
201962306a36Sopenharmony_ci * bind pinctrl and gpio drivers via the "gpio-ranges" property.
202062306a36Sopenharmony_ci */
202162306a36Sopenharmony_ciint gpiochip_add_pin_range(struct gpio_chip *gc, const char *pinctl_name,
202262306a36Sopenharmony_ci			   unsigned int gpio_offset, unsigned int pin_offset,
202362306a36Sopenharmony_ci			   unsigned int npins)
202462306a36Sopenharmony_ci{
202562306a36Sopenharmony_ci	struct gpio_pin_range *pin_range;
202662306a36Sopenharmony_ci	struct gpio_device *gdev = gc->gpiodev;
202762306a36Sopenharmony_ci	int ret;
202862306a36Sopenharmony_ci
202962306a36Sopenharmony_ci	pin_range = kzalloc(sizeof(*pin_range), GFP_KERNEL);
203062306a36Sopenharmony_ci	if (!pin_range) {
203162306a36Sopenharmony_ci		chip_err(gc, "failed to allocate pin ranges\n");
203262306a36Sopenharmony_ci		return -ENOMEM;
203362306a36Sopenharmony_ci	}
203462306a36Sopenharmony_ci
203562306a36Sopenharmony_ci	/* Use local offset as range ID */
203662306a36Sopenharmony_ci	pin_range->range.id = gpio_offset;
203762306a36Sopenharmony_ci	pin_range->range.gc = gc;
203862306a36Sopenharmony_ci	pin_range->range.name = gc->label;
203962306a36Sopenharmony_ci	pin_range->range.base = gdev->base + gpio_offset;
204062306a36Sopenharmony_ci	pin_range->range.pin_base = pin_offset;
204162306a36Sopenharmony_ci	pin_range->range.npins = npins;
204262306a36Sopenharmony_ci	pin_range->pctldev = pinctrl_find_and_add_gpio_range(pinctl_name,
204362306a36Sopenharmony_ci			&pin_range->range);
204462306a36Sopenharmony_ci	if (IS_ERR(pin_range->pctldev)) {
204562306a36Sopenharmony_ci		ret = PTR_ERR(pin_range->pctldev);
204662306a36Sopenharmony_ci		chip_err(gc, "could not create pin range\n");
204762306a36Sopenharmony_ci		kfree(pin_range);
204862306a36Sopenharmony_ci		return ret;
204962306a36Sopenharmony_ci	}
205062306a36Sopenharmony_ci	chip_dbg(gc, "created GPIO range %d->%d ==> %s PIN %d->%d\n",
205162306a36Sopenharmony_ci		 gpio_offset, gpio_offset + npins - 1,
205262306a36Sopenharmony_ci		 pinctl_name,
205362306a36Sopenharmony_ci		 pin_offset, pin_offset + npins - 1);
205462306a36Sopenharmony_ci
205562306a36Sopenharmony_ci	list_add_tail(&pin_range->node, &gdev->pin_ranges);
205662306a36Sopenharmony_ci
205762306a36Sopenharmony_ci	return 0;
205862306a36Sopenharmony_ci}
205962306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiochip_add_pin_range);
206062306a36Sopenharmony_ci
206162306a36Sopenharmony_ci/**
206262306a36Sopenharmony_ci * gpiochip_remove_pin_ranges() - remove all the GPIO <-> pin mappings
206362306a36Sopenharmony_ci * @gc: the chip to remove all the mappings for
206462306a36Sopenharmony_ci */
206562306a36Sopenharmony_civoid gpiochip_remove_pin_ranges(struct gpio_chip *gc)
206662306a36Sopenharmony_ci{
206762306a36Sopenharmony_ci	struct gpio_pin_range *pin_range, *tmp;
206862306a36Sopenharmony_ci	struct gpio_device *gdev = gc->gpiodev;
206962306a36Sopenharmony_ci
207062306a36Sopenharmony_ci	list_for_each_entry_safe(pin_range, tmp, &gdev->pin_ranges, node) {
207162306a36Sopenharmony_ci		list_del(&pin_range->node);
207262306a36Sopenharmony_ci		pinctrl_remove_gpio_range(pin_range->pctldev,
207362306a36Sopenharmony_ci				&pin_range->range);
207462306a36Sopenharmony_ci		kfree(pin_range);
207562306a36Sopenharmony_ci	}
207662306a36Sopenharmony_ci}
207762306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiochip_remove_pin_ranges);
207862306a36Sopenharmony_ci
207962306a36Sopenharmony_ci#endif /* CONFIG_PINCTRL */
208062306a36Sopenharmony_ci
208162306a36Sopenharmony_ci/* These "optional" allocation calls help prevent drivers from stomping
208262306a36Sopenharmony_ci * on each other, and help provide better diagnostics in debugfs.
208362306a36Sopenharmony_ci * They're called even less than the "set direction" calls.
208462306a36Sopenharmony_ci */
208562306a36Sopenharmony_cistatic int gpiod_request_commit(struct gpio_desc *desc, const char *label)
208662306a36Sopenharmony_ci{
208762306a36Sopenharmony_ci	struct gpio_chip	*gc = desc->gdev->chip;
208862306a36Sopenharmony_ci	int			ret;
208962306a36Sopenharmony_ci	unsigned long		flags;
209062306a36Sopenharmony_ci	unsigned		offset;
209162306a36Sopenharmony_ci
209262306a36Sopenharmony_ci	if (label) {
209362306a36Sopenharmony_ci		label = kstrdup_const(label, GFP_KERNEL);
209462306a36Sopenharmony_ci		if (!label)
209562306a36Sopenharmony_ci			return -ENOMEM;
209662306a36Sopenharmony_ci	}
209762306a36Sopenharmony_ci
209862306a36Sopenharmony_ci	spin_lock_irqsave(&gpio_lock, flags);
209962306a36Sopenharmony_ci
210062306a36Sopenharmony_ci	/* NOTE:  gpio_request() can be called in early boot,
210162306a36Sopenharmony_ci	 * before IRQs are enabled, for non-sleeping (SOC) GPIOs.
210262306a36Sopenharmony_ci	 */
210362306a36Sopenharmony_ci
210462306a36Sopenharmony_ci	if (test_and_set_bit(FLAG_REQUESTED, &desc->flags) == 0) {
210562306a36Sopenharmony_ci		desc_set_label(desc, label ? : "?");
210662306a36Sopenharmony_ci	} else {
210762306a36Sopenharmony_ci		ret = -EBUSY;
210862306a36Sopenharmony_ci		goto out_free_unlock;
210962306a36Sopenharmony_ci	}
211062306a36Sopenharmony_ci
211162306a36Sopenharmony_ci	if (gc->request) {
211262306a36Sopenharmony_ci		/* gc->request may sleep */
211362306a36Sopenharmony_ci		spin_unlock_irqrestore(&gpio_lock, flags);
211462306a36Sopenharmony_ci		offset = gpio_chip_hwgpio(desc);
211562306a36Sopenharmony_ci		if (gpiochip_line_is_valid(gc, offset))
211662306a36Sopenharmony_ci			ret = gc->request(gc, offset);
211762306a36Sopenharmony_ci		else
211862306a36Sopenharmony_ci			ret = -EINVAL;
211962306a36Sopenharmony_ci		spin_lock_irqsave(&gpio_lock, flags);
212062306a36Sopenharmony_ci
212162306a36Sopenharmony_ci		if (ret) {
212262306a36Sopenharmony_ci			desc_set_label(desc, NULL);
212362306a36Sopenharmony_ci			clear_bit(FLAG_REQUESTED, &desc->flags);
212462306a36Sopenharmony_ci			goto out_free_unlock;
212562306a36Sopenharmony_ci		}
212662306a36Sopenharmony_ci	}
212762306a36Sopenharmony_ci	if (gc->get_direction) {
212862306a36Sopenharmony_ci		/* gc->get_direction may sleep */
212962306a36Sopenharmony_ci		spin_unlock_irqrestore(&gpio_lock, flags);
213062306a36Sopenharmony_ci		gpiod_get_direction(desc);
213162306a36Sopenharmony_ci		spin_lock_irqsave(&gpio_lock, flags);
213262306a36Sopenharmony_ci	}
213362306a36Sopenharmony_ci	spin_unlock_irqrestore(&gpio_lock, flags);
213462306a36Sopenharmony_ci	return 0;
213562306a36Sopenharmony_ci
213662306a36Sopenharmony_ciout_free_unlock:
213762306a36Sopenharmony_ci	spin_unlock_irqrestore(&gpio_lock, flags);
213862306a36Sopenharmony_ci	kfree_const(label);
213962306a36Sopenharmony_ci	return ret;
214062306a36Sopenharmony_ci}
214162306a36Sopenharmony_ci
214262306a36Sopenharmony_ci/*
214362306a36Sopenharmony_ci * This descriptor validation needs to be inserted verbatim into each
214462306a36Sopenharmony_ci * function taking a descriptor, so we need to use a preprocessor
214562306a36Sopenharmony_ci * macro to avoid endless duplication. If the desc is NULL it is an
214662306a36Sopenharmony_ci * optional GPIO and calls should just bail out.
214762306a36Sopenharmony_ci */
214862306a36Sopenharmony_cistatic int validate_desc(const struct gpio_desc *desc, const char *func)
214962306a36Sopenharmony_ci{
215062306a36Sopenharmony_ci	if (!desc)
215162306a36Sopenharmony_ci		return 0;
215262306a36Sopenharmony_ci	if (IS_ERR(desc)) {
215362306a36Sopenharmony_ci		pr_warn("%s: invalid GPIO (errorpointer)\n", func);
215462306a36Sopenharmony_ci		return PTR_ERR(desc);
215562306a36Sopenharmony_ci	}
215662306a36Sopenharmony_ci	if (!desc->gdev) {
215762306a36Sopenharmony_ci		pr_warn("%s: invalid GPIO (no device)\n", func);
215862306a36Sopenharmony_ci		return -EINVAL;
215962306a36Sopenharmony_ci	}
216062306a36Sopenharmony_ci	if (!desc->gdev->chip) {
216162306a36Sopenharmony_ci		dev_warn(&desc->gdev->dev,
216262306a36Sopenharmony_ci			 "%s: backing chip is gone\n", func);
216362306a36Sopenharmony_ci		return 0;
216462306a36Sopenharmony_ci	}
216562306a36Sopenharmony_ci	return 1;
216662306a36Sopenharmony_ci}
216762306a36Sopenharmony_ci
216862306a36Sopenharmony_ci#define VALIDATE_DESC(desc) do { \
216962306a36Sopenharmony_ci	int __valid = validate_desc(desc, __func__); \
217062306a36Sopenharmony_ci	if (__valid <= 0) \
217162306a36Sopenharmony_ci		return __valid; \
217262306a36Sopenharmony_ci	} while (0)
217362306a36Sopenharmony_ci
217462306a36Sopenharmony_ci#define VALIDATE_DESC_VOID(desc) do { \
217562306a36Sopenharmony_ci	int __valid = validate_desc(desc, __func__); \
217662306a36Sopenharmony_ci	if (__valid <= 0) \
217762306a36Sopenharmony_ci		return; \
217862306a36Sopenharmony_ci	} while (0)
217962306a36Sopenharmony_ci
218062306a36Sopenharmony_ciint gpiod_request(struct gpio_desc *desc, const char *label)
218162306a36Sopenharmony_ci{
218262306a36Sopenharmony_ci	int ret = -EPROBE_DEFER;
218362306a36Sopenharmony_ci
218462306a36Sopenharmony_ci	VALIDATE_DESC(desc);
218562306a36Sopenharmony_ci
218662306a36Sopenharmony_ci	if (try_module_get(desc->gdev->owner)) {
218762306a36Sopenharmony_ci		ret = gpiod_request_commit(desc, label);
218862306a36Sopenharmony_ci		if (ret)
218962306a36Sopenharmony_ci			module_put(desc->gdev->owner);
219062306a36Sopenharmony_ci		else
219162306a36Sopenharmony_ci			gpio_device_get(desc->gdev);
219262306a36Sopenharmony_ci	}
219362306a36Sopenharmony_ci
219462306a36Sopenharmony_ci	if (ret)
219562306a36Sopenharmony_ci		gpiod_dbg(desc, "%s: status %d\n", __func__, ret);
219662306a36Sopenharmony_ci
219762306a36Sopenharmony_ci	return ret;
219862306a36Sopenharmony_ci}
219962306a36Sopenharmony_ci
220062306a36Sopenharmony_cistatic bool gpiod_free_commit(struct gpio_desc *desc)
220162306a36Sopenharmony_ci{
220262306a36Sopenharmony_ci	bool			ret = false;
220362306a36Sopenharmony_ci	unsigned long		flags;
220462306a36Sopenharmony_ci	struct gpio_chip	*gc;
220562306a36Sopenharmony_ci
220662306a36Sopenharmony_ci	might_sleep();
220762306a36Sopenharmony_ci
220862306a36Sopenharmony_ci	spin_lock_irqsave(&gpio_lock, flags);
220962306a36Sopenharmony_ci
221062306a36Sopenharmony_ci	gc = desc->gdev->chip;
221162306a36Sopenharmony_ci	if (gc && test_bit(FLAG_REQUESTED, &desc->flags)) {
221262306a36Sopenharmony_ci		if (gc->free) {
221362306a36Sopenharmony_ci			spin_unlock_irqrestore(&gpio_lock, flags);
221462306a36Sopenharmony_ci			might_sleep_if(gc->can_sleep);
221562306a36Sopenharmony_ci			gc->free(gc, gpio_chip_hwgpio(desc));
221662306a36Sopenharmony_ci			spin_lock_irqsave(&gpio_lock, flags);
221762306a36Sopenharmony_ci		}
221862306a36Sopenharmony_ci		kfree_const(desc->label);
221962306a36Sopenharmony_ci		desc_set_label(desc, NULL);
222062306a36Sopenharmony_ci		clear_bit(FLAG_ACTIVE_LOW, &desc->flags);
222162306a36Sopenharmony_ci		clear_bit(FLAG_REQUESTED, &desc->flags);
222262306a36Sopenharmony_ci		clear_bit(FLAG_OPEN_DRAIN, &desc->flags);
222362306a36Sopenharmony_ci		clear_bit(FLAG_OPEN_SOURCE, &desc->flags);
222462306a36Sopenharmony_ci		clear_bit(FLAG_PULL_UP, &desc->flags);
222562306a36Sopenharmony_ci		clear_bit(FLAG_PULL_DOWN, &desc->flags);
222662306a36Sopenharmony_ci		clear_bit(FLAG_BIAS_DISABLE, &desc->flags);
222762306a36Sopenharmony_ci		clear_bit(FLAG_EDGE_RISING, &desc->flags);
222862306a36Sopenharmony_ci		clear_bit(FLAG_EDGE_FALLING, &desc->flags);
222962306a36Sopenharmony_ci		clear_bit(FLAG_IS_HOGGED, &desc->flags);
223062306a36Sopenharmony_ci#ifdef CONFIG_OF_DYNAMIC
223162306a36Sopenharmony_ci		desc->hog = NULL;
223262306a36Sopenharmony_ci#endif
223362306a36Sopenharmony_ci#ifdef CONFIG_GPIO_CDEV
223462306a36Sopenharmony_ci		WRITE_ONCE(desc->debounce_period_us, 0);
223562306a36Sopenharmony_ci#endif
223662306a36Sopenharmony_ci		ret = true;
223762306a36Sopenharmony_ci	}
223862306a36Sopenharmony_ci
223962306a36Sopenharmony_ci	spin_unlock_irqrestore(&gpio_lock, flags);
224062306a36Sopenharmony_ci	gpiod_line_state_notify(desc, GPIOLINE_CHANGED_RELEASED);
224162306a36Sopenharmony_ci
224262306a36Sopenharmony_ci	return ret;
224362306a36Sopenharmony_ci}
224462306a36Sopenharmony_ci
224562306a36Sopenharmony_civoid gpiod_free(struct gpio_desc *desc)
224662306a36Sopenharmony_ci{
224762306a36Sopenharmony_ci	/*
224862306a36Sopenharmony_ci	 * We must not use VALIDATE_DESC_VOID() as the underlying gdev->chip
224962306a36Sopenharmony_ci	 * may already be NULL but we still want to put the references.
225062306a36Sopenharmony_ci	 */
225162306a36Sopenharmony_ci	if (!desc)
225262306a36Sopenharmony_ci		return;
225362306a36Sopenharmony_ci
225462306a36Sopenharmony_ci	if (!gpiod_free_commit(desc))
225562306a36Sopenharmony_ci		WARN_ON(extra_checks);
225662306a36Sopenharmony_ci
225762306a36Sopenharmony_ci	module_put(desc->gdev->owner);
225862306a36Sopenharmony_ci	gpio_device_put(desc->gdev);
225962306a36Sopenharmony_ci}
226062306a36Sopenharmony_ci
226162306a36Sopenharmony_ci/**
226262306a36Sopenharmony_ci * gpiochip_is_requested - return string iff signal was requested
226362306a36Sopenharmony_ci * @gc: controller managing the signal
226462306a36Sopenharmony_ci * @offset: of signal within controller's 0..(ngpio - 1) range
226562306a36Sopenharmony_ci *
226662306a36Sopenharmony_ci * Returns NULL if the GPIO is not currently requested, else a string.
226762306a36Sopenharmony_ci * The string returned is the label passed to gpio_request(); if none has been
226862306a36Sopenharmony_ci * passed it is a meaningless, non-NULL constant.
226962306a36Sopenharmony_ci *
227062306a36Sopenharmony_ci * This function is for use by GPIO controller drivers.  The label can
227162306a36Sopenharmony_ci * help with diagnostics, and knowing that the signal is used as a GPIO
227262306a36Sopenharmony_ci * can help avoid accidentally multiplexing it to another controller.
227362306a36Sopenharmony_ci */
227462306a36Sopenharmony_ciconst char *gpiochip_is_requested(struct gpio_chip *gc, unsigned int offset)
227562306a36Sopenharmony_ci{
227662306a36Sopenharmony_ci	struct gpio_desc *desc;
227762306a36Sopenharmony_ci
227862306a36Sopenharmony_ci	desc = gpiochip_get_desc(gc, offset);
227962306a36Sopenharmony_ci	if (IS_ERR(desc))
228062306a36Sopenharmony_ci		return NULL;
228162306a36Sopenharmony_ci
228262306a36Sopenharmony_ci	if (test_bit(FLAG_REQUESTED, &desc->flags) == 0)
228362306a36Sopenharmony_ci		return NULL;
228462306a36Sopenharmony_ci	return desc->label;
228562306a36Sopenharmony_ci}
228662306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiochip_is_requested);
228762306a36Sopenharmony_ci
228862306a36Sopenharmony_ci/**
228962306a36Sopenharmony_ci * gpiochip_request_own_desc - Allow GPIO chip to request its own descriptor
229062306a36Sopenharmony_ci * @gc: GPIO chip
229162306a36Sopenharmony_ci * @hwnum: hardware number of the GPIO for which to request the descriptor
229262306a36Sopenharmony_ci * @label: label for the GPIO
229362306a36Sopenharmony_ci * @lflags: lookup flags for this GPIO or 0 if default, this can be used to
229462306a36Sopenharmony_ci * specify things like line inversion semantics with the machine flags
229562306a36Sopenharmony_ci * such as GPIO_OUT_LOW
229662306a36Sopenharmony_ci * @dflags: descriptor request flags for this GPIO or 0 if default, this
229762306a36Sopenharmony_ci * can be used to specify consumer semantics such as open drain
229862306a36Sopenharmony_ci *
229962306a36Sopenharmony_ci * Function allows GPIO chip drivers to request and use their own GPIO
230062306a36Sopenharmony_ci * descriptors via gpiolib API. Difference to gpiod_request() is that this
230162306a36Sopenharmony_ci * function will not increase reference count of the GPIO chip module. This
230262306a36Sopenharmony_ci * allows the GPIO chip module to be unloaded as needed (we assume that the
230362306a36Sopenharmony_ci * GPIO chip driver handles freeing the GPIOs it has requested).
230462306a36Sopenharmony_ci *
230562306a36Sopenharmony_ci * Returns:
230662306a36Sopenharmony_ci * A pointer to the GPIO descriptor, or an ERR_PTR()-encoded negative error
230762306a36Sopenharmony_ci * code on failure.
230862306a36Sopenharmony_ci */
230962306a36Sopenharmony_cistruct gpio_desc *gpiochip_request_own_desc(struct gpio_chip *gc,
231062306a36Sopenharmony_ci					    unsigned int hwnum,
231162306a36Sopenharmony_ci					    const char *label,
231262306a36Sopenharmony_ci					    enum gpio_lookup_flags lflags,
231362306a36Sopenharmony_ci					    enum gpiod_flags dflags)
231462306a36Sopenharmony_ci{
231562306a36Sopenharmony_ci	struct gpio_desc *desc = gpiochip_get_desc(gc, hwnum);
231662306a36Sopenharmony_ci	int ret;
231762306a36Sopenharmony_ci
231862306a36Sopenharmony_ci	if (IS_ERR(desc)) {
231962306a36Sopenharmony_ci		chip_err(gc, "failed to get GPIO descriptor\n");
232062306a36Sopenharmony_ci		return desc;
232162306a36Sopenharmony_ci	}
232262306a36Sopenharmony_ci
232362306a36Sopenharmony_ci	ret = gpiod_request_commit(desc, label);
232462306a36Sopenharmony_ci	if (ret < 0)
232562306a36Sopenharmony_ci		return ERR_PTR(ret);
232662306a36Sopenharmony_ci
232762306a36Sopenharmony_ci	ret = gpiod_configure_flags(desc, label, lflags, dflags);
232862306a36Sopenharmony_ci	if (ret) {
232962306a36Sopenharmony_ci		chip_err(gc, "setup of own GPIO %s failed\n", label);
233062306a36Sopenharmony_ci		gpiod_free_commit(desc);
233162306a36Sopenharmony_ci		return ERR_PTR(ret);
233262306a36Sopenharmony_ci	}
233362306a36Sopenharmony_ci
233462306a36Sopenharmony_ci	return desc;
233562306a36Sopenharmony_ci}
233662306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiochip_request_own_desc);
233762306a36Sopenharmony_ci
233862306a36Sopenharmony_ci/**
233962306a36Sopenharmony_ci * gpiochip_free_own_desc - Free GPIO requested by the chip driver
234062306a36Sopenharmony_ci * @desc: GPIO descriptor to free
234162306a36Sopenharmony_ci *
234262306a36Sopenharmony_ci * Function frees the given GPIO requested previously with
234362306a36Sopenharmony_ci * gpiochip_request_own_desc().
234462306a36Sopenharmony_ci */
234562306a36Sopenharmony_civoid gpiochip_free_own_desc(struct gpio_desc *desc)
234662306a36Sopenharmony_ci{
234762306a36Sopenharmony_ci	if (desc)
234862306a36Sopenharmony_ci		gpiod_free_commit(desc);
234962306a36Sopenharmony_ci}
235062306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiochip_free_own_desc);
235162306a36Sopenharmony_ci
235262306a36Sopenharmony_ci/*
235362306a36Sopenharmony_ci * Drivers MUST set GPIO direction before making get/set calls.  In
235462306a36Sopenharmony_ci * some cases this is done in early boot, before IRQs are enabled.
235562306a36Sopenharmony_ci *
235662306a36Sopenharmony_ci * As a rule these aren't called more than once (except for drivers
235762306a36Sopenharmony_ci * using the open-drain emulation idiom) so these are natural places
235862306a36Sopenharmony_ci * to accumulate extra debugging checks.  Note that we can't (yet)
235962306a36Sopenharmony_ci * rely on gpio_request() having been called beforehand.
236062306a36Sopenharmony_ci */
236162306a36Sopenharmony_ci
236262306a36Sopenharmony_cistatic int gpio_do_set_config(struct gpio_chip *gc, unsigned int offset,
236362306a36Sopenharmony_ci			      unsigned long config)
236462306a36Sopenharmony_ci{
236562306a36Sopenharmony_ci	if (!gc->set_config)
236662306a36Sopenharmony_ci		return -ENOTSUPP;
236762306a36Sopenharmony_ci
236862306a36Sopenharmony_ci	return gc->set_config(gc, offset, config);
236962306a36Sopenharmony_ci}
237062306a36Sopenharmony_ci
237162306a36Sopenharmony_cistatic int gpio_set_config_with_argument(struct gpio_desc *desc,
237262306a36Sopenharmony_ci					 enum pin_config_param mode,
237362306a36Sopenharmony_ci					 u32 argument)
237462306a36Sopenharmony_ci{
237562306a36Sopenharmony_ci	struct gpio_chip *gc = desc->gdev->chip;
237662306a36Sopenharmony_ci	unsigned long config;
237762306a36Sopenharmony_ci
237862306a36Sopenharmony_ci	config = pinconf_to_config_packed(mode, argument);
237962306a36Sopenharmony_ci	return gpio_do_set_config(gc, gpio_chip_hwgpio(desc), config);
238062306a36Sopenharmony_ci}
238162306a36Sopenharmony_ci
238262306a36Sopenharmony_cistatic int gpio_set_config_with_argument_optional(struct gpio_desc *desc,
238362306a36Sopenharmony_ci						  enum pin_config_param mode,
238462306a36Sopenharmony_ci						  u32 argument)
238562306a36Sopenharmony_ci{
238662306a36Sopenharmony_ci	struct device *dev = &desc->gdev->dev;
238762306a36Sopenharmony_ci	int gpio = gpio_chip_hwgpio(desc);
238862306a36Sopenharmony_ci	int ret;
238962306a36Sopenharmony_ci
239062306a36Sopenharmony_ci	ret = gpio_set_config_with_argument(desc, mode, argument);
239162306a36Sopenharmony_ci	if (ret != -ENOTSUPP)
239262306a36Sopenharmony_ci		return ret;
239362306a36Sopenharmony_ci
239462306a36Sopenharmony_ci	switch (mode) {
239562306a36Sopenharmony_ci	case PIN_CONFIG_PERSIST_STATE:
239662306a36Sopenharmony_ci		dev_dbg(dev, "Persistence not supported for GPIO %d\n", gpio);
239762306a36Sopenharmony_ci		break;
239862306a36Sopenharmony_ci	default:
239962306a36Sopenharmony_ci		break;
240062306a36Sopenharmony_ci	}
240162306a36Sopenharmony_ci
240262306a36Sopenharmony_ci	return 0;
240362306a36Sopenharmony_ci}
240462306a36Sopenharmony_ci
240562306a36Sopenharmony_cistatic int gpio_set_config(struct gpio_desc *desc, enum pin_config_param mode)
240662306a36Sopenharmony_ci{
240762306a36Sopenharmony_ci	return gpio_set_config_with_argument(desc, mode, 0);
240862306a36Sopenharmony_ci}
240962306a36Sopenharmony_ci
241062306a36Sopenharmony_cistatic int gpio_set_bias(struct gpio_desc *desc)
241162306a36Sopenharmony_ci{
241262306a36Sopenharmony_ci	enum pin_config_param bias;
241362306a36Sopenharmony_ci	unsigned int arg;
241462306a36Sopenharmony_ci
241562306a36Sopenharmony_ci	if (test_bit(FLAG_BIAS_DISABLE, &desc->flags))
241662306a36Sopenharmony_ci		bias = PIN_CONFIG_BIAS_DISABLE;
241762306a36Sopenharmony_ci	else if (test_bit(FLAG_PULL_UP, &desc->flags))
241862306a36Sopenharmony_ci		bias = PIN_CONFIG_BIAS_PULL_UP;
241962306a36Sopenharmony_ci	else if (test_bit(FLAG_PULL_DOWN, &desc->flags))
242062306a36Sopenharmony_ci		bias = PIN_CONFIG_BIAS_PULL_DOWN;
242162306a36Sopenharmony_ci	else
242262306a36Sopenharmony_ci		return 0;
242362306a36Sopenharmony_ci
242462306a36Sopenharmony_ci	switch (bias) {
242562306a36Sopenharmony_ci	case PIN_CONFIG_BIAS_PULL_DOWN:
242662306a36Sopenharmony_ci	case PIN_CONFIG_BIAS_PULL_UP:
242762306a36Sopenharmony_ci		arg = 1;
242862306a36Sopenharmony_ci		break;
242962306a36Sopenharmony_ci
243062306a36Sopenharmony_ci	default:
243162306a36Sopenharmony_ci		arg = 0;
243262306a36Sopenharmony_ci		break;
243362306a36Sopenharmony_ci	}
243462306a36Sopenharmony_ci
243562306a36Sopenharmony_ci	return gpio_set_config_with_argument_optional(desc, bias, arg);
243662306a36Sopenharmony_ci}
243762306a36Sopenharmony_ci
243862306a36Sopenharmony_ci/**
243962306a36Sopenharmony_ci * gpio_set_debounce_timeout() - Set debounce timeout
244062306a36Sopenharmony_ci * @desc:	GPIO descriptor to set the debounce timeout
244162306a36Sopenharmony_ci * @debounce:	Debounce timeout in microseconds
244262306a36Sopenharmony_ci *
244362306a36Sopenharmony_ci * The function calls the certain GPIO driver to set debounce timeout
244462306a36Sopenharmony_ci * in the hardware.
244562306a36Sopenharmony_ci *
244662306a36Sopenharmony_ci * Returns 0 on success, or negative error code otherwise.
244762306a36Sopenharmony_ci */
244862306a36Sopenharmony_ciint gpio_set_debounce_timeout(struct gpio_desc *desc, unsigned int debounce)
244962306a36Sopenharmony_ci{
245062306a36Sopenharmony_ci	return gpio_set_config_with_argument_optional(desc,
245162306a36Sopenharmony_ci						      PIN_CONFIG_INPUT_DEBOUNCE,
245262306a36Sopenharmony_ci						      debounce);
245362306a36Sopenharmony_ci}
245462306a36Sopenharmony_ci
245562306a36Sopenharmony_ci/**
245662306a36Sopenharmony_ci * gpiod_direction_input - set the GPIO direction to input
245762306a36Sopenharmony_ci * @desc:	GPIO to set to input
245862306a36Sopenharmony_ci *
245962306a36Sopenharmony_ci * Set the direction of the passed GPIO to input, such as gpiod_get_value() can
246062306a36Sopenharmony_ci * be called safely on it.
246162306a36Sopenharmony_ci *
246262306a36Sopenharmony_ci * Return 0 in case of success, else an error code.
246362306a36Sopenharmony_ci */
246462306a36Sopenharmony_ciint gpiod_direction_input(struct gpio_desc *desc)
246562306a36Sopenharmony_ci{
246662306a36Sopenharmony_ci	struct gpio_chip	*gc;
246762306a36Sopenharmony_ci	int			ret = 0;
246862306a36Sopenharmony_ci
246962306a36Sopenharmony_ci	VALIDATE_DESC(desc);
247062306a36Sopenharmony_ci	gc = desc->gdev->chip;
247162306a36Sopenharmony_ci
247262306a36Sopenharmony_ci	/*
247362306a36Sopenharmony_ci	 * It is legal to have no .get() and .direction_input() specified if
247462306a36Sopenharmony_ci	 * the chip is output-only, but you can't specify .direction_input()
247562306a36Sopenharmony_ci	 * and not support the .get() operation, that doesn't make sense.
247662306a36Sopenharmony_ci	 */
247762306a36Sopenharmony_ci	if (!gc->get && gc->direction_input) {
247862306a36Sopenharmony_ci		gpiod_warn(desc,
247962306a36Sopenharmony_ci			   "%s: missing get() but have direction_input()\n",
248062306a36Sopenharmony_ci			   __func__);
248162306a36Sopenharmony_ci		return -EIO;
248262306a36Sopenharmony_ci	}
248362306a36Sopenharmony_ci
248462306a36Sopenharmony_ci	/*
248562306a36Sopenharmony_ci	 * If we have a .direction_input() callback, things are simple,
248662306a36Sopenharmony_ci	 * just call it. Else we are some input-only chip so try to check the
248762306a36Sopenharmony_ci	 * direction (if .get_direction() is supported) else we silently
248862306a36Sopenharmony_ci	 * assume we are in input mode after this.
248962306a36Sopenharmony_ci	 */
249062306a36Sopenharmony_ci	if (gc->direction_input) {
249162306a36Sopenharmony_ci		ret = gc->direction_input(gc, gpio_chip_hwgpio(desc));
249262306a36Sopenharmony_ci	} else if (gc->get_direction &&
249362306a36Sopenharmony_ci		  (gc->get_direction(gc, gpio_chip_hwgpio(desc)) != 1)) {
249462306a36Sopenharmony_ci		gpiod_warn(desc,
249562306a36Sopenharmony_ci			   "%s: missing direction_input() operation and line is output\n",
249662306a36Sopenharmony_ci			   __func__);
249762306a36Sopenharmony_ci		return -EIO;
249862306a36Sopenharmony_ci	}
249962306a36Sopenharmony_ci	if (ret == 0) {
250062306a36Sopenharmony_ci		clear_bit(FLAG_IS_OUT, &desc->flags);
250162306a36Sopenharmony_ci		ret = gpio_set_bias(desc);
250262306a36Sopenharmony_ci	}
250362306a36Sopenharmony_ci
250462306a36Sopenharmony_ci	trace_gpio_direction(desc_to_gpio(desc), 1, ret);
250562306a36Sopenharmony_ci
250662306a36Sopenharmony_ci	return ret;
250762306a36Sopenharmony_ci}
250862306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiod_direction_input);
250962306a36Sopenharmony_ci
251062306a36Sopenharmony_cistatic int gpiod_direction_output_raw_commit(struct gpio_desc *desc, int value)
251162306a36Sopenharmony_ci{
251262306a36Sopenharmony_ci	struct gpio_chip *gc = desc->gdev->chip;
251362306a36Sopenharmony_ci	int val = !!value;
251462306a36Sopenharmony_ci	int ret = 0;
251562306a36Sopenharmony_ci
251662306a36Sopenharmony_ci	/*
251762306a36Sopenharmony_ci	 * It's OK not to specify .direction_output() if the gpiochip is
251862306a36Sopenharmony_ci	 * output-only, but if there is then not even a .set() operation it
251962306a36Sopenharmony_ci	 * is pretty tricky to drive the output line.
252062306a36Sopenharmony_ci	 */
252162306a36Sopenharmony_ci	if (!gc->set && !gc->direction_output) {
252262306a36Sopenharmony_ci		gpiod_warn(desc,
252362306a36Sopenharmony_ci			   "%s: missing set() and direction_output() operations\n",
252462306a36Sopenharmony_ci			   __func__);
252562306a36Sopenharmony_ci		return -EIO;
252662306a36Sopenharmony_ci	}
252762306a36Sopenharmony_ci
252862306a36Sopenharmony_ci	if (gc->direction_output) {
252962306a36Sopenharmony_ci		ret = gc->direction_output(gc, gpio_chip_hwgpio(desc), val);
253062306a36Sopenharmony_ci	} else {
253162306a36Sopenharmony_ci		/* Check that we are in output mode if we can */
253262306a36Sopenharmony_ci		if (gc->get_direction &&
253362306a36Sopenharmony_ci		    gc->get_direction(gc, gpio_chip_hwgpio(desc))) {
253462306a36Sopenharmony_ci			gpiod_warn(desc,
253562306a36Sopenharmony_ci				"%s: missing direction_output() operation\n",
253662306a36Sopenharmony_ci				__func__);
253762306a36Sopenharmony_ci			return -EIO;
253862306a36Sopenharmony_ci		}
253962306a36Sopenharmony_ci		/*
254062306a36Sopenharmony_ci		 * If we can't actively set the direction, we are some
254162306a36Sopenharmony_ci		 * output-only chip, so just drive the output as desired.
254262306a36Sopenharmony_ci		 */
254362306a36Sopenharmony_ci		gc->set(gc, gpio_chip_hwgpio(desc), val);
254462306a36Sopenharmony_ci	}
254562306a36Sopenharmony_ci
254662306a36Sopenharmony_ci	if (!ret)
254762306a36Sopenharmony_ci		set_bit(FLAG_IS_OUT, &desc->flags);
254862306a36Sopenharmony_ci	trace_gpio_value(desc_to_gpio(desc), 0, val);
254962306a36Sopenharmony_ci	trace_gpio_direction(desc_to_gpio(desc), 0, ret);
255062306a36Sopenharmony_ci	return ret;
255162306a36Sopenharmony_ci}
255262306a36Sopenharmony_ci
255362306a36Sopenharmony_ci/**
255462306a36Sopenharmony_ci * gpiod_direction_output_raw - set the GPIO direction to output
255562306a36Sopenharmony_ci * @desc:	GPIO to set to output
255662306a36Sopenharmony_ci * @value:	initial output value of the GPIO
255762306a36Sopenharmony_ci *
255862306a36Sopenharmony_ci * Set the direction of the passed GPIO to output, such as gpiod_set_value() can
255962306a36Sopenharmony_ci * be called safely on it. The initial value of the output must be specified
256062306a36Sopenharmony_ci * as raw value on the physical line without regard for the ACTIVE_LOW status.
256162306a36Sopenharmony_ci *
256262306a36Sopenharmony_ci * Return 0 in case of success, else an error code.
256362306a36Sopenharmony_ci */
256462306a36Sopenharmony_ciint gpiod_direction_output_raw(struct gpio_desc *desc, int value)
256562306a36Sopenharmony_ci{
256662306a36Sopenharmony_ci	VALIDATE_DESC(desc);
256762306a36Sopenharmony_ci	return gpiod_direction_output_raw_commit(desc, value);
256862306a36Sopenharmony_ci}
256962306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiod_direction_output_raw);
257062306a36Sopenharmony_ci
257162306a36Sopenharmony_ci/**
257262306a36Sopenharmony_ci * gpiod_direction_output - set the GPIO direction to output
257362306a36Sopenharmony_ci * @desc:	GPIO to set to output
257462306a36Sopenharmony_ci * @value:	initial output value of the GPIO
257562306a36Sopenharmony_ci *
257662306a36Sopenharmony_ci * Set the direction of the passed GPIO to output, such as gpiod_set_value() can
257762306a36Sopenharmony_ci * be called safely on it. The initial value of the output must be specified
257862306a36Sopenharmony_ci * as the logical value of the GPIO, i.e. taking its ACTIVE_LOW status into
257962306a36Sopenharmony_ci * account.
258062306a36Sopenharmony_ci *
258162306a36Sopenharmony_ci * Return 0 in case of success, else an error code.
258262306a36Sopenharmony_ci */
258362306a36Sopenharmony_ciint gpiod_direction_output(struct gpio_desc *desc, int value)
258462306a36Sopenharmony_ci{
258562306a36Sopenharmony_ci	int ret;
258662306a36Sopenharmony_ci
258762306a36Sopenharmony_ci	VALIDATE_DESC(desc);
258862306a36Sopenharmony_ci	if (test_bit(FLAG_ACTIVE_LOW, &desc->flags))
258962306a36Sopenharmony_ci		value = !value;
259062306a36Sopenharmony_ci	else
259162306a36Sopenharmony_ci		value = !!value;
259262306a36Sopenharmony_ci
259362306a36Sopenharmony_ci	/* GPIOs used for enabled IRQs shall not be set as output */
259462306a36Sopenharmony_ci	if (test_bit(FLAG_USED_AS_IRQ, &desc->flags) &&
259562306a36Sopenharmony_ci	    test_bit(FLAG_IRQ_IS_ENABLED, &desc->flags)) {
259662306a36Sopenharmony_ci		gpiod_err(desc,
259762306a36Sopenharmony_ci			  "%s: tried to set a GPIO tied to an IRQ as output\n",
259862306a36Sopenharmony_ci			  __func__);
259962306a36Sopenharmony_ci		return -EIO;
260062306a36Sopenharmony_ci	}
260162306a36Sopenharmony_ci
260262306a36Sopenharmony_ci	if (test_bit(FLAG_OPEN_DRAIN, &desc->flags)) {
260362306a36Sopenharmony_ci		/* First see if we can enable open drain in hardware */
260462306a36Sopenharmony_ci		ret = gpio_set_config(desc, PIN_CONFIG_DRIVE_OPEN_DRAIN);
260562306a36Sopenharmony_ci		if (!ret)
260662306a36Sopenharmony_ci			goto set_output_value;
260762306a36Sopenharmony_ci		/* Emulate open drain by not actively driving the line high */
260862306a36Sopenharmony_ci		if (value) {
260962306a36Sopenharmony_ci			ret = gpiod_direction_input(desc);
261062306a36Sopenharmony_ci			goto set_output_flag;
261162306a36Sopenharmony_ci		}
261262306a36Sopenharmony_ci	} else if (test_bit(FLAG_OPEN_SOURCE, &desc->flags)) {
261362306a36Sopenharmony_ci		ret = gpio_set_config(desc, PIN_CONFIG_DRIVE_OPEN_SOURCE);
261462306a36Sopenharmony_ci		if (!ret)
261562306a36Sopenharmony_ci			goto set_output_value;
261662306a36Sopenharmony_ci		/* Emulate open source by not actively driving the line low */
261762306a36Sopenharmony_ci		if (!value) {
261862306a36Sopenharmony_ci			ret = gpiod_direction_input(desc);
261962306a36Sopenharmony_ci			goto set_output_flag;
262062306a36Sopenharmony_ci		}
262162306a36Sopenharmony_ci	} else {
262262306a36Sopenharmony_ci		gpio_set_config(desc, PIN_CONFIG_DRIVE_PUSH_PULL);
262362306a36Sopenharmony_ci	}
262462306a36Sopenharmony_ci
262562306a36Sopenharmony_ciset_output_value:
262662306a36Sopenharmony_ci	ret = gpio_set_bias(desc);
262762306a36Sopenharmony_ci	if (ret)
262862306a36Sopenharmony_ci		return ret;
262962306a36Sopenharmony_ci	return gpiod_direction_output_raw_commit(desc, value);
263062306a36Sopenharmony_ci
263162306a36Sopenharmony_ciset_output_flag:
263262306a36Sopenharmony_ci	/*
263362306a36Sopenharmony_ci	 * When emulating open-source or open-drain functionalities by not
263462306a36Sopenharmony_ci	 * actively driving the line (setting mode to input) we still need to
263562306a36Sopenharmony_ci	 * set the IS_OUT flag or otherwise we won't be able to set the line
263662306a36Sopenharmony_ci	 * value anymore.
263762306a36Sopenharmony_ci	 */
263862306a36Sopenharmony_ci	if (ret == 0)
263962306a36Sopenharmony_ci		set_bit(FLAG_IS_OUT, &desc->flags);
264062306a36Sopenharmony_ci	return ret;
264162306a36Sopenharmony_ci}
264262306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiod_direction_output);
264362306a36Sopenharmony_ci
264462306a36Sopenharmony_ci/**
264562306a36Sopenharmony_ci * gpiod_enable_hw_timestamp_ns - Enable hardware timestamp in nanoseconds.
264662306a36Sopenharmony_ci *
264762306a36Sopenharmony_ci * @desc: GPIO to enable.
264862306a36Sopenharmony_ci * @flags: Flags related to GPIO edge.
264962306a36Sopenharmony_ci *
265062306a36Sopenharmony_ci * Return 0 in case of success, else negative error code.
265162306a36Sopenharmony_ci */
265262306a36Sopenharmony_ciint gpiod_enable_hw_timestamp_ns(struct gpio_desc *desc, unsigned long flags)
265362306a36Sopenharmony_ci{
265462306a36Sopenharmony_ci	int ret = 0;
265562306a36Sopenharmony_ci	struct gpio_chip *gc;
265662306a36Sopenharmony_ci
265762306a36Sopenharmony_ci	VALIDATE_DESC(desc);
265862306a36Sopenharmony_ci
265962306a36Sopenharmony_ci	gc = desc->gdev->chip;
266062306a36Sopenharmony_ci	if (!gc->en_hw_timestamp) {
266162306a36Sopenharmony_ci		gpiod_warn(desc, "%s: hw ts not supported\n", __func__);
266262306a36Sopenharmony_ci		return -ENOTSUPP;
266362306a36Sopenharmony_ci	}
266462306a36Sopenharmony_ci
266562306a36Sopenharmony_ci	ret = gc->en_hw_timestamp(gc, gpio_chip_hwgpio(desc), flags);
266662306a36Sopenharmony_ci	if (ret)
266762306a36Sopenharmony_ci		gpiod_warn(desc, "%s: hw ts request failed\n", __func__);
266862306a36Sopenharmony_ci
266962306a36Sopenharmony_ci	return ret;
267062306a36Sopenharmony_ci}
267162306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiod_enable_hw_timestamp_ns);
267262306a36Sopenharmony_ci
267362306a36Sopenharmony_ci/**
267462306a36Sopenharmony_ci * gpiod_disable_hw_timestamp_ns - Disable hardware timestamp.
267562306a36Sopenharmony_ci *
267662306a36Sopenharmony_ci * @desc: GPIO to disable.
267762306a36Sopenharmony_ci * @flags: Flags related to GPIO edge, same value as used during enable call.
267862306a36Sopenharmony_ci *
267962306a36Sopenharmony_ci * Return 0 in case of success, else negative error code.
268062306a36Sopenharmony_ci */
268162306a36Sopenharmony_ciint gpiod_disable_hw_timestamp_ns(struct gpio_desc *desc, unsigned long flags)
268262306a36Sopenharmony_ci{
268362306a36Sopenharmony_ci	int ret = 0;
268462306a36Sopenharmony_ci	struct gpio_chip *gc;
268562306a36Sopenharmony_ci
268662306a36Sopenharmony_ci	VALIDATE_DESC(desc);
268762306a36Sopenharmony_ci
268862306a36Sopenharmony_ci	gc = desc->gdev->chip;
268962306a36Sopenharmony_ci	if (!gc->dis_hw_timestamp) {
269062306a36Sopenharmony_ci		gpiod_warn(desc, "%s: hw ts not supported\n", __func__);
269162306a36Sopenharmony_ci		return -ENOTSUPP;
269262306a36Sopenharmony_ci	}
269362306a36Sopenharmony_ci
269462306a36Sopenharmony_ci	ret = gc->dis_hw_timestamp(gc, gpio_chip_hwgpio(desc), flags);
269562306a36Sopenharmony_ci	if (ret)
269662306a36Sopenharmony_ci		gpiod_warn(desc, "%s: hw ts release failed\n", __func__);
269762306a36Sopenharmony_ci
269862306a36Sopenharmony_ci	return ret;
269962306a36Sopenharmony_ci}
270062306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiod_disable_hw_timestamp_ns);
270162306a36Sopenharmony_ci
270262306a36Sopenharmony_ci/**
270362306a36Sopenharmony_ci * gpiod_set_config - sets @config for a GPIO
270462306a36Sopenharmony_ci * @desc: descriptor of the GPIO for which to set the configuration
270562306a36Sopenharmony_ci * @config: Same packed config format as generic pinconf
270662306a36Sopenharmony_ci *
270762306a36Sopenharmony_ci * Returns:
270862306a36Sopenharmony_ci * 0 on success, %-ENOTSUPP if the controller doesn't support setting the
270962306a36Sopenharmony_ci * configuration.
271062306a36Sopenharmony_ci */
271162306a36Sopenharmony_ciint gpiod_set_config(struct gpio_desc *desc, unsigned long config)
271262306a36Sopenharmony_ci{
271362306a36Sopenharmony_ci	struct gpio_chip *gc;
271462306a36Sopenharmony_ci
271562306a36Sopenharmony_ci	VALIDATE_DESC(desc);
271662306a36Sopenharmony_ci	gc = desc->gdev->chip;
271762306a36Sopenharmony_ci
271862306a36Sopenharmony_ci	return gpio_do_set_config(gc, gpio_chip_hwgpio(desc), config);
271962306a36Sopenharmony_ci}
272062306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiod_set_config);
272162306a36Sopenharmony_ci
272262306a36Sopenharmony_ci/**
272362306a36Sopenharmony_ci * gpiod_set_debounce - sets @debounce time for a GPIO
272462306a36Sopenharmony_ci * @desc: descriptor of the GPIO for which to set debounce time
272562306a36Sopenharmony_ci * @debounce: debounce time in microseconds
272662306a36Sopenharmony_ci *
272762306a36Sopenharmony_ci * Returns:
272862306a36Sopenharmony_ci * 0 on success, %-ENOTSUPP if the controller doesn't support setting the
272962306a36Sopenharmony_ci * debounce time.
273062306a36Sopenharmony_ci */
273162306a36Sopenharmony_ciint gpiod_set_debounce(struct gpio_desc *desc, unsigned int debounce)
273262306a36Sopenharmony_ci{
273362306a36Sopenharmony_ci	unsigned long config;
273462306a36Sopenharmony_ci
273562306a36Sopenharmony_ci	config = pinconf_to_config_packed(PIN_CONFIG_INPUT_DEBOUNCE, debounce);
273662306a36Sopenharmony_ci	return gpiod_set_config(desc, config);
273762306a36Sopenharmony_ci}
273862306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiod_set_debounce);
273962306a36Sopenharmony_ci
274062306a36Sopenharmony_ci/**
274162306a36Sopenharmony_ci * gpiod_set_transitory - Lose or retain GPIO state on suspend or reset
274262306a36Sopenharmony_ci * @desc: descriptor of the GPIO for which to configure persistence
274362306a36Sopenharmony_ci * @transitory: True to lose state on suspend or reset, false for persistence
274462306a36Sopenharmony_ci *
274562306a36Sopenharmony_ci * Returns:
274662306a36Sopenharmony_ci * 0 on success, otherwise a negative error code.
274762306a36Sopenharmony_ci */
274862306a36Sopenharmony_ciint gpiod_set_transitory(struct gpio_desc *desc, bool transitory)
274962306a36Sopenharmony_ci{
275062306a36Sopenharmony_ci	VALIDATE_DESC(desc);
275162306a36Sopenharmony_ci	/*
275262306a36Sopenharmony_ci	 * Handle FLAG_TRANSITORY first, enabling queries to gpiolib for
275362306a36Sopenharmony_ci	 * persistence state.
275462306a36Sopenharmony_ci	 */
275562306a36Sopenharmony_ci	assign_bit(FLAG_TRANSITORY, &desc->flags, transitory);
275662306a36Sopenharmony_ci
275762306a36Sopenharmony_ci	/* If the driver supports it, set the persistence state now */
275862306a36Sopenharmony_ci	return gpio_set_config_with_argument_optional(desc,
275962306a36Sopenharmony_ci						      PIN_CONFIG_PERSIST_STATE,
276062306a36Sopenharmony_ci						      !transitory);
276162306a36Sopenharmony_ci}
276262306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiod_set_transitory);
276362306a36Sopenharmony_ci
276462306a36Sopenharmony_ci/**
276562306a36Sopenharmony_ci * gpiod_is_active_low - test whether a GPIO is active-low or not
276662306a36Sopenharmony_ci * @desc: the gpio descriptor to test
276762306a36Sopenharmony_ci *
276862306a36Sopenharmony_ci * Returns 1 if the GPIO is active-low, 0 otherwise.
276962306a36Sopenharmony_ci */
277062306a36Sopenharmony_ciint gpiod_is_active_low(const struct gpio_desc *desc)
277162306a36Sopenharmony_ci{
277262306a36Sopenharmony_ci	VALIDATE_DESC(desc);
277362306a36Sopenharmony_ci	return test_bit(FLAG_ACTIVE_LOW, &desc->flags);
277462306a36Sopenharmony_ci}
277562306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiod_is_active_low);
277662306a36Sopenharmony_ci
277762306a36Sopenharmony_ci/**
277862306a36Sopenharmony_ci * gpiod_toggle_active_low - toggle whether a GPIO is active-low or not
277962306a36Sopenharmony_ci * @desc: the gpio descriptor to change
278062306a36Sopenharmony_ci */
278162306a36Sopenharmony_civoid gpiod_toggle_active_low(struct gpio_desc *desc)
278262306a36Sopenharmony_ci{
278362306a36Sopenharmony_ci	VALIDATE_DESC_VOID(desc);
278462306a36Sopenharmony_ci	change_bit(FLAG_ACTIVE_LOW, &desc->flags);
278562306a36Sopenharmony_ci}
278662306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiod_toggle_active_low);
278762306a36Sopenharmony_ci
278862306a36Sopenharmony_cistatic int gpio_chip_get_value(struct gpio_chip *gc, const struct gpio_desc *desc)
278962306a36Sopenharmony_ci{
279062306a36Sopenharmony_ci	return gc->get ? gc->get(gc, gpio_chip_hwgpio(desc)) : -EIO;
279162306a36Sopenharmony_ci}
279262306a36Sopenharmony_ci
279362306a36Sopenharmony_ci/* I/O calls are only valid after configuration completed; the relevant
279462306a36Sopenharmony_ci * "is this a valid GPIO" error checks should already have been done.
279562306a36Sopenharmony_ci *
279662306a36Sopenharmony_ci * "Get" operations are often inlinable as reading a pin value register,
279762306a36Sopenharmony_ci * and masking the relevant bit in that register.
279862306a36Sopenharmony_ci *
279962306a36Sopenharmony_ci * When "set" operations are inlinable, they involve writing that mask to
280062306a36Sopenharmony_ci * one register to set a low value, or a different register to set it high.
280162306a36Sopenharmony_ci * Otherwise locking is needed, so there may be little value to inlining.
280262306a36Sopenharmony_ci *
280362306a36Sopenharmony_ci *------------------------------------------------------------------------
280462306a36Sopenharmony_ci *
280562306a36Sopenharmony_ci * IMPORTANT!!!  The hot paths -- get/set value -- assume that callers
280662306a36Sopenharmony_ci * have requested the GPIO.  That can include implicit requesting by
280762306a36Sopenharmony_ci * a direction setting call.  Marking a gpio as requested locks its chip
280862306a36Sopenharmony_ci * in memory, guaranteeing that these table lookups need no more locking
280962306a36Sopenharmony_ci * and that gpiochip_remove() will fail.
281062306a36Sopenharmony_ci *
281162306a36Sopenharmony_ci * REVISIT when debugging, consider adding some instrumentation to ensure
281262306a36Sopenharmony_ci * that the GPIO was actually requested.
281362306a36Sopenharmony_ci */
281462306a36Sopenharmony_ci
281562306a36Sopenharmony_cistatic int gpiod_get_raw_value_commit(const struct gpio_desc *desc)
281662306a36Sopenharmony_ci{
281762306a36Sopenharmony_ci	struct gpio_chip	*gc;
281862306a36Sopenharmony_ci	int value;
281962306a36Sopenharmony_ci
282062306a36Sopenharmony_ci	gc = desc->gdev->chip;
282162306a36Sopenharmony_ci	value = gpio_chip_get_value(gc, desc);
282262306a36Sopenharmony_ci	value = value < 0 ? value : !!value;
282362306a36Sopenharmony_ci	trace_gpio_value(desc_to_gpio(desc), 1, value);
282462306a36Sopenharmony_ci	return value;
282562306a36Sopenharmony_ci}
282662306a36Sopenharmony_ci
282762306a36Sopenharmony_cistatic int gpio_chip_get_multiple(struct gpio_chip *gc,
282862306a36Sopenharmony_ci				  unsigned long *mask, unsigned long *bits)
282962306a36Sopenharmony_ci{
283062306a36Sopenharmony_ci	if (gc->get_multiple)
283162306a36Sopenharmony_ci		return gc->get_multiple(gc, mask, bits);
283262306a36Sopenharmony_ci	if (gc->get) {
283362306a36Sopenharmony_ci		int i, value;
283462306a36Sopenharmony_ci
283562306a36Sopenharmony_ci		for_each_set_bit(i, mask, gc->ngpio) {
283662306a36Sopenharmony_ci			value = gc->get(gc, i);
283762306a36Sopenharmony_ci			if (value < 0)
283862306a36Sopenharmony_ci				return value;
283962306a36Sopenharmony_ci			__assign_bit(i, bits, value);
284062306a36Sopenharmony_ci		}
284162306a36Sopenharmony_ci		return 0;
284262306a36Sopenharmony_ci	}
284362306a36Sopenharmony_ci	return -EIO;
284462306a36Sopenharmony_ci}
284562306a36Sopenharmony_ci
284662306a36Sopenharmony_ciint gpiod_get_array_value_complex(bool raw, bool can_sleep,
284762306a36Sopenharmony_ci				  unsigned int array_size,
284862306a36Sopenharmony_ci				  struct gpio_desc **desc_array,
284962306a36Sopenharmony_ci				  struct gpio_array *array_info,
285062306a36Sopenharmony_ci				  unsigned long *value_bitmap)
285162306a36Sopenharmony_ci{
285262306a36Sopenharmony_ci	int ret, i = 0;
285362306a36Sopenharmony_ci
285462306a36Sopenharmony_ci	/*
285562306a36Sopenharmony_ci	 * Validate array_info against desc_array and its size.
285662306a36Sopenharmony_ci	 * It should immediately follow desc_array if both
285762306a36Sopenharmony_ci	 * have been obtained from the same gpiod_get_array() call.
285862306a36Sopenharmony_ci	 */
285962306a36Sopenharmony_ci	if (array_info && array_info->desc == desc_array &&
286062306a36Sopenharmony_ci	    array_size <= array_info->size &&
286162306a36Sopenharmony_ci	    (void *)array_info == desc_array + array_info->size) {
286262306a36Sopenharmony_ci		if (!can_sleep)
286362306a36Sopenharmony_ci			WARN_ON(array_info->chip->can_sleep);
286462306a36Sopenharmony_ci
286562306a36Sopenharmony_ci		ret = gpio_chip_get_multiple(array_info->chip,
286662306a36Sopenharmony_ci					     array_info->get_mask,
286762306a36Sopenharmony_ci					     value_bitmap);
286862306a36Sopenharmony_ci		if (ret)
286962306a36Sopenharmony_ci			return ret;
287062306a36Sopenharmony_ci
287162306a36Sopenharmony_ci		if (!raw && !bitmap_empty(array_info->invert_mask, array_size))
287262306a36Sopenharmony_ci			bitmap_xor(value_bitmap, value_bitmap,
287362306a36Sopenharmony_ci				   array_info->invert_mask, array_size);
287462306a36Sopenharmony_ci
287562306a36Sopenharmony_ci		i = find_first_zero_bit(array_info->get_mask, array_size);
287662306a36Sopenharmony_ci		if (i == array_size)
287762306a36Sopenharmony_ci			return 0;
287862306a36Sopenharmony_ci	} else {
287962306a36Sopenharmony_ci		array_info = NULL;
288062306a36Sopenharmony_ci	}
288162306a36Sopenharmony_ci
288262306a36Sopenharmony_ci	while (i < array_size) {
288362306a36Sopenharmony_ci		struct gpio_chip *gc = desc_array[i]->gdev->chip;
288462306a36Sopenharmony_ci		DECLARE_BITMAP(fastpath_mask, FASTPATH_NGPIO);
288562306a36Sopenharmony_ci		DECLARE_BITMAP(fastpath_bits, FASTPATH_NGPIO);
288662306a36Sopenharmony_ci		unsigned long *mask, *bits;
288762306a36Sopenharmony_ci		int first, j;
288862306a36Sopenharmony_ci
288962306a36Sopenharmony_ci		if (likely(gc->ngpio <= FASTPATH_NGPIO)) {
289062306a36Sopenharmony_ci			mask = fastpath_mask;
289162306a36Sopenharmony_ci			bits = fastpath_bits;
289262306a36Sopenharmony_ci		} else {
289362306a36Sopenharmony_ci			gfp_t flags = can_sleep ? GFP_KERNEL : GFP_ATOMIC;
289462306a36Sopenharmony_ci
289562306a36Sopenharmony_ci			mask = bitmap_alloc(gc->ngpio, flags);
289662306a36Sopenharmony_ci			if (!mask)
289762306a36Sopenharmony_ci				return -ENOMEM;
289862306a36Sopenharmony_ci
289962306a36Sopenharmony_ci			bits = bitmap_alloc(gc->ngpio, flags);
290062306a36Sopenharmony_ci			if (!bits) {
290162306a36Sopenharmony_ci				bitmap_free(mask);
290262306a36Sopenharmony_ci				return -ENOMEM;
290362306a36Sopenharmony_ci			}
290462306a36Sopenharmony_ci		}
290562306a36Sopenharmony_ci
290662306a36Sopenharmony_ci		bitmap_zero(mask, gc->ngpio);
290762306a36Sopenharmony_ci
290862306a36Sopenharmony_ci		if (!can_sleep)
290962306a36Sopenharmony_ci			WARN_ON(gc->can_sleep);
291062306a36Sopenharmony_ci
291162306a36Sopenharmony_ci		/* collect all inputs belonging to the same chip */
291262306a36Sopenharmony_ci		first = i;
291362306a36Sopenharmony_ci		do {
291462306a36Sopenharmony_ci			const struct gpio_desc *desc = desc_array[i];
291562306a36Sopenharmony_ci			int hwgpio = gpio_chip_hwgpio(desc);
291662306a36Sopenharmony_ci
291762306a36Sopenharmony_ci			__set_bit(hwgpio, mask);
291862306a36Sopenharmony_ci			i++;
291962306a36Sopenharmony_ci
292062306a36Sopenharmony_ci			if (array_info)
292162306a36Sopenharmony_ci				i = find_next_zero_bit(array_info->get_mask,
292262306a36Sopenharmony_ci						       array_size, i);
292362306a36Sopenharmony_ci		} while ((i < array_size) &&
292462306a36Sopenharmony_ci			 (desc_array[i]->gdev->chip == gc));
292562306a36Sopenharmony_ci
292662306a36Sopenharmony_ci		ret = gpio_chip_get_multiple(gc, mask, bits);
292762306a36Sopenharmony_ci		if (ret) {
292862306a36Sopenharmony_ci			if (mask != fastpath_mask)
292962306a36Sopenharmony_ci				bitmap_free(mask);
293062306a36Sopenharmony_ci			if (bits != fastpath_bits)
293162306a36Sopenharmony_ci				bitmap_free(bits);
293262306a36Sopenharmony_ci			return ret;
293362306a36Sopenharmony_ci		}
293462306a36Sopenharmony_ci
293562306a36Sopenharmony_ci		for (j = first; j < i; ) {
293662306a36Sopenharmony_ci			const struct gpio_desc *desc = desc_array[j];
293762306a36Sopenharmony_ci			int hwgpio = gpio_chip_hwgpio(desc);
293862306a36Sopenharmony_ci			int value = test_bit(hwgpio, bits);
293962306a36Sopenharmony_ci
294062306a36Sopenharmony_ci			if (!raw && test_bit(FLAG_ACTIVE_LOW, &desc->flags))
294162306a36Sopenharmony_ci				value = !value;
294262306a36Sopenharmony_ci			__assign_bit(j, value_bitmap, value);
294362306a36Sopenharmony_ci			trace_gpio_value(desc_to_gpio(desc), 1, value);
294462306a36Sopenharmony_ci			j++;
294562306a36Sopenharmony_ci
294662306a36Sopenharmony_ci			if (array_info)
294762306a36Sopenharmony_ci				j = find_next_zero_bit(array_info->get_mask, i,
294862306a36Sopenharmony_ci						       j);
294962306a36Sopenharmony_ci		}
295062306a36Sopenharmony_ci
295162306a36Sopenharmony_ci		if (mask != fastpath_mask)
295262306a36Sopenharmony_ci			bitmap_free(mask);
295362306a36Sopenharmony_ci		if (bits != fastpath_bits)
295462306a36Sopenharmony_ci			bitmap_free(bits);
295562306a36Sopenharmony_ci	}
295662306a36Sopenharmony_ci	return 0;
295762306a36Sopenharmony_ci}
295862306a36Sopenharmony_ci
295962306a36Sopenharmony_ci/**
296062306a36Sopenharmony_ci * gpiod_get_raw_value() - return a gpio's raw value
296162306a36Sopenharmony_ci * @desc: gpio whose value will be returned
296262306a36Sopenharmony_ci *
296362306a36Sopenharmony_ci * Return the GPIO's raw value, i.e. the value of the physical line disregarding
296462306a36Sopenharmony_ci * its ACTIVE_LOW status, or negative errno on failure.
296562306a36Sopenharmony_ci *
296662306a36Sopenharmony_ci * This function can be called from contexts where we cannot sleep, and will
296762306a36Sopenharmony_ci * complain if the GPIO chip functions potentially sleep.
296862306a36Sopenharmony_ci */
296962306a36Sopenharmony_ciint gpiod_get_raw_value(const struct gpio_desc *desc)
297062306a36Sopenharmony_ci{
297162306a36Sopenharmony_ci	VALIDATE_DESC(desc);
297262306a36Sopenharmony_ci	/* Should be using gpiod_get_raw_value_cansleep() */
297362306a36Sopenharmony_ci	WARN_ON(desc->gdev->chip->can_sleep);
297462306a36Sopenharmony_ci	return gpiod_get_raw_value_commit(desc);
297562306a36Sopenharmony_ci}
297662306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiod_get_raw_value);
297762306a36Sopenharmony_ci
297862306a36Sopenharmony_ci/**
297962306a36Sopenharmony_ci * gpiod_get_value() - return a gpio's value
298062306a36Sopenharmony_ci * @desc: gpio whose value will be returned
298162306a36Sopenharmony_ci *
298262306a36Sopenharmony_ci * Return the GPIO's logical value, i.e. taking the ACTIVE_LOW status into
298362306a36Sopenharmony_ci * account, or negative errno on failure.
298462306a36Sopenharmony_ci *
298562306a36Sopenharmony_ci * This function can be called from contexts where we cannot sleep, and will
298662306a36Sopenharmony_ci * complain if the GPIO chip functions potentially sleep.
298762306a36Sopenharmony_ci */
298862306a36Sopenharmony_ciint gpiod_get_value(const struct gpio_desc *desc)
298962306a36Sopenharmony_ci{
299062306a36Sopenharmony_ci	int value;
299162306a36Sopenharmony_ci
299262306a36Sopenharmony_ci	VALIDATE_DESC(desc);
299362306a36Sopenharmony_ci	/* Should be using gpiod_get_value_cansleep() */
299462306a36Sopenharmony_ci	WARN_ON(desc->gdev->chip->can_sleep);
299562306a36Sopenharmony_ci
299662306a36Sopenharmony_ci	value = gpiod_get_raw_value_commit(desc);
299762306a36Sopenharmony_ci	if (value < 0)
299862306a36Sopenharmony_ci		return value;
299962306a36Sopenharmony_ci
300062306a36Sopenharmony_ci	if (test_bit(FLAG_ACTIVE_LOW, &desc->flags))
300162306a36Sopenharmony_ci		value = !value;
300262306a36Sopenharmony_ci
300362306a36Sopenharmony_ci	return value;
300462306a36Sopenharmony_ci}
300562306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiod_get_value);
300662306a36Sopenharmony_ci
300762306a36Sopenharmony_ci/**
300862306a36Sopenharmony_ci * gpiod_get_raw_array_value() - read raw values from an array of GPIOs
300962306a36Sopenharmony_ci * @array_size: number of elements in the descriptor array / value bitmap
301062306a36Sopenharmony_ci * @desc_array: array of GPIO descriptors whose values will be read
301162306a36Sopenharmony_ci * @array_info: information on applicability of fast bitmap processing path
301262306a36Sopenharmony_ci * @value_bitmap: bitmap to store the read values
301362306a36Sopenharmony_ci *
301462306a36Sopenharmony_ci * Read the raw values of the GPIOs, i.e. the values of the physical lines
301562306a36Sopenharmony_ci * without regard for their ACTIVE_LOW status.  Return 0 in case of success,
301662306a36Sopenharmony_ci * else an error code.
301762306a36Sopenharmony_ci *
301862306a36Sopenharmony_ci * This function can be called from contexts where we cannot sleep,
301962306a36Sopenharmony_ci * and it will complain if the GPIO chip functions potentially sleep.
302062306a36Sopenharmony_ci */
302162306a36Sopenharmony_ciint gpiod_get_raw_array_value(unsigned int array_size,
302262306a36Sopenharmony_ci			      struct gpio_desc **desc_array,
302362306a36Sopenharmony_ci			      struct gpio_array *array_info,
302462306a36Sopenharmony_ci			      unsigned long *value_bitmap)
302562306a36Sopenharmony_ci{
302662306a36Sopenharmony_ci	if (!desc_array)
302762306a36Sopenharmony_ci		return -EINVAL;
302862306a36Sopenharmony_ci	return gpiod_get_array_value_complex(true, false, array_size,
302962306a36Sopenharmony_ci					     desc_array, array_info,
303062306a36Sopenharmony_ci					     value_bitmap);
303162306a36Sopenharmony_ci}
303262306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiod_get_raw_array_value);
303362306a36Sopenharmony_ci
303462306a36Sopenharmony_ci/**
303562306a36Sopenharmony_ci * gpiod_get_array_value() - read values from an array of GPIOs
303662306a36Sopenharmony_ci * @array_size: number of elements in the descriptor array / value bitmap
303762306a36Sopenharmony_ci * @desc_array: array of GPIO descriptors whose values will be read
303862306a36Sopenharmony_ci * @array_info: information on applicability of fast bitmap processing path
303962306a36Sopenharmony_ci * @value_bitmap: bitmap to store the read values
304062306a36Sopenharmony_ci *
304162306a36Sopenharmony_ci * Read the logical values of the GPIOs, i.e. taking their ACTIVE_LOW status
304262306a36Sopenharmony_ci * into account.  Return 0 in case of success, else an error code.
304362306a36Sopenharmony_ci *
304462306a36Sopenharmony_ci * This function can be called from contexts where we cannot sleep,
304562306a36Sopenharmony_ci * and it will complain if the GPIO chip functions potentially sleep.
304662306a36Sopenharmony_ci */
304762306a36Sopenharmony_ciint gpiod_get_array_value(unsigned int array_size,
304862306a36Sopenharmony_ci			  struct gpio_desc **desc_array,
304962306a36Sopenharmony_ci			  struct gpio_array *array_info,
305062306a36Sopenharmony_ci			  unsigned long *value_bitmap)
305162306a36Sopenharmony_ci{
305262306a36Sopenharmony_ci	if (!desc_array)
305362306a36Sopenharmony_ci		return -EINVAL;
305462306a36Sopenharmony_ci	return gpiod_get_array_value_complex(false, false, array_size,
305562306a36Sopenharmony_ci					     desc_array, array_info,
305662306a36Sopenharmony_ci					     value_bitmap);
305762306a36Sopenharmony_ci}
305862306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiod_get_array_value);
305962306a36Sopenharmony_ci
306062306a36Sopenharmony_ci/*
306162306a36Sopenharmony_ci *  gpio_set_open_drain_value_commit() - Set the open drain gpio's value.
306262306a36Sopenharmony_ci * @desc: gpio descriptor whose state need to be set.
306362306a36Sopenharmony_ci * @value: Non-zero for setting it HIGH otherwise it will set to LOW.
306462306a36Sopenharmony_ci */
306562306a36Sopenharmony_cistatic void gpio_set_open_drain_value_commit(struct gpio_desc *desc, bool value)
306662306a36Sopenharmony_ci{
306762306a36Sopenharmony_ci	int ret = 0;
306862306a36Sopenharmony_ci	struct gpio_chip *gc = desc->gdev->chip;
306962306a36Sopenharmony_ci	int offset = gpio_chip_hwgpio(desc);
307062306a36Sopenharmony_ci
307162306a36Sopenharmony_ci	if (value) {
307262306a36Sopenharmony_ci		ret = gc->direction_input(gc, offset);
307362306a36Sopenharmony_ci	} else {
307462306a36Sopenharmony_ci		ret = gc->direction_output(gc, offset, 0);
307562306a36Sopenharmony_ci		if (!ret)
307662306a36Sopenharmony_ci			set_bit(FLAG_IS_OUT, &desc->flags);
307762306a36Sopenharmony_ci	}
307862306a36Sopenharmony_ci	trace_gpio_direction(desc_to_gpio(desc), value, ret);
307962306a36Sopenharmony_ci	if (ret < 0)
308062306a36Sopenharmony_ci		gpiod_err(desc,
308162306a36Sopenharmony_ci			  "%s: Error in set_value for open drain err %d\n",
308262306a36Sopenharmony_ci			  __func__, ret);
308362306a36Sopenharmony_ci}
308462306a36Sopenharmony_ci
308562306a36Sopenharmony_ci/*
308662306a36Sopenharmony_ci *  _gpio_set_open_source_value() - Set the open source gpio's value.
308762306a36Sopenharmony_ci * @desc: gpio descriptor whose state need to be set.
308862306a36Sopenharmony_ci * @value: Non-zero for setting it HIGH otherwise it will set to LOW.
308962306a36Sopenharmony_ci */
309062306a36Sopenharmony_cistatic void gpio_set_open_source_value_commit(struct gpio_desc *desc, bool value)
309162306a36Sopenharmony_ci{
309262306a36Sopenharmony_ci	int ret = 0;
309362306a36Sopenharmony_ci	struct gpio_chip *gc = desc->gdev->chip;
309462306a36Sopenharmony_ci	int offset = gpio_chip_hwgpio(desc);
309562306a36Sopenharmony_ci
309662306a36Sopenharmony_ci	if (value) {
309762306a36Sopenharmony_ci		ret = gc->direction_output(gc, offset, 1);
309862306a36Sopenharmony_ci		if (!ret)
309962306a36Sopenharmony_ci			set_bit(FLAG_IS_OUT, &desc->flags);
310062306a36Sopenharmony_ci	} else {
310162306a36Sopenharmony_ci		ret = gc->direction_input(gc, offset);
310262306a36Sopenharmony_ci	}
310362306a36Sopenharmony_ci	trace_gpio_direction(desc_to_gpio(desc), !value, ret);
310462306a36Sopenharmony_ci	if (ret < 0)
310562306a36Sopenharmony_ci		gpiod_err(desc,
310662306a36Sopenharmony_ci			  "%s: Error in set_value for open source err %d\n",
310762306a36Sopenharmony_ci			  __func__, ret);
310862306a36Sopenharmony_ci}
310962306a36Sopenharmony_ci
311062306a36Sopenharmony_cistatic void gpiod_set_raw_value_commit(struct gpio_desc *desc, bool value)
311162306a36Sopenharmony_ci{
311262306a36Sopenharmony_ci	struct gpio_chip	*gc;
311362306a36Sopenharmony_ci
311462306a36Sopenharmony_ci	gc = desc->gdev->chip;
311562306a36Sopenharmony_ci	trace_gpio_value(desc_to_gpio(desc), 0, value);
311662306a36Sopenharmony_ci	gc->set(gc, gpio_chip_hwgpio(desc), value);
311762306a36Sopenharmony_ci}
311862306a36Sopenharmony_ci
311962306a36Sopenharmony_ci/*
312062306a36Sopenharmony_ci * set multiple outputs on the same chip;
312162306a36Sopenharmony_ci * use the chip's set_multiple function if available;
312262306a36Sopenharmony_ci * otherwise set the outputs sequentially;
312362306a36Sopenharmony_ci * @chip: the GPIO chip we operate on
312462306a36Sopenharmony_ci * @mask: bit mask array; one bit per output; BITS_PER_LONG bits per word
312562306a36Sopenharmony_ci *        defines which outputs are to be changed
312662306a36Sopenharmony_ci * @bits: bit value array; one bit per output; BITS_PER_LONG bits per word
312762306a36Sopenharmony_ci *        defines the values the outputs specified by mask are to be set to
312862306a36Sopenharmony_ci */
312962306a36Sopenharmony_cistatic void gpio_chip_set_multiple(struct gpio_chip *gc,
313062306a36Sopenharmony_ci				   unsigned long *mask, unsigned long *bits)
313162306a36Sopenharmony_ci{
313262306a36Sopenharmony_ci	if (gc->set_multiple) {
313362306a36Sopenharmony_ci		gc->set_multiple(gc, mask, bits);
313462306a36Sopenharmony_ci	} else {
313562306a36Sopenharmony_ci		unsigned int i;
313662306a36Sopenharmony_ci
313762306a36Sopenharmony_ci		/* set outputs if the corresponding mask bit is set */
313862306a36Sopenharmony_ci		for_each_set_bit(i, mask, gc->ngpio)
313962306a36Sopenharmony_ci			gc->set(gc, i, test_bit(i, bits));
314062306a36Sopenharmony_ci	}
314162306a36Sopenharmony_ci}
314262306a36Sopenharmony_ci
314362306a36Sopenharmony_ciint gpiod_set_array_value_complex(bool raw, bool can_sleep,
314462306a36Sopenharmony_ci				  unsigned int array_size,
314562306a36Sopenharmony_ci				  struct gpio_desc **desc_array,
314662306a36Sopenharmony_ci				  struct gpio_array *array_info,
314762306a36Sopenharmony_ci				  unsigned long *value_bitmap)
314862306a36Sopenharmony_ci{
314962306a36Sopenharmony_ci	int i = 0;
315062306a36Sopenharmony_ci
315162306a36Sopenharmony_ci	/*
315262306a36Sopenharmony_ci	 * Validate array_info against desc_array and its size.
315362306a36Sopenharmony_ci	 * It should immediately follow desc_array if both
315462306a36Sopenharmony_ci	 * have been obtained from the same gpiod_get_array() call.
315562306a36Sopenharmony_ci	 */
315662306a36Sopenharmony_ci	if (array_info && array_info->desc == desc_array &&
315762306a36Sopenharmony_ci	    array_size <= array_info->size &&
315862306a36Sopenharmony_ci	    (void *)array_info == desc_array + array_info->size) {
315962306a36Sopenharmony_ci		if (!can_sleep)
316062306a36Sopenharmony_ci			WARN_ON(array_info->chip->can_sleep);
316162306a36Sopenharmony_ci
316262306a36Sopenharmony_ci		if (!raw && !bitmap_empty(array_info->invert_mask, array_size))
316362306a36Sopenharmony_ci			bitmap_xor(value_bitmap, value_bitmap,
316462306a36Sopenharmony_ci				   array_info->invert_mask, array_size);
316562306a36Sopenharmony_ci
316662306a36Sopenharmony_ci		gpio_chip_set_multiple(array_info->chip, array_info->set_mask,
316762306a36Sopenharmony_ci				       value_bitmap);
316862306a36Sopenharmony_ci
316962306a36Sopenharmony_ci		i = find_first_zero_bit(array_info->set_mask, array_size);
317062306a36Sopenharmony_ci		if (i == array_size)
317162306a36Sopenharmony_ci			return 0;
317262306a36Sopenharmony_ci	} else {
317362306a36Sopenharmony_ci		array_info = NULL;
317462306a36Sopenharmony_ci	}
317562306a36Sopenharmony_ci
317662306a36Sopenharmony_ci	while (i < array_size) {
317762306a36Sopenharmony_ci		struct gpio_chip *gc = desc_array[i]->gdev->chip;
317862306a36Sopenharmony_ci		DECLARE_BITMAP(fastpath_mask, FASTPATH_NGPIO);
317962306a36Sopenharmony_ci		DECLARE_BITMAP(fastpath_bits, FASTPATH_NGPIO);
318062306a36Sopenharmony_ci		unsigned long *mask, *bits;
318162306a36Sopenharmony_ci		int count = 0;
318262306a36Sopenharmony_ci
318362306a36Sopenharmony_ci		if (likely(gc->ngpio <= FASTPATH_NGPIO)) {
318462306a36Sopenharmony_ci			mask = fastpath_mask;
318562306a36Sopenharmony_ci			bits = fastpath_bits;
318662306a36Sopenharmony_ci		} else {
318762306a36Sopenharmony_ci			gfp_t flags = can_sleep ? GFP_KERNEL : GFP_ATOMIC;
318862306a36Sopenharmony_ci
318962306a36Sopenharmony_ci			mask = bitmap_alloc(gc->ngpio, flags);
319062306a36Sopenharmony_ci			if (!mask)
319162306a36Sopenharmony_ci				return -ENOMEM;
319262306a36Sopenharmony_ci
319362306a36Sopenharmony_ci			bits = bitmap_alloc(gc->ngpio, flags);
319462306a36Sopenharmony_ci			if (!bits) {
319562306a36Sopenharmony_ci				bitmap_free(mask);
319662306a36Sopenharmony_ci				return -ENOMEM;
319762306a36Sopenharmony_ci			}
319862306a36Sopenharmony_ci		}
319962306a36Sopenharmony_ci
320062306a36Sopenharmony_ci		bitmap_zero(mask, gc->ngpio);
320162306a36Sopenharmony_ci
320262306a36Sopenharmony_ci		if (!can_sleep)
320362306a36Sopenharmony_ci			WARN_ON(gc->can_sleep);
320462306a36Sopenharmony_ci
320562306a36Sopenharmony_ci		do {
320662306a36Sopenharmony_ci			struct gpio_desc *desc = desc_array[i];
320762306a36Sopenharmony_ci			int hwgpio = gpio_chip_hwgpio(desc);
320862306a36Sopenharmony_ci			int value = test_bit(i, value_bitmap);
320962306a36Sopenharmony_ci
321062306a36Sopenharmony_ci			/*
321162306a36Sopenharmony_ci			 * Pins applicable for fast input but not for
321262306a36Sopenharmony_ci			 * fast output processing may have been already
321362306a36Sopenharmony_ci			 * inverted inside the fast path, skip them.
321462306a36Sopenharmony_ci			 */
321562306a36Sopenharmony_ci			if (!raw && !(array_info &&
321662306a36Sopenharmony_ci			    test_bit(i, array_info->invert_mask)) &&
321762306a36Sopenharmony_ci			    test_bit(FLAG_ACTIVE_LOW, &desc->flags))
321862306a36Sopenharmony_ci				value = !value;
321962306a36Sopenharmony_ci			trace_gpio_value(desc_to_gpio(desc), 0, value);
322062306a36Sopenharmony_ci			/*
322162306a36Sopenharmony_ci			 * collect all normal outputs belonging to the same chip
322262306a36Sopenharmony_ci			 * open drain and open source outputs are set individually
322362306a36Sopenharmony_ci			 */
322462306a36Sopenharmony_ci			if (test_bit(FLAG_OPEN_DRAIN, &desc->flags) && !raw) {
322562306a36Sopenharmony_ci				gpio_set_open_drain_value_commit(desc, value);
322662306a36Sopenharmony_ci			} else if (test_bit(FLAG_OPEN_SOURCE, &desc->flags) && !raw) {
322762306a36Sopenharmony_ci				gpio_set_open_source_value_commit(desc, value);
322862306a36Sopenharmony_ci			} else {
322962306a36Sopenharmony_ci				__set_bit(hwgpio, mask);
323062306a36Sopenharmony_ci				__assign_bit(hwgpio, bits, value);
323162306a36Sopenharmony_ci				count++;
323262306a36Sopenharmony_ci			}
323362306a36Sopenharmony_ci			i++;
323462306a36Sopenharmony_ci
323562306a36Sopenharmony_ci			if (array_info)
323662306a36Sopenharmony_ci				i = find_next_zero_bit(array_info->set_mask,
323762306a36Sopenharmony_ci						       array_size, i);
323862306a36Sopenharmony_ci		} while ((i < array_size) &&
323962306a36Sopenharmony_ci			 (desc_array[i]->gdev->chip == gc));
324062306a36Sopenharmony_ci		/* push collected bits to outputs */
324162306a36Sopenharmony_ci		if (count != 0)
324262306a36Sopenharmony_ci			gpio_chip_set_multiple(gc, mask, bits);
324362306a36Sopenharmony_ci
324462306a36Sopenharmony_ci		if (mask != fastpath_mask)
324562306a36Sopenharmony_ci			bitmap_free(mask);
324662306a36Sopenharmony_ci		if (bits != fastpath_bits)
324762306a36Sopenharmony_ci			bitmap_free(bits);
324862306a36Sopenharmony_ci	}
324962306a36Sopenharmony_ci	return 0;
325062306a36Sopenharmony_ci}
325162306a36Sopenharmony_ci
325262306a36Sopenharmony_ci/**
325362306a36Sopenharmony_ci * gpiod_set_raw_value() - assign a gpio's raw value
325462306a36Sopenharmony_ci * @desc: gpio whose value will be assigned
325562306a36Sopenharmony_ci * @value: value to assign
325662306a36Sopenharmony_ci *
325762306a36Sopenharmony_ci * Set the raw value of the GPIO, i.e. the value of its physical line without
325862306a36Sopenharmony_ci * regard for its ACTIVE_LOW status.
325962306a36Sopenharmony_ci *
326062306a36Sopenharmony_ci * This function can be called from contexts where we cannot sleep, and will
326162306a36Sopenharmony_ci * complain if the GPIO chip functions potentially sleep.
326262306a36Sopenharmony_ci */
326362306a36Sopenharmony_civoid gpiod_set_raw_value(struct gpio_desc *desc, int value)
326462306a36Sopenharmony_ci{
326562306a36Sopenharmony_ci	VALIDATE_DESC_VOID(desc);
326662306a36Sopenharmony_ci	/* Should be using gpiod_set_raw_value_cansleep() */
326762306a36Sopenharmony_ci	WARN_ON(desc->gdev->chip->can_sleep);
326862306a36Sopenharmony_ci	gpiod_set_raw_value_commit(desc, value);
326962306a36Sopenharmony_ci}
327062306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiod_set_raw_value);
327162306a36Sopenharmony_ci
327262306a36Sopenharmony_ci/**
327362306a36Sopenharmony_ci * gpiod_set_value_nocheck() - set a GPIO line value without checking
327462306a36Sopenharmony_ci * @desc: the descriptor to set the value on
327562306a36Sopenharmony_ci * @value: value to set
327662306a36Sopenharmony_ci *
327762306a36Sopenharmony_ci * This sets the value of a GPIO line backing a descriptor, applying
327862306a36Sopenharmony_ci * different semantic quirks like active low and open drain/source
327962306a36Sopenharmony_ci * handling.
328062306a36Sopenharmony_ci */
328162306a36Sopenharmony_cistatic void gpiod_set_value_nocheck(struct gpio_desc *desc, int value)
328262306a36Sopenharmony_ci{
328362306a36Sopenharmony_ci	if (test_bit(FLAG_ACTIVE_LOW, &desc->flags))
328462306a36Sopenharmony_ci		value = !value;
328562306a36Sopenharmony_ci	if (test_bit(FLAG_OPEN_DRAIN, &desc->flags))
328662306a36Sopenharmony_ci		gpio_set_open_drain_value_commit(desc, value);
328762306a36Sopenharmony_ci	else if (test_bit(FLAG_OPEN_SOURCE, &desc->flags))
328862306a36Sopenharmony_ci		gpio_set_open_source_value_commit(desc, value);
328962306a36Sopenharmony_ci	else
329062306a36Sopenharmony_ci		gpiod_set_raw_value_commit(desc, value);
329162306a36Sopenharmony_ci}
329262306a36Sopenharmony_ci
329362306a36Sopenharmony_ci/**
329462306a36Sopenharmony_ci * gpiod_set_value() - assign a gpio's value
329562306a36Sopenharmony_ci * @desc: gpio whose value will be assigned
329662306a36Sopenharmony_ci * @value: value to assign
329762306a36Sopenharmony_ci *
329862306a36Sopenharmony_ci * Set the logical value of the GPIO, i.e. taking its ACTIVE_LOW,
329962306a36Sopenharmony_ci * OPEN_DRAIN and OPEN_SOURCE flags into account.
330062306a36Sopenharmony_ci *
330162306a36Sopenharmony_ci * This function can be called from contexts where we cannot sleep, and will
330262306a36Sopenharmony_ci * complain if the GPIO chip functions potentially sleep.
330362306a36Sopenharmony_ci */
330462306a36Sopenharmony_civoid gpiod_set_value(struct gpio_desc *desc, int value)
330562306a36Sopenharmony_ci{
330662306a36Sopenharmony_ci	VALIDATE_DESC_VOID(desc);
330762306a36Sopenharmony_ci	/* Should be using gpiod_set_value_cansleep() */
330862306a36Sopenharmony_ci	WARN_ON(desc->gdev->chip->can_sleep);
330962306a36Sopenharmony_ci	gpiod_set_value_nocheck(desc, value);
331062306a36Sopenharmony_ci}
331162306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiod_set_value);
331262306a36Sopenharmony_ci
331362306a36Sopenharmony_ci/**
331462306a36Sopenharmony_ci * gpiod_set_raw_array_value() - assign values to an array of GPIOs
331562306a36Sopenharmony_ci * @array_size: number of elements in the descriptor array / value bitmap
331662306a36Sopenharmony_ci * @desc_array: array of GPIO descriptors whose values will be assigned
331762306a36Sopenharmony_ci * @array_info: information on applicability of fast bitmap processing path
331862306a36Sopenharmony_ci * @value_bitmap: bitmap of values to assign
331962306a36Sopenharmony_ci *
332062306a36Sopenharmony_ci * Set the raw values of the GPIOs, i.e. the values of the physical lines
332162306a36Sopenharmony_ci * without regard for their ACTIVE_LOW status.
332262306a36Sopenharmony_ci *
332362306a36Sopenharmony_ci * This function can be called from contexts where we cannot sleep, and will
332462306a36Sopenharmony_ci * complain if the GPIO chip functions potentially sleep.
332562306a36Sopenharmony_ci */
332662306a36Sopenharmony_ciint gpiod_set_raw_array_value(unsigned int array_size,
332762306a36Sopenharmony_ci			      struct gpio_desc **desc_array,
332862306a36Sopenharmony_ci			      struct gpio_array *array_info,
332962306a36Sopenharmony_ci			      unsigned long *value_bitmap)
333062306a36Sopenharmony_ci{
333162306a36Sopenharmony_ci	if (!desc_array)
333262306a36Sopenharmony_ci		return -EINVAL;
333362306a36Sopenharmony_ci	return gpiod_set_array_value_complex(true, false, array_size,
333462306a36Sopenharmony_ci					desc_array, array_info, value_bitmap);
333562306a36Sopenharmony_ci}
333662306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiod_set_raw_array_value);
333762306a36Sopenharmony_ci
333862306a36Sopenharmony_ci/**
333962306a36Sopenharmony_ci * gpiod_set_array_value() - assign values to an array of GPIOs
334062306a36Sopenharmony_ci * @array_size: number of elements in the descriptor array / value bitmap
334162306a36Sopenharmony_ci * @desc_array: array of GPIO descriptors whose values will be assigned
334262306a36Sopenharmony_ci * @array_info: information on applicability of fast bitmap processing path
334362306a36Sopenharmony_ci * @value_bitmap: bitmap of values to assign
334462306a36Sopenharmony_ci *
334562306a36Sopenharmony_ci * Set the logical values of the GPIOs, i.e. taking their ACTIVE_LOW status
334662306a36Sopenharmony_ci * into account.
334762306a36Sopenharmony_ci *
334862306a36Sopenharmony_ci * This function can be called from contexts where we cannot sleep, and will
334962306a36Sopenharmony_ci * complain if the GPIO chip functions potentially sleep.
335062306a36Sopenharmony_ci */
335162306a36Sopenharmony_ciint gpiod_set_array_value(unsigned int array_size,
335262306a36Sopenharmony_ci			  struct gpio_desc **desc_array,
335362306a36Sopenharmony_ci			  struct gpio_array *array_info,
335462306a36Sopenharmony_ci			  unsigned long *value_bitmap)
335562306a36Sopenharmony_ci{
335662306a36Sopenharmony_ci	if (!desc_array)
335762306a36Sopenharmony_ci		return -EINVAL;
335862306a36Sopenharmony_ci	return gpiod_set_array_value_complex(false, false, array_size,
335962306a36Sopenharmony_ci					     desc_array, array_info,
336062306a36Sopenharmony_ci					     value_bitmap);
336162306a36Sopenharmony_ci}
336262306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiod_set_array_value);
336362306a36Sopenharmony_ci
336462306a36Sopenharmony_ci/**
336562306a36Sopenharmony_ci * gpiod_cansleep() - report whether gpio value access may sleep
336662306a36Sopenharmony_ci * @desc: gpio to check
336762306a36Sopenharmony_ci *
336862306a36Sopenharmony_ci */
336962306a36Sopenharmony_ciint gpiod_cansleep(const struct gpio_desc *desc)
337062306a36Sopenharmony_ci{
337162306a36Sopenharmony_ci	VALIDATE_DESC(desc);
337262306a36Sopenharmony_ci	return desc->gdev->chip->can_sleep;
337362306a36Sopenharmony_ci}
337462306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiod_cansleep);
337562306a36Sopenharmony_ci
337662306a36Sopenharmony_ci/**
337762306a36Sopenharmony_ci * gpiod_set_consumer_name() - set the consumer name for the descriptor
337862306a36Sopenharmony_ci * @desc: gpio to set the consumer name on
337962306a36Sopenharmony_ci * @name: the new consumer name
338062306a36Sopenharmony_ci */
338162306a36Sopenharmony_ciint gpiod_set_consumer_name(struct gpio_desc *desc, const char *name)
338262306a36Sopenharmony_ci{
338362306a36Sopenharmony_ci	VALIDATE_DESC(desc);
338462306a36Sopenharmony_ci	if (name) {
338562306a36Sopenharmony_ci		name = kstrdup_const(name, GFP_KERNEL);
338662306a36Sopenharmony_ci		if (!name)
338762306a36Sopenharmony_ci			return -ENOMEM;
338862306a36Sopenharmony_ci	}
338962306a36Sopenharmony_ci
339062306a36Sopenharmony_ci	kfree_const(desc->label);
339162306a36Sopenharmony_ci	desc_set_label(desc, name);
339262306a36Sopenharmony_ci
339362306a36Sopenharmony_ci	return 0;
339462306a36Sopenharmony_ci}
339562306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiod_set_consumer_name);
339662306a36Sopenharmony_ci
339762306a36Sopenharmony_ci/**
339862306a36Sopenharmony_ci * gpiod_to_irq() - return the IRQ corresponding to a GPIO
339962306a36Sopenharmony_ci * @desc: gpio whose IRQ will be returned (already requested)
340062306a36Sopenharmony_ci *
340162306a36Sopenharmony_ci * Return the IRQ corresponding to the passed GPIO, or an error code in case of
340262306a36Sopenharmony_ci * error.
340362306a36Sopenharmony_ci */
340462306a36Sopenharmony_ciint gpiod_to_irq(const struct gpio_desc *desc)
340562306a36Sopenharmony_ci{
340662306a36Sopenharmony_ci	struct gpio_chip *gc;
340762306a36Sopenharmony_ci	int offset;
340862306a36Sopenharmony_ci
340962306a36Sopenharmony_ci	/*
341062306a36Sopenharmony_ci	 * Cannot VALIDATE_DESC() here as gpiod_to_irq() consumer semantics
341162306a36Sopenharmony_ci	 * requires this function to not return zero on an invalid descriptor
341262306a36Sopenharmony_ci	 * but rather a negative error number.
341362306a36Sopenharmony_ci	 */
341462306a36Sopenharmony_ci	if (!desc || IS_ERR(desc) || !desc->gdev || !desc->gdev->chip)
341562306a36Sopenharmony_ci		return -EINVAL;
341662306a36Sopenharmony_ci
341762306a36Sopenharmony_ci	gc = desc->gdev->chip;
341862306a36Sopenharmony_ci	offset = gpio_chip_hwgpio(desc);
341962306a36Sopenharmony_ci	if (gc->to_irq) {
342062306a36Sopenharmony_ci		int retirq = gc->to_irq(gc, offset);
342162306a36Sopenharmony_ci
342262306a36Sopenharmony_ci		/* Zero means NO_IRQ */
342362306a36Sopenharmony_ci		if (!retirq)
342462306a36Sopenharmony_ci			return -ENXIO;
342562306a36Sopenharmony_ci
342662306a36Sopenharmony_ci		return retirq;
342762306a36Sopenharmony_ci	}
342862306a36Sopenharmony_ci#ifdef CONFIG_GPIOLIB_IRQCHIP
342962306a36Sopenharmony_ci	if (gc->irq.chip) {
343062306a36Sopenharmony_ci		/*
343162306a36Sopenharmony_ci		 * Avoid race condition with other code, which tries to lookup
343262306a36Sopenharmony_ci		 * an IRQ before the irqchip has been properly registered,
343362306a36Sopenharmony_ci		 * i.e. while gpiochip is still being brought up.
343462306a36Sopenharmony_ci		 */
343562306a36Sopenharmony_ci		return -EPROBE_DEFER;
343662306a36Sopenharmony_ci	}
343762306a36Sopenharmony_ci#endif
343862306a36Sopenharmony_ci	return -ENXIO;
343962306a36Sopenharmony_ci}
344062306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiod_to_irq);
344162306a36Sopenharmony_ci
344262306a36Sopenharmony_ci/**
344362306a36Sopenharmony_ci * gpiochip_lock_as_irq() - lock a GPIO to be used as IRQ
344462306a36Sopenharmony_ci * @gc: the chip the GPIO to lock belongs to
344562306a36Sopenharmony_ci * @offset: the offset of the GPIO to lock as IRQ
344662306a36Sopenharmony_ci *
344762306a36Sopenharmony_ci * This is used directly by GPIO drivers that want to lock down
344862306a36Sopenharmony_ci * a certain GPIO line to be used for IRQs.
344962306a36Sopenharmony_ci */
345062306a36Sopenharmony_ciint gpiochip_lock_as_irq(struct gpio_chip *gc, unsigned int offset)
345162306a36Sopenharmony_ci{
345262306a36Sopenharmony_ci	struct gpio_desc *desc;
345362306a36Sopenharmony_ci
345462306a36Sopenharmony_ci	desc = gpiochip_get_desc(gc, offset);
345562306a36Sopenharmony_ci	if (IS_ERR(desc))
345662306a36Sopenharmony_ci		return PTR_ERR(desc);
345762306a36Sopenharmony_ci
345862306a36Sopenharmony_ci	/*
345962306a36Sopenharmony_ci	 * If it's fast: flush the direction setting if something changed
346062306a36Sopenharmony_ci	 * behind our back
346162306a36Sopenharmony_ci	 */
346262306a36Sopenharmony_ci	if (!gc->can_sleep && gc->get_direction) {
346362306a36Sopenharmony_ci		int dir = gpiod_get_direction(desc);
346462306a36Sopenharmony_ci
346562306a36Sopenharmony_ci		if (dir < 0) {
346662306a36Sopenharmony_ci			chip_err(gc, "%s: cannot get GPIO direction\n",
346762306a36Sopenharmony_ci				 __func__);
346862306a36Sopenharmony_ci			return dir;
346962306a36Sopenharmony_ci		}
347062306a36Sopenharmony_ci	}
347162306a36Sopenharmony_ci
347262306a36Sopenharmony_ci	/* To be valid for IRQ the line needs to be input or open drain */
347362306a36Sopenharmony_ci	if (test_bit(FLAG_IS_OUT, &desc->flags) &&
347462306a36Sopenharmony_ci	    !test_bit(FLAG_OPEN_DRAIN, &desc->flags)) {
347562306a36Sopenharmony_ci		chip_err(gc,
347662306a36Sopenharmony_ci			 "%s: tried to flag a GPIO set as output for IRQ\n",
347762306a36Sopenharmony_ci			 __func__);
347862306a36Sopenharmony_ci		return -EIO;
347962306a36Sopenharmony_ci	}
348062306a36Sopenharmony_ci
348162306a36Sopenharmony_ci	set_bit(FLAG_USED_AS_IRQ, &desc->flags);
348262306a36Sopenharmony_ci	set_bit(FLAG_IRQ_IS_ENABLED, &desc->flags);
348362306a36Sopenharmony_ci
348462306a36Sopenharmony_ci	/*
348562306a36Sopenharmony_ci	 * If the consumer has not set up a label (such as when the
348662306a36Sopenharmony_ci	 * IRQ is referenced from .to_irq()) we set up a label here
348762306a36Sopenharmony_ci	 * so it is clear this is used as an interrupt.
348862306a36Sopenharmony_ci	 */
348962306a36Sopenharmony_ci	if (!desc->label)
349062306a36Sopenharmony_ci		desc_set_label(desc, "interrupt");
349162306a36Sopenharmony_ci
349262306a36Sopenharmony_ci	return 0;
349362306a36Sopenharmony_ci}
349462306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiochip_lock_as_irq);
349562306a36Sopenharmony_ci
349662306a36Sopenharmony_ci/**
349762306a36Sopenharmony_ci * gpiochip_unlock_as_irq() - unlock a GPIO used as IRQ
349862306a36Sopenharmony_ci * @gc: the chip the GPIO to lock belongs to
349962306a36Sopenharmony_ci * @offset: the offset of the GPIO to lock as IRQ
350062306a36Sopenharmony_ci *
350162306a36Sopenharmony_ci * This is used directly by GPIO drivers that want to indicate
350262306a36Sopenharmony_ci * that a certain GPIO is no longer used exclusively for IRQ.
350362306a36Sopenharmony_ci */
350462306a36Sopenharmony_civoid gpiochip_unlock_as_irq(struct gpio_chip *gc, unsigned int offset)
350562306a36Sopenharmony_ci{
350662306a36Sopenharmony_ci	struct gpio_desc *desc;
350762306a36Sopenharmony_ci
350862306a36Sopenharmony_ci	desc = gpiochip_get_desc(gc, offset);
350962306a36Sopenharmony_ci	if (IS_ERR(desc))
351062306a36Sopenharmony_ci		return;
351162306a36Sopenharmony_ci
351262306a36Sopenharmony_ci	clear_bit(FLAG_USED_AS_IRQ, &desc->flags);
351362306a36Sopenharmony_ci	clear_bit(FLAG_IRQ_IS_ENABLED, &desc->flags);
351462306a36Sopenharmony_ci
351562306a36Sopenharmony_ci	/* If we only had this marking, erase it */
351662306a36Sopenharmony_ci	if (desc->label && !strcmp(desc->label, "interrupt"))
351762306a36Sopenharmony_ci		desc_set_label(desc, NULL);
351862306a36Sopenharmony_ci}
351962306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiochip_unlock_as_irq);
352062306a36Sopenharmony_ci
352162306a36Sopenharmony_civoid gpiochip_disable_irq(struct gpio_chip *gc, unsigned int offset)
352262306a36Sopenharmony_ci{
352362306a36Sopenharmony_ci	struct gpio_desc *desc = gpiochip_get_desc(gc, offset);
352462306a36Sopenharmony_ci
352562306a36Sopenharmony_ci	if (!IS_ERR(desc) &&
352662306a36Sopenharmony_ci	    !WARN_ON(!test_bit(FLAG_USED_AS_IRQ, &desc->flags)))
352762306a36Sopenharmony_ci		clear_bit(FLAG_IRQ_IS_ENABLED, &desc->flags);
352862306a36Sopenharmony_ci}
352962306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiochip_disable_irq);
353062306a36Sopenharmony_ci
353162306a36Sopenharmony_civoid gpiochip_enable_irq(struct gpio_chip *gc, unsigned int offset)
353262306a36Sopenharmony_ci{
353362306a36Sopenharmony_ci	struct gpio_desc *desc = gpiochip_get_desc(gc, offset);
353462306a36Sopenharmony_ci
353562306a36Sopenharmony_ci	if (!IS_ERR(desc) &&
353662306a36Sopenharmony_ci	    !WARN_ON(!test_bit(FLAG_USED_AS_IRQ, &desc->flags))) {
353762306a36Sopenharmony_ci		/*
353862306a36Sopenharmony_ci		 * We must not be output when using IRQ UNLESS we are
353962306a36Sopenharmony_ci		 * open drain.
354062306a36Sopenharmony_ci		 */
354162306a36Sopenharmony_ci		WARN_ON(test_bit(FLAG_IS_OUT, &desc->flags) &&
354262306a36Sopenharmony_ci			!test_bit(FLAG_OPEN_DRAIN, &desc->flags));
354362306a36Sopenharmony_ci		set_bit(FLAG_IRQ_IS_ENABLED, &desc->flags);
354462306a36Sopenharmony_ci	}
354562306a36Sopenharmony_ci}
354662306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiochip_enable_irq);
354762306a36Sopenharmony_ci
354862306a36Sopenharmony_cibool gpiochip_line_is_irq(struct gpio_chip *gc, unsigned int offset)
354962306a36Sopenharmony_ci{
355062306a36Sopenharmony_ci	if (offset >= gc->ngpio)
355162306a36Sopenharmony_ci		return false;
355262306a36Sopenharmony_ci
355362306a36Sopenharmony_ci	return test_bit(FLAG_USED_AS_IRQ, &gc->gpiodev->descs[offset].flags);
355462306a36Sopenharmony_ci}
355562306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiochip_line_is_irq);
355662306a36Sopenharmony_ci
355762306a36Sopenharmony_ciint gpiochip_reqres_irq(struct gpio_chip *gc, unsigned int offset)
355862306a36Sopenharmony_ci{
355962306a36Sopenharmony_ci	int ret;
356062306a36Sopenharmony_ci
356162306a36Sopenharmony_ci	if (!try_module_get(gc->gpiodev->owner))
356262306a36Sopenharmony_ci		return -ENODEV;
356362306a36Sopenharmony_ci
356462306a36Sopenharmony_ci	ret = gpiochip_lock_as_irq(gc, offset);
356562306a36Sopenharmony_ci	if (ret) {
356662306a36Sopenharmony_ci		chip_err(gc, "unable to lock HW IRQ %u for IRQ\n", offset);
356762306a36Sopenharmony_ci		module_put(gc->gpiodev->owner);
356862306a36Sopenharmony_ci		return ret;
356962306a36Sopenharmony_ci	}
357062306a36Sopenharmony_ci	return 0;
357162306a36Sopenharmony_ci}
357262306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiochip_reqres_irq);
357362306a36Sopenharmony_ci
357462306a36Sopenharmony_civoid gpiochip_relres_irq(struct gpio_chip *gc, unsigned int offset)
357562306a36Sopenharmony_ci{
357662306a36Sopenharmony_ci	gpiochip_unlock_as_irq(gc, offset);
357762306a36Sopenharmony_ci	module_put(gc->gpiodev->owner);
357862306a36Sopenharmony_ci}
357962306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiochip_relres_irq);
358062306a36Sopenharmony_ci
358162306a36Sopenharmony_cibool gpiochip_line_is_open_drain(struct gpio_chip *gc, unsigned int offset)
358262306a36Sopenharmony_ci{
358362306a36Sopenharmony_ci	if (offset >= gc->ngpio)
358462306a36Sopenharmony_ci		return false;
358562306a36Sopenharmony_ci
358662306a36Sopenharmony_ci	return test_bit(FLAG_OPEN_DRAIN, &gc->gpiodev->descs[offset].flags);
358762306a36Sopenharmony_ci}
358862306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiochip_line_is_open_drain);
358962306a36Sopenharmony_ci
359062306a36Sopenharmony_cibool gpiochip_line_is_open_source(struct gpio_chip *gc, unsigned int offset)
359162306a36Sopenharmony_ci{
359262306a36Sopenharmony_ci	if (offset >= gc->ngpio)
359362306a36Sopenharmony_ci		return false;
359462306a36Sopenharmony_ci
359562306a36Sopenharmony_ci	return test_bit(FLAG_OPEN_SOURCE, &gc->gpiodev->descs[offset].flags);
359662306a36Sopenharmony_ci}
359762306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiochip_line_is_open_source);
359862306a36Sopenharmony_ci
359962306a36Sopenharmony_cibool gpiochip_line_is_persistent(struct gpio_chip *gc, unsigned int offset)
360062306a36Sopenharmony_ci{
360162306a36Sopenharmony_ci	if (offset >= gc->ngpio)
360262306a36Sopenharmony_ci		return false;
360362306a36Sopenharmony_ci
360462306a36Sopenharmony_ci	return !test_bit(FLAG_TRANSITORY, &gc->gpiodev->descs[offset].flags);
360562306a36Sopenharmony_ci}
360662306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiochip_line_is_persistent);
360762306a36Sopenharmony_ci
360862306a36Sopenharmony_ci/**
360962306a36Sopenharmony_ci * gpiod_get_raw_value_cansleep() - return a gpio's raw value
361062306a36Sopenharmony_ci * @desc: gpio whose value will be returned
361162306a36Sopenharmony_ci *
361262306a36Sopenharmony_ci * Return the GPIO's raw value, i.e. the value of the physical line disregarding
361362306a36Sopenharmony_ci * its ACTIVE_LOW status, or negative errno on failure.
361462306a36Sopenharmony_ci *
361562306a36Sopenharmony_ci * This function is to be called from contexts that can sleep.
361662306a36Sopenharmony_ci */
361762306a36Sopenharmony_ciint gpiod_get_raw_value_cansleep(const struct gpio_desc *desc)
361862306a36Sopenharmony_ci{
361962306a36Sopenharmony_ci	might_sleep_if(extra_checks);
362062306a36Sopenharmony_ci	VALIDATE_DESC(desc);
362162306a36Sopenharmony_ci	return gpiod_get_raw_value_commit(desc);
362262306a36Sopenharmony_ci}
362362306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiod_get_raw_value_cansleep);
362462306a36Sopenharmony_ci
362562306a36Sopenharmony_ci/**
362662306a36Sopenharmony_ci * gpiod_get_value_cansleep() - return a gpio's value
362762306a36Sopenharmony_ci * @desc: gpio whose value will be returned
362862306a36Sopenharmony_ci *
362962306a36Sopenharmony_ci * Return the GPIO's logical value, i.e. taking the ACTIVE_LOW status into
363062306a36Sopenharmony_ci * account, or negative errno on failure.
363162306a36Sopenharmony_ci *
363262306a36Sopenharmony_ci * This function is to be called from contexts that can sleep.
363362306a36Sopenharmony_ci */
363462306a36Sopenharmony_ciint gpiod_get_value_cansleep(const struct gpio_desc *desc)
363562306a36Sopenharmony_ci{
363662306a36Sopenharmony_ci	int value;
363762306a36Sopenharmony_ci
363862306a36Sopenharmony_ci	might_sleep_if(extra_checks);
363962306a36Sopenharmony_ci	VALIDATE_DESC(desc);
364062306a36Sopenharmony_ci	value = gpiod_get_raw_value_commit(desc);
364162306a36Sopenharmony_ci	if (value < 0)
364262306a36Sopenharmony_ci		return value;
364362306a36Sopenharmony_ci
364462306a36Sopenharmony_ci	if (test_bit(FLAG_ACTIVE_LOW, &desc->flags))
364562306a36Sopenharmony_ci		value = !value;
364662306a36Sopenharmony_ci
364762306a36Sopenharmony_ci	return value;
364862306a36Sopenharmony_ci}
364962306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiod_get_value_cansleep);
365062306a36Sopenharmony_ci
365162306a36Sopenharmony_ci/**
365262306a36Sopenharmony_ci * gpiod_get_raw_array_value_cansleep() - read raw values from an array of GPIOs
365362306a36Sopenharmony_ci * @array_size: number of elements in the descriptor array / value bitmap
365462306a36Sopenharmony_ci * @desc_array: array of GPIO descriptors whose values will be read
365562306a36Sopenharmony_ci * @array_info: information on applicability of fast bitmap processing path
365662306a36Sopenharmony_ci * @value_bitmap: bitmap to store the read values
365762306a36Sopenharmony_ci *
365862306a36Sopenharmony_ci * Read the raw values of the GPIOs, i.e. the values of the physical lines
365962306a36Sopenharmony_ci * without regard for their ACTIVE_LOW status.  Return 0 in case of success,
366062306a36Sopenharmony_ci * else an error code.
366162306a36Sopenharmony_ci *
366262306a36Sopenharmony_ci * This function is to be called from contexts that can sleep.
366362306a36Sopenharmony_ci */
366462306a36Sopenharmony_ciint gpiod_get_raw_array_value_cansleep(unsigned int array_size,
366562306a36Sopenharmony_ci				       struct gpio_desc **desc_array,
366662306a36Sopenharmony_ci				       struct gpio_array *array_info,
366762306a36Sopenharmony_ci				       unsigned long *value_bitmap)
366862306a36Sopenharmony_ci{
366962306a36Sopenharmony_ci	might_sleep_if(extra_checks);
367062306a36Sopenharmony_ci	if (!desc_array)
367162306a36Sopenharmony_ci		return -EINVAL;
367262306a36Sopenharmony_ci	return gpiod_get_array_value_complex(true, true, array_size,
367362306a36Sopenharmony_ci					     desc_array, array_info,
367462306a36Sopenharmony_ci					     value_bitmap);
367562306a36Sopenharmony_ci}
367662306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiod_get_raw_array_value_cansleep);
367762306a36Sopenharmony_ci
367862306a36Sopenharmony_ci/**
367962306a36Sopenharmony_ci * gpiod_get_array_value_cansleep() - read values from an array of GPIOs
368062306a36Sopenharmony_ci * @array_size: number of elements in the descriptor array / value bitmap
368162306a36Sopenharmony_ci * @desc_array: array of GPIO descriptors whose values will be read
368262306a36Sopenharmony_ci * @array_info: information on applicability of fast bitmap processing path
368362306a36Sopenharmony_ci * @value_bitmap: bitmap to store the read values
368462306a36Sopenharmony_ci *
368562306a36Sopenharmony_ci * Read the logical values of the GPIOs, i.e. taking their ACTIVE_LOW status
368662306a36Sopenharmony_ci * into account.  Return 0 in case of success, else an error code.
368762306a36Sopenharmony_ci *
368862306a36Sopenharmony_ci * This function is to be called from contexts that can sleep.
368962306a36Sopenharmony_ci */
369062306a36Sopenharmony_ciint gpiod_get_array_value_cansleep(unsigned int array_size,
369162306a36Sopenharmony_ci				   struct gpio_desc **desc_array,
369262306a36Sopenharmony_ci				   struct gpio_array *array_info,
369362306a36Sopenharmony_ci				   unsigned long *value_bitmap)
369462306a36Sopenharmony_ci{
369562306a36Sopenharmony_ci	might_sleep_if(extra_checks);
369662306a36Sopenharmony_ci	if (!desc_array)
369762306a36Sopenharmony_ci		return -EINVAL;
369862306a36Sopenharmony_ci	return gpiod_get_array_value_complex(false, true, array_size,
369962306a36Sopenharmony_ci					     desc_array, array_info,
370062306a36Sopenharmony_ci					     value_bitmap);
370162306a36Sopenharmony_ci}
370262306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiod_get_array_value_cansleep);
370362306a36Sopenharmony_ci
370462306a36Sopenharmony_ci/**
370562306a36Sopenharmony_ci * gpiod_set_raw_value_cansleep() - assign a gpio's raw value
370662306a36Sopenharmony_ci * @desc: gpio whose value will be assigned
370762306a36Sopenharmony_ci * @value: value to assign
370862306a36Sopenharmony_ci *
370962306a36Sopenharmony_ci * Set the raw value of the GPIO, i.e. the value of its physical line without
371062306a36Sopenharmony_ci * regard for its ACTIVE_LOW status.
371162306a36Sopenharmony_ci *
371262306a36Sopenharmony_ci * This function is to be called from contexts that can sleep.
371362306a36Sopenharmony_ci */
371462306a36Sopenharmony_civoid gpiod_set_raw_value_cansleep(struct gpio_desc *desc, int value)
371562306a36Sopenharmony_ci{
371662306a36Sopenharmony_ci	might_sleep_if(extra_checks);
371762306a36Sopenharmony_ci	VALIDATE_DESC_VOID(desc);
371862306a36Sopenharmony_ci	gpiod_set_raw_value_commit(desc, value);
371962306a36Sopenharmony_ci}
372062306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiod_set_raw_value_cansleep);
372162306a36Sopenharmony_ci
372262306a36Sopenharmony_ci/**
372362306a36Sopenharmony_ci * gpiod_set_value_cansleep() - assign a gpio's value
372462306a36Sopenharmony_ci * @desc: gpio whose value will be assigned
372562306a36Sopenharmony_ci * @value: value to assign
372662306a36Sopenharmony_ci *
372762306a36Sopenharmony_ci * Set the logical value of the GPIO, i.e. taking its ACTIVE_LOW status into
372862306a36Sopenharmony_ci * account
372962306a36Sopenharmony_ci *
373062306a36Sopenharmony_ci * This function is to be called from contexts that can sleep.
373162306a36Sopenharmony_ci */
373262306a36Sopenharmony_civoid gpiod_set_value_cansleep(struct gpio_desc *desc, int value)
373362306a36Sopenharmony_ci{
373462306a36Sopenharmony_ci	might_sleep_if(extra_checks);
373562306a36Sopenharmony_ci	VALIDATE_DESC_VOID(desc);
373662306a36Sopenharmony_ci	gpiod_set_value_nocheck(desc, value);
373762306a36Sopenharmony_ci}
373862306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiod_set_value_cansleep);
373962306a36Sopenharmony_ci
374062306a36Sopenharmony_ci/**
374162306a36Sopenharmony_ci * gpiod_set_raw_array_value_cansleep() - assign values to an array of GPIOs
374262306a36Sopenharmony_ci * @array_size: number of elements in the descriptor array / value bitmap
374362306a36Sopenharmony_ci * @desc_array: array of GPIO descriptors whose values will be assigned
374462306a36Sopenharmony_ci * @array_info: information on applicability of fast bitmap processing path
374562306a36Sopenharmony_ci * @value_bitmap: bitmap of values to assign
374662306a36Sopenharmony_ci *
374762306a36Sopenharmony_ci * Set the raw values of the GPIOs, i.e. the values of the physical lines
374862306a36Sopenharmony_ci * without regard for their ACTIVE_LOW status.
374962306a36Sopenharmony_ci *
375062306a36Sopenharmony_ci * This function is to be called from contexts that can sleep.
375162306a36Sopenharmony_ci */
375262306a36Sopenharmony_ciint gpiod_set_raw_array_value_cansleep(unsigned int array_size,
375362306a36Sopenharmony_ci				       struct gpio_desc **desc_array,
375462306a36Sopenharmony_ci				       struct gpio_array *array_info,
375562306a36Sopenharmony_ci				       unsigned long *value_bitmap)
375662306a36Sopenharmony_ci{
375762306a36Sopenharmony_ci	might_sleep_if(extra_checks);
375862306a36Sopenharmony_ci	if (!desc_array)
375962306a36Sopenharmony_ci		return -EINVAL;
376062306a36Sopenharmony_ci	return gpiod_set_array_value_complex(true, true, array_size, desc_array,
376162306a36Sopenharmony_ci				      array_info, value_bitmap);
376262306a36Sopenharmony_ci}
376362306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiod_set_raw_array_value_cansleep);
376462306a36Sopenharmony_ci
376562306a36Sopenharmony_ci/**
376662306a36Sopenharmony_ci * gpiod_add_lookup_tables() - register GPIO device consumers
376762306a36Sopenharmony_ci * @tables: list of tables of consumers to register
376862306a36Sopenharmony_ci * @n: number of tables in the list
376962306a36Sopenharmony_ci */
377062306a36Sopenharmony_civoid gpiod_add_lookup_tables(struct gpiod_lookup_table **tables, size_t n)
377162306a36Sopenharmony_ci{
377262306a36Sopenharmony_ci	unsigned int i;
377362306a36Sopenharmony_ci
377462306a36Sopenharmony_ci	mutex_lock(&gpio_lookup_lock);
377562306a36Sopenharmony_ci
377662306a36Sopenharmony_ci	for (i = 0; i < n; i++)
377762306a36Sopenharmony_ci		list_add_tail(&tables[i]->list, &gpio_lookup_list);
377862306a36Sopenharmony_ci
377962306a36Sopenharmony_ci	mutex_unlock(&gpio_lookup_lock);
378062306a36Sopenharmony_ci}
378162306a36Sopenharmony_ci
378262306a36Sopenharmony_ci/**
378362306a36Sopenharmony_ci * gpiod_set_array_value_cansleep() - assign values to an array of GPIOs
378462306a36Sopenharmony_ci * @array_size: number of elements in the descriptor array / value bitmap
378562306a36Sopenharmony_ci * @desc_array: array of GPIO descriptors whose values will be assigned
378662306a36Sopenharmony_ci * @array_info: information on applicability of fast bitmap processing path
378762306a36Sopenharmony_ci * @value_bitmap: bitmap of values to assign
378862306a36Sopenharmony_ci *
378962306a36Sopenharmony_ci * Set the logical values of the GPIOs, i.e. taking their ACTIVE_LOW status
379062306a36Sopenharmony_ci * into account.
379162306a36Sopenharmony_ci *
379262306a36Sopenharmony_ci * This function is to be called from contexts that can sleep.
379362306a36Sopenharmony_ci */
379462306a36Sopenharmony_ciint gpiod_set_array_value_cansleep(unsigned int array_size,
379562306a36Sopenharmony_ci				   struct gpio_desc **desc_array,
379662306a36Sopenharmony_ci				   struct gpio_array *array_info,
379762306a36Sopenharmony_ci				   unsigned long *value_bitmap)
379862306a36Sopenharmony_ci{
379962306a36Sopenharmony_ci	might_sleep_if(extra_checks);
380062306a36Sopenharmony_ci	if (!desc_array)
380162306a36Sopenharmony_ci		return -EINVAL;
380262306a36Sopenharmony_ci	return gpiod_set_array_value_complex(false, true, array_size,
380362306a36Sopenharmony_ci					     desc_array, array_info,
380462306a36Sopenharmony_ci					     value_bitmap);
380562306a36Sopenharmony_ci}
380662306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiod_set_array_value_cansleep);
380762306a36Sopenharmony_ci
380862306a36Sopenharmony_civoid gpiod_line_state_notify(struct gpio_desc *desc, unsigned long action)
380962306a36Sopenharmony_ci{
381062306a36Sopenharmony_ci	blocking_notifier_call_chain(&desc->gdev->line_state_notifier,
381162306a36Sopenharmony_ci				     action, desc);
381262306a36Sopenharmony_ci}
381362306a36Sopenharmony_ci
381462306a36Sopenharmony_ci/**
381562306a36Sopenharmony_ci * gpiod_add_lookup_table() - register GPIO device consumers
381662306a36Sopenharmony_ci * @table: table of consumers to register
381762306a36Sopenharmony_ci */
381862306a36Sopenharmony_civoid gpiod_add_lookup_table(struct gpiod_lookup_table *table)
381962306a36Sopenharmony_ci{
382062306a36Sopenharmony_ci	gpiod_add_lookup_tables(&table, 1);
382162306a36Sopenharmony_ci}
382262306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiod_add_lookup_table);
382362306a36Sopenharmony_ci
382462306a36Sopenharmony_ci/**
382562306a36Sopenharmony_ci * gpiod_remove_lookup_table() - unregister GPIO device consumers
382662306a36Sopenharmony_ci * @table: table of consumers to unregister
382762306a36Sopenharmony_ci */
382862306a36Sopenharmony_civoid gpiod_remove_lookup_table(struct gpiod_lookup_table *table)
382962306a36Sopenharmony_ci{
383062306a36Sopenharmony_ci	/* Nothing to remove */
383162306a36Sopenharmony_ci	if (!table)
383262306a36Sopenharmony_ci		return;
383362306a36Sopenharmony_ci
383462306a36Sopenharmony_ci	mutex_lock(&gpio_lookup_lock);
383562306a36Sopenharmony_ci
383662306a36Sopenharmony_ci	list_del(&table->list);
383762306a36Sopenharmony_ci
383862306a36Sopenharmony_ci	mutex_unlock(&gpio_lookup_lock);
383962306a36Sopenharmony_ci}
384062306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiod_remove_lookup_table);
384162306a36Sopenharmony_ci
384262306a36Sopenharmony_ci/**
384362306a36Sopenharmony_ci * gpiod_add_hogs() - register a set of GPIO hogs from machine code
384462306a36Sopenharmony_ci * @hogs: table of gpio hog entries with a zeroed sentinel at the end
384562306a36Sopenharmony_ci */
384662306a36Sopenharmony_civoid gpiod_add_hogs(struct gpiod_hog *hogs)
384762306a36Sopenharmony_ci{
384862306a36Sopenharmony_ci	struct gpio_chip *gc;
384962306a36Sopenharmony_ci	struct gpiod_hog *hog;
385062306a36Sopenharmony_ci
385162306a36Sopenharmony_ci	mutex_lock(&gpio_machine_hogs_mutex);
385262306a36Sopenharmony_ci
385362306a36Sopenharmony_ci	for (hog = &hogs[0]; hog->chip_label; hog++) {
385462306a36Sopenharmony_ci		list_add_tail(&hog->list, &gpio_machine_hogs);
385562306a36Sopenharmony_ci
385662306a36Sopenharmony_ci		/*
385762306a36Sopenharmony_ci		 * The chip may have been registered earlier, so check if it
385862306a36Sopenharmony_ci		 * exists and, if so, try to hog the line now.
385962306a36Sopenharmony_ci		 */
386062306a36Sopenharmony_ci		gc = find_chip_by_name(hog->chip_label);
386162306a36Sopenharmony_ci		if (gc)
386262306a36Sopenharmony_ci			gpiochip_machine_hog(gc, hog);
386362306a36Sopenharmony_ci	}
386462306a36Sopenharmony_ci
386562306a36Sopenharmony_ci	mutex_unlock(&gpio_machine_hogs_mutex);
386662306a36Sopenharmony_ci}
386762306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiod_add_hogs);
386862306a36Sopenharmony_ci
386962306a36Sopenharmony_civoid gpiod_remove_hogs(struct gpiod_hog *hogs)
387062306a36Sopenharmony_ci{
387162306a36Sopenharmony_ci	struct gpiod_hog *hog;
387262306a36Sopenharmony_ci
387362306a36Sopenharmony_ci	mutex_lock(&gpio_machine_hogs_mutex);
387462306a36Sopenharmony_ci	for (hog = &hogs[0]; hog->chip_label; hog++)
387562306a36Sopenharmony_ci		list_del(&hog->list);
387662306a36Sopenharmony_ci	mutex_unlock(&gpio_machine_hogs_mutex);
387762306a36Sopenharmony_ci}
387862306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiod_remove_hogs);
387962306a36Sopenharmony_ci
388062306a36Sopenharmony_cistatic struct gpiod_lookup_table *gpiod_find_lookup_table(struct device *dev)
388162306a36Sopenharmony_ci{
388262306a36Sopenharmony_ci	const char *dev_id = dev ? dev_name(dev) : NULL;
388362306a36Sopenharmony_ci	struct gpiod_lookup_table *table;
388462306a36Sopenharmony_ci
388562306a36Sopenharmony_ci	mutex_lock(&gpio_lookup_lock);
388662306a36Sopenharmony_ci
388762306a36Sopenharmony_ci	list_for_each_entry(table, &gpio_lookup_list, list) {
388862306a36Sopenharmony_ci		if (table->dev_id && dev_id) {
388962306a36Sopenharmony_ci			/*
389062306a36Sopenharmony_ci			 * Valid strings on both ends, must be identical to have
389162306a36Sopenharmony_ci			 * a match
389262306a36Sopenharmony_ci			 */
389362306a36Sopenharmony_ci			if (!strcmp(table->dev_id, dev_id))
389462306a36Sopenharmony_ci				goto found;
389562306a36Sopenharmony_ci		} else {
389662306a36Sopenharmony_ci			/*
389762306a36Sopenharmony_ci			 * One of the pointers is NULL, so both must be to have
389862306a36Sopenharmony_ci			 * a match
389962306a36Sopenharmony_ci			 */
390062306a36Sopenharmony_ci			if (dev_id == table->dev_id)
390162306a36Sopenharmony_ci				goto found;
390262306a36Sopenharmony_ci		}
390362306a36Sopenharmony_ci	}
390462306a36Sopenharmony_ci	table = NULL;
390562306a36Sopenharmony_ci
390662306a36Sopenharmony_cifound:
390762306a36Sopenharmony_ci	mutex_unlock(&gpio_lookup_lock);
390862306a36Sopenharmony_ci	return table;
390962306a36Sopenharmony_ci}
391062306a36Sopenharmony_ci
391162306a36Sopenharmony_cistatic struct gpio_desc *gpiod_find(struct device *dev, const char *con_id,
391262306a36Sopenharmony_ci				    unsigned int idx, unsigned long *flags)
391362306a36Sopenharmony_ci{
391462306a36Sopenharmony_ci	struct gpio_desc *desc = ERR_PTR(-ENOENT);
391562306a36Sopenharmony_ci	struct gpiod_lookup_table *table;
391662306a36Sopenharmony_ci	struct gpiod_lookup *p;
391762306a36Sopenharmony_ci
391862306a36Sopenharmony_ci	table = gpiod_find_lookup_table(dev);
391962306a36Sopenharmony_ci	if (!table)
392062306a36Sopenharmony_ci		return desc;
392162306a36Sopenharmony_ci
392262306a36Sopenharmony_ci	for (p = &table->table[0]; p->key; p++) {
392362306a36Sopenharmony_ci		struct gpio_chip *gc;
392462306a36Sopenharmony_ci
392562306a36Sopenharmony_ci		/* idx must always match exactly */
392662306a36Sopenharmony_ci		if (p->idx != idx)
392762306a36Sopenharmony_ci			continue;
392862306a36Sopenharmony_ci
392962306a36Sopenharmony_ci		/* If the lookup entry has a con_id, require exact match */
393062306a36Sopenharmony_ci		if (p->con_id && (!con_id || strcmp(p->con_id, con_id)))
393162306a36Sopenharmony_ci			continue;
393262306a36Sopenharmony_ci
393362306a36Sopenharmony_ci		if (p->chip_hwnum == U16_MAX) {
393462306a36Sopenharmony_ci			desc = gpio_name_to_desc(p->key);
393562306a36Sopenharmony_ci			if (desc) {
393662306a36Sopenharmony_ci				*flags = p->flags;
393762306a36Sopenharmony_ci				return desc;
393862306a36Sopenharmony_ci			}
393962306a36Sopenharmony_ci
394062306a36Sopenharmony_ci			dev_warn(dev, "cannot find GPIO line %s, deferring\n",
394162306a36Sopenharmony_ci				 p->key);
394262306a36Sopenharmony_ci			return ERR_PTR(-EPROBE_DEFER);
394362306a36Sopenharmony_ci		}
394462306a36Sopenharmony_ci
394562306a36Sopenharmony_ci		gc = find_chip_by_name(p->key);
394662306a36Sopenharmony_ci
394762306a36Sopenharmony_ci		if (!gc) {
394862306a36Sopenharmony_ci			/*
394962306a36Sopenharmony_ci			 * As the lookup table indicates a chip with
395062306a36Sopenharmony_ci			 * p->key should exist, assume it may
395162306a36Sopenharmony_ci			 * still appear later and let the interested
395262306a36Sopenharmony_ci			 * consumer be probed again or let the Deferred
395362306a36Sopenharmony_ci			 * Probe infrastructure handle the error.
395462306a36Sopenharmony_ci			 */
395562306a36Sopenharmony_ci			dev_warn(dev, "cannot find GPIO chip %s, deferring\n",
395662306a36Sopenharmony_ci				 p->key);
395762306a36Sopenharmony_ci			return ERR_PTR(-EPROBE_DEFER);
395862306a36Sopenharmony_ci		}
395962306a36Sopenharmony_ci
396062306a36Sopenharmony_ci		if (gc->ngpio <= p->chip_hwnum) {
396162306a36Sopenharmony_ci			dev_err(dev,
396262306a36Sopenharmony_ci				"requested GPIO %u (%u) is out of range [0..%u] for chip %s\n",
396362306a36Sopenharmony_ci				idx, p->chip_hwnum, gc->ngpio - 1,
396462306a36Sopenharmony_ci				gc->label);
396562306a36Sopenharmony_ci			return ERR_PTR(-EINVAL);
396662306a36Sopenharmony_ci		}
396762306a36Sopenharmony_ci
396862306a36Sopenharmony_ci		desc = gpiochip_get_desc(gc, p->chip_hwnum);
396962306a36Sopenharmony_ci		*flags = p->flags;
397062306a36Sopenharmony_ci
397162306a36Sopenharmony_ci		return desc;
397262306a36Sopenharmony_ci	}
397362306a36Sopenharmony_ci
397462306a36Sopenharmony_ci	return desc;
397562306a36Sopenharmony_ci}
397662306a36Sopenharmony_ci
397762306a36Sopenharmony_cistatic int platform_gpio_count(struct device *dev, const char *con_id)
397862306a36Sopenharmony_ci{
397962306a36Sopenharmony_ci	struct gpiod_lookup_table *table;
398062306a36Sopenharmony_ci	struct gpiod_lookup *p;
398162306a36Sopenharmony_ci	unsigned int count = 0;
398262306a36Sopenharmony_ci
398362306a36Sopenharmony_ci	table = gpiod_find_lookup_table(dev);
398462306a36Sopenharmony_ci	if (!table)
398562306a36Sopenharmony_ci		return -ENOENT;
398662306a36Sopenharmony_ci
398762306a36Sopenharmony_ci	for (p = &table->table[0]; p->key; p++) {
398862306a36Sopenharmony_ci		if ((con_id && p->con_id && !strcmp(con_id, p->con_id)) ||
398962306a36Sopenharmony_ci		    (!con_id && !p->con_id))
399062306a36Sopenharmony_ci			count++;
399162306a36Sopenharmony_ci	}
399262306a36Sopenharmony_ci	if (!count)
399362306a36Sopenharmony_ci		return -ENOENT;
399462306a36Sopenharmony_ci
399562306a36Sopenharmony_ci	return count;
399662306a36Sopenharmony_ci}
399762306a36Sopenharmony_ci
399862306a36Sopenharmony_cistatic struct gpio_desc *gpiod_find_by_fwnode(struct fwnode_handle *fwnode,
399962306a36Sopenharmony_ci					      struct device *consumer,
400062306a36Sopenharmony_ci					      const char *con_id,
400162306a36Sopenharmony_ci					      unsigned int idx,
400262306a36Sopenharmony_ci					      enum gpiod_flags *flags,
400362306a36Sopenharmony_ci					      unsigned long *lookupflags)
400462306a36Sopenharmony_ci{
400562306a36Sopenharmony_ci	struct gpio_desc *desc = ERR_PTR(-ENOENT);
400662306a36Sopenharmony_ci
400762306a36Sopenharmony_ci	if (is_of_node(fwnode)) {
400862306a36Sopenharmony_ci		dev_dbg(consumer, "using DT '%pfw' for '%s' GPIO lookup\n",
400962306a36Sopenharmony_ci			fwnode, con_id);
401062306a36Sopenharmony_ci		desc = of_find_gpio(to_of_node(fwnode), con_id, idx, lookupflags);
401162306a36Sopenharmony_ci	} else if (is_acpi_node(fwnode)) {
401262306a36Sopenharmony_ci		dev_dbg(consumer, "using ACPI '%pfw' for '%s' GPIO lookup\n",
401362306a36Sopenharmony_ci			fwnode, con_id);
401462306a36Sopenharmony_ci		desc = acpi_find_gpio(fwnode, con_id, idx, flags, lookupflags);
401562306a36Sopenharmony_ci	} else if (is_software_node(fwnode)) {
401662306a36Sopenharmony_ci		dev_dbg(consumer, "using swnode '%pfw' for '%s' GPIO lookup\n",
401762306a36Sopenharmony_ci			fwnode, con_id);
401862306a36Sopenharmony_ci		desc = swnode_find_gpio(fwnode, con_id, idx, lookupflags);
401962306a36Sopenharmony_ci	}
402062306a36Sopenharmony_ci
402162306a36Sopenharmony_ci	return desc;
402262306a36Sopenharmony_ci}
402362306a36Sopenharmony_ci
402462306a36Sopenharmony_cistruct gpio_desc *gpiod_find_and_request(struct device *consumer,
402562306a36Sopenharmony_ci					 struct fwnode_handle *fwnode,
402662306a36Sopenharmony_ci					 const char *con_id,
402762306a36Sopenharmony_ci					 unsigned int idx,
402862306a36Sopenharmony_ci					 enum gpiod_flags flags,
402962306a36Sopenharmony_ci					 const char *label,
403062306a36Sopenharmony_ci					 bool platform_lookup_allowed)
403162306a36Sopenharmony_ci{
403262306a36Sopenharmony_ci	unsigned long lookupflags = GPIO_LOOKUP_FLAGS_DEFAULT;
403362306a36Sopenharmony_ci	struct gpio_desc *desc;
403462306a36Sopenharmony_ci	int ret;
403562306a36Sopenharmony_ci
403662306a36Sopenharmony_ci	desc = gpiod_find_by_fwnode(fwnode, consumer, con_id, idx, &flags, &lookupflags);
403762306a36Sopenharmony_ci	if (gpiod_not_found(desc) && platform_lookup_allowed) {
403862306a36Sopenharmony_ci		/*
403962306a36Sopenharmony_ci		 * Either we are not using DT or ACPI, or their lookup did not
404062306a36Sopenharmony_ci		 * return a result. In that case, use platform lookup as a
404162306a36Sopenharmony_ci		 * fallback.
404262306a36Sopenharmony_ci		 */
404362306a36Sopenharmony_ci		dev_dbg(consumer, "using lookup tables for GPIO lookup\n");
404462306a36Sopenharmony_ci		desc = gpiod_find(consumer, con_id, idx, &lookupflags);
404562306a36Sopenharmony_ci	}
404662306a36Sopenharmony_ci
404762306a36Sopenharmony_ci	if (IS_ERR(desc)) {
404862306a36Sopenharmony_ci		dev_dbg(consumer, "No GPIO consumer %s found\n", con_id);
404962306a36Sopenharmony_ci		return desc;
405062306a36Sopenharmony_ci	}
405162306a36Sopenharmony_ci
405262306a36Sopenharmony_ci	/*
405362306a36Sopenharmony_ci	 * If a connection label was passed use that, else attempt to use
405462306a36Sopenharmony_ci	 * the device name as label
405562306a36Sopenharmony_ci	 */
405662306a36Sopenharmony_ci	ret = gpiod_request(desc, label);
405762306a36Sopenharmony_ci	if (ret) {
405862306a36Sopenharmony_ci		if (!(ret == -EBUSY && flags & GPIOD_FLAGS_BIT_NONEXCLUSIVE))
405962306a36Sopenharmony_ci			return ERR_PTR(ret);
406062306a36Sopenharmony_ci
406162306a36Sopenharmony_ci		/*
406262306a36Sopenharmony_ci		 * This happens when there are several consumers for
406362306a36Sopenharmony_ci		 * the same GPIO line: we just return here without
406462306a36Sopenharmony_ci		 * further initialization. It is a bit of a hack.
406562306a36Sopenharmony_ci		 * This is necessary to support fixed regulators.
406662306a36Sopenharmony_ci		 *
406762306a36Sopenharmony_ci		 * FIXME: Make this more sane and safe.
406862306a36Sopenharmony_ci		 */
406962306a36Sopenharmony_ci		dev_info(consumer,
407062306a36Sopenharmony_ci			 "nonexclusive access to GPIO for %s\n", con_id);
407162306a36Sopenharmony_ci		return desc;
407262306a36Sopenharmony_ci	}
407362306a36Sopenharmony_ci
407462306a36Sopenharmony_ci	ret = gpiod_configure_flags(desc, con_id, lookupflags, flags);
407562306a36Sopenharmony_ci	if (ret < 0) {
407662306a36Sopenharmony_ci		dev_dbg(consumer, "setup of GPIO %s failed\n", con_id);
407762306a36Sopenharmony_ci		gpiod_put(desc);
407862306a36Sopenharmony_ci		return ERR_PTR(ret);
407962306a36Sopenharmony_ci	}
408062306a36Sopenharmony_ci
408162306a36Sopenharmony_ci	gpiod_line_state_notify(desc, GPIOLINE_CHANGED_REQUESTED);
408262306a36Sopenharmony_ci
408362306a36Sopenharmony_ci	return desc;
408462306a36Sopenharmony_ci}
408562306a36Sopenharmony_ci
408662306a36Sopenharmony_ci/**
408762306a36Sopenharmony_ci * fwnode_gpiod_get_index - obtain a GPIO from firmware node
408862306a36Sopenharmony_ci * @fwnode:	handle of the firmware node
408962306a36Sopenharmony_ci * @con_id:	function within the GPIO consumer
409062306a36Sopenharmony_ci * @index:	index of the GPIO to obtain for the consumer
409162306a36Sopenharmony_ci * @flags:	GPIO initialization flags
409262306a36Sopenharmony_ci * @label:	label to attach to the requested GPIO
409362306a36Sopenharmony_ci *
409462306a36Sopenharmony_ci * This function can be used for drivers that get their configuration
409562306a36Sopenharmony_ci * from opaque firmware.
409662306a36Sopenharmony_ci *
409762306a36Sopenharmony_ci * The function properly finds the corresponding GPIO using whatever is the
409862306a36Sopenharmony_ci * underlying firmware interface and then makes sure that the GPIO
409962306a36Sopenharmony_ci * descriptor is requested before it is returned to the caller.
410062306a36Sopenharmony_ci *
410162306a36Sopenharmony_ci * Returns:
410262306a36Sopenharmony_ci * On successful request the GPIO pin is configured in accordance with
410362306a36Sopenharmony_ci * provided @flags.
410462306a36Sopenharmony_ci *
410562306a36Sopenharmony_ci * In case of error an ERR_PTR() is returned.
410662306a36Sopenharmony_ci */
410762306a36Sopenharmony_cistruct gpio_desc *fwnode_gpiod_get_index(struct fwnode_handle *fwnode,
410862306a36Sopenharmony_ci					 const char *con_id,
410962306a36Sopenharmony_ci					 int index,
411062306a36Sopenharmony_ci					 enum gpiod_flags flags,
411162306a36Sopenharmony_ci					 const char *label)
411262306a36Sopenharmony_ci{
411362306a36Sopenharmony_ci	return gpiod_find_and_request(NULL, fwnode, con_id, index, flags, label, false);
411462306a36Sopenharmony_ci}
411562306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(fwnode_gpiod_get_index);
411662306a36Sopenharmony_ci
411762306a36Sopenharmony_ci/**
411862306a36Sopenharmony_ci * gpiod_count - return the number of GPIOs associated with a device / function
411962306a36Sopenharmony_ci *		or -ENOENT if no GPIO has been assigned to the requested function
412062306a36Sopenharmony_ci * @dev:	GPIO consumer, can be NULL for system-global GPIOs
412162306a36Sopenharmony_ci * @con_id:	function within the GPIO consumer
412262306a36Sopenharmony_ci */
412362306a36Sopenharmony_ciint gpiod_count(struct device *dev, const char *con_id)
412462306a36Sopenharmony_ci{
412562306a36Sopenharmony_ci	const struct fwnode_handle *fwnode = dev ? dev_fwnode(dev) : NULL;
412662306a36Sopenharmony_ci	int count = -ENOENT;
412762306a36Sopenharmony_ci
412862306a36Sopenharmony_ci	if (is_of_node(fwnode))
412962306a36Sopenharmony_ci		count = of_gpio_get_count(dev, con_id);
413062306a36Sopenharmony_ci	else if (is_acpi_node(fwnode))
413162306a36Sopenharmony_ci		count = acpi_gpio_count(dev, con_id);
413262306a36Sopenharmony_ci	else if (is_software_node(fwnode))
413362306a36Sopenharmony_ci		count = swnode_gpio_count(fwnode, con_id);
413462306a36Sopenharmony_ci
413562306a36Sopenharmony_ci	if (count < 0)
413662306a36Sopenharmony_ci		count = platform_gpio_count(dev, con_id);
413762306a36Sopenharmony_ci
413862306a36Sopenharmony_ci	return count;
413962306a36Sopenharmony_ci}
414062306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiod_count);
414162306a36Sopenharmony_ci
414262306a36Sopenharmony_ci/**
414362306a36Sopenharmony_ci * gpiod_get - obtain a GPIO for a given GPIO function
414462306a36Sopenharmony_ci * @dev:	GPIO consumer, can be NULL for system-global GPIOs
414562306a36Sopenharmony_ci * @con_id:	function within the GPIO consumer
414662306a36Sopenharmony_ci * @flags:	optional GPIO initialization flags
414762306a36Sopenharmony_ci *
414862306a36Sopenharmony_ci * Return the GPIO descriptor corresponding to the function con_id of device
414962306a36Sopenharmony_ci * dev, -ENOENT if no GPIO has been assigned to the requested function, or
415062306a36Sopenharmony_ci * another IS_ERR() code if an error occurred while trying to acquire the GPIO.
415162306a36Sopenharmony_ci */
415262306a36Sopenharmony_cistruct gpio_desc *__must_check gpiod_get(struct device *dev, const char *con_id,
415362306a36Sopenharmony_ci					 enum gpiod_flags flags)
415462306a36Sopenharmony_ci{
415562306a36Sopenharmony_ci	return gpiod_get_index(dev, con_id, 0, flags);
415662306a36Sopenharmony_ci}
415762306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiod_get);
415862306a36Sopenharmony_ci
415962306a36Sopenharmony_ci/**
416062306a36Sopenharmony_ci * gpiod_get_optional - obtain an optional GPIO for a given GPIO function
416162306a36Sopenharmony_ci * @dev: GPIO consumer, can be NULL for system-global GPIOs
416262306a36Sopenharmony_ci * @con_id: function within the GPIO consumer
416362306a36Sopenharmony_ci * @flags: optional GPIO initialization flags
416462306a36Sopenharmony_ci *
416562306a36Sopenharmony_ci * This is equivalent to gpiod_get(), except that when no GPIO was assigned to
416662306a36Sopenharmony_ci * the requested function it will return NULL. This is convenient for drivers
416762306a36Sopenharmony_ci * that need to handle optional GPIOs.
416862306a36Sopenharmony_ci */
416962306a36Sopenharmony_cistruct gpio_desc *__must_check gpiod_get_optional(struct device *dev,
417062306a36Sopenharmony_ci						  const char *con_id,
417162306a36Sopenharmony_ci						  enum gpiod_flags flags)
417262306a36Sopenharmony_ci{
417362306a36Sopenharmony_ci	return gpiod_get_index_optional(dev, con_id, 0, flags);
417462306a36Sopenharmony_ci}
417562306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiod_get_optional);
417662306a36Sopenharmony_ci
417762306a36Sopenharmony_ci
417862306a36Sopenharmony_ci/**
417962306a36Sopenharmony_ci * gpiod_configure_flags - helper function to configure a given GPIO
418062306a36Sopenharmony_ci * @desc:	gpio whose value will be assigned
418162306a36Sopenharmony_ci * @con_id:	function within the GPIO consumer
418262306a36Sopenharmony_ci * @lflags:	bitmask of gpio_lookup_flags GPIO_* values - returned from
418362306a36Sopenharmony_ci *		of_find_gpio() or of_get_gpio_hog()
418462306a36Sopenharmony_ci * @dflags:	gpiod_flags - optional GPIO initialization flags
418562306a36Sopenharmony_ci *
418662306a36Sopenharmony_ci * Return 0 on success, -ENOENT if no GPIO has been assigned to the
418762306a36Sopenharmony_ci * requested function and/or index, or another IS_ERR() code if an error
418862306a36Sopenharmony_ci * occurred while trying to acquire the GPIO.
418962306a36Sopenharmony_ci */
419062306a36Sopenharmony_ciint gpiod_configure_flags(struct gpio_desc *desc, const char *con_id,
419162306a36Sopenharmony_ci		unsigned long lflags, enum gpiod_flags dflags)
419262306a36Sopenharmony_ci{
419362306a36Sopenharmony_ci	int ret;
419462306a36Sopenharmony_ci
419562306a36Sopenharmony_ci	if (lflags & GPIO_ACTIVE_LOW)
419662306a36Sopenharmony_ci		set_bit(FLAG_ACTIVE_LOW, &desc->flags);
419762306a36Sopenharmony_ci
419862306a36Sopenharmony_ci	if (lflags & GPIO_OPEN_DRAIN)
419962306a36Sopenharmony_ci		set_bit(FLAG_OPEN_DRAIN, &desc->flags);
420062306a36Sopenharmony_ci	else if (dflags & GPIOD_FLAGS_BIT_OPEN_DRAIN) {
420162306a36Sopenharmony_ci		/*
420262306a36Sopenharmony_ci		 * This enforces open drain mode from the consumer side.
420362306a36Sopenharmony_ci		 * This is necessary for some busses like I2C, but the lookup
420462306a36Sopenharmony_ci		 * should *REALLY* have specified them as open drain in the
420562306a36Sopenharmony_ci		 * first place, so print a little warning here.
420662306a36Sopenharmony_ci		 */
420762306a36Sopenharmony_ci		set_bit(FLAG_OPEN_DRAIN, &desc->flags);
420862306a36Sopenharmony_ci		gpiod_warn(desc,
420962306a36Sopenharmony_ci			   "enforced open drain please flag it properly in DT/ACPI DSDT/board file\n");
421062306a36Sopenharmony_ci	}
421162306a36Sopenharmony_ci
421262306a36Sopenharmony_ci	if (lflags & GPIO_OPEN_SOURCE)
421362306a36Sopenharmony_ci		set_bit(FLAG_OPEN_SOURCE, &desc->flags);
421462306a36Sopenharmony_ci
421562306a36Sopenharmony_ci	if (((lflags & GPIO_PULL_UP) && (lflags & GPIO_PULL_DOWN)) ||
421662306a36Sopenharmony_ci	    ((lflags & GPIO_PULL_UP) && (lflags & GPIO_PULL_DISABLE)) ||
421762306a36Sopenharmony_ci	    ((lflags & GPIO_PULL_DOWN) && (lflags & GPIO_PULL_DISABLE))) {
421862306a36Sopenharmony_ci		gpiod_err(desc,
421962306a36Sopenharmony_ci			  "multiple pull-up, pull-down or pull-disable enabled, invalid configuration\n");
422062306a36Sopenharmony_ci		return -EINVAL;
422162306a36Sopenharmony_ci	}
422262306a36Sopenharmony_ci
422362306a36Sopenharmony_ci	if (lflags & GPIO_PULL_UP)
422462306a36Sopenharmony_ci		set_bit(FLAG_PULL_UP, &desc->flags);
422562306a36Sopenharmony_ci	else if (lflags & GPIO_PULL_DOWN)
422662306a36Sopenharmony_ci		set_bit(FLAG_PULL_DOWN, &desc->flags);
422762306a36Sopenharmony_ci	else if (lflags & GPIO_PULL_DISABLE)
422862306a36Sopenharmony_ci		set_bit(FLAG_BIAS_DISABLE, &desc->flags);
422962306a36Sopenharmony_ci
423062306a36Sopenharmony_ci	ret = gpiod_set_transitory(desc, (lflags & GPIO_TRANSITORY));
423162306a36Sopenharmony_ci	if (ret < 0)
423262306a36Sopenharmony_ci		return ret;
423362306a36Sopenharmony_ci
423462306a36Sopenharmony_ci	/* No particular flag request, return here... */
423562306a36Sopenharmony_ci	if (!(dflags & GPIOD_FLAGS_BIT_DIR_SET)) {
423662306a36Sopenharmony_ci		gpiod_dbg(desc, "no flags found for %s\n", con_id);
423762306a36Sopenharmony_ci		return 0;
423862306a36Sopenharmony_ci	}
423962306a36Sopenharmony_ci
424062306a36Sopenharmony_ci	/* Process flags */
424162306a36Sopenharmony_ci	if (dflags & GPIOD_FLAGS_BIT_DIR_OUT)
424262306a36Sopenharmony_ci		ret = gpiod_direction_output(desc,
424362306a36Sopenharmony_ci				!!(dflags & GPIOD_FLAGS_BIT_DIR_VAL));
424462306a36Sopenharmony_ci	else
424562306a36Sopenharmony_ci		ret = gpiod_direction_input(desc);
424662306a36Sopenharmony_ci
424762306a36Sopenharmony_ci	return ret;
424862306a36Sopenharmony_ci}
424962306a36Sopenharmony_ci
425062306a36Sopenharmony_ci/**
425162306a36Sopenharmony_ci * gpiod_get_index - obtain a GPIO from a multi-index GPIO function
425262306a36Sopenharmony_ci * @dev:	GPIO consumer, can be NULL for system-global GPIOs
425362306a36Sopenharmony_ci * @con_id:	function within the GPIO consumer
425462306a36Sopenharmony_ci * @idx:	index of the GPIO to obtain in the consumer
425562306a36Sopenharmony_ci * @flags:	optional GPIO initialization flags
425662306a36Sopenharmony_ci *
425762306a36Sopenharmony_ci * This variant of gpiod_get() allows to access GPIOs other than the first
425862306a36Sopenharmony_ci * defined one for functions that define several GPIOs.
425962306a36Sopenharmony_ci *
426062306a36Sopenharmony_ci * Return a valid GPIO descriptor, -ENOENT if no GPIO has been assigned to the
426162306a36Sopenharmony_ci * requested function and/or index, or another IS_ERR() code if an error
426262306a36Sopenharmony_ci * occurred while trying to acquire the GPIO.
426362306a36Sopenharmony_ci */
426462306a36Sopenharmony_cistruct gpio_desc *__must_check gpiod_get_index(struct device *dev,
426562306a36Sopenharmony_ci					       const char *con_id,
426662306a36Sopenharmony_ci					       unsigned int idx,
426762306a36Sopenharmony_ci					       enum gpiod_flags flags)
426862306a36Sopenharmony_ci{
426962306a36Sopenharmony_ci	struct fwnode_handle *fwnode = dev ? dev_fwnode(dev) : NULL;
427062306a36Sopenharmony_ci	const char *devname = dev ? dev_name(dev) : "?";
427162306a36Sopenharmony_ci	const char *label = con_id ?: devname;
427262306a36Sopenharmony_ci
427362306a36Sopenharmony_ci	return gpiod_find_and_request(dev, fwnode, con_id, idx, flags, label, true);
427462306a36Sopenharmony_ci}
427562306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiod_get_index);
427662306a36Sopenharmony_ci
427762306a36Sopenharmony_ci/**
427862306a36Sopenharmony_ci * gpiod_get_index_optional - obtain an optional GPIO from a multi-index GPIO
427962306a36Sopenharmony_ci *                            function
428062306a36Sopenharmony_ci * @dev: GPIO consumer, can be NULL for system-global GPIOs
428162306a36Sopenharmony_ci * @con_id: function within the GPIO consumer
428262306a36Sopenharmony_ci * @index: index of the GPIO to obtain in the consumer
428362306a36Sopenharmony_ci * @flags: optional GPIO initialization flags
428462306a36Sopenharmony_ci *
428562306a36Sopenharmony_ci * This is equivalent to gpiod_get_index(), except that when no GPIO with the
428662306a36Sopenharmony_ci * specified index was assigned to the requested function it will return NULL.
428762306a36Sopenharmony_ci * This is convenient for drivers that need to handle optional GPIOs.
428862306a36Sopenharmony_ci */
428962306a36Sopenharmony_cistruct gpio_desc *__must_check gpiod_get_index_optional(struct device *dev,
429062306a36Sopenharmony_ci							const char *con_id,
429162306a36Sopenharmony_ci							unsigned int index,
429262306a36Sopenharmony_ci							enum gpiod_flags flags)
429362306a36Sopenharmony_ci{
429462306a36Sopenharmony_ci	struct gpio_desc *desc;
429562306a36Sopenharmony_ci
429662306a36Sopenharmony_ci	desc = gpiod_get_index(dev, con_id, index, flags);
429762306a36Sopenharmony_ci	if (gpiod_not_found(desc))
429862306a36Sopenharmony_ci		return NULL;
429962306a36Sopenharmony_ci
430062306a36Sopenharmony_ci	return desc;
430162306a36Sopenharmony_ci}
430262306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiod_get_index_optional);
430362306a36Sopenharmony_ci
430462306a36Sopenharmony_ci/**
430562306a36Sopenharmony_ci * gpiod_hog - Hog the specified GPIO desc given the provided flags
430662306a36Sopenharmony_ci * @desc:	gpio whose value will be assigned
430762306a36Sopenharmony_ci * @name:	gpio line name
430862306a36Sopenharmony_ci * @lflags:	bitmask of gpio_lookup_flags GPIO_* values - returned from
430962306a36Sopenharmony_ci *		of_find_gpio() or of_get_gpio_hog()
431062306a36Sopenharmony_ci * @dflags:	gpiod_flags - optional GPIO initialization flags
431162306a36Sopenharmony_ci */
431262306a36Sopenharmony_ciint gpiod_hog(struct gpio_desc *desc, const char *name,
431362306a36Sopenharmony_ci	      unsigned long lflags, enum gpiod_flags dflags)
431462306a36Sopenharmony_ci{
431562306a36Sopenharmony_ci	struct gpio_chip *gc;
431662306a36Sopenharmony_ci	struct gpio_desc *local_desc;
431762306a36Sopenharmony_ci	int hwnum;
431862306a36Sopenharmony_ci	int ret;
431962306a36Sopenharmony_ci
432062306a36Sopenharmony_ci	gc = gpiod_to_chip(desc);
432162306a36Sopenharmony_ci	hwnum = gpio_chip_hwgpio(desc);
432262306a36Sopenharmony_ci
432362306a36Sopenharmony_ci	local_desc = gpiochip_request_own_desc(gc, hwnum, name,
432462306a36Sopenharmony_ci					       lflags, dflags);
432562306a36Sopenharmony_ci	if (IS_ERR(local_desc)) {
432662306a36Sopenharmony_ci		ret = PTR_ERR(local_desc);
432762306a36Sopenharmony_ci		pr_err("requesting hog GPIO %s (chip %s, offset %d) failed, %d\n",
432862306a36Sopenharmony_ci		       name, gc->label, hwnum, ret);
432962306a36Sopenharmony_ci		return ret;
433062306a36Sopenharmony_ci	}
433162306a36Sopenharmony_ci
433262306a36Sopenharmony_ci	/* Mark GPIO as hogged so it can be identified and removed later */
433362306a36Sopenharmony_ci	set_bit(FLAG_IS_HOGGED, &desc->flags);
433462306a36Sopenharmony_ci
433562306a36Sopenharmony_ci	gpiod_dbg(desc, "hogged as %s%s\n",
433662306a36Sopenharmony_ci		(dflags & GPIOD_FLAGS_BIT_DIR_OUT) ? "output" : "input",
433762306a36Sopenharmony_ci		(dflags & GPIOD_FLAGS_BIT_DIR_OUT) ?
433862306a36Sopenharmony_ci		  (dflags & GPIOD_FLAGS_BIT_DIR_VAL) ? "/high" : "/low" : "");
433962306a36Sopenharmony_ci
434062306a36Sopenharmony_ci	return 0;
434162306a36Sopenharmony_ci}
434262306a36Sopenharmony_ci
434362306a36Sopenharmony_ci/**
434462306a36Sopenharmony_ci * gpiochip_free_hogs - Scan gpio-controller chip and release GPIO hog
434562306a36Sopenharmony_ci * @gc:	gpio chip to act on
434662306a36Sopenharmony_ci */
434762306a36Sopenharmony_cistatic void gpiochip_free_hogs(struct gpio_chip *gc)
434862306a36Sopenharmony_ci{
434962306a36Sopenharmony_ci	struct gpio_desc *desc;
435062306a36Sopenharmony_ci
435162306a36Sopenharmony_ci	for_each_gpio_desc_with_flag(gc, desc, FLAG_IS_HOGGED)
435262306a36Sopenharmony_ci		gpiochip_free_own_desc(desc);
435362306a36Sopenharmony_ci}
435462306a36Sopenharmony_ci
435562306a36Sopenharmony_ci/**
435662306a36Sopenharmony_ci * gpiod_get_array - obtain multiple GPIOs from a multi-index GPIO function
435762306a36Sopenharmony_ci * @dev:	GPIO consumer, can be NULL for system-global GPIOs
435862306a36Sopenharmony_ci * @con_id:	function within the GPIO consumer
435962306a36Sopenharmony_ci * @flags:	optional GPIO initialization flags
436062306a36Sopenharmony_ci *
436162306a36Sopenharmony_ci * This function acquires all the GPIOs defined under a given function.
436262306a36Sopenharmony_ci *
436362306a36Sopenharmony_ci * Return a struct gpio_descs containing an array of descriptors, -ENOENT if
436462306a36Sopenharmony_ci * no GPIO has been assigned to the requested function, or another IS_ERR()
436562306a36Sopenharmony_ci * code if an error occurred while trying to acquire the GPIOs.
436662306a36Sopenharmony_ci */
436762306a36Sopenharmony_cistruct gpio_descs *__must_check gpiod_get_array(struct device *dev,
436862306a36Sopenharmony_ci						const char *con_id,
436962306a36Sopenharmony_ci						enum gpiod_flags flags)
437062306a36Sopenharmony_ci{
437162306a36Sopenharmony_ci	struct gpio_desc *desc;
437262306a36Sopenharmony_ci	struct gpio_descs *descs;
437362306a36Sopenharmony_ci	struct gpio_array *array_info = NULL;
437462306a36Sopenharmony_ci	struct gpio_chip *gc;
437562306a36Sopenharmony_ci	int count, bitmap_size;
437662306a36Sopenharmony_ci	size_t descs_size;
437762306a36Sopenharmony_ci
437862306a36Sopenharmony_ci	count = gpiod_count(dev, con_id);
437962306a36Sopenharmony_ci	if (count < 0)
438062306a36Sopenharmony_ci		return ERR_PTR(count);
438162306a36Sopenharmony_ci
438262306a36Sopenharmony_ci	descs_size = struct_size(descs, desc, count);
438362306a36Sopenharmony_ci	descs = kzalloc(descs_size, GFP_KERNEL);
438462306a36Sopenharmony_ci	if (!descs)
438562306a36Sopenharmony_ci		return ERR_PTR(-ENOMEM);
438662306a36Sopenharmony_ci
438762306a36Sopenharmony_ci	for (descs->ndescs = 0; descs->ndescs < count; descs->ndescs++) {
438862306a36Sopenharmony_ci		desc = gpiod_get_index(dev, con_id, descs->ndescs, flags);
438962306a36Sopenharmony_ci		if (IS_ERR(desc)) {
439062306a36Sopenharmony_ci			gpiod_put_array(descs);
439162306a36Sopenharmony_ci			return ERR_CAST(desc);
439262306a36Sopenharmony_ci		}
439362306a36Sopenharmony_ci
439462306a36Sopenharmony_ci		descs->desc[descs->ndescs] = desc;
439562306a36Sopenharmony_ci
439662306a36Sopenharmony_ci		gc = gpiod_to_chip(desc);
439762306a36Sopenharmony_ci		/*
439862306a36Sopenharmony_ci		 * If pin hardware number of array member 0 is also 0, select
439962306a36Sopenharmony_ci		 * its chip as a candidate for fast bitmap processing path.
440062306a36Sopenharmony_ci		 */
440162306a36Sopenharmony_ci		if (descs->ndescs == 0 && gpio_chip_hwgpio(desc) == 0) {
440262306a36Sopenharmony_ci			struct gpio_descs *array;
440362306a36Sopenharmony_ci
440462306a36Sopenharmony_ci			bitmap_size = BITS_TO_LONGS(gc->ngpio > count ?
440562306a36Sopenharmony_ci						    gc->ngpio : count);
440662306a36Sopenharmony_ci
440762306a36Sopenharmony_ci			array = krealloc(descs, descs_size +
440862306a36Sopenharmony_ci					 struct_size(array_info, invert_mask, 3 * bitmap_size),
440962306a36Sopenharmony_ci					 GFP_KERNEL | __GFP_ZERO);
441062306a36Sopenharmony_ci			if (!array) {
441162306a36Sopenharmony_ci				gpiod_put_array(descs);
441262306a36Sopenharmony_ci				return ERR_PTR(-ENOMEM);
441362306a36Sopenharmony_ci			}
441462306a36Sopenharmony_ci
441562306a36Sopenharmony_ci			descs = array;
441662306a36Sopenharmony_ci
441762306a36Sopenharmony_ci			array_info = (void *)descs + descs_size;
441862306a36Sopenharmony_ci			array_info->get_mask = array_info->invert_mask +
441962306a36Sopenharmony_ci						  bitmap_size;
442062306a36Sopenharmony_ci			array_info->set_mask = array_info->get_mask +
442162306a36Sopenharmony_ci						  bitmap_size;
442262306a36Sopenharmony_ci
442362306a36Sopenharmony_ci			array_info->desc = descs->desc;
442462306a36Sopenharmony_ci			array_info->size = count;
442562306a36Sopenharmony_ci			array_info->chip = gc;
442662306a36Sopenharmony_ci			bitmap_set(array_info->get_mask, descs->ndescs,
442762306a36Sopenharmony_ci				   count - descs->ndescs);
442862306a36Sopenharmony_ci			bitmap_set(array_info->set_mask, descs->ndescs,
442962306a36Sopenharmony_ci				   count - descs->ndescs);
443062306a36Sopenharmony_ci			descs->info = array_info;
443162306a36Sopenharmony_ci		}
443262306a36Sopenharmony_ci
443362306a36Sopenharmony_ci		/* If there is no cache for fast bitmap processing path, continue */
443462306a36Sopenharmony_ci		if (!array_info)
443562306a36Sopenharmony_ci			continue;
443662306a36Sopenharmony_ci
443762306a36Sopenharmony_ci		/* Unmark array members which don't belong to the 'fast' chip */
443862306a36Sopenharmony_ci		if (array_info->chip != gc) {
443962306a36Sopenharmony_ci			__clear_bit(descs->ndescs, array_info->get_mask);
444062306a36Sopenharmony_ci			__clear_bit(descs->ndescs, array_info->set_mask);
444162306a36Sopenharmony_ci		}
444262306a36Sopenharmony_ci		/*
444362306a36Sopenharmony_ci		 * Detect array members which belong to the 'fast' chip
444462306a36Sopenharmony_ci		 * but their pins are not in hardware order.
444562306a36Sopenharmony_ci		 */
444662306a36Sopenharmony_ci		else if (gpio_chip_hwgpio(desc) != descs->ndescs) {
444762306a36Sopenharmony_ci			/*
444862306a36Sopenharmony_ci			 * Don't use fast path if all array members processed so
444962306a36Sopenharmony_ci			 * far belong to the same chip as this one but its pin
445062306a36Sopenharmony_ci			 * hardware number is different from its array index.
445162306a36Sopenharmony_ci			 */
445262306a36Sopenharmony_ci			if (bitmap_full(array_info->get_mask, descs->ndescs)) {
445362306a36Sopenharmony_ci				array_info = NULL;
445462306a36Sopenharmony_ci			} else {
445562306a36Sopenharmony_ci				__clear_bit(descs->ndescs,
445662306a36Sopenharmony_ci					    array_info->get_mask);
445762306a36Sopenharmony_ci				__clear_bit(descs->ndescs,
445862306a36Sopenharmony_ci					    array_info->set_mask);
445962306a36Sopenharmony_ci			}
446062306a36Sopenharmony_ci		} else {
446162306a36Sopenharmony_ci			/* Exclude open drain or open source from fast output */
446262306a36Sopenharmony_ci			if (gpiochip_line_is_open_drain(gc, descs->ndescs) ||
446362306a36Sopenharmony_ci			    gpiochip_line_is_open_source(gc, descs->ndescs))
446462306a36Sopenharmony_ci				__clear_bit(descs->ndescs,
446562306a36Sopenharmony_ci					    array_info->set_mask);
446662306a36Sopenharmony_ci			/* Identify 'fast' pins which require invertion */
446762306a36Sopenharmony_ci			if (gpiod_is_active_low(desc))
446862306a36Sopenharmony_ci				__set_bit(descs->ndescs,
446962306a36Sopenharmony_ci					  array_info->invert_mask);
447062306a36Sopenharmony_ci		}
447162306a36Sopenharmony_ci	}
447262306a36Sopenharmony_ci	if (array_info)
447362306a36Sopenharmony_ci		dev_dbg(dev,
447462306a36Sopenharmony_ci			"GPIO array info: chip=%s, size=%d, get_mask=%lx, set_mask=%lx, invert_mask=%lx\n",
447562306a36Sopenharmony_ci			array_info->chip->label, array_info->size,
447662306a36Sopenharmony_ci			*array_info->get_mask, *array_info->set_mask,
447762306a36Sopenharmony_ci			*array_info->invert_mask);
447862306a36Sopenharmony_ci	return descs;
447962306a36Sopenharmony_ci}
448062306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiod_get_array);
448162306a36Sopenharmony_ci
448262306a36Sopenharmony_ci/**
448362306a36Sopenharmony_ci * gpiod_get_array_optional - obtain multiple GPIOs from a multi-index GPIO
448462306a36Sopenharmony_ci *                            function
448562306a36Sopenharmony_ci * @dev:	GPIO consumer, can be NULL for system-global GPIOs
448662306a36Sopenharmony_ci * @con_id:	function within the GPIO consumer
448762306a36Sopenharmony_ci * @flags:	optional GPIO initialization flags
448862306a36Sopenharmony_ci *
448962306a36Sopenharmony_ci * This is equivalent to gpiod_get_array(), except that when no GPIO was
449062306a36Sopenharmony_ci * assigned to the requested function it will return NULL.
449162306a36Sopenharmony_ci */
449262306a36Sopenharmony_cistruct gpio_descs *__must_check gpiod_get_array_optional(struct device *dev,
449362306a36Sopenharmony_ci							const char *con_id,
449462306a36Sopenharmony_ci							enum gpiod_flags flags)
449562306a36Sopenharmony_ci{
449662306a36Sopenharmony_ci	struct gpio_descs *descs;
449762306a36Sopenharmony_ci
449862306a36Sopenharmony_ci	descs = gpiod_get_array(dev, con_id, flags);
449962306a36Sopenharmony_ci	if (gpiod_not_found(descs))
450062306a36Sopenharmony_ci		return NULL;
450162306a36Sopenharmony_ci
450262306a36Sopenharmony_ci	return descs;
450362306a36Sopenharmony_ci}
450462306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiod_get_array_optional);
450562306a36Sopenharmony_ci
450662306a36Sopenharmony_ci/**
450762306a36Sopenharmony_ci * gpiod_put - dispose of a GPIO descriptor
450862306a36Sopenharmony_ci * @desc:	GPIO descriptor to dispose of
450962306a36Sopenharmony_ci *
451062306a36Sopenharmony_ci * No descriptor can be used after gpiod_put() has been called on it.
451162306a36Sopenharmony_ci */
451262306a36Sopenharmony_civoid gpiod_put(struct gpio_desc *desc)
451362306a36Sopenharmony_ci{
451462306a36Sopenharmony_ci	if (desc)
451562306a36Sopenharmony_ci		gpiod_free(desc);
451662306a36Sopenharmony_ci}
451762306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiod_put);
451862306a36Sopenharmony_ci
451962306a36Sopenharmony_ci/**
452062306a36Sopenharmony_ci * gpiod_put_array - dispose of multiple GPIO descriptors
452162306a36Sopenharmony_ci * @descs:	struct gpio_descs containing an array of descriptors
452262306a36Sopenharmony_ci */
452362306a36Sopenharmony_civoid gpiod_put_array(struct gpio_descs *descs)
452462306a36Sopenharmony_ci{
452562306a36Sopenharmony_ci	unsigned int i;
452662306a36Sopenharmony_ci
452762306a36Sopenharmony_ci	for (i = 0; i < descs->ndescs; i++)
452862306a36Sopenharmony_ci		gpiod_put(descs->desc[i]);
452962306a36Sopenharmony_ci
453062306a36Sopenharmony_ci	kfree(descs);
453162306a36Sopenharmony_ci}
453262306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(gpiod_put_array);
453362306a36Sopenharmony_ci
453462306a36Sopenharmony_cistatic int gpio_stub_drv_probe(struct device *dev)
453562306a36Sopenharmony_ci{
453662306a36Sopenharmony_ci	/*
453762306a36Sopenharmony_ci	 * The DT node of some GPIO chips have a "compatible" property, but
453862306a36Sopenharmony_ci	 * never have a struct device added and probed by a driver to register
453962306a36Sopenharmony_ci	 * the GPIO chip with gpiolib. In such cases, fw_devlink=on will cause
454062306a36Sopenharmony_ci	 * the consumers of the GPIO chip to get probe deferred forever because
454162306a36Sopenharmony_ci	 * they will be waiting for a device associated with the GPIO chip
454262306a36Sopenharmony_ci	 * firmware node to get added and bound to a driver.
454362306a36Sopenharmony_ci	 *
454462306a36Sopenharmony_ci	 * To allow these consumers to probe, we associate the struct
454562306a36Sopenharmony_ci	 * gpio_device of the GPIO chip with the firmware node and then simply
454662306a36Sopenharmony_ci	 * bind it to this stub driver.
454762306a36Sopenharmony_ci	 */
454862306a36Sopenharmony_ci	return 0;
454962306a36Sopenharmony_ci}
455062306a36Sopenharmony_ci
455162306a36Sopenharmony_cistatic struct device_driver gpio_stub_drv = {
455262306a36Sopenharmony_ci	.name = "gpio_stub_drv",
455362306a36Sopenharmony_ci	.bus = &gpio_bus_type,
455462306a36Sopenharmony_ci	.probe = gpio_stub_drv_probe,
455562306a36Sopenharmony_ci};
455662306a36Sopenharmony_ci
455762306a36Sopenharmony_cistatic int __init gpiolib_dev_init(void)
455862306a36Sopenharmony_ci{
455962306a36Sopenharmony_ci	int ret;
456062306a36Sopenharmony_ci
456162306a36Sopenharmony_ci	/* Register GPIO sysfs bus */
456262306a36Sopenharmony_ci	ret = bus_register(&gpio_bus_type);
456362306a36Sopenharmony_ci	if (ret < 0) {
456462306a36Sopenharmony_ci		pr_err("gpiolib: could not register GPIO bus type\n");
456562306a36Sopenharmony_ci		return ret;
456662306a36Sopenharmony_ci	}
456762306a36Sopenharmony_ci
456862306a36Sopenharmony_ci	ret = driver_register(&gpio_stub_drv);
456962306a36Sopenharmony_ci	if (ret < 0) {
457062306a36Sopenharmony_ci		pr_err("gpiolib: could not register GPIO stub driver\n");
457162306a36Sopenharmony_ci		bus_unregister(&gpio_bus_type);
457262306a36Sopenharmony_ci		return ret;
457362306a36Sopenharmony_ci	}
457462306a36Sopenharmony_ci
457562306a36Sopenharmony_ci	ret = alloc_chrdev_region(&gpio_devt, 0, GPIO_DEV_MAX, GPIOCHIP_NAME);
457662306a36Sopenharmony_ci	if (ret < 0) {
457762306a36Sopenharmony_ci		pr_err("gpiolib: failed to allocate char dev region\n");
457862306a36Sopenharmony_ci		driver_unregister(&gpio_stub_drv);
457962306a36Sopenharmony_ci		bus_unregister(&gpio_bus_type);
458062306a36Sopenharmony_ci		return ret;
458162306a36Sopenharmony_ci	}
458262306a36Sopenharmony_ci
458362306a36Sopenharmony_ci	gpiolib_initialized = true;
458462306a36Sopenharmony_ci	gpiochip_setup_devs();
458562306a36Sopenharmony_ci
458662306a36Sopenharmony_ci#if IS_ENABLED(CONFIG_OF_DYNAMIC) && IS_ENABLED(CONFIG_OF_GPIO)
458762306a36Sopenharmony_ci	WARN_ON(of_reconfig_notifier_register(&gpio_of_notifier));
458862306a36Sopenharmony_ci#endif /* CONFIG_OF_DYNAMIC && CONFIG_OF_GPIO */
458962306a36Sopenharmony_ci
459062306a36Sopenharmony_ci	return ret;
459162306a36Sopenharmony_ci}
459262306a36Sopenharmony_cicore_initcall(gpiolib_dev_init);
459362306a36Sopenharmony_ci
459462306a36Sopenharmony_ci#ifdef CONFIG_DEBUG_FS
459562306a36Sopenharmony_ci
459662306a36Sopenharmony_cistatic void gpiolib_dbg_show(struct seq_file *s, struct gpio_device *gdev)
459762306a36Sopenharmony_ci{
459862306a36Sopenharmony_ci	struct gpio_chip	*gc = gdev->chip;
459962306a36Sopenharmony_ci	struct gpio_desc	*desc;
460062306a36Sopenharmony_ci	unsigned		gpio = gdev->base;
460162306a36Sopenharmony_ci	int			value;
460262306a36Sopenharmony_ci	bool			is_out;
460362306a36Sopenharmony_ci	bool			is_irq;
460462306a36Sopenharmony_ci	bool			active_low;
460562306a36Sopenharmony_ci
460662306a36Sopenharmony_ci	for_each_gpio_desc(gc, desc) {
460762306a36Sopenharmony_ci		if (test_bit(FLAG_REQUESTED, &desc->flags)) {
460862306a36Sopenharmony_ci			gpiod_get_direction(desc);
460962306a36Sopenharmony_ci			is_out = test_bit(FLAG_IS_OUT, &desc->flags);
461062306a36Sopenharmony_ci			value = gpio_chip_get_value(gc, desc);
461162306a36Sopenharmony_ci			is_irq = test_bit(FLAG_USED_AS_IRQ, &desc->flags);
461262306a36Sopenharmony_ci			active_low = test_bit(FLAG_ACTIVE_LOW, &desc->flags);
461362306a36Sopenharmony_ci			seq_printf(s, " gpio-%-3d (%-20.20s|%-20.20s) %s %s %s%s\n",
461462306a36Sopenharmony_ci				   gpio, desc->name ?: "", desc->label,
461562306a36Sopenharmony_ci				   is_out ? "out" : "in ",
461662306a36Sopenharmony_ci				   value >= 0 ? (value ? "hi" : "lo") : "?  ",
461762306a36Sopenharmony_ci				   is_irq ? "IRQ " : "",
461862306a36Sopenharmony_ci				   active_low ? "ACTIVE LOW" : "");
461962306a36Sopenharmony_ci		} else if (desc->name) {
462062306a36Sopenharmony_ci			seq_printf(s, " gpio-%-3d (%-20.20s)\n", gpio, desc->name);
462162306a36Sopenharmony_ci		}
462262306a36Sopenharmony_ci
462362306a36Sopenharmony_ci		gpio++;
462462306a36Sopenharmony_ci	}
462562306a36Sopenharmony_ci}
462662306a36Sopenharmony_ci
462762306a36Sopenharmony_cistatic void *gpiolib_seq_start(struct seq_file *s, loff_t *pos)
462862306a36Sopenharmony_ci{
462962306a36Sopenharmony_ci	unsigned long flags;
463062306a36Sopenharmony_ci	struct gpio_device *gdev = NULL;
463162306a36Sopenharmony_ci	loff_t index = *pos;
463262306a36Sopenharmony_ci
463362306a36Sopenharmony_ci	s->private = "";
463462306a36Sopenharmony_ci
463562306a36Sopenharmony_ci	spin_lock_irqsave(&gpio_lock, flags);
463662306a36Sopenharmony_ci	list_for_each_entry(gdev, &gpio_devices, list)
463762306a36Sopenharmony_ci		if (index-- == 0) {
463862306a36Sopenharmony_ci			spin_unlock_irqrestore(&gpio_lock, flags);
463962306a36Sopenharmony_ci			return gdev;
464062306a36Sopenharmony_ci		}
464162306a36Sopenharmony_ci	spin_unlock_irqrestore(&gpio_lock, flags);
464262306a36Sopenharmony_ci
464362306a36Sopenharmony_ci	return NULL;
464462306a36Sopenharmony_ci}
464562306a36Sopenharmony_ci
464662306a36Sopenharmony_cistatic void *gpiolib_seq_next(struct seq_file *s, void *v, loff_t *pos)
464762306a36Sopenharmony_ci{
464862306a36Sopenharmony_ci	unsigned long flags;
464962306a36Sopenharmony_ci	struct gpio_device *gdev = v;
465062306a36Sopenharmony_ci	void *ret = NULL;
465162306a36Sopenharmony_ci
465262306a36Sopenharmony_ci	spin_lock_irqsave(&gpio_lock, flags);
465362306a36Sopenharmony_ci	if (list_is_last(&gdev->list, &gpio_devices))
465462306a36Sopenharmony_ci		ret = NULL;
465562306a36Sopenharmony_ci	else
465662306a36Sopenharmony_ci		ret = list_first_entry(&gdev->list, struct gpio_device, list);
465762306a36Sopenharmony_ci	spin_unlock_irqrestore(&gpio_lock, flags);
465862306a36Sopenharmony_ci
465962306a36Sopenharmony_ci	s->private = "\n";
466062306a36Sopenharmony_ci	++*pos;
466162306a36Sopenharmony_ci
466262306a36Sopenharmony_ci	return ret;
466362306a36Sopenharmony_ci}
466462306a36Sopenharmony_ci
466562306a36Sopenharmony_cistatic void gpiolib_seq_stop(struct seq_file *s, void *v)
466662306a36Sopenharmony_ci{
466762306a36Sopenharmony_ci}
466862306a36Sopenharmony_ci
466962306a36Sopenharmony_cistatic int gpiolib_seq_show(struct seq_file *s, void *v)
467062306a36Sopenharmony_ci{
467162306a36Sopenharmony_ci	struct gpio_device *gdev = v;
467262306a36Sopenharmony_ci	struct gpio_chip *gc = gdev->chip;
467362306a36Sopenharmony_ci	struct device *parent;
467462306a36Sopenharmony_ci
467562306a36Sopenharmony_ci	if (!gc) {
467662306a36Sopenharmony_ci		seq_printf(s, "%s%s: (dangling chip)", (char *)s->private,
467762306a36Sopenharmony_ci			   dev_name(&gdev->dev));
467862306a36Sopenharmony_ci		return 0;
467962306a36Sopenharmony_ci	}
468062306a36Sopenharmony_ci
468162306a36Sopenharmony_ci	seq_printf(s, "%s%s: GPIOs %d-%d", (char *)s->private,
468262306a36Sopenharmony_ci		   dev_name(&gdev->dev),
468362306a36Sopenharmony_ci		   gdev->base, gdev->base + gdev->ngpio - 1);
468462306a36Sopenharmony_ci	parent = gc->parent;
468562306a36Sopenharmony_ci	if (parent)
468662306a36Sopenharmony_ci		seq_printf(s, ", parent: %s/%s",
468762306a36Sopenharmony_ci			   parent->bus ? parent->bus->name : "no-bus",
468862306a36Sopenharmony_ci			   dev_name(parent));
468962306a36Sopenharmony_ci	if (gc->label)
469062306a36Sopenharmony_ci		seq_printf(s, ", %s", gc->label);
469162306a36Sopenharmony_ci	if (gc->can_sleep)
469262306a36Sopenharmony_ci		seq_printf(s, ", can sleep");
469362306a36Sopenharmony_ci	seq_printf(s, ":\n");
469462306a36Sopenharmony_ci
469562306a36Sopenharmony_ci	if (gc->dbg_show)
469662306a36Sopenharmony_ci		gc->dbg_show(s, gc);
469762306a36Sopenharmony_ci	else
469862306a36Sopenharmony_ci		gpiolib_dbg_show(s, gdev);
469962306a36Sopenharmony_ci
470062306a36Sopenharmony_ci	return 0;
470162306a36Sopenharmony_ci}
470262306a36Sopenharmony_ci
470362306a36Sopenharmony_cistatic const struct seq_operations gpiolib_sops = {
470462306a36Sopenharmony_ci	.start = gpiolib_seq_start,
470562306a36Sopenharmony_ci	.next = gpiolib_seq_next,
470662306a36Sopenharmony_ci	.stop = gpiolib_seq_stop,
470762306a36Sopenharmony_ci	.show = gpiolib_seq_show,
470862306a36Sopenharmony_ci};
470962306a36Sopenharmony_ciDEFINE_SEQ_ATTRIBUTE(gpiolib);
471062306a36Sopenharmony_ci
471162306a36Sopenharmony_cistatic int __init gpiolib_debugfs_init(void)
471262306a36Sopenharmony_ci{
471362306a36Sopenharmony_ci	/* /sys/kernel/debug/gpio */
471462306a36Sopenharmony_ci	debugfs_create_file("gpio", 0444, NULL, NULL, &gpiolib_fops);
471562306a36Sopenharmony_ci	return 0;
471662306a36Sopenharmony_ci}
471762306a36Sopenharmony_cisubsys_initcall(gpiolib_debugfs_init);
471862306a36Sopenharmony_ci
471962306a36Sopenharmony_ci#endif	/* DEBUG_FS */
4720