Commit abdc08a3 authored by Alexandre Courbot's avatar Alexandre Courbot Committed by Linus Walleij
Browse files

gpio: change gpiochip_request_own_desc() prototype



The current prototype of gpiochip_request_own_desc() requires to obtain
a pointer to a descriptor. This is in contradiction to all other GPIO
request schemes, and imposes an extra step of obtaining a descriptor to
drivers. Most drivers actually cannot even perform that step since the
function that does it (gpichip_get_desc()) is gpiolib-private.

Change gpiochip_request_own_desc() to return a descriptor from a
(chip, hwnum) tuple and update users of this function (currently
gpiolib-acpi only).

Signed-off-by: default avatarAlexandre Courbot <acourbot@nvidia.com>
Tested-by: default avatarMika Westerberg <mika.westerberg@linux.intel.com>
Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
parent e46cf32c
Loading
Loading
Loading
Loading
+2 −1
Original line number Original line Diff line number Diff line
@@ -178,7 +178,8 @@ does not help since it pins the module to the kernel forever (it calls
try_module_get()). A GPIO driver can use the following functions instead
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.


	int gpiochip_request_own_desc(struct gpio_desc *desc, const char *label)
	struct gpio_desc *gpiochip_request_own_desc(struct gpio_desc *desc,
						    const char *label)


	void gpiochip_free_own_desc(struct gpio_desc *desc)
	void gpiochip_free_own_desc(struct gpio_desc *desc)


+3 −17
Original line number Original line Diff line number Diff line
@@ -145,14 +145,8 @@ static acpi_status acpi_gpiochip_request_interrupt(struct acpi_resource *ares,
	if (!handler)
	if (!handler)
		return AE_BAD_PARAMETER;
		return AE_BAD_PARAMETER;


	desc = gpiochip_get_desc(chip, pin);
	desc = gpiochip_request_own_desc(chip, pin, "ACPI:Event");
	if (IS_ERR(desc)) {
	if (IS_ERR(desc)) {
		dev_err(chip->dev, "Failed to get GPIO descriptor\n");
		return AE_ERROR;
	}

	ret = gpiochip_request_own_desc(desc, "ACPI:Event");
	if (ret) {
		dev_err(chip->dev, "Failed to request GPIO\n");
		dev_err(chip->dev, "Failed to request GPIO\n");
		return AE_ERROR;
		return AE_ERROR;
	}
	}
@@ -420,22 +414,14 @@ acpi_gpio_adr_space_handler(u32 function, acpi_physical_address address,
			}
			}
		}
		}
		if (!found) {
		if (!found) {
			int ret;
			desc = gpiochip_request_own_desc(chip, pin,

							 "ACPI:OpRegion");
			desc = gpiochip_get_desc(chip, pin);
			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;
			}
			}


			ret = gpiochip_request_own_desc(desc, "ACPI:OpRegion");
			if (ret) {
				status = AE_ERROR;
				mutex_unlock(&achip->conn_lock);
				goto out;
			}

			switch (agpio->io_restriction) {
			switch (agpio->io_restriction) {
			case ACPI_IO_RESTRICT_INPUT:
			case ACPI_IO_RESTRICT_INPUT:
				gpiod_direction_input(desc);
				gpiod_direction_input(desc);
+14 −4
Original line number Original line Diff line number Diff line
@@ -895,12 +895,22 @@ EXPORT_SYMBOL_GPL(gpiochip_is_requested);
 * allows the GPIO chip module to be unloaded as needed (we assume that the
 * allows the GPIO chip module to be unloaded as needed (we assume that the
 * GPIO chip driver handles freeing the GPIOs it has requested).
 * GPIO chip driver handles freeing the GPIOs it has requested).
 */
 */
int gpiochip_request_own_desc(struct gpio_desc *desc, const char *label)
struct gpio_desc *gpiochip_request_own_desc(struct gpio_chip *chip, u16 hwnum,
					    const char *label)
{
{
	if (!desc || !desc->chip)
	struct gpio_desc *desc = gpiochip_get_desc(chip, hwnum);
		return -EINVAL;
	int err;

	if (IS_ERR(desc)) {
		chip_err(chip, "failed to get GPIO descriptor\n");
		return desc;
	}

	err = __gpiod_request(desc, label);
	if (err < 0)
		return ERR_PTR(err);


	return __gpiod_request(desc, label);
	return desc;
}
}
EXPORT_SYMBOL_GPL(gpiochip_request_own_desc);
EXPORT_SYMBOL_GPL(gpiochip_request_own_desc);


+2 −1
Original line number Original line Diff line number Diff line
@@ -166,7 +166,8 @@ int gpiochip_irqchip_add(struct gpio_chip *gpiochip,


#endif /* CONFIG_GPIO_IRQCHIP */
#endif /* CONFIG_GPIO_IRQCHIP */


int gpiochip_request_own_desc(struct gpio_desc *desc, const char *label);
struct gpio_desc *gpiochip_request_own_desc(struct gpio_chip *chip, u16 hwnum,
					    const char *label);
void gpiochip_free_own_desc(struct gpio_desc *desc);
void gpiochip_free_own_desc(struct gpio_desc *desc);


#else /* CONFIG_GPIOLIB */
#else /* CONFIG_GPIOLIB */