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: Alexandre Courbot <acourbot@nvidia.com> Tested-by: Mika Westerberg <mika.westerberg@linux.intel.com> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
This commit is contained in:
Родитель
e46cf32ced
Коммит
abdc08a3a2
|
@ -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
|
||||
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)
|
||||
|
||||
|
|
|
@ -145,14 +145,8 @@ static acpi_status acpi_gpiochip_request_interrupt(struct acpi_resource *ares,
|
|||
if (!handler)
|
||||
return AE_BAD_PARAMETER;
|
||||
|
||||
desc = gpiochip_get_desc(chip, pin);
|
||||
desc = gpiochip_request_own_desc(chip, pin, "ACPI:Event");
|
||||
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");
|
||||
return AE_ERROR;
|
||||
}
|
||||
|
@ -420,22 +414,14 @@ acpi_gpio_adr_space_handler(u32 function, acpi_physical_address address,
|
|||
}
|
||||
}
|
||||
if (!found) {
|
||||
int ret;
|
||||
|
||||
desc = gpiochip_get_desc(chip, pin);
|
||||
desc = gpiochip_request_own_desc(chip, pin,
|
||||
"ACPI:OpRegion");
|
||||
if (IS_ERR(desc)) {
|
||||
status = AE_ERROR;
|
||||
mutex_unlock(&achip->conn_lock);
|
||||
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) {
|
||||
case ACPI_IO_RESTRICT_INPUT:
|
||||
gpiod_direction_input(desc);
|
||||
|
|
|
@ -895,12 +895,22 @@ EXPORT_SYMBOL_GPL(gpiochip_is_requested);
|
|||
* 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)
|
||||
struct gpio_desc *gpiochip_request_own_desc(struct gpio_chip *chip, u16 hwnum,
|
||||
const char *label)
|
||||
{
|
||||
if (!desc || !desc->chip)
|
||||
return -EINVAL;
|
||||
struct gpio_desc *desc = gpiochip_get_desc(chip, hwnum);
|
||||
int err;
|
||||
|
||||
return __gpiod_request(desc, label);
|
||||
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 desc;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(gpiochip_request_own_desc);
|
||||
|
||||
|
|
|
@ -166,7 +166,8 @@ int gpiochip_irqchip_add(struct gpio_chip *gpiochip,
|
|||
|
||||
#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);
|
||||
|
||||
#else /* CONFIG_GPIOLIB */
|
||||
|
|
Загрузка…
Ссылка в новой задаче