@@ -1855,6 +1855,7 @@ static int __init _omap_gpio_init(void)
bank->chip.get = gpio_get;
bank->chip.direction_output = gpio_output;
bank->chip.set_debounce = gpio_debounce;
+ bank->chip->flags = GPIO_FLAG_DEBOUNCE;
bank->chip.set = gpio_set;
bank->chip.to_irq = gpio_2irq;
if (bank_is_mpuio(bank)) {
@@ -1461,9 +1461,14 @@ int gpio_set_debounce(unsigned gpio, unsigned debounce)
spin_lock_irqsave(&gpio_lock, flags);
+ chip = desc->chip;
+ if (!(chip->flags & GPIO_FLAG_DEBOUNCE)) {
+ spin_unlock_irqrestore(&gpio_lock, flags);
+ return 0;
+ }
+
if (!gpio_is_valid(gpio))
goto fail;
- chip = desc->chip;
if (!chip || !chip->set || !chip->set_debounce)
goto fail;
gpio -= chip->base;
@@ -32,6 +32,8 @@ struct device;
struct seq_file;
struct module;
+#define GPIO_FLAG_DEBOUNCE (1 << 0)
+
/**
* struct gpio_chip - abstract a GPIO controller
* @label: for diagnostics
@@ -61,6 +63,7 @@ struct module;
* names for the GPIOs in this chip. Any entry in the array
* may be NULL if there is no alias for the GPIO, however the
* array must be @ngpio entries long.
+ * @flags: a bitmap for supported features by that particular gpio chip.
*
* A gpio_chip can help platforms abstract various sources of GPIOs so
* they can all be accessed through a common programing interface.
@@ -104,6 +107,7 @@ struct gpio_chip {
char **names;
unsigned can_sleep:1;
unsigned exported:1;
+ unsigned flags;
};
extern const char *gpiochip_is_requested(struct gpio_chip *chip,