|
@@ -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,
|
|
static inline void set_gpio_trigger(struct gpio_bank *bank, int gpio,
|
|
unsigned trigger)
|
|
unsigned trigger)
|
|
{
|
|
{
|
|
@@ -539,6 +573,7 @@ static void _reset_gpio(struct gpio_bank *bank, int gpio)
|
|
_set_gpio_irqenable(bank, gpio, 0);
|
|
_set_gpio_irqenable(bank, gpio, 0);
|
|
_clear_gpio_irqstatus(bank, gpio);
|
|
_clear_gpio_irqstatus(bank, gpio);
|
|
_set_gpio_triggering(bank, GPIO_INDEX(bank, gpio), IRQ_TYPE_NONE);
|
|
_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 */
|
|
/* Use disable_irq_wake() and enable_irq_wake() functions from drivers */
|