diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-10-09 14:58:15 -0400 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-10-09 14:58:15 -0400 | 
| commit | ea584595fc85e65796335033dfca25ed655cd0ed (patch) | |
| tree | 79d444c507472f6c66d887ad332e7c1784eeb4de /drivers/gpio/gpio-omap.c | |
| parent | 782d59c5dfc5ac39ac8cfb4c6dd40597938dde9c (diff) | |
| parent | a092e19b688be88f7329bd05f90cb92ebe1a4f5b (diff) | |
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
  ...
Diffstat (limited to 'drivers/gpio/gpio-omap.c')
| -rw-r--r-- | drivers/gpio/gpio-omap.c | 33 | 
1 files changed, 18 insertions, 15 deletions
diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c index 174932165fcb..415682f69214 100644 --- a/drivers/gpio/gpio-omap.c +++ b/drivers/gpio/gpio-omap.c @@ -857,16 +857,6 @@ static void omap_gpio_unmask_irq(struct irq_data *d)  	spin_unlock_irqrestore(&bank->lock, flags);  } -static struct irq_chip gpio_irq_chip = { -	.name		= "GPIO", -	.irq_shutdown	= omap_gpio_irq_shutdown, -	.irq_ack	= omap_gpio_ack_irq, -	.irq_mask	= omap_gpio_mask_irq, -	.irq_unmask	= omap_gpio_unmask_irq, -	.irq_set_type	= omap_gpio_irq_type, -	.irq_set_wake	= omap_gpio_wake_enable, -}; -  /*---------------------------------------------------------------------*/  static int omap_mpuio_suspend_noirq(struct device *dev) @@ -1088,7 +1078,7 @@ omap_mpuio_alloc_gc(struct gpio_bank *bank, unsigned int irq_start,  			       IRQ_NOREQUEST | IRQ_NOPROBE, 0);  } -static int omap_gpio_chip_init(struct gpio_bank *bank) +static int omap_gpio_chip_init(struct gpio_bank *bank, struct irq_chip *irqc)  {  	int j;  	static int gpio; @@ -1137,17 +1127,17 @@ static int omap_gpio_chip_init(struct gpio_bank *bank)  	}  #endif -	ret = gpiochip_irqchip_add(&bank->chip, &gpio_irq_chip, +	ret = gpiochip_irqchip_add(&bank->chip, irqc,  				   irq_base, omap_gpio_irq_handler,  				   IRQ_TYPE_NONE);  	if (ret) {  		dev_err(bank->dev, "Couldn't add irqchip to gpiochip %d\n", ret); -		ret = gpiochip_remove(&bank->chip); +		gpiochip_remove(&bank->chip);  		return -ENODEV;  	} -	gpiochip_set_chained_irqchip(&bank->chip, &gpio_irq_chip, +	gpiochip_set_chained_irqchip(&bank->chip, irqc,  				     bank->irq, omap_gpio_irq_handler);  	for (j = 0; j < bank->width; j++) { @@ -1172,6 +1162,7 @@ static int omap_gpio_probe(struct platform_device *pdev)  	const struct omap_gpio_platform_data *pdata;  	struct resource *res;  	struct gpio_bank *bank; +	struct irq_chip *irqc;  	int ret;  	match = of_match_device(of_match_ptr(omap_gpio_match), dev); @@ -1186,6 +1177,18 @@ static int omap_gpio_probe(struct platform_device *pdev)  		return -ENOMEM;  	} +	irqc = devm_kzalloc(dev, sizeof(*irqc), GFP_KERNEL); +	if (!irqc) +		return -ENOMEM; + +	irqc->irq_shutdown = omap_gpio_irq_shutdown, +	irqc->irq_ack = omap_gpio_ack_irq, +	irqc->irq_mask = omap_gpio_mask_irq, +	irqc->irq_unmask = omap_gpio_unmask_irq, +	irqc->irq_set_type = omap_gpio_irq_type, +	irqc->irq_set_wake = omap_gpio_wake_enable, +	irqc->name = dev_name(&pdev->dev); +  	res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);  	if (unlikely(!res)) {  		dev_err(dev, "Invalid IRQ resource\n"); @@ -1241,7 +1244,7 @@ static int omap_gpio_probe(struct platform_device *pdev)  	omap_gpio_mod_init(bank); -	ret = omap_gpio_chip_init(bank); +	ret = omap_gpio_chip_init(bank, irqc);  	if (ret)  		return ret;  | 
