Merge tag 'gpio-v3.18-1' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-gpio
Pull GPIO changes from Linus Walleij: "This is the bulk of GPIO changes for the v3.18 development cycle: - Increase the default ARCH_NR_GPIO from 256 to 512. This was done to avoid having a custom <asm/gpio.h> header for the x86 architecture - GPIO is custom and complicated enough as it is already! We want to move to a radix to store the descriptors going forward, and finally get rid of this fixed array size altogether. - Endgame patching of the gpio_remove() semantics initiated by Abdoulaye Berthe. It is not accepted by the system that the removal of a GPIO chip fails during eg reboot or shutdown, and therefore the return value has now painfully been refactored away. For special cases like GPIO expanders on a hot-pluggable bus like USB, we may later add some gpiochip_try_remove() call, but for the cases we have now, return values are moot. - Some incremental refactoring of the gpiolib core and ACPI GPIO library for more descriptor usage. - Refactor the chained IRQ handler set-up method to handle also threaded, nested interrupts and set up the parent IRQ correctly. Switch STMPE and TC3589x drivers to use this registration method. - Add a .irq_not_threaded flag to the struct gpio_chip, so that also GPIO expanders that block but are still not using threaded IRQ handlers. - New drivers for the ARM64 X-Gene SoC GPIO controller. - The syscon GPIO driver has been improved to handle the "DSP GPIO" found on the TI Keystone 2 SoC:s. - ADNP driver switched to use gpiolib irqchip helpers. - Refactor the DWAPB driver to support being instantiated from and MFD cell (platform device). - Incremental feature improvement in the Zynq, MCP23S08, DWAPB, OMAP, Xilinx and Crystalcove drivers. - Various minor fixes" * tag 'gpio-v3.18-1' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-gpio: (52 commits) gpio: pch: Build context save/restore only for PM pinctrl: abx500: get rid of unused variable gpio: ks8695: fix 'else should follow close brace '}'' gpio: stmpe: add verbose debug code gpio: stmpe: fix up interrupt enable logic gpio: staticize xway_stp_init() gpio: handle also nested irqchips in the chained handler set-up gpio: set parent irq on chained handlers gpiolib: irqchip: use irq_find_mapping while removing irqchip gpio: crystalcove: support virtual GPIO pinctrl: bcm281xx: make Kconfig dependency more strict gpio: kona: enable only on BCM_MOBILE or for compile testing gpio, bcm-kona, LLVMLinux: Remove use of __initconst gpio: Fix ngpio in gpio-xilinx driver gpio: dwapb: fix pointer to integer cast gpio: xgene: Remove unneeded #ifdef CONFIG_OF guard gpio: xgene: Remove unneeded forward declation for struct xgene_gpio gpio: xgene: Fix missing spin_lock_init() gpio: ks8695: fix switch case indentation gpiolib: add irq_not_threaded flag to gpio_chip ...
This commit is contained in:
@@ -25,10 +25,12 @@ struct acpi_gpio_event {
|
||||
acpi_handle handle;
|
||||
unsigned int pin;
|
||||
unsigned int irq;
|
||||
struct gpio_desc *desc;
|
||||
};
|
||||
|
||||
struct acpi_gpio_connection {
|
||||
struct list_head node;
|
||||
unsigned int pin;
|
||||
struct gpio_desc *desc;
|
||||
};
|
||||
|
||||
@@ -143,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;
|
||||
}
|
||||
@@ -197,6 +193,7 @@ static acpi_status acpi_gpiochip_request_interrupt(struct acpi_resource *ares,
|
||||
event->handle = evt_handle;
|
||||
event->irq = irq;
|
||||
event->pin = pin;
|
||||
event->desc = desc;
|
||||
|
||||
ret = request_threaded_irq(event->irq, NULL, handler, irqflags,
|
||||
"ACPI:Event", event);
|
||||
@@ -280,7 +277,7 @@ void acpi_gpiochip_free_interrupts(struct gpio_chip *chip)
|
||||
struct gpio_desc *desc;
|
||||
|
||||
free_irq(event->irq, event);
|
||||
desc = gpiochip_get_desc(chip, event->pin);
|
||||
desc = event->desc;
|
||||
if (WARN_ON(IS_ERR(desc)))
|
||||
continue;
|
||||
gpio_unlock_as_irq(chip, event->pin);
|
||||
@@ -409,26 +406,20 @@ acpi_gpio_adr_space_handler(u32 function, acpi_physical_address address,
|
||||
struct gpio_desc *desc;
|
||||
bool found;
|
||||
|
||||
desc = gpiochip_get_desc(chip, pin);
|
||||
if (IS_ERR(desc)) {
|
||||
status = AE_ERROR;
|
||||
goto out;
|
||||
}
|
||||
|
||||
mutex_lock(&achip->conn_lock);
|
||||
|
||||
found = false;
|
||||
list_for_each_entry(conn, &achip->conns, node) {
|
||||
if (conn->desc == desc) {
|
||||
if (conn->pin == pin) {
|
||||
found = true;
|
||||
desc = conn->desc;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!found) {
|
||||
int ret;
|
||||
|
||||
ret = gpiochip_request_own_desc(desc, "ACPI:OpRegion");
|
||||
if (ret) {
|
||||
desc = gpiochip_request_own_desc(chip, pin,
|
||||
"ACPI:OpRegion");
|
||||
if (IS_ERR(desc)) {
|
||||
status = AE_ERROR;
|
||||
mutex_unlock(&achip->conn_lock);
|
||||
goto out;
|
||||
@@ -465,6 +456,7 @@ acpi_gpio_adr_space_handler(u32 function, acpi_physical_address address,
|
||||
goto out;
|
||||
}
|
||||
|
||||
conn->pin = pin;
|
||||
conn->desc = desc;
|
||||
list_add_tail(&conn->node, &achip->conns);
|
||||
}
|
||||
|
Reference in New Issue
Block a user