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

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
...@@ -178,7 +178,8 @@ does not help since it pins the module to the kernel forever (it calls ...@@ -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)
......
...@@ -145,14 +145,8 @@ static acpi_status acpi_gpiochip_request_interrupt(struct acpi_resource *ares, ...@@ -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, ...@@ -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);
......
...@@ -895,12 +895,22 @@ EXPORT_SYMBOL_GPL(gpiochip_is_requested); ...@@ -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);
......
...@@ -166,7 +166,8 @@ int gpiochip_irqchip_add(struct gpio_chip *gpiochip, ...@@ -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 */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment