forked from mirrors/linux
		
	gpio: Pass a flag to gpiochip_request_own_desc()
Before things go out of hand, make it possible to pass flags when requesting "own" descriptors from a gpio_chip. This is necessary if the chip wants to request a GPIO with active low semantics, for example. Cc: Janusz Krzysztofik <jmkrzyszt@gmail.com> Cc: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> Cc: Jason Cooper <jason@lakedaemon.net> Cc: Jiri Kosina <jkosina@suse.cz> Cc: Roger Quadros <rogerq@ti.com> Reviewed-by: Gregory CLEMENT <gregory.clement@free-electrons.com> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
This commit is contained in:
		
							parent
							
								
									67566ae474
								
							
						
					
					
						commit
						21abf10381
					
				
					 9 changed files with 34 additions and 19 deletions
				
			
		| 
						 | 
					@ -434,7 +434,9 @@ try_module_get()). A GPIO driver can use the following functions instead
 | 
				
			||||||
to request and free descriptors without being pinned to the kernel forever::
 | 
					to request and free descriptors without being pinned to the kernel forever::
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	struct gpio_desc *gpiochip_request_own_desc(struct gpio_desc *desc,
 | 
						struct gpio_desc *gpiochip_request_own_desc(struct gpio_desc *desc,
 | 
				
			||||||
						    const char *label)
 | 
											    u16 hwnum,
 | 
				
			||||||
 | 
											    const char *label,
 | 
				
			||||||
 | 
											    enum gpiod_flags flags)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void gpiochip_free_own_desc(struct gpio_desc *desc)
 | 
						void gpiochip_free_own_desc(struct gpio_desc *desc)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -103,7 +103,7 @@ void __init ams_delta_init_fiq(struct gpio_chip *chip,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (i = 0; i < ARRAY_SIZE(irq_data); i++) {
 | 
						for (i = 0; i < ARRAY_SIZE(irq_data); i++) {
 | 
				
			||||||
		gpiod = gpiochip_request_own_desc(chip, i, pin_name[i]);
 | 
							gpiod = gpiochip_request_own_desc(chip, i, pin_name[i], 0);
 | 
				
			||||||
		if (IS_ERR(gpiod)) {
 | 
							if (IS_ERR(gpiod)) {
 | 
				
			||||||
			pr_err("%s: failed to get GPIO pin %d (%ld)\n",
 | 
								pr_err("%s: failed to get GPIO pin %d (%ld)\n",
 | 
				
			||||||
			       __func__, i, PTR_ERR(gpiod));
 | 
								       __func__, i, PTR_ERR(gpiod));
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -808,7 +808,7 @@ static void __init ams_delta_led_init(struct gpio_chip *chip)
 | 
				
			||||||
	int i;
 | 
						int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (i = LATCH1_PIN_LED_CAMERA; i < LATCH1_PIN_DOCKIT1; i++) {
 | 
						for (i = LATCH1_PIN_LED_CAMERA; i < LATCH1_PIN_DOCKIT1; i++) {
 | 
				
			||||||
		gpiod = gpiochip_request_own_desc(chip, i, NULL);
 | 
							gpiod = gpiochip_request_own_desc(chip, i, "camera-led", 0);
 | 
				
			||||||
		if (IS_ERR(gpiod)) {
 | 
							if (IS_ERR(gpiod)) {
 | 
				
			||||||
			pr_warn("%s: %s GPIO %d request failed (%ld)\n",
 | 
								pr_warn("%s: %s GPIO %d request failed (%ld)\n",
 | 
				
			||||||
				__func__, LATCH1_LABEL, i, PTR_ERR(gpiod));
 | 
									__func__, LATCH1_LABEL, i, PTR_ERR(gpiod));
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -608,7 +608,7 @@ static int mvebu_pwm_request(struct pwm_chip *chip, struct pwm_device *pwm)
 | 
				
			||||||
		ret = -EBUSY;
 | 
							ret = -EBUSY;
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		desc = gpiochip_request_own_desc(&mvchip->chip,
 | 
							desc = gpiochip_request_own_desc(&mvchip->chip,
 | 
				
			||||||
						 pwm->hwpwm, "mvebu-pwm");
 | 
											 pwm->hwpwm, "mvebu-pwm", 0);
 | 
				
			||||||
		if (IS_ERR(desc)) {
 | 
							if (IS_ERR(desc)) {
 | 
				
			||||||
			ret = PTR_ERR(desc);
 | 
								ret = PTR_ERR(desc);
 | 
				
			||||||
			goto out;
 | 
								goto out;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -167,7 +167,7 @@ static acpi_status acpi_gpiochip_request_interrupt(struct acpi_resource *ares,
 | 
				
			||||||
	if (!handler)
 | 
						if (!handler)
 | 
				
			||||||
		return AE_OK;
 | 
							return AE_OK;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	desc = gpiochip_request_own_desc(chip, pin, "ACPI:Event");
 | 
						desc = gpiochip_request_own_desc(chip, pin, "ACPI:Event", 0);
 | 
				
			||||||
	if (IS_ERR(desc)) {
 | 
						if (IS_ERR(desc)) {
 | 
				
			||||||
		dev_err(chip->parent, "Failed to request GPIO\n");
 | 
							dev_err(chip->parent, "Failed to request GPIO\n");
 | 
				
			||||||
		return AE_ERROR;
 | 
							return AE_ERROR;
 | 
				
			||||||
| 
						 | 
					@ -884,21 +884,14 @@ acpi_gpio_adr_space_handler(u32 function, acpi_physical_address address,
 | 
				
			||||||
			const char *label = "ACPI:OpRegion";
 | 
								const char *label = "ACPI:OpRegion";
 | 
				
			||||||
			int err;
 | 
								int err;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			desc = gpiochip_request_own_desc(chip, pin, label);
 | 
								desc = gpiochip_request_own_desc(chip, pin, label,
 | 
				
			||||||
 | 
												 flags);
 | 
				
			||||||
			if (IS_ERR(desc)) {
 | 
								if (IS_ERR(desc)) {
 | 
				
			||||||
				status = AE_ERROR;
 | 
									status = AE_ERROR;
 | 
				
			||||||
				mutex_unlock(&achip->conn_lock);
 | 
									mutex_unlock(&achip->conn_lock);
 | 
				
			||||||
				goto out;
 | 
									goto out;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			err = gpiod_configure_flags(desc, label, 0, flags);
 | 
					 | 
				
			||||||
			if (err < 0) {
 | 
					 | 
				
			||||||
				status = AE_NOT_CONFIGURED;
 | 
					 | 
				
			||||||
				gpiochip_free_own_desc(desc);
 | 
					 | 
				
			||||||
				mutex_unlock(&achip->conn_lock);
 | 
					 | 
				
			||||||
				goto out;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			conn = kzalloc(sizeof(*conn), GFP_KERNEL);
 | 
								conn = kzalloc(sizeof(*conn), GFP_KERNEL);
 | 
				
			||||||
			if (!conn) {
 | 
								if (!conn) {
 | 
				
			||||||
				status = AE_NO_MEMORY;
 | 
									status = AE_NO_MEMORY;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2454,6 +2454,7 @@ EXPORT_SYMBOL_GPL(gpiochip_is_requested);
 | 
				
			||||||
 * @chip: GPIO chip
 | 
					 * @chip: GPIO chip
 | 
				
			||||||
 * @hwnum: hardware number of the GPIO for which to request the descriptor
 | 
					 * @hwnum: hardware number of the GPIO for which to request the descriptor
 | 
				
			||||||
 * @label: label for the GPIO
 | 
					 * @label: label for the GPIO
 | 
				
			||||||
 | 
					 * @flags: flags for this GPIO or 0 if default
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * Function allows GPIO chip drivers to request and use their own GPIO
 | 
					 * Function allows GPIO chip drivers to request and use their own GPIO
 | 
				
			||||||
 * descriptors via gpiolib API. Difference to gpiod_request() is that this
 | 
					 * descriptors via gpiolib API. Difference to gpiod_request() is that this
 | 
				
			||||||
| 
						 | 
					@ -2466,7 +2467,8 @@ EXPORT_SYMBOL_GPL(gpiochip_is_requested);
 | 
				
			||||||
 * code on failure.
 | 
					 * code on failure.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
struct gpio_desc *gpiochip_request_own_desc(struct gpio_chip *chip, u16 hwnum,
 | 
					struct gpio_desc *gpiochip_request_own_desc(struct gpio_chip *chip, u16 hwnum,
 | 
				
			||||||
					    const char *label)
 | 
										    const char *label,
 | 
				
			||||||
 | 
										    enum gpiod_flags flags)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct gpio_desc *desc = gpiochip_get_desc(chip, hwnum);
 | 
						struct gpio_desc *desc = gpiochip_get_desc(chip, hwnum);
 | 
				
			||||||
	int err;
 | 
						int err;
 | 
				
			||||||
| 
						 | 
					@ -2480,6 +2482,13 @@ struct gpio_desc *gpiochip_request_own_desc(struct gpio_chip *chip, u16 hwnum,
 | 
				
			||||||
	if (err < 0)
 | 
						if (err < 0)
 | 
				
			||||||
		return ERR_PTR(err);
 | 
							return ERR_PTR(err);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err = gpiod_configure_flags(desc, label, 0, flags);
 | 
				
			||||||
 | 
						if (err) {
 | 
				
			||||||
 | 
							chip_err(chip, "setup of own GPIO %s failed\n", label);
 | 
				
			||||||
 | 
							gpiod_free_commit(desc);
 | 
				
			||||||
 | 
							return ERR_PTR(err);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return desc;
 | 
						return desc;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
EXPORT_SYMBOL_GPL(gpiochip_request_own_desc);
 | 
					EXPORT_SYMBOL_GPL(gpiochip_request_own_desc);
 | 
				
			||||||
| 
						 | 
					@ -4332,7 +4341,15 @@ int gpiod_hog(struct gpio_desc *desc, const char *name,
 | 
				
			||||||
	chip = gpiod_to_chip(desc);
 | 
						chip = gpiod_to_chip(desc);
 | 
				
			||||||
	hwnum = gpio_chip_hwgpio(desc);
 | 
						hwnum = gpio_chip_hwgpio(desc);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	local_desc = gpiochip_request_own_desc(chip, hwnum, name);
 | 
						/*
 | 
				
			||||||
 | 
						 * FIXME: not very elegant that we call gpiod_configure_flags()
 | 
				
			||||||
 | 
						 * twice here (once inside gpiochip_request_own_desc() and
 | 
				
			||||||
 | 
						 * again here), but the gpiochip_request_own_desc() is external
 | 
				
			||||||
 | 
						 * and cannot really pass the lflags so this is the lesser evil
 | 
				
			||||||
 | 
						 * at the moment. Pass zero as dflags on this first call so we
 | 
				
			||||||
 | 
						 * don't screw anything up.
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						local_desc = gpiochip_request_own_desc(chip, hwnum, name, 0);
 | 
				
			||||||
	if (IS_ERR(local_desc)) {
 | 
						if (IS_ERR(local_desc)) {
 | 
				
			||||||
		status = PTR_ERR(local_desc);
 | 
							status = PTR_ERR(local_desc);
 | 
				
			||||||
		pr_err("requesting hog GPIO %s (chip %s, offset %d) failed, %d\n",
 | 
							pr_err("requesting hog GPIO %s (chip %s, offset %d) failed, %d\n",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1203,7 +1203,7 @@ static int __maybe_unused cp2112_allocate_irq(struct cp2112_device *dev,
 | 
				
			||||||
		return -EINVAL;
 | 
							return -EINVAL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	dev->desc[pin] = gpiochip_request_own_desc(&dev->gc, pin,
 | 
						dev->desc[pin] = gpiochip_request_own_desc(&dev->gc, pin,
 | 
				
			||||||
						   "HID/I2C:Event");
 | 
											   "HID/I2C:Event", 0);
 | 
				
			||||||
	if (IS_ERR(dev->desc[pin])) {
 | 
						if (IS_ERR(dev->desc[pin])) {
 | 
				
			||||||
		dev_err(dev->gc.parent, "Failed to request GPIO\n");
 | 
							dev_err(dev->gc.parent, "Failed to request GPIO\n");
 | 
				
			||||||
		return PTR_ERR(dev->desc[pin]);
 | 
							return PTR_ERR(dev->desc[pin]);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2170,7 +2170,8 @@ static int gpmc_probe_generic_child(struct platform_device *pdev,
 | 
				
			||||||
		unsigned int wait_pin = gpmc_s.wait_pin;
 | 
							unsigned int wait_pin = gpmc_s.wait_pin;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		waitpin_desc = gpiochip_request_own_desc(&gpmc->gpio_chip,
 | 
							waitpin_desc = gpiochip_request_own_desc(&gpmc->gpio_chip,
 | 
				
			||||||
							 wait_pin, "WAITPIN");
 | 
												 wait_pin, "WAITPIN",
 | 
				
			||||||
 | 
												 0);
 | 
				
			||||||
		if (IS_ERR(waitpin_desc)) {
 | 
							if (IS_ERR(waitpin_desc)) {
 | 
				
			||||||
			dev_err(&pdev->dev, "invalid wait-pin: %d\n", wait_pin);
 | 
								dev_err(&pdev->dev, "invalid wait-pin: %d\n", wait_pin);
 | 
				
			||||||
			ret = PTR_ERR(waitpin_desc);
 | 
								ret = PTR_ERR(waitpin_desc);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -17,6 +17,7 @@ struct device_node;
 | 
				
			||||||
struct seq_file;
 | 
					struct seq_file;
 | 
				
			||||||
struct gpio_device;
 | 
					struct gpio_device;
 | 
				
			||||||
struct module;
 | 
					struct module;
 | 
				
			||||||
 | 
					enum gpiod_flags;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef CONFIG_GPIOLIB
 | 
					#ifdef CONFIG_GPIOLIB
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -604,7 +605,8 @@ gpiochip_remove_pin_ranges(struct gpio_chip *chip)
 | 
				
			||||||
#endif /* CONFIG_PINCTRL */
 | 
					#endif /* CONFIG_PINCTRL */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct gpio_desc *gpiochip_request_own_desc(struct gpio_chip *chip, u16 hwnum,
 | 
					struct gpio_desc *gpiochip_request_own_desc(struct gpio_chip *chip, u16 hwnum,
 | 
				
			||||||
					    const char *label);
 | 
										    const char *label,
 | 
				
			||||||
 | 
										    enum gpiod_flags flags);
 | 
				
			||||||
void gpiochip_free_own_desc(struct gpio_desc *desc);
 | 
					void gpiochip_free_own_desc(struct gpio_desc *desc);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#else /* CONFIG_GPIOLIB */
 | 
					#else /* CONFIG_GPIOLIB */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue