|
@@ -1447,6 +1447,49 @@ fail:
|
|
}
|
|
}
|
|
EXPORT_SYMBOL_GPL(gpio_direction_output);
|
|
EXPORT_SYMBOL_GPL(gpio_direction_output);
|
|
|
|
|
|
|
|
+/**
|
|
|
|
+ * gpio_set_debounce - sets @debounce time for a @gpio
|
|
|
|
+ * @gpio: the gpio to set debounce time
|
|
|
|
+ * @debounce: debounce time is microseconds
|
|
|
|
+ */
|
|
|
|
+int gpio_set_debounce(unsigned gpio, unsigned debounce)
|
|
|
|
+{
|
|
|
|
+ unsigned long flags;
|
|
|
|
+ struct gpio_chip *chip;
|
|
|
|
+ struct gpio_desc *desc = &gpio_desc[gpio];
|
|
|
|
+ int status = -EINVAL;
|
|
|
|
+
|
|
|
|
+ spin_lock_irqsave(&gpio_lock, flags);
|
|
|
|
+
|
|
|
|
+ if (!gpio_is_valid(gpio))
|
|
|
|
+ goto fail;
|
|
|
|
+ chip = desc->chip;
|
|
|
|
+ if (!chip || !chip->set || !chip->set_debounce)
|
|
|
|
+ goto fail;
|
|
|
|
+ gpio -= chip->base;
|
|
|
|
+ if (gpio >= chip->ngpio)
|
|
|
|
+ goto fail;
|
|
|
|
+ status = gpio_ensure_requested(desc, gpio);
|
|
|
|
+ if (status < 0)
|
|
|
|
+ goto fail;
|
|
|
|
+
|
|
|
|
+ /* now we know the gpio is valid and chip won't vanish */
|
|
|
|
+
|
|
|
|
+ spin_unlock_irqrestore(&gpio_lock, flags);
|
|
|
|
+
|
|
|
|
+ might_sleep_if(extra_checks && chip->can_sleep);
|
|
|
|
+
|
|
|
|
+ return chip->set_debounce(chip, gpio, debounce);
|
|
|
|
+
|
|
|
|
+fail:
|
|
|
|
+ spin_unlock_irqrestore(&gpio_lock, flags);
|
|
|
|
+ if (status)
|
|
|
|
+ pr_debug("%s: gpio-%d status %d\n",
|
|
|
|
+ __func__, gpio, status);
|
|
|
|
+
|
|
|
|
+ return status;
|
|
|
|
+}
|
|
|
|
+EXPORT_SYMBOL_GPL(gpio_set_debounce);
|
|
|
|
|
|
/* I/O calls are only valid after configuration completed; the relevant
|
|
/* I/O calls are only valid after configuration completed; the relevant
|
|
* "is this a valid GPIO" error checks should already have been done.
|
|
* "is this a valid GPIO" error checks should already have been done.
|