diff options
Diffstat (limited to 'drivers/gpio/gpiolib.c')
| -rw-r--r-- | drivers/gpio/gpiolib.c | 1393 | 
1 files changed, 1097 insertions, 296 deletions
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index 86ef3461ec0..2ebc9071e35 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c @@ -12,20 +12,19 @@  #include <linux/of_gpio.h>  #include <linux/idr.h>  #include <linux/slab.h> +#include <linux/acpi.h> +#include <linux/gpio/driver.h> + +#include "gpiolib.h"  #define CREATE_TRACE_POINTS  #include <trace/events/gpio.h> -/* Optional implementation infrastructure for GPIO interfaces. - * - * Platforms may want to use this if they tend to use very many GPIOs - * that aren't part of a System-On-Chip core; or across I2C/SPI/etc. +/* Implementation infrastructure for GPIO interfaces.   * - * When kernel footprint or instruction count is an issue, simpler - * implementations may be preferred.  The GPIO programming interface - * allows for inlining speed-critical get/set operations for common - * cases, so that access to SOC-integrated GPIOs can sometimes cost - * only an instruction or two per bit. + * The GPIO programming interface allows for inlining speed-critical + * get/set operations for common cases, so that access to SOC-integrated + * GPIOs can sometimes cost only an instruction or two per bit.   */ @@ -57,9 +56,10 @@ struct gpio_desc {  #define FLAG_SYSFS	3	/* exported via /sys/class/gpio/control */  #define FLAG_TRIG_FALL	4	/* trigger on falling edge */  #define FLAG_TRIG_RISE	5	/* trigger on rising edge */ -#define FLAG_ACTIVE_LOW	6	/* sysfs value has active low */ +#define FLAG_ACTIVE_LOW	6	/* value has active low */  #define FLAG_OPEN_DRAIN	7	/* Gpio is open drain type */  #define FLAG_OPEN_SOURCE 8	/* Gpio is open source type */ +#define FLAG_USED_AS_IRQ 9	/* GPIO is connected to an IRQ */  #define ID_SHIFT	16	/* add new flags before this one */ @@ -74,34 +74,67 @@ static struct gpio_desc gpio_desc[ARCH_NR_GPIOS];  #define GPIO_OFFSET_VALID(chip, offset) (offset >= 0 && offset < chip->ngpio) +static DEFINE_MUTEX(gpio_lookup_lock); +static LIST_HEAD(gpio_lookup_list);  static LIST_HEAD(gpio_chips);  #ifdef CONFIG_GPIO_SYSFS  static DEFINE_IDR(dirent_idr);  #endif -/* - * Internal gpiod_* API using descriptors instead of the integer namespace. - * Most of this should eventually go public. - */  static int gpiod_request(struct gpio_desc *desc, const char *label);  static void gpiod_free(struct gpio_desc *desc); -static int gpiod_direction_input(struct gpio_desc *desc); -static int gpiod_direction_output(struct gpio_desc *desc, int value); -static int gpiod_get_direction(const struct gpio_desc *desc); -static int gpiod_set_debounce(struct gpio_desc *desc, unsigned debounce); -static int gpiod_get_value_cansleep(const struct gpio_desc *desc); -static void gpiod_set_value_cansleep(struct gpio_desc *desc, int value); -static int gpiod_get_value(const struct gpio_desc *desc); -static void gpiod_set_value(struct gpio_desc *desc, int value); -static int gpiod_cansleep(const struct gpio_desc *desc); -static int gpiod_to_irq(const struct gpio_desc *desc); -static int gpiod_export(struct gpio_desc *desc, bool direction_may_change); -static int gpiod_export_link(struct device *dev, const char *name, -			     struct gpio_desc *desc); -static int gpiod_sysfs_set_active_low(struct gpio_desc *desc, int value); -static void gpiod_unexport(struct gpio_desc *desc); +/* With descriptor prefix */ + +#ifdef CONFIG_DEBUG_FS +#define gpiod_emerg(desc, fmt, ...)					       \ +	pr_emerg("gpio-%d (%s): " fmt, desc_to_gpio(desc), desc->label ? : "?",\ +                 ##__VA_ARGS__) +#define gpiod_crit(desc, fmt, ...)					       \ +	pr_crit("gpio-%d (%s): " fmt, desc_to_gpio(desc), desc->label ? : "?", \ +                 ##__VA_ARGS__) +#define gpiod_err(desc, fmt, ...)					       \ +	pr_err("gpio-%d (%s): " fmt, desc_to_gpio(desc), desc->label ? : "?",  \ +                 ##__VA_ARGS__) +#define gpiod_warn(desc, fmt, ...)					       \ +	pr_warn("gpio-%d (%s): " fmt, desc_to_gpio(desc), desc->label ? : "?", \ +                 ##__VA_ARGS__) +#define gpiod_info(desc, fmt, ...)					       \ +	pr_info("gpio-%d (%s): " fmt, desc_to_gpio(desc), desc->label ? : "?", \ +                ##__VA_ARGS__) +#define gpiod_dbg(desc, fmt, ...)					       \ +	pr_debug("gpio-%d (%s): " fmt, desc_to_gpio(desc), desc->label ? : "?",\ +                 ##__VA_ARGS__) +#else +#define gpiod_emerg(desc, fmt, ...)					\ +	pr_emerg("gpio-%d: " fmt, desc_to_gpio(desc), ##__VA_ARGS__) +#define gpiod_crit(desc, fmt, ...)					\ +	pr_crit("gpio-%d: " fmt, desc_to_gpio(desc), ##__VA_ARGS__) +#define gpiod_err(desc, fmt, ...)					\ +	pr_err("gpio-%d: " fmt, desc_to_gpio(desc), ##__VA_ARGS__) +#define gpiod_warn(desc, fmt, ...)					\ +	pr_warn("gpio-%d: " fmt, desc_to_gpio(desc), ##__VA_ARGS__) +#define gpiod_info(desc, fmt, ...)					\ +	pr_info("gpio-%d: " fmt, desc_to_gpio(desc), ##__VA_ARGS__) +#define gpiod_dbg(desc, fmt, ...)					\ +	pr_debug("gpio-%d: " fmt, desc_to_gpio(desc), ##__VA_ARGS__) +#endif + +/* With chip prefix */ + +#define chip_emerg(chip, fmt, ...)					\ +	pr_emerg("GPIO chip %s: " fmt, chip->label, ##__VA_ARGS__) +#define chip_crit(chip, fmt, ...)					\ +	pr_crit("GPIO chip %s: " fmt, chip->label, ##__VA_ARGS__) +#define chip_err(chip, fmt, ...)					\ +	pr_err("GPIO chip %s: " fmt, chip->label, ##__VA_ARGS__) +#define chip_warn(chip, fmt, ...)					\ +	pr_warn("GPIO chip %s: " fmt, chip->label, ##__VA_ARGS__) +#define chip_info(chip, fmt, ...)					\ +	pr_info("GPIO chip %s: " fmt, chip->label, ##__VA_ARGS__) +#define chip_dbg(chip, fmt, ...)					\ +	pr_debug("GPIO chip %s: " fmt, chip->label, ##__VA_ARGS__)  static inline void desc_set_label(struct gpio_desc *d, const char *label)  { @@ -121,23 +154,38 @@ static int gpio_chip_hwgpio(const struct gpio_desc *desc)  /**   * Convert a GPIO number to its descriptor   */ -static struct gpio_desc *gpio_to_desc(unsigned gpio) +struct gpio_desc *gpio_to_desc(unsigned gpio)  {  	if (WARN(!gpio_is_valid(gpio), "invalid GPIO %d\n", gpio))  		return NULL;  	else  		return &gpio_desc[gpio];  } +EXPORT_SYMBOL_GPL(gpio_to_desc); + +/** + * Get the GPIO descriptor corresponding to the given hw number for this chip. + */ +struct gpio_desc *gpiochip_get_desc(struct gpio_chip *chip, +				    u16 hwnum) +{ +	if (hwnum >= chip->ngpio) +		return ERR_PTR(-EINVAL); + +	return &chip->desc[hwnum]; +} +EXPORT_SYMBOL_GPL(gpiochip_get_desc);  /**   * Convert a GPIO descriptor to the integer namespace.   * This should disappear in the future but is needed since we still   * use GPIO numbers for error messages and sysfs nodes   */ -static int desc_to_gpio(const struct gpio_desc *desc) +int desc_to_gpio(const struct gpio_desc *desc)  { -	return desc->chip->base + gpio_chip_hwgpio(desc); +	return desc - &gpio_desc[0];  } +EXPORT_SYMBOL_GPL(desc_to_gpio);  /* Warn when drivers omit gpio_request() calls -- legal but ill-advised @@ -159,7 +207,8 @@ static int gpio_ensure_requested(struct gpio_desc *desc)  	if (WARN(test_and_set_bit(FLAG_REQUESTED, &desc->flags) == 0,  			"autorequest GPIO-%d\n", gpio)) {  		if (!try_module_get(chip->owner)) { -			pr_err("GPIO-%d: module can't be gotten \n", gpio); +			gpiod_err(desc, "%s: module can't be gotten\n", +					__func__);  			clear_bit(FLAG_REQUESTED, &desc->flags);  			/* lose */  			return -EIO; @@ -172,16 +221,15 @@ static int gpio_ensure_requested(struct gpio_desc *desc)  	return 0;  } -static struct gpio_chip *gpiod_to_chip(const struct gpio_desc *desc) +/** + * gpiod_to_chip - Return the GPIO chip to which a GPIO descriptor belongs + * @desc:	descriptor to return the chip of + */ +struct gpio_chip *gpiod_to_chip(const struct gpio_desc *desc)  {  	return desc ? desc->chip : NULL;  } - -/* caller holds gpio_lock *OR* gpio is marked as requested */ -struct gpio_chip *gpio_to_chip(unsigned gpio) -{ -	return gpiod_to_chip(gpio_to_desc(gpio)); -} +EXPORT_SYMBOL_GPL(gpiod_to_chip);  /* dynamic allocation of GPIOs, e.g. on a hotplugged device */  static int gpiochip_find_base(int ngpio) @@ -207,8 +255,15 @@ static int gpiochip_find_base(int ngpio)  	}  } -/* caller ensures gpio is valid and requested, chip->get_direction may sleep  */ -static int gpiod_get_direction(const struct gpio_desc *desc) +/** + * gpiod_get_direction - return the current direction of a GPIO + * @desc:	GPIO to get the direction of + * + * Return GPIOF_DIR_IN or GPIOF_DIR_OUT, or an error code in case of error. + * + * This function may sleep if gpiod_cansleep() is true. + */ +int gpiod_get_direction(const struct gpio_desc *desc)  {  	struct gpio_chip	*chip;  	unsigned		offset; @@ -234,6 +289,7 @@ static int gpiod_get_direction(const struct gpio_desc *desc)  	}  	return status;  } +EXPORT_SYMBOL_GPL(gpiod_get_direction);  #ifdef CONFIG_GPIO_SYSFS @@ -295,9 +351,9 @@ static ssize_t gpio_direction_store(struct device *dev,  	if (!test_bit(FLAG_EXPORT, &desc->flags))  		status = -EIO;  	else if (sysfs_streq(buf, "high")) -		status = gpiod_direction_output(desc, 1); +		status = gpiod_direction_output_raw(desc, 1);  	else if (sysfs_streq(buf, "out") || sysfs_streq(buf, "low")) -		status = gpiod_direction_output(desc, 0); +		status = gpiod_direction_output_raw(desc, 0);  	else if (sysfs_streq(buf, "in"))  		status = gpiod_direction_input(desc);  	else @@ -318,17 +374,10 @@ static ssize_t gpio_value_show(struct device *dev,  	mutex_lock(&sysfs_lock); -	if (!test_bit(FLAG_EXPORT, &desc->flags)) { +	if (!test_bit(FLAG_EXPORT, &desc->flags))  		status = -EIO; -	} else { -		int value; - -		value = !!gpiod_get_value_cansleep(desc); -		if (test_bit(FLAG_ACTIVE_LOW, &desc->flags)) -			value = !value; - -		status = sprintf(buf, "%d\n", value); -	} +	else +		status = sprintf(buf, "%d\n", gpiod_get_value_cansleep(desc));  	mutex_unlock(&sysfs_lock);  	return status; @@ -351,9 +400,7 @@ static ssize_t gpio_value_store(struct device *dev,  		status = kstrtol(buf, 0, &value);  		if (status == 0) { -			if (test_bit(FLAG_ACTIVE_LOW, &desc->flags)) -				value = !value; -			gpiod_set_value_cansleep(desc, value != 0); +			gpiod_set_value_cansleep(desc, value);  			status = size;  		}  	} @@ -367,7 +414,7 @@ static const DEVICE_ATTR(value, 0644,  static irqreturn_t gpio_sysfs_irq(int irq, void *priv)  { -	struct sysfs_dirent	*value_sd = priv; +	struct kernfs_node	*value_sd = priv;  	sysfs_notify_dirent(value_sd);  	return IRQ_HANDLED; @@ -376,7 +423,7 @@ static irqreturn_t gpio_sysfs_irq(int irq, void *priv)  static int gpio_setup_irq(struct gpio_desc *desc, struct device *dev,  		unsigned long gpio_flags)  { -	struct sysfs_dirent	*value_sd; +	struct kernfs_node	*value_sd;  	unsigned long		irq_flags;  	int			ret, irq, id; @@ -395,6 +442,7 @@ static int gpio_setup_irq(struct gpio_desc *desc, struct device *dev,  	desc->flags &= ~GPIO_TRIGGER_MASK;  	if (!gpio_flags) { +		gpiod_unlock_as_irq(desc);  		ret = 0;  		goto free_id;  	} @@ -408,7 +456,7 @@ static int gpio_setup_irq(struct gpio_desc *desc, struct device *dev,  			IRQF_TRIGGER_FALLING : IRQF_TRIGGER_RISING;  	if (!value_sd) { -		value_sd = sysfs_get_dirent(dev->kobj.sd, NULL, "value"); +		value_sd = sysfs_get_dirent(dev->kobj.sd, "value");  		if (!value_sd) {  			ret = -ENODEV;  			goto err_out; @@ -433,6 +481,12 @@ static int gpio_setup_irq(struct gpio_desc *desc, struct device *dev,  	if (ret < 0)  		goto free_id; +	ret = gpiod_lock_as_irq(desc); +	if (ret < 0) { +		gpiod_warn(desc, "failed to flag the GPIO for IRQ\n"); +		goto free_id; +	} +  	desc->flags |= gpio_flags;  	return 0; @@ -736,7 +790,7 @@ static struct class gpio_class = {  /** - * gpio_export - export a GPIO through sysfs + * gpiod_export - export a GPIO through sysfs   * @gpio: gpio to make available, already requested   * @direction_may_change: true if userspace may change gpio direction   * Context: arch_initcall or later @@ -750,7 +804,7 @@ static struct class gpio_class = {   *   * Returns zero on success, else an error.   */ -static int gpiod_export(struct gpio_desc *desc, bool direction_may_change) +int gpiod_export(struct gpio_desc *desc, bool direction_may_change)  {  	unsigned long		flags;  	int			status; @@ -775,8 +829,8 @@ static int gpiod_export(struct gpio_desc *desc, bool direction_may_change)  	if (!test_bit(FLAG_REQUESTED, &desc->flags) ||  	     test_bit(FLAG_EXPORT, &desc->flags)) {  		spin_unlock_irqrestore(&gpio_lock, flags); -		pr_debug("%s: gpio %d unavailable (requested=%d, exported=%d)\n", -				__func__, desc_to_gpio(desc), +		gpiod_dbg(desc, "%s: unavailable (requested=%d, exported=%d)\n", +				__func__,  				test_bit(FLAG_REQUESTED, &desc->flags),  				test_bit(FLAG_EXPORT, &desc->flags));  		status = -EPERM; @@ -824,16 +878,10 @@ fail_unregister_device:  	device_unregister(dev);  fail_unlock:  	mutex_unlock(&sysfs_lock); -	pr_debug("%s: gpio%d status %d\n", __func__, desc_to_gpio(desc), -		 status); +	gpiod_dbg(desc, "%s: status %d\n", __func__, status);  	return status;  } - -int gpio_export(unsigned gpio, bool direction_may_change) -{ -	return gpiod_export(gpio_to_desc(gpio), direction_may_change); -} -EXPORT_SYMBOL_GPL(gpio_export); +EXPORT_SYMBOL_GPL(gpiod_export);  static int match_export(struct device *dev, const void *data)  { @@ -841,7 +889,7 @@ static int match_export(struct device *dev, const void *data)  }  /** - * gpio_export_link - create a sysfs link to an exported GPIO node + * gpiod_export_link - create a sysfs link to an exported GPIO node   * @dev: device under which to create symlink   * @name: name of the symlink   * @gpio: gpio to create symlink to, already exported @@ -851,8 +899,8 @@ static int match_export(struct device *dev, const void *data)   *   * Returns zero on success, else an error.   */ -static int gpiod_export_link(struct device *dev, const char *name, -			     struct gpio_desc *desc) +int gpiod_export_link(struct device *dev, const char *name, +		      struct gpio_desc *desc)  {  	int			status = -EINVAL; @@ -878,20 +926,14 @@ static int gpiod_export_link(struct device *dev, const char *name,  	mutex_unlock(&sysfs_lock);  	if (status) -		pr_debug("%s: gpio%d status %d\n", __func__, desc_to_gpio(desc), -			 status); +		gpiod_dbg(desc, "%s: status %d\n", __func__, status);  	return status;  } - -int gpio_export_link(struct device *dev, const char *name, unsigned gpio) -{ -	return gpiod_export_link(dev, name, gpio_to_desc(gpio)); -} -EXPORT_SYMBOL_GPL(gpio_export_link); +EXPORT_SYMBOL_GPL(gpiod_export_link);  /** - * gpio_sysfs_set_active_low - set the polarity of gpio sysfs value + * gpiod_sysfs_set_active_low - set the polarity of gpio sysfs value   * @gpio: gpio to change   * @value: non-zero to use active low, i.e. inverted values   * @@ -902,7 +944,7 @@ EXPORT_SYMBOL_GPL(gpio_export_link);   *   * Returns zero on success, else an error.   */ -static int gpiod_sysfs_set_active_low(struct gpio_desc *desc, int value) +int gpiod_sysfs_set_active_low(struct gpio_desc *desc, int value)  {  	struct device		*dev = NULL;  	int			status = -EINVAL; @@ -928,25 +970,19 @@ unlock:  	mutex_unlock(&sysfs_lock);  	if (status) -		pr_debug("%s: gpio%d status %d\n", __func__, desc_to_gpio(desc), -			 status); +		gpiod_dbg(desc, "%s: status %d\n", __func__, status);  	return status;  } - -int gpio_sysfs_set_active_low(unsigned gpio, int value) -{ -	return gpiod_sysfs_set_active_low(gpio_to_desc(gpio), value); -} -EXPORT_SYMBOL_GPL(gpio_sysfs_set_active_low); +EXPORT_SYMBOL_GPL(gpiod_sysfs_set_active_low);  /** - * gpio_unexport - reverse effect of gpio_export() + * gpiod_unexport - reverse effect of gpio_export()   * @gpio: gpio to make unavailable   *   * This is implicit on gpio_free().   */ -static void gpiod_unexport(struct gpio_desc *desc) +void gpiod_unexport(struct gpio_desc *desc)  {  	int			status = 0;  	struct device		*dev = NULL; @@ -976,15 +1012,9 @@ static void gpiod_unexport(struct gpio_desc *desc)  	}  	if (status) -		pr_debug("%s: gpio%d status %d\n", __func__, desc_to_gpio(desc), -			 status); -} - -void gpio_unexport(unsigned gpio) -{ -	gpiod_unexport(gpio_to_desc(gpio)); +		gpiod_dbg(desc, "%s: status %d\n", __func__, status);  } -EXPORT_SYMBOL_GPL(gpio_unexport); +EXPORT_SYMBOL_GPL(gpiod_unexport);  static int gpiochip_export(struct gpio_chip *chip)  { @@ -1021,8 +1051,7 @@ static int gpiochip_export(struct gpio_chip *chip)  			chip->desc[gpio++].chip = NULL;  		spin_unlock_irqrestore(&gpio_lock, flags); -		pr_debug("%s: chip %s status %d\n", __func__, -				chip->label, status); +		chip_dbg(chip, "%s: status %d\n", __func__, status);  	}  	return status; @@ -1038,15 +1067,14 @@ static void gpiochip_unexport(struct gpio_chip *chip)  	if (dev) {  		put_device(dev);  		device_unregister(dev); -		chip->exported = 0; +		chip->exported = false;  		status = 0;  	} else  		status = -ENODEV;  	mutex_unlock(&sysfs_lock);  	if (status) -		pr_debug("%s: chip %s status %d\n", __func__, -				chip->label, status); +		chip_dbg(chip, "%s: status %d\n", __func__, status);  }  static int __init gpiolib_sysfs_init(void) @@ -1091,27 +1119,6 @@ static inline void gpiochip_unexport(struct gpio_chip *chip)  {  } -static inline int gpiod_export(struct gpio_desc *desc, -			       bool direction_may_change) -{ -	return -ENOSYS; -} - -static inline int gpiod_export_link(struct device *dev, const char *name, -				    struct gpio_desc *desc) -{ -	return -ENOSYS; -} - -static inline int gpiod_sysfs_set_active_low(struct gpio_desc *desc, int value) -{ -	return -ENOSYS; -} - -static inline void gpiod_unexport(struct gpio_desc *desc) -{ -} -  #endif /* CONFIG_GPIO_SYSFS */  /* @@ -1221,6 +1228,7 @@ int gpiochip_add(struct gpio_chip *chip)  #endif  	of_gpiochip_add(chip); +	acpi_gpiochip_add(chip);  	if (status)  		goto fail; @@ -1229,7 +1237,7 @@ int gpiochip_add(struct gpio_chip *chip)  	if (status)  		goto fail; -	pr_debug("gpiochip_add: registered GPIOs %d to %d on device: %s\n", +	pr_debug("%s: registered GPIOs %d to %d on device: %s\n", __func__,  		chip->base, chip->base + chip->ngpio - 1,  		chip->label ? : "generic"); @@ -1239,13 +1247,16 @@ unlock:  	spin_unlock_irqrestore(&gpio_lock, flags);  fail:  	/* failures here can mean systems won't boot... */ -	pr_err("gpiochip_add: gpios %d..%d (%s) failed to register\n", +	pr_err("%s: GPIOs %d..%d (%s) failed to register\n", __func__,  		chip->base, chip->base + chip->ngpio - 1,  		chip->label ? : "generic");  	return status;  }  EXPORT_SYMBOL_GPL(gpiochip_add); +/* Forward-declaration */ +static void gpiochip_irqchip_remove(struct gpio_chip *gpiochip); +  /**   * gpiochip_remove() - unregister a gpio_chip   * @chip: the chip to unregister @@ -1258,8 +1269,11 @@ int gpiochip_remove(struct gpio_chip *chip)  	int		status = 0;  	unsigned	id; +	acpi_gpiochip_remove(chip); +  	spin_lock_irqsave(&gpio_lock, flags); +	gpiochip_irqchip_remove(chip);  	gpiochip_remove_pin_ranges(chip);  	of_gpiochip_remove(chip); @@ -1317,9 +1331,302 @@ struct gpio_chip *gpiochip_find(void *data,  }  EXPORT_SYMBOL_GPL(gpiochip_find); +static int gpiochip_match_name(struct gpio_chip *chip, void *data) +{ +	const char *name = data; + +	return !strcmp(chip->label, name); +} + +static struct gpio_chip *find_chip_by_name(const char *name) +{ +	return gpiochip_find((void *)name, gpiochip_match_name); +} + +#ifdef CONFIG_GPIOLIB_IRQCHIP + +/* + * The following is irqchip helper code for gpiochips. + */ + +/** + * gpiochip_add_chained_irqchip() - adds a chained irqchip to a gpiochip + * @gpiochip: the gpiochip to add the irqchip to + * @irqchip: the irqchip to add to the gpiochip + * @parent_irq: the irq number corresponding to the parent IRQ for this + * chained irqchip + * @parent_handler: the parent interrupt handler for the accumulated IRQ + * coming out of the gpiochip + */ +void gpiochip_set_chained_irqchip(struct gpio_chip *gpiochip, +				  struct irq_chip *irqchip, +				  int parent_irq, +				  irq_flow_handler_t parent_handler) +{ +	if (gpiochip->can_sleep) { +		chip_err(gpiochip, "you cannot have chained interrupts on a chip that may sleep\n"); +		return; +	} + +	irq_set_chained_handler(parent_irq, parent_handler); +	/* +	 * The parent irqchip is already using the chip_data for this +	 * irqchip, so our callbacks simply use the handler_data. +	 */ +	irq_set_handler_data(parent_irq, gpiochip); +} +EXPORT_SYMBOL_GPL(gpiochip_set_chained_irqchip); + +/* + * This lock class tells lockdep that GPIO irqs are in a different + * category than their parents, so it won't report false recursion. + */ +static struct lock_class_key gpiochip_irq_lock_class; + +/** + * gpiochip_irq_map() - maps an IRQ into a GPIO irqchip + * @d: the irqdomain used by this irqchip + * @irq: the global irq number used by this GPIO irqchip irq + * @hwirq: the local IRQ/GPIO line offset on this gpiochip + * + * This function will set up the mapping for a certain IRQ line on a + * gpiochip by assigning the gpiochip as chip data, and using the irqchip + * stored inside the gpiochip. + */ +static int gpiochip_irq_map(struct irq_domain *d, unsigned int irq, +			    irq_hw_number_t hwirq) +{ +	struct gpio_chip *chip = d->host_data; + +	irq_set_chip_data(irq, chip); +	irq_set_lockdep_class(irq, &gpiochip_irq_lock_class); +	irq_set_chip_and_handler(irq, chip->irqchip, chip->irq_handler); +	/* Chips that can sleep need nested thread handlers */ +	if (chip->can_sleep) +		irq_set_nested_thread(irq, 1); +#ifdef CONFIG_ARM +	set_irq_flags(irq, IRQF_VALID); +#else +	irq_set_noprobe(irq); +#endif +	/* +	 * No set-up of the hardware will happen if IRQ_TYPE_NONE +	 * is passed as default type. +	 */ +	if (chip->irq_default_type != IRQ_TYPE_NONE) +		irq_set_irq_type(irq, chip->irq_default_type); + +	return 0; +} + +static void gpiochip_irq_unmap(struct irq_domain *d, unsigned int irq) +{ +	struct gpio_chip *chip = d->host_data; + +#ifdef CONFIG_ARM +	set_irq_flags(irq, 0); +#endif +	if (chip->can_sleep) +		irq_set_nested_thread(irq, 0); +	irq_set_chip_and_handler(irq, NULL, NULL); +	irq_set_chip_data(irq, NULL); +} + +static const struct irq_domain_ops gpiochip_domain_ops = { +	.map	= gpiochip_irq_map, +	.unmap	= gpiochip_irq_unmap, +	/* Virtually all GPIO irqchips are twocell:ed */ +	.xlate	= irq_domain_xlate_twocell, +}; + +static int gpiochip_irq_reqres(struct irq_data *d) +{ +	struct gpio_chip *chip = irq_data_get_irq_chip_data(d); + +	if (gpio_lock_as_irq(chip, d->hwirq)) { +		chip_err(chip, +			"unable to lock HW IRQ %lu for IRQ\n", +			d->hwirq); +		return -EINVAL; +	} +	return 0; +} + +static void gpiochip_irq_relres(struct irq_data *d) +{ +	struct gpio_chip *chip = irq_data_get_irq_chip_data(d); + +	gpio_unlock_as_irq(chip, d->hwirq); +} + +static int gpiochip_to_irq(struct gpio_chip *chip, unsigned offset) +{ +	return irq_find_mapping(chip->irqdomain, offset); +} + +/** + * gpiochip_irqchip_remove() - removes an irqchip added to a gpiochip + * @gpiochip: the gpiochip to remove the irqchip from + * + * This is called only from gpiochip_remove() + */ +static void gpiochip_irqchip_remove(struct gpio_chip *gpiochip) +{ +	unsigned int offset; + +	/* Remove all IRQ mappings and delete the domain */ +	if (gpiochip->irqdomain) { +		for (offset = 0; offset < gpiochip->ngpio; offset++) +			irq_dispose_mapping(gpiochip->irq_base + offset); +		irq_domain_remove(gpiochip->irqdomain); +	} + +	if (gpiochip->irqchip) { +		gpiochip->irqchip->irq_request_resources = NULL; +		gpiochip->irqchip->irq_release_resources = NULL; +		gpiochip->irqchip = NULL; +	} +} + +/** + * gpiochip_irqchip_add() - adds an irqchip to a gpiochip + * @gpiochip: the gpiochip to add the irqchip to + * @irqchip: the irqchip to add to the gpiochip + * @first_irq: if not dynamically assigned, the base (first) IRQ to + * allocate gpiochip irqs from + * @handler: the irq handler to use (often a predefined irq core function) + * @type: the default type for IRQs on this irqchip, pass IRQ_TYPE_NONE + * to have the core avoid setting up any default type in the hardware. + * + * This function closely associates a certain irqchip with a certain + * gpiochip, providing an irq domain to translate the local IRQs to + * global irqs in the gpiolib core, and making sure that the gpiochip + * is passed as chip data to all related functions. Driver callbacks + * need to use container_of() to get their local state containers back + * from the gpiochip passed as chip data. An irqdomain will be stored + * in the gpiochip that shall be used by the driver to handle IRQ number + * translation. The gpiochip will need to be initialized and registered + * before calling this function. + * + * This function will handle two cell:ed simple IRQs and assumes all + * the pins on the gpiochip can generate a unique IRQ. Everything else + * need to be open coded. + */ +int gpiochip_irqchip_add(struct gpio_chip *gpiochip, +			 struct irq_chip *irqchip, +			 unsigned int first_irq, +			 irq_flow_handler_t handler, +			 unsigned int type) +{ +	struct device_node *of_node; +	unsigned int offset; +	unsigned irq_base = 0; + +	if (!gpiochip || !irqchip) +		return -EINVAL; + +	if (!gpiochip->dev) { +		pr_err("missing gpiochip .dev parent pointer\n"); +		return -EINVAL; +	} +	of_node = gpiochip->dev->of_node; +#ifdef CONFIG_OF_GPIO +	/* +	 * If the gpiochip has an assigned OF node this takes precendence +	 * FIXME: get rid of this and use gpiochip->dev->of_node everywhere +	 */ +	if (gpiochip->of_node) +		of_node = gpiochip->of_node; +#endif +	gpiochip->irqchip = irqchip; +	gpiochip->irq_handler = handler; +	gpiochip->irq_default_type = type; +	gpiochip->to_irq = gpiochip_to_irq; +	gpiochip->irqdomain = irq_domain_add_simple(of_node, +					gpiochip->ngpio, first_irq, +					&gpiochip_domain_ops, gpiochip); +	if (!gpiochip->irqdomain) { +		gpiochip->irqchip = NULL; +		return -EINVAL; +	} +	irqchip->irq_request_resources = gpiochip_irq_reqres; +	irqchip->irq_release_resources = gpiochip_irq_relres; + +	/* +	 * Prepare the mapping since the irqchip shall be orthogonal to +	 * any gpiochip calls. If the first_irq was zero, this is +	 * necessary to allocate descriptors for all IRQs. +	 */ +	for (offset = 0; offset < gpiochip->ngpio; offset++) { +		irq_base = irq_create_mapping(gpiochip->irqdomain, offset); +		if (offset == 0) +			/* +			 * Store the base into the gpiochip to be used when +			 * unmapping the irqs. +			 */ +			gpiochip->irq_base = irq_base; +	} + +	return 0; +} +EXPORT_SYMBOL_GPL(gpiochip_irqchip_add); + +#else /* CONFIG_GPIOLIB_IRQCHIP */ + +static void gpiochip_irqchip_remove(struct gpio_chip *gpiochip) {} + +#endif /* CONFIG_GPIOLIB_IRQCHIP */ +  #ifdef CONFIG_PINCTRL  /** + * gpiochip_add_pingroup_range() - add a range for GPIO <-> pin mapping + * @chip: the gpiochip to add the range for + * @pinctrl: the dev_name() of the pin controller to map to + * @gpio_offset: the start offset in the current gpio_chip number space + * @pin_group: name of the pin group inside the pin controller + */ +int gpiochip_add_pingroup_range(struct gpio_chip *chip, +			struct pinctrl_dev *pctldev, +			unsigned int gpio_offset, const char *pin_group) +{ +	struct gpio_pin_range *pin_range; +	int ret; + +	pin_range = kzalloc(sizeof(*pin_range), GFP_KERNEL); +	if (!pin_range) { +		chip_err(chip, "failed to allocate pin ranges\n"); +		return -ENOMEM; +	} + +	/* Use local offset as range ID */ +	pin_range->range.id = gpio_offset; +	pin_range->range.gc = chip; +	pin_range->range.name = chip->label; +	pin_range->range.base = chip->base + gpio_offset; +	pin_range->pctldev = pctldev; + +	ret = pinctrl_get_group_pins(pctldev, pin_group, +					&pin_range->range.pins, +					&pin_range->range.npins); +	if (ret < 0) { +		kfree(pin_range); +		return ret; +	} + +	pinctrl_add_gpio_range(pctldev, &pin_range->range); + +	chip_dbg(chip, "created GPIO range %d->%d ==> %s PINGRP %s\n", +		 gpio_offset, gpio_offset + pin_range->range.npins - 1, +		 pinctrl_dev_get_devname(pctldev), pin_group); + +	list_add_tail(&pin_range->node, &chip->pin_ranges); + +	return 0; +} +EXPORT_SYMBOL_GPL(gpiochip_add_pingroup_range); + +/**   * gpiochip_add_pin_range() - add a range for GPIO <-> pin mapping   * @chip: the gpiochip to add the range for   * @pinctrl_name: the dev_name() of the pin controller to map to @@ -1337,8 +1644,7 @@ int gpiochip_add_pin_range(struct gpio_chip *chip, const char *pinctl_name,  	pin_range = kzalloc(sizeof(*pin_range), GFP_KERNEL);  	if (!pin_range) { -		pr_err("%s: GPIO chip: failed to allocate pin ranges\n", -				chip->label); +		chip_err(chip, "failed to allocate pin ranges\n");  		return -ENOMEM;  	} @@ -1353,13 +1659,12 @@ int gpiochip_add_pin_range(struct gpio_chip *chip, const char *pinctl_name,  			&pin_range->range);  	if (IS_ERR(pin_range->pctldev)) {  		ret = PTR_ERR(pin_range->pctldev); -		pr_err("%s: GPIO chip: could not create pin range\n", -		       chip->label); +		chip_err(chip, "could not create pin range\n");  		kfree(pin_range);  		return ret;  	} -	pr_debug("GPIO chip %s: created GPIO range %d->%d ==> %s PIN %d->%d\n", -		 chip->label, gpio_offset, gpio_offset + npins - 1, +	chip_dbg(chip, "created GPIO range %d->%d ==> %s PIN %d->%d\n", +		 gpio_offset, gpio_offset + npins - 1,  		 pinctl_name,  		 pin_offset, pin_offset + npins - 1); @@ -1392,24 +1697,14 @@ EXPORT_SYMBOL_GPL(gpiochip_remove_pin_ranges);   * on each other, and help provide better diagnostics in debugfs.   * They're called even less than the "set direction" calls.   */ -static int gpiod_request(struct gpio_desc *desc, const char *label) +static int __gpiod_request(struct gpio_desc *desc, const char *label)  { -	struct gpio_chip	*chip; -	int			status = -EPROBE_DEFER; +	struct gpio_chip	*chip = desc->chip; +	int			status;  	unsigned long		flags; -	if (!desc || !desc->chip) { -		pr_warn("%s: invalid GPIO\n", __func__); -		return -EINVAL; -	} -  	spin_lock_irqsave(&gpio_lock, flags); -	chip = desc->chip; - -	if (!try_module_get(chip->owner)) -		goto done; -  	/* NOTE:  gpio_request() can be called in early boot,  	 * before IRQs are enabled, for non-sleeping (SOC) GPIOs.  	 */ @@ -1419,7 +1714,6 @@ static int gpiod_request(struct gpio_desc *desc, const char *label)  		status = 0;  	} else {  		status = -EBUSY; -		module_put(chip->owner);  		goto done;  	} @@ -1431,7 +1725,6 @@ static int gpiod_request(struct gpio_desc *desc, const char *label)  		if (status < 0) {  			desc_set_label(desc, NULL); -			module_put(chip->owner);  			clear_bit(FLAG_REQUESTED, &desc->flags);  			goto done;  		} @@ -1443,31 +1736,51 @@ static int gpiod_request(struct gpio_desc *desc, const char *label)  		spin_lock_irqsave(&gpio_lock, flags);  	}  done: -	if (status) -		pr_debug("_gpio_request: gpio-%d (%s) status %d\n", -			 desc_to_gpio(desc), label ? : "?", status);  	spin_unlock_irqrestore(&gpio_lock, flags);  	return status;  } +static int gpiod_request(struct gpio_desc *desc, const char *label) +{ +	int status = -EPROBE_DEFER; +	struct gpio_chip *chip; + +	if (!desc) { +		pr_warn("%s: invalid GPIO\n", __func__); +		return -EINVAL; +	} + +	chip = desc->chip; +	if (!chip) +		goto done; + +	if (try_module_get(chip->owner)) { +		status = __gpiod_request(desc, label); +		if (status < 0) +			module_put(chip->owner); +	} + +done: +	if (status) +		gpiod_dbg(desc, "%s: status %d\n", __func__, status); + +	return status; +} +  int gpio_request(unsigned gpio, const char *label)  {  	return gpiod_request(gpio_to_desc(gpio), label);  }  EXPORT_SYMBOL_GPL(gpio_request); -static void gpiod_free(struct gpio_desc *desc) +static bool __gpiod_free(struct gpio_desc *desc)  { +	bool			ret = false;  	unsigned long		flags;  	struct gpio_chip	*chip;  	might_sleep(); -	if (!desc) { -		WARN_ON(extra_checks); -		return; -	} -  	gpiod_unexport(desc);  	spin_lock_irqsave(&gpio_lock, flags); @@ -1481,15 +1794,23 @@ static void gpiod_free(struct gpio_desc *desc)  			spin_lock_irqsave(&gpio_lock, flags);  		}  		desc_set_label(desc, NULL); -		module_put(desc->chip->owner);  		clear_bit(FLAG_ACTIVE_LOW, &desc->flags);  		clear_bit(FLAG_REQUESTED, &desc->flags);  		clear_bit(FLAG_OPEN_DRAIN, &desc->flags);  		clear_bit(FLAG_OPEN_SOURCE, &desc->flags); -	} else -		WARN_ON(extra_checks); +		ret = true; +	}  	spin_unlock_irqrestore(&gpio_lock, flags); +	return ret; +} + +static void gpiod_free(struct gpio_desc *desc) +{ +	if (desc && __gpiod_free(desc)) +		module_put(desc->chip->owner); +	else +		WARN_ON(extra_checks);  }  void gpio_free(unsigned gpio) @@ -1524,7 +1845,7 @@ int gpio_request_one(unsigned gpio, unsigned long flags, const char *label)  	if (flags & GPIOF_DIR_IN)  		err = gpiod_direction_input(desc);  	else -		err = gpiod_direction_output(desc, +		err = gpiod_direction_output_raw(desc,  				(flags & GPIOF_INIT_HIGH) ? 1 : 0);  	if (err) @@ -1611,6 +1932,37 @@ const char *gpiochip_is_requested(struct gpio_chip *chip, unsigned offset)  }  EXPORT_SYMBOL_GPL(gpiochip_is_requested); +/** + * gpiochip_request_own_desc - Allow GPIO chip to request its own descriptor + * @desc: GPIO descriptor to request + * @label: label for the GPIO + * + * Function allows GPIO chip drivers to request and use their own GPIO + * descriptors via gpiolib API. Difference to gpiod_request() is that this + * function will not increase reference count of the GPIO chip module. This + * allows the GPIO chip module to be unloaded as needed (we assume that the + * GPIO chip driver handles freeing the GPIOs it has requested). + */ +int gpiochip_request_own_desc(struct gpio_desc *desc, const char *label) +{ +	if (!desc || !desc->chip) +		return -EINVAL; + +	return __gpiod_request(desc, label); +} + +/** + * gpiochip_free_own_desc - Free GPIO requested by the chip driver + * @desc: GPIO descriptor to free + * + * Function frees the given GPIO requested previously with + * gpiochip_request_own_desc(). + */ +void gpiochip_free_own_desc(struct gpio_desc *desc) +{ +	if (desc) +		__gpiod_free(desc); +}  /* Drivers MUST set GPIO direction before making get/set calls.  In   * some cases this is done in early boot, before IRQs are enabled. @@ -1621,7 +1973,16 @@ EXPORT_SYMBOL_GPL(gpiochip_is_requested);   * rely on gpio_request() having been called beforehand.   */ -static int gpiod_direction_input(struct gpio_desc *desc) +/** + * gpiod_direction_input - set the GPIO direction to input + * @desc:	GPIO to set to input + * + * Set the direction of the passed GPIO to input, such as gpiod_get_value() can + * be called safely on it. + * + * Return 0 in case of success, else an error code. + */ +int gpiod_direction_input(struct gpio_desc *desc)  {  	unsigned long		flags;  	struct gpio_chip	*chip; @@ -1635,7 +1996,8 @@ static int gpiod_direction_input(struct gpio_desc *desc)  	chip = desc->chip;  	if (!chip->get || !chip->direction_input) { -		pr_warn("%s: missing get() or direction_input() operations\n", +		gpiod_warn(desc, +			"%s: missing get() or direction_input() operations\n",  			__func__);  		return -EIO;  	} @@ -1656,8 +2018,8 @@ static int gpiod_direction_input(struct gpio_desc *desc)  	if (status) {  		status = chip->request(chip, offset);  		if (status < 0) { -			pr_debug("GPIO-%d: chip request fail, %d\n", -				desc_to_gpio(desc), status); +			gpiod_dbg(desc, "%s: chip request fail, %d\n", +					__func__, status);  			/* and it's not available to anyone else ...  			 * gpio_request() is the fully clean solution.  			 */ @@ -1675,27 +2037,24 @@ lose:  fail:  	spin_unlock_irqrestore(&gpio_lock, flags);  	if (status) -		pr_debug("%s: gpio-%d status %d\n", __func__, -			 desc_to_gpio(desc), status); +		gpiod_dbg(desc, "%s: status %d\n", __func__, status);  	return status;  } +EXPORT_SYMBOL_GPL(gpiod_direction_input); -int gpio_direction_input(unsigned gpio) -{ -	return gpiod_direction_input(gpio_to_desc(gpio)); -} -EXPORT_SYMBOL_GPL(gpio_direction_input); - -static int gpiod_direction_output(struct gpio_desc *desc, int value) +static int _gpiod_direction_output_raw(struct gpio_desc *desc, int value)  {  	unsigned long		flags;  	struct gpio_chip	*chip;  	int			status = -EINVAL;  	int offset; -	if (!desc || !desc->chip) { -		pr_warn("%s: invalid GPIO\n", __func__); -		return -EINVAL; +	/* GPIOs used for IRQs shall not be set as output */ +	if (test_bit(FLAG_USED_AS_IRQ, &desc->flags)) { +		gpiod_err(desc, +			  "%s: tried to set a GPIO tied to an IRQ as output\n", +			  __func__); +		return -EIO;  	}  	/* Open drain pin should not be driven to 1 */ @@ -1708,8 +2067,9 @@ static int gpiod_direction_output(struct gpio_desc *desc, int value)  	chip = desc->chip;  	if (!chip->set || !chip->direction_output) { -		pr_warn("%s: missing set() or direction_output() operations\n", -			__func__); +		gpiod_warn(desc, +		       "%s: missing set() or direction_output() operations\n", +		       __func__);  		return -EIO;  	} @@ -1729,8 +2089,8 @@ static int gpiod_direction_output(struct gpio_desc *desc, int value)  	if (status) {  		status = chip->request(chip, offset);  		if (status < 0) { -			pr_debug("GPIO-%d: chip request fail, %d\n", -				desc_to_gpio(desc), status); +			gpiod_dbg(desc, "%s: chip request fail, %d\n", +					__func__, status);  			/* and it's not available to anyone else ...  			 * gpio_request() is the fully clean solution.  			 */ @@ -1748,26 +2108,64 @@ lose:  fail:  	spin_unlock_irqrestore(&gpio_lock, flags);  	if (status) -		pr_debug("%s: gpio-%d status %d\n", __func__, -			 desc_to_gpio(desc), status); +		gpiod_dbg(desc, "%s: gpio status %d\n", __func__, status);  	return status;  } -int gpio_direction_output(unsigned gpio, int value) +/** + * gpiod_direction_output_raw - set the GPIO direction to output + * @desc:	GPIO to set to output + * @value:	initial output value of the GPIO + * + * Set the direction of the passed GPIO to output, such as gpiod_set_value() can + * be called safely on it. The initial value of the output must be specified + * as raw value on the physical line without regard for the ACTIVE_LOW status. + * + * Return 0 in case of success, else an error code. + */ +int gpiod_direction_output_raw(struct gpio_desc *desc, int value) +{ +	if (!desc || !desc->chip) { +		pr_warn("%s: invalid GPIO\n", __func__); +		return -EINVAL; +	} +	return _gpiod_direction_output_raw(desc, value); +} +EXPORT_SYMBOL_GPL(gpiod_direction_output_raw); + +/** + * gpiod_direction_output - set the GPIO direction to output + * @desc:	GPIO to set to output + * @value:	initial output value of the GPIO + * + * Set the direction of the passed GPIO to output, such as gpiod_set_value() can + * be called safely on it. The initial value of the output must be specified + * as the logical value of the GPIO, i.e. taking its ACTIVE_LOW status into + * account. + * + * Return 0 in case of success, else an error code. + */ +int gpiod_direction_output(struct gpio_desc *desc, int value)  { -	return gpiod_direction_output(gpio_to_desc(gpio), value); +	if (!desc || !desc->chip) { +		pr_warn("%s: invalid GPIO\n", __func__); +		return -EINVAL; +	} +	if (test_bit(FLAG_ACTIVE_LOW, &desc->flags)) +		value = !value; +	return _gpiod_direction_output_raw(desc, value);  } -EXPORT_SYMBOL_GPL(gpio_direction_output); +EXPORT_SYMBOL_GPL(gpiod_direction_output);  /** - * gpio_set_debounce - sets @debounce time for a @gpio + * gpiod_set_debounce - sets @debounce time for a @gpio   * @gpio: the gpio to set debounce time   * @debounce: debounce time is microseconds   *   * returns -ENOTSUPP if the controller does not support setting   * debounce.   */ -static int gpiod_set_debounce(struct gpio_desc *desc, unsigned debounce) +int gpiod_set_debounce(struct gpio_desc *desc, unsigned debounce)  {  	unsigned long		flags;  	struct gpio_chip	*chip; @@ -1781,8 +2179,9 @@ static int gpiod_set_debounce(struct gpio_desc *desc, unsigned debounce)  	chip = desc->chip;  	if (!chip->set || !chip->set_debounce) { -		pr_debug("%s: missing set() or set_debounce() operations\n", -			__func__); +		gpiod_dbg(desc, +			  "%s: missing set() or set_debounce() operations\n", +			  __func__);  		return -ENOTSUPP;  	} @@ -1804,17 +2203,23 @@ static int gpiod_set_debounce(struct gpio_desc *desc, unsigned debounce)  fail:  	spin_unlock_irqrestore(&gpio_lock, flags);  	if (status) -		pr_debug("%s: gpio-%d status %d\n", __func__, -			 desc_to_gpio(desc), status); +		gpiod_dbg(desc, "%s: status %d\n", __func__, status);  	return status;  } +EXPORT_SYMBOL_GPL(gpiod_set_debounce); -int gpio_set_debounce(unsigned gpio, unsigned debounce) +/** + * gpiod_is_active_low - test whether a GPIO is active-low or not + * @desc: the gpio descriptor to test + * + * Returns 1 if the GPIO is active-low, 0 otherwise. + */ +int gpiod_is_active_low(const struct gpio_desc *desc)  { -	return gpiod_set_debounce(gpio_to_desc(gpio), debounce); +	return test_bit(FLAG_ACTIVE_LOW, &desc->flags);  } -EXPORT_SYMBOL_GPL(gpio_set_debounce); +EXPORT_SYMBOL_GPL(gpiod_is_active_low);  /* I/O calls are only valid after configuration completed; the relevant   * "is this a valid GPIO" error checks should already have been done. @@ -1838,45 +2243,71 @@ EXPORT_SYMBOL_GPL(gpio_set_debounce);   * that the GPIO was actually requested.   */ -/** - * __gpio_get_value() - return a gpio's value - * @gpio: gpio whose value will be returned - * Context: any - * - * This is used directly or indirectly to implement gpio_get_value(). - * It returns the zero or nonzero value provided by the associated - * gpio_chip.get() method; or zero if no such method is provided. - */ -static int gpiod_get_value(const struct gpio_desc *desc) +static bool _gpiod_get_raw_value(const struct gpio_desc *desc)  {  	struct gpio_chip	*chip; -	int value; +	bool value;  	int offset; -	if (!desc) -		return 0;  	chip = desc->chip;  	offset = gpio_chip_hwgpio(desc); -	/* Should be using gpio_get_value_cansleep() */ -	WARN_ON(chip->can_sleep); -	value = chip->get ? chip->get(chip, offset) : 0; +	value = chip->get ? chip->get(chip, offset) : false;  	trace_gpio_value(desc_to_gpio(desc), 1, value);  	return value;  } -int __gpio_get_value(unsigned gpio) +/** + * gpiod_get_raw_value() - return a gpio's raw value + * @desc: gpio whose value will be returned + * + * Return the GPIO's raw value, i.e. the value of the physical line disregarding + * its ACTIVE_LOW status. + * + * This function should be called from contexts where we cannot sleep, and will + * complain if the GPIO chip functions potentially sleep. + */ +int gpiod_get_raw_value(const struct gpio_desc *desc) +{ +	if (!desc) +		return 0; +	/* Should be using gpio_get_value_cansleep() */ +	WARN_ON(desc->chip->can_sleep); +	return _gpiod_get_raw_value(desc); +} +EXPORT_SYMBOL_GPL(gpiod_get_raw_value); + +/** + * gpiod_get_value() - return a gpio's value + * @desc: gpio whose value will be returned + * + * Return the GPIO's logical value, i.e. taking the ACTIVE_LOW status into + * account. + * + * This function should be called from contexts where we cannot sleep, and will + * complain if the GPIO chip functions potentially sleep. + */ +int gpiod_get_value(const struct gpio_desc *desc)  { -	return gpiod_get_value(gpio_to_desc(gpio)); +	int value; +	if (!desc) +		return 0; +	/* Should be using gpio_get_value_cansleep() */ +	WARN_ON(desc->chip->can_sleep); + +	value = _gpiod_get_raw_value(desc); +	if (test_bit(FLAG_ACTIVE_LOW, &desc->flags)) +		value = !value; + +	return value;  } -EXPORT_SYMBOL_GPL(__gpio_get_value); +EXPORT_SYMBOL_GPL(gpiod_get_value);  /*   *  _gpio_set_open_drain_value() - Set the open drain gpio's value. - * @gpio: Gpio whose state need to be set. - * @chip: Gpio chip. + * @desc: gpio descriptor whose state need to be set.   * @value: Non-zero for setting it HIGH otherise it will set to LOW.   */ -static void _gpio_set_open_drain_value(struct gpio_desc *desc, int value) +static void _gpio_set_open_drain_value(struct gpio_desc *desc, bool value)  {  	int err = 0;  	struct gpio_chip *chip = desc->chip; @@ -1893,17 +2324,17 @@ static void _gpio_set_open_drain_value(struct gpio_desc *desc, int value)  	}  	trace_gpio_direction(desc_to_gpio(desc), value, err);  	if (err < 0) -		pr_err("%s: Error in set_value for open drain gpio%d err %d\n", -					__func__, desc_to_gpio(desc), err); +		gpiod_err(desc, +			  "%s: Error in set_value for open drain err %d\n", +			  __func__, err);  }  /* - *  _gpio_set_open_source() - Set the open source gpio's value. - * @gpio: Gpio whose state need to be set. - * @chip: Gpio chip. + *  _gpio_set_open_source_value() - Set the open source gpio's value. + * @desc: gpio descriptor whose state need to be set.   * @value: Non-zero for setting it HIGH otherise it will set to LOW.   */ -static void _gpio_set_open_source_value(struct gpio_desc *desc, int value) +static void _gpio_set_open_source_value(struct gpio_desc *desc, bool value)  {  	int err = 0;  	struct gpio_chip *chip = desc->chip; @@ -1920,28 +2351,16 @@ static void _gpio_set_open_source_value(struct gpio_desc *desc, int value)  	}  	trace_gpio_direction(desc_to_gpio(desc), !value, err);  	if (err < 0) -		pr_err("%s: Error in set_value for open source gpio%d err %d\n", -					__func__, desc_to_gpio(desc), err); +		gpiod_err(desc, +			  "%s: Error in set_value for open source err %d\n", +			  __func__, err);  } -/** - * __gpio_set_value() - assign a gpio's value - * @gpio: gpio whose value will be assigned - * @value: value to assign - * Context: any - * - * This is used directly or indirectly to implement gpio_set_value(). - * It invokes the associated gpio_chip.set() method. - */ -static void gpiod_set_value(struct gpio_desc *desc, int value) +static void _gpiod_set_raw_value(struct gpio_desc *desc, bool value)  {  	struct gpio_chip	*chip; -	if (!desc) -		return;  	chip = desc->chip; -	/* Should be using gpio_set_value_cansleep() */ -	WARN_ON(chip->can_sleep);  	trace_gpio_value(desc_to_gpio(desc), 0, value);  	if (test_bit(FLAG_OPEN_DRAIN, &desc->flags))  		_gpio_set_open_drain_value(desc, value); @@ -1951,44 +2370,71 @@ static void gpiod_set_value(struct gpio_desc *desc, int value)  		chip->set(chip, gpio_chip_hwgpio(desc), value);  } -void __gpio_set_value(unsigned gpio, int value) +/** + * gpiod_set_raw_value() - assign a gpio's raw value + * @desc: gpio whose value will be assigned + * @value: value to assign + * + * Set the raw value of the GPIO, i.e. the value of its physical line without + * regard for its ACTIVE_LOW status. + * + * This function should be called from contexts where we cannot sleep, and will + * complain if the GPIO chip functions potentially sleep. + */ +void gpiod_set_raw_value(struct gpio_desc *desc, int value)  { -	return gpiod_set_value(gpio_to_desc(gpio), value); +	if (!desc) +		return; +	/* Should be using gpio_set_value_cansleep() */ +	WARN_ON(desc->chip->can_sleep); +	_gpiod_set_raw_value(desc, value);  } -EXPORT_SYMBOL_GPL(__gpio_set_value); +EXPORT_SYMBOL_GPL(gpiod_set_raw_value);  /** - * __gpio_cansleep() - report whether gpio value access will sleep - * @gpio: gpio in question - * Context: any + * gpiod_set_value() - assign a gpio's value + * @desc: gpio whose value will be assigned + * @value: value to assign + * + * Set the logical value of the GPIO, i.e. taking its ACTIVE_LOW status into + * account   * - * This is used directly or indirectly to implement gpio_cansleep().  It - * returns nonzero if access reading or writing the GPIO value can sleep. + * This function should be called from contexts where we cannot sleep, and will + * complain if the GPIO chip functions potentially sleep.   */ -static int gpiod_cansleep(const struct gpio_desc *desc) +void gpiod_set_value(struct gpio_desc *desc, int value)  {  	if (!desc) -		return 0; -	/* only call this on GPIOs that are valid! */ -	return desc->chip->can_sleep; +		return; +	/* Should be using gpio_set_value_cansleep() */ +	WARN_ON(desc->chip->can_sleep); +	if (test_bit(FLAG_ACTIVE_LOW, &desc->flags)) +		value = !value; +	_gpiod_set_raw_value(desc, value);  } +EXPORT_SYMBOL_GPL(gpiod_set_value); -int __gpio_cansleep(unsigned gpio) +/** + * gpiod_cansleep() - report whether gpio value access may sleep + * @desc: gpio to check + * + */ +int gpiod_cansleep(const struct gpio_desc *desc)  { -	return gpiod_cansleep(gpio_to_desc(gpio)); +	if (!desc) +		return 0; +	return desc->chip->can_sleep;  } -EXPORT_SYMBOL_GPL(__gpio_cansleep); +EXPORT_SYMBOL_GPL(gpiod_cansleep);  /** - * __gpio_to_irq() - return the IRQ corresponding to a GPIO - * @gpio: gpio whose IRQ will be returned (already requested) - * Context: any + * gpiod_to_irq() - return the IRQ corresponding to a GPIO + * @desc: gpio whose IRQ will be returned (already requested)   * - * This is used directly or indirectly to implement gpio_to_irq(). - * It returns the number of the IRQ signaled by this (input) GPIO, - * or a negative errno. + * Return the IRQ corresponding to the passed GPIO, or an error code in case of + * error.   */ -static int gpiod_to_irq(const struct gpio_desc *desc) +int gpiod_to_irq(const struct gpio_desc *desc)  {  	struct gpio_chip	*chip;  	int			offset; @@ -1999,62 +2445,414 @@ static int gpiod_to_irq(const struct gpio_desc *desc)  	offset = gpio_chip_hwgpio(desc);  	return chip->to_irq ? chip->to_irq(chip, offset) : -ENXIO;  } +EXPORT_SYMBOL_GPL(gpiod_to_irq); -int __gpio_to_irq(unsigned gpio) +/** + * gpiod_lock_as_irq() - lock a GPIO to be used as IRQ + * @gpio: the GPIO line to lock as used for IRQ + * + * This is used directly by GPIO drivers that want to lock down + * a certain GPIO line to be used for IRQs. + */ +int gpiod_lock_as_irq(struct gpio_desc *desc)  { -	return gpiod_to_irq(gpio_to_desc(gpio)); +	if (!desc) +		return -EINVAL; + +	if (test_bit(FLAG_IS_OUT, &desc->flags)) { +		gpiod_err(desc, +			  "%s: tried to flag a GPIO set as output for IRQ\n", +			  __func__); +		return -EIO; +	} + +	set_bit(FLAG_USED_AS_IRQ, &desc->flags); +	return 0;  } -EXPORT_SYMBOL_GPL(__gpio_to_irq); +EXPORT_SYMBOL_GPL(gpiod_lock_as_irq); +int gpio_lock_as_irq(struct gpio_chip *chip, unsigned int offset) +{ +	return gpiod_lock_as_irq(gpiochip_get_desc(chip, offset)); +} +EXPORT_SYMBOL_GPL(gpio_lock_as_irq); -/* There's no value in making it easy to inline GPIO calls that may sleep. - * Common examples include ones connected to I2C or SPI chips. +/** + * gpiod_unlock_as_irq() - unlock a GPIO used as IRQ + * @gpio: the GPIO line to unlock from IRQ usage + * + * This is used directly by GPIO drivers that want to indicate + * that a certain GPIO is no longer used exclusively for IRQ.   */ +void gpiod_unlock_as_irq(struct gpio_desc *desc) +{ +	if (!desc) +		return; + +	clear_bit(FLAG_USED_AS_IRQ, &desc->flags); +} +EXPORT_SYMBOL_GPL(gpiod_unlock_as_irq); -static int gpiod_get_value_cansleep(const struct gpio_desc *desc) +void gpio_unlock_as_irq(struct gpio_chip *chip, unsigned int offset) +{ +	return gpiod_unlock_as_irq(gpiochip_get_desc(chip, offset)); +} +EXPORT_SYMBOL_GPL(gpio_unlock_as_irq); + +/** + * gpiod_get_raw_value_cansleep() - return a gpio's raw value + * @desc: gpio whose value will be returned + * + * Return the GPIO's raw value, i.e. the value of the physical line disregarding + * its ACTIVE_LOW status. + * + * This function is to be called from contexts that can sleep. + */ +int gpiod_get_raw_value_cansleep(const struct gpio_desc *desc) +{ +	might_sleep_if(extra_checks); +	if (!desc) +		return 0; +	return _gpiod_get_raw_value(desc); +} +EXPORT_SYMBOL_GPL(gpiod_get_raw_value_cansleep); + +/** + * gpiod_get_value_cansleep() - return a gpio's value + * @desc: gpio whose value will be returned + * + * Return the GPIO's logical value, i.e. taking the ACTIVE_LOW status into + * account. + * + * This function is to be called from contexts that can sleep. + */ +int gpiod_get_value_cansleep(const struct gpio_desc *desc)  { -	struct gpio_chip	*chip;  	int value; -	int offset;  	might_sleep_if(extra_checks);  	if (!desc)  		return 0; -	chip = desc->chip; -	offset = gpio_chip_hwgpio(desc); -	value = chip->get ? chip->get(chip, offset) : 0; -	trace_gpio_value(desc_to_gpio(desc), 1, value); + +	value = _gpiod_get_raw_value(desc); +	if (test_bit(FLAG_ACTIVE_LOW, &desc->flags)) +		value = !value; +  	return value;  } +EXPORT_SYMBOL_GPL(gpiod_get_value_cansleep); -int gpio_get_value_cansleep(unsigned gpio) +/** + * gpiod_set_raw_value_cansleep() - assign a gpio's raw value + * @desc: gpio whose value will be assigned + * @value: value to assign + * + * Set the raw value of the GPIO, i.e. the value of its physical line without + * regard for its ACTIVE_LOW status. + * + * This function is to be called from contexts that can sleep. + */ +void gpiod_set_raw_value_cansleep(struct gpio_desc *desc, int value)  { -	return gpiod_get_value_cansleep(gpio_to_desc(gpio)); +	might_sleep_if(extra_checks); +	if (!desc) +		return; +	_gpiod_set_raw_value(desc, value);  } -EXPORT_SYMBOL_GPL(gpio_get_value_cansleep); +EXPORT_SYMBOL_GPL(gpiod_set_raw_value_cansleep); -static void gpiod_set_value_cansleep(struct gpio_desc *desc, int value) +/** + * gpiod_set_value_cansleep() - assign a gpio's value + * @desc: gpio whose value will be assigned + * @value: value to assign + * + * Set the logical value of the GPIO, i.e. taking its ACTIVE_LOW status into + * account + * + * This function is to be called from contexts that can sleep. + */ +void gpiod_set_value_cansleep(struct gpio_desc *desc, int value)  { -	struct gpio_chip	*chip; -  	might_sleep_if(extra_checks);  	if (!desc)  		return; -	chip = desc->chip; -	trace_gpio_value(desc_to_gpio(desc), 0, value); -	if (test_bit(FLAG_OPEN_DRAIN,  &desc->flags)) -		_gpio_set_open_drain_value(desc, value); -	else if (test_bit(FLAG_OPEN_SOURCE,  &desc->flags)) -		_gpio_set_open_source_value(desc, value); -	else -		chip->set(chip, gpio_chip_hwgpio(desc), value); + +	if (test_bit(FLAG_ACTIVE_LOW, &desc->flags)) +		value = !value; +	_gpiod_set_raw_value(desc, value); +} +EXPORT_SYMBOL_GPL(gpiod_set_value_cansleep); + +/** + * gpiod_add_lookup_table() - register GPIO device consumers + * @table: table of consumers to register + */ +void gpiod_add_lookup_table(struct gpiod_lookup_table *table) +{ +	mutex_lock(&gpio_lookup_lock); + +	list_add_tail(&table->list, &gpio_lookup_list); + +	mutex_unlock(&gpio_lookup_lock); +} + +static struct gpio_desc *of_find_gpio(struct device *dev, const char *con_id, +				      unsigned int idx, +				      enum gpio_lookup_flags *flags) +{ +	static const char *suffixes[] = { "gpios", "gpio" }; +	char prop_name[32]; /* 32 is max size of property name */ +	enum of_gpio_flags of_flags; +	struct gpio_desc *desc; +	unsigned int i; + +	for (i = 0; i < ARRAY_SIZE(suffixes); i++) { +		if (con_id) +			snprintf(prop_name, 32, "%s-%s", con_id, suffixes[i]); +		else +			snprintf(prop_name, 32, "%s", suffixes[i]); + +		desc = of_get_named_gpiod_flags(dev->of_node, prop_name, idx, +						&of_flags); +		if (!IS_ERR(desc) || (PTR_ERR(desc) == -EPROBE_DEFER)) +			break; +	} + +	if (IS_ERR(desc)) +		return desc; + +	if (of_flags & OF_GPIO_ACTIVE_LOW) +		*flags |= GPIO_ACTIVE_LOW; + +	return desc; +} + +static struct gpio_desc *acpi_find_gpio(struct device *dev, const char *con_id, +					unsigned int idx, +					enum gpio_lookup_flags *flags) +{ +	struct acpi_gpio_info info; +	struct gpio_desc *desc; + +	desc = acpi_get_gpiod_by_index(dev, idx, &info); +	if (IS_ERR(desc)) +		return desc; + +	if (info.gpioint && info.active_low) +		*flags |= GPIO_ACTIVE_LOW; + +	return desc; +} + +static struct gpiod_lookup_table *gpiod_find_lookup_table(struct device *dev) +{ +	const char *dev_id = dev ? dev_name(dev) : NULL; +	struct gpiod_lookup_table *table; + +	mutex_lock(&gpio_lookup_lock); + +	list_for_each_entry(table, &gpio_lookup_list, list) { +		if (table->dev_id && dev_id) { +			/* +			 * Valid strings on both ends, must be identical to have +			 * a match +			 */ +			if (!strcmp(table->dev_id, dev_id)) +				goto found; +		} else { +			/* +			 * One of the pointers is NULL, so both must be to have +			 * a match +			 */ +			if (dev_id == table->dev_id) +				goto found; +		} +	} +	table = NULL; + +found: +	mutex_unlock(&gpio_lookup_lock); +	return table; +} + +static struct gpio_desc *gpiod_find(struct device *dev, const char *con_id, +				    unsigned int idx, +				    enum gpio_lookup_flags *flags) +{ +	struct gpio_desc *desc = ERR_PTR(-ENOENT); +	struct gpiod_lookup_table *table; +	struct gpiod_lookup *p; + +	table = gpiod_find_lookup_table(dev); +	if (!table) +		return desc; + +	for (p = &table->table[0]; p->chip_label; p++) { +		struct gpio_chip *chip; + +		/* idx must always match exactly */ +		if (p->idx != idx) +			continue; + +		/* If the lookup entry has a con_id, require exact match */ +		if (p->con_id && (!con_id || strcmp(p->con_id, con_id))) +			continue; + +		chip = find_chip_by_name(p->chip_label); + +		if (!chip) { +			dev_err(dev, "cannot find GPIO chip %s\n", +				p->chip_label); +			return ERR_PTR(-ENODEV); +		} + +		if (chip->ngpio <= p->chip_hwnum) { +			dev_err(dev, +				"requested GPIO %d is out of range [0..%d] for chip %s\n", +				idx, chip->ngpio, chip->label); +			return ERR_PTR(-EINVAL); +		} + +		desc = gpiochip_get_desc(chip, p->chip_hwnum); +		*flags = p->flags; + +		return desc; +	} + +	return desc; +} + +/** + * gpiod_get - obtain a GPIO for a given GPIO function + * @dev:	GPIO consumer, can be NULL for system-global GPIOs + * @con_id:	function within the GPIO consumer + * + * Return the GPIO descriptor corresponding to the function con_id of device + * dev, -ENOENT if no GPIO has been assigned to the requested function, or + * another IS_ERR() code if an error occured while trying to acquire the GPIO. + */ +struct gpio_desc *__must_check gpiod_get(struct device *dev, const char *con_id) +{ +	return gpiod_get_index(dev, con_id, 0);  } +EXPORT_SYMBOL_GPL(gpiod_get); -void gpio_set_value_cansleep(unsigned gpio, int value) +/** + * gpiod_get_optional - obtain an optional GPIO for a given GPIO function + * @dev: GPIO consumer, can be NULL for system-global GPIOs + * @con_id: function within the GPIO consumer + * + * This is equivalent to gpiod_get(), except that when no GPIO was assigned to + * the requested function it will return NULL. This is convenient for drivers + * that need to handle optional GPIOs. + */ +struct gpio_desc *__must_check gpiod_get_optional(struct device *dev, +						  const char *con_id)  { -	return gpiod_set_value_cansleep(gpio_to_desc(gpio), value); +	return gpiod_get_index_optional(dev, con_id, 0); +} +EXPORT_SYMBOL_GPL(gpiod_get_optional); + +/** + * gpiod_get_index - obtain a GPIO from a multi-index GPIO function + * @dev:	GPIO consumer, can be NULL for system-global GPIOs + * @con_id:	function within the GPIO consumer + * @idx:	index of the GPIO to obtain in the consumer + * + * This variant of gpiod_get() allows to access GPIOs other than the first + * defined one for functions that define several GPIOs. + * + * Return a valid GPIO descriptor, -ENOENT if no GPIO has been assigned to the + * requested function and/or index, or another IS_ERR() code if an error + * occured while trying to acquire the GPIO. + */ +struct gpio_desc *__must_check gpiod_get_index(struct device *dev, +					       const char *con_id, +					       unsigned int idx) +{ +	struct gpio_desc *desc = NULL; +	int status; +	enum gpio_lookup_flags flags = 0; + +	dev_dbg(dev, "GPIO lookup for consumer %s\n", con_id); + +	/* Using device tree? */ +	if (IS_ENABLED(CONFIG_OF) && dev && dev->of_node) { +		dev_dbg(dev, "using device tree for GPIO lookup\n"); +		desc = of_find_gpio(dev, con_id, idx, &flags); +	} else if (IS_ENABLED(CONFIG_ACPI) && dev && ACPI_HANDLE(dev)) { +		dev_dbg(dev, "using ACPI for GPIO lookup\n"); +		desc = acpi_find_gpio(dev, con_id, idx, &flags); +	} + +	/* +	 * Either we are not using DT or ACPI, or their lookup did not return +	 * a result. In that case, use platform lookup as a fallback. +	 */ +	if (!desc || desc == ERR_PTR(-ENOENT)) { +		dev_dbg(dev, "using lookup tables for GPIO lookup"); +		desc = gpiod_find(dev, con_id, idx, &flags); +	} + +	if (IS_ERR(desc)) { +		dev_dbg(dev, "lookup for GPIO %s failed\n", con_id); +		return desc; +	} + +	status = gpiod_request(desc, con_id); + +	if (status < 0) +		return ERR_PTR(status); + +	if (flags & GPIO_ACTIVE_LOW) +		set_bit(FLAG_ACTIVE_LOW, &desc->flags); +	if (flags & GPIO_OPEN_DRAIN) +		set_bit(FLAG_OPEN_DRAIN, &desc->flags); +	if (flags & GPIO_OPEN_SOURCE) +		set_bit(FLAG_OPEN_SOURCE, &desc->flags); + +	return desc; +} +EXPORT_SYMBOL_GPL(gpiod_get_index); + +/** + * gpiod_get_index_optional - obtain an optional GPIO from a multi-index GPIO + *                            function + * @dev: GPIO consumer, can be NULL for system-global GPIOs + * @con_id: function within the GPIO consumer + * @index: index of the GPIO to obtain in the consumer + * + * This is equivalent to gpiod_get_index(), except that when no GPIO with the + * specified index was assigned to the requested function it will return NULL. + * This is convenient for drivers that need to handle optional GPIOs. + */ +struct gpio_desc *__must_check gpiod_get_index_optional(struct device *dev, +							const char *con_id, +							unsigned int index) +{ +	struct gpio_desc *desc; + +	desc = gpiod_get_index(dev, con_id, index); +	if (IS_ERR(desc)) { +		if (PTR_ERR(desc) == -ENOENT) +			return NULL; +	} + +	return desc; +} +EXPORT_SYMBOL_GPL(gpiod_get_index_optional); + +/** + * gpiod_put - dispose of a GPIO descriptor + * @desc:	GPIO descriptor to dispose of + * + * No descriptor can be used after gpiod_put() has been called on it. + */ +void gpiod_put(struct gpio_desc *desc) +{ +	gpiod_free(desc);  } -EXPORT_SYMBOL_GPL(gpio_set_value_cansleep); +EXPORT_SYMBOL_GPL(gpiod_put);  #ifdef CONFIG_DEBUG_FS @@ -2064,6 +2862,7 @@ static void gpiolib_dbg_show(struct seq_file *s, struct gpio_chip *chip)  	unsigned		gpio = chip->base;  	struct gpio_desc	*gdesc = &chip->desc[0];  	int			is_out; +	int			is_irq;  	for (i = 0; i < chip->ngpio; i++, gpio++, gdesc++) {  		if (!test_bit(FLAG_REQUESTED, &gdesc->flags)) @@ -2071,12 +2870,14 @@ static void gpiolib_dbg_show(struct seq_file *s, struct gpio_chip *chip)  		gpiod_get_direction(gdesc);  		is_out = test_bit(FLAG_IS_OUT, &gdesc->flags); -		seq_printf(s, " gpio-%-3d (%-20.20s) %s %s", +		is_irq = test_bit(FLAG_USED_AS_IRQ, &gdesc->flags); +		seq_printf(s, " gpio-%-3d (%-20.20s) %s %s %s",  			gpio, gdesc->label,  			is_out ? "out" : "in ",  			chip->get  				? (chip->get(chip, i) ? "hi" : "lo") -				: "?  "); +				: "?  ", +			is_irq ? "IRQ" : "   ");  		seq_printf(s, "\n");  	}  }  | 
