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:
+2
-1
@@ -605,7 +605,8 @@ static int asic3_gpio_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct asic3 *asic = platform_get_drvdata(pdev);
|
||||
|
||||
return gpiochip_remove(&asic->gpio);
|
||||
gpiochip_remove(&asic->gpio);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void asic3_clk_enable(struct asic3 *asic, struct asic3_clk *clk)
|
||||
|
||||
@@ -481,15 +481,9 @@ static int htcpld_register_chip_gpio(
|
||||
|
||||
ret = gpiochip_add(&(chip->chip_in));
|
||||
if (ret) {
|
||||
int error;
|
||||
|
||||
dev_warn(dev, "Unable to register input GPIOs for 0x%x: %d\n",
|
||||
plat_chip_data->addr, ret);
|
||||
|
||||
error = gpiochip_remove(&(chip->chip_out));
|
||||
if (error)
|
||||
dev_warn(dev, "Error while trying to unregister gpio chip: %d\n", error);
|
||||
|
||||
gpiochip_remove(&(chip->chip_out));
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
+3
-14
@@ -1047,7 +1047,6 @@ static int sm501_register_gpio(struct sm501_devdata *sm)
|
||||
struct sm501_gpio *gpio = &sm->gpio;
|
||||
resource_size_t iobase = sm->io_res->start + SM501_GPIO;
|
||||
int ret;
|
||||
int tmp;
|
||||
|
||||
dev_dbg(sm->dev, "registering gpio block %08llx\n",
|
||||
(unsigned long long)iobase);
|
||||
@@ -1086,11 +1085,7 @@ static int sm501_register_gpio(struct sm501_devdata *sm)
|
||||
return 0;
|
||||
|
||||
err_low_chip:
|
||||
tmp = gpiochip_remove(&gpio->low.gpio);
|
||||
if (tmp) {
|
||||
dev_err(sm->dev, "cannot remove low chip, cannot tidy up\n");
|
||||
return ret;
|
||||
}
|
||||
gpiochip_remove(&gpio->low.gpio);
|
||||
|
||||
err_mapped:
|
||||
iounmap(gpio->regs);
|
||||
@@ -1105,18 +1100,12 @@ static int sm501_register_gpio(struct sm501_devdata *sm)
|
||||
static void sm501_gpio_remove(struct sm501_devdata *sm)
|
||||
{
|
||||
struct sm501_gpio *gpio = &sm->gpio;
|
||||
int ret;
|
||||
|
||||
if (!sm->gpio.registered)
|
||||
return;
|
||||
|
||||
ret = gpiochip_remove(&gpio->low.gpio);
|
||||
if (ret)
|
||||
dev_err(sm->dev, "cannot remove low chip, cannot tidy up\n");
|
||||
|
||||
ret = gpiochip_remove(&gpio->high.gpio);
|
||||
if (ret)
|
||||
dev_err(sm->dev, "cannot remove high chip, cannot tidy up\n");
|
||||
gpiochip_remove(&gpio->low.gpio);
|
||||
gpiochip_remove(&gpio->high.gpio);
|
||||
|
||||
iounmap(gpio->regs);
|
||||
release_resource(gpio->regs_res);
|
||||
|
||||
@@ -607,7 +607,7 @@ static int tc6393xb_probe(struct platform_device *dev)
|
||||
struct tc6393xb_platform_data *tcpd = dev_get_platdata(&dev->dev);
|
||||
struct tc6393xb *tc6393xb;
|
||||
struct resource *iomem, *rscr;
|
||||
int ret, temp;
|
||||
int ret;
|
||||
|
||||
iomem = platform_get_resource(dev, IORESOURCE_MEM, 0);
|
||||
if (!iomem)
|
||||
@@ -714,7 +714,7 @@ err_setup:
|
||||
|
||||
err_gpio_add:
|
||||
if (tc6393xb->gpio.base != -1)
|
||||
temp = gpiochip_remove(&tc6393xb->gpio);
|
||||
gpiochip_remove(&tc6393xb->gpio);
|
||||
tcpd->disable(dev);
|
||||
err_enable:
|
||||
clk_disable(tc6393xb->clk);
|
||||
@@ -744,13 +744,8 @@ static int tc6393xb_remove(struct platform_device *dev)
|
||||
|
||||
tc6393xb_detach_irq(dev);
|
||||
|
||||
if (tc6393xb->gpio.base != -1) {
|
||||
ret = gpiochip_remove(&tc6393xb->gpio);
|
||||
if (ret) {
|
||||
dev_err(&dev->dev, "Can't remove gpio chip: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
if (tc6393xb->gpio.base != -1)
|
||||
gpiochip_remove(&tc6393xb->gpio);
|
||||
|
||||
ret = tcpd->disable(dev);
|
||||
clk_disable(tc6393xb->clk);
|
||||
|
||||
@@ -621,7 +621,6 @@ static void ucb1x00_remove(struct mcp *mcp)
|
||||
struct ucb1x00_plat_data *pdata = mcp->attached_device.platform_data;
|
||||
struct ucb1x00 *ucb = mcp_get_drvdata(mcp);
|
||||
struct list_head *l, *n;
|
||||
int ret;
|
||||
|
||||
mutex_lock(&ucb1x00_mutex);
|
||||
list_del(&ucb->node);
|
||||
@@ -631,11 +630,8 @@ static void ucb1x00_remove(struct mcp *mcp)
|
||||
}
|
||||
mutex_unlock(&ucb1x00_mutex);
|
||||
|
||||
if (ucb->gpio.base != -1) {
|
||||
ret = gpiochip_remove(&ucb->gpio);
|
||||
if (ret)
|
||||
dev_err(&ucb->dev, "Can't remove gpio chip: %d\n", ret);
|
||||
}
|
||||
if (ucb->gpio.base != -1)
|
||||
gpiochip_remove(&ucb->gpio);
|
||||
|
||||
irq_set_chained_handler(ucb->irq, NULL);
|
||||
irq_free_descs(ucb->irq_base, 16);
|
||||
|
||||
Reference in New Issue
Block a user