gpio: change gpiochip_request_own_desc() prototype
authorAlexandre Courbot <acourbot@nvidia.com>
Tue, 19 Aug 2014 17:06:09 +0000 (10:06 -0700)
committerLinus Walleij <linus.walleij@linaro.org>
Fri, 29 Aug 2014 06:58:34 +0000 (08:58 +0200)
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>
Documentation/gpio/driver.txt
drivers/gpio/gpiolib-acpi.c
drivers/gpio/gpiolib.c
include/linux/gpio/driver.h

index 18790c237977b5a585953ffef3e45a0eab64e468..23b751a10d7b0850ce0a8aee23da026be01222ce 100644 (file)
@@ -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)
 
index 84540025aa08a3f22b36b78859a442a66b542f0d..f9103e72e2a41dcd1584c74aaa367c59fe423975 100644 (file)
@@ -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);
index 15cc0bb65dda84f8e5b8151722434f6073e61e5b..a5831d6a9b9108c0c5b676f0912ab347c5ec9fb3 100644 (file)
@@ -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;
+
+       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);
 
index e78a2373e37453776a3cec8d6e9d6aea93738f24..a2de58fffd1918753b630b6b2f111c6566d9965b 100644 (file)
@@ -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 */