]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
gpiolib: Introduce ->add_pin_ranges() callback
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Mon, 4 Nov 2019 16:09:39 +0000 (18:09 +0200)
committerAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Wed, 13 Nov 2019 13:30:30 +0000 (15:30 +0200)
When IRQ chip is being added by GPIO library, the ACPI based platform expects
GPIO <-> pin mapping ranges to be initialized in order to correctly initialize
ACPI event mechanism on affected platforms. Unfortunately this step is missed.

Introduce ->add_pin_ranges() callback to fill the above mentioned gap.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Reviewed-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
Tested-by: Hans de Goede <hdegoede@redhat.com>
drivers/gpio/gpiolib.c
include/linux/gpio/driver.h

index 731d732cdc2b72d591f39180b4ef5fc98eb102b1..1dc144f834832f324a806220857c9a3d41437d5a 100644 (file)
@@ -390,6 +390,14 @@ static void gpiochip_free_valid_mask(struct gpio_chip *gpiochip)
        gpiochip->valid_mask = NULL;
 }
 
+static int gpiochip_add_pin_ranges(struct gpio_chip *gc)
+{
+       if (gc->add_pin_ranges)
+               return gc->add_pin_ranges(gc);
+
+       return 0;
+}
+
 bool gpiochip_line_is_valid(const struct gpio_chip *gpiochip,
                                unsigned int offset)
 {
@@ -1397,6 +1405,10 @@ int gpiochip_add_data_with_key(struct gpio_chip *chip, void *data,
                }
        }
 
+       ret = gpiochip_add_pin_ranges(chip);
+       if (ret)
+               goto err_remove_of_chip;
+
        acpi_gpiochip_add(chip);
 
        machine_gpiochip_add(chip);
index cc9ade4552d95c9de2b8c929e66f06ab875e799b..e2480ef94c5597b5cb8a33dcafec95e4c29d10b0 100644 (file)
@@ -289,6 +289,9 @@ struct gpio_irq_chip {
  *     state (such as pullup/pulldown configuration).
  * @init_valid_mask: optional routine to initialize @valid_mask, to be used if
  *     not all GPIOs are valid.
+ * @add_pin_ranges: optional routine to initialize pin ranges, to be used when
+ *     requires special mapping of the pins that provides GPIO functionality.
+ *     It is called after adding GPIO chip and before adding IRQ chip.
  * @base: identifies the first GPIO number handled by this chip;
  *     or, if negative during registration, requests dynamic ID allocation.
  *     DEPRECATION: providing anything non-negative and nailing the base
@@ -379,6 +382,8 @@ struct gpio_chip {
                                                   unsigned long *valid_mask,
                                                   unsigned int ngpios);
 
+       int                     (*add_pin_ranges)(struct gpio_chip *chip);
+
        int                     base;
        u16                     ngpio;
        const char              *const *names;