gpiolib: Introduce ->add_pin_ranges() callback
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>
This commit is contained in:
Родитель
6b240aeb12
Коммит
b056ca1c2f
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
Загрузка…
Ссылка в новой задаче