提交 abdc08a3 编写于 作者: A Alexandre Courbot 提交者: 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: NAlexandre Courbot <acourbot@nvidia.com>
Tested-by: NMika Westerberg <mika.westerberg@linux.intel.com>
Signed-off-by: NLinus Walleij <linus.walleij@linaro.org>
上级 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% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册