diff options
Diffstat (limited to 'drivers/gpio/gpio-omap.c')
| -rw-r--r-- | drivers/gpio/gpio-omap.c | 35 | 
1 files changed, 35 insertions, 0 deletions
diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c index 94cbc842fbc..d335af1d4d8 100644 --- a/drivers/gpio/gpio-omap.c +++ b/drivers/gpio/gpio-omap.c @@ -251,6 +251,40 @@ static void _set_gpio_debounce(struct gpio_bank *bank, unsigned gpio,  	}  } +/** + * _clear_gpio_debounce - clear debounce settings for a gpio + * @bank: the gpio bank we're acting upon + * @gpio: the gpio number on this @gpio + * + * If a gpio is using debounce, then clear the debounce enable bit and if + * this is the only gpio in this bank using debounce, then clear the debounce + * time too. The debounce clock will also be disabled when calling this function + * if this is the only gpio in the bank using debounce. + */ +static void _clear_gpio_debounce(struct gpio_bank *bank, unsigned gpio) +{ +	u32 gpio_bit = GPIO_BIT(bank, gpio); + +	if (!bank->dbck_flag) +		return; + +	if (!(bank->dbck_enable_mask & gpio_bit)) +		return; + +	bank->dbck_enable_mask &= ~gpio_bit; +	bank->context.debounce_en &= ~gpio_bit; +	__raw_writel(bank->context.debounce_en, +		     bank->base + bank->regs->debounce_en); + +	if (!bank->dbck_enable_mask) { +		bank->context.debounce = 0; +		__raw_writel(bank->context.debounce, bank->base + +			     bank->regs->debounce); +		clk_disable(bank->dbck); +		bank->dbck_enabled = false; +	} +} +  static inline void set_gpio_trigger(struct gpio_bank *bank, int gpio,  						unsigned trigger)  { @@ -539,6 +573,7 @@ static void _reset_gpio(struct gpio_bank *bank, int gpio)  	_set_gpio_irqenable(bank, gpio, 0);  	_clear_gpio_irqstatus(bank, gpio);  	_set_gpio_triggering(bank, GPIO_INDEX(bank, gpio), IRQ_TYPE_NONE); +	_clear_gpio_debounce(bank, gpio);  }  /* Use disable_irq_wake() and enable_irq_wake() functions from drivers */  |