diff options
Diffstat (limited to 'drivers/gpio')
| -rw-r--r-- | drivers/gpio/Kconfig | 2 | ||||
| -rw-r--r-- | drivers/gpio/devres.c | 1 | ||||
| -rw-r--r-- | drivers/gpio/gpio-mxc.c | 10 | ||||
| -rw-r--r-- | drivers/gpio/gpio-omap.c | 14 | ||||
| -rw-r--r-- | drivers/gpio/gpio-sta2x11.c | 5 | ||||
| -rw-r--r-- | drivers/gpio/gpio-tps65910.c | 3 | ||||
| -rw-r--r-- | drivers/gpio/gpio-wm8994.c | 5 | 
7 files changed, 31 insertions, 9 deletions
| diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig index c4067d0141f7..542f0c04b695 100644 --- a/drivers/gpio/Kconfig +++ b/drivers/gpio/Kconfig @@ -136,7 +136,7 @@ config GPIO_MPC8XXX  config GPIO_MSM_V1  	tristate "Qualcomm MSM GPIO v1" -	depends on GPIOLIB && ARCH_MSM +	depends on GPIOLIB && ARCH_MSM && (ARCH_MSM7X00A || ARCH_MSM7X30 || ARCH_QSD8X50)  	help  	  Say yes here to support the GPIO interface on ARM v6 based  	  Qualcomm MSM chips.  Most of the pins on the MSM can be diff --git a/drivers/gpio/devres.c b/drivers/gpio/devres.c index 9e9947cb86a3..1077754f8289 100644 --- a/drivers/gpio/devres.c +++ b/drivers/gpio/devres.c @@ -98,6 +98,7 @@ int devm_gpio_request_one(struct device *dev, unsigned gpio,  	return 0;  } +EXPORT_SYMBOL(devm_gpio_request_one);  /**   *      devm_gpio_free - free an interrupt diff --git a/drivers/gpio/gpio-mxc.c b/drivers/gpio/gpio-mxc.c index c337143b18f8..c89c4c1e668d 100644 --- a/drivers/gpio/gpio-mxc.c +++ b/drivers/gpio/gpio-mxc.c @@ -398,10 +398,12 @@ static int __devinit mxc_gpio_probe(struct platform_device *pdev)  	writel(~0, port->base + GPIO_ISR);  	if (mxc_gpio_hwtype == IMX21_GPIO) { -		/* setup one handler for all GPIO interrupts */ -		if (pdev->id == 0) -			irq_set_chained_handler(port->irq, -						mx2_gpio_irq_handler); +		/* +		 * Setup one handler for all GPIO interrupts. Actually setting +		 * the handler is needed only once, but doing it for every port +		 * is more robust and easier. +		 */ +		irq_set_chained_handler(port->irq, mx2_gpio_irq_handler);  	} else {  		/* setup one handler for each entry */  		irq_set_chained_handler(port->irq, mx3_gpio_irq_handler); diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c index c4ed1722734c..4fbc208c32cf 100644 --- a/drivers/gpio/gpio-omap.c +++ b/drivers/gpio/gpio-omap.c @@ -174,12 +174,22 @@ static inline void _gpio_dbck_enable(struct gpio_bank *bank)  	if (bank->dbck_enable_mask && !bank->dbck_enabled) {  		clk_enable(bank->dbck);  		bank->dbck_enabled = true; + +		__raw_writel(bank->dbck_enable_mask, +			     bank->base + bank->regs->debounce_en);  	}  }  static inline void _gpio_dbck_disable(struct gpio_bank *bank)  {  	if (bank->dbck_enable_mask && bank->dbck_enabled) { +		/* +		 * Disable debounce before cutting it's clock. If debounce is +		 * enabled but the clock is not, GPIO module seems to be unable +		 * to detect events and generate interrupts at least on OMAP3. +		 */ +		__raw_writel(0, bank->base + bank->regs->debounce_en); +  		clk_disable(bank->dbck);  		bank->dbck_enabled = false;  	} @@ -1081,7 +1091,6 @@ static int __devinit omap_gpio_probe(struct platform_device *pdev)  	bank->is_mpuio = pdata->is_mpuio;  	bank->non_wakeup_gpios = pdata->non_wakeup_gpios;  	bank->loses_context = pdata->loses_context; -	bank->get_context_loss_count = pdata->get_context_loss_count;  	bank->regs = pdata->regs;  #ifdef CONFIG_OF_GPIO  	bank->chip.of_node = of_node_get(node); @@ -1135,6 +1144,9 @@ static int __devinit omap_gpio_probe(struct platform_device *pdev)  	omap_gpio_chip_init(bank);  	omap_gpio_show_rev(bank); +	if (bank->loses_context) +		bank->get_context_loss_count = pdata->get_context_loss_count; +  	pm_runtime_put(bank->dev);  	list_add_tail(&bank->node, &omap_gpio_list); diff --git a/drivers/gpio/gpio-sta2x11.c b/drivers/gpio/gpio-sta2x11.c index 38416be8ba11..6064fb376e11 100644 --- a/drivers/gpio/gpio-sta2x11.c +++ b/drivers/gpio/gpio-sta2x11.c @@ -383,8 +383,9 @@ static int __devinit gsta_probe(struct platform_device *dev)  	}  	spin_lock_init(&chip->lock);  	gsta_gpio_setup(chip); -	for (i = 0; i < GSTA_NR_GPIO; i++) -		gsta_set_config(chip, i, gpio_pdata->pinconfig[i]); +	if (gpio_pdata) +		for (i = 0; i < GSTA_NR_GPIO; i++) +			gsta_set_config(chip, i, gpio_pdata->pinconfig[i]);  	/* 384 was used in previous code: be compatible for other drivers */  	err = irq_alloc_descs(-1, 384, GSTA_NR_GPIO, NUMA_NO_NODE); diff --git a/drivers/gpio/gpio-tps65910.c b/drivers/gpio/gpio-tps65910.c index c1ad2884f2ed..11f29c82253c 100644 --- a/drivers/gpio/gpio-tps65910.c +++ b/drivers/gpio/gpio-tps65910.c @@ -149,6 +149,9 @@ static int __devinit tps65910_gpio_probe(struct platform_device *pdev)  	tps65910_gpio->gpio_chip.set	= tps65910_gpio_set;  	tps65910_gpio->gpio_chip.get	= tps65910_gpio_get;  	tps65910_gpio->gpio_chip.dev = &pdev->dev; +#ifdef CONFIG_OF_GPIO +	tps65910_gpio->gpio_chip.of_node = tps65910->dev->of_node; +#endif  	if (pdata && pdata->gpio_base)  		tps65910_gpio->gpio_chip.base = pdata->gpio_base;  	else diff --git a/drivers/gpio/gpio-wm8994.c b/drivers/gpio/gpio-wm8994.c index 92ea5350dfe9..aa61ad2fcaaa 100644 --- a/drivers/gpio/gpio-wm8994.c +++ b/drivers/gpio/gpio-wm8994.c @@ -89,8 +89,11 @@ static int wm8994_gpio_direction_out(struct gpio_chip *chip,  	struct wm8994_gpio *wm8994_gpio = to_wm8994_gpio(chip);  	struct wm8994 *wm8994 = wm8994_gpio->wm8994; +	if (value) +		value = WM8994_GPN_LVL; +  	return wm8994_set_bits(wm8994, WM8994_GPIO_1 + offset, -			       WM8994_GPN_DIR, 0); +			       WM8994_GPN_DIR | WM8994_GPN_LVL, value);  }  static void wm8994_gpio_set(struct gpio_chip *chip, unsigned offset, int value) | 
