summaryrefslogtreecommitdiff
path: root/package/kernel/gpio-button-hotplug/src/gpio-button-hotplug.c
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@openwrt.org>2013-06-29 19:01:49 +0000
committerFelix Fietkau <nbd@openwrt.org>2013-06-29 19:01:49 +0000
commit0f6e9c9fcc18fee284f3e4a1201c5a257d83b1b1 (patch)
tree55d8fae86c6ab91bb73cdedd7b58e8dcb996f3cf /package/kernel/gpio-button-hotplug/src/gpio-button-hotplug.c
parent124ef95f5f3850a6f9bfe7dfdc48f082f996fa1b (diff)
downloadmtk-20170518-0f6e9c9fcc18fee284f3e4a1201c5a257d83b1b1.zip
mtk-20170518-0f6e9c9fcc18fee284f3e4a1201c5a257d83b1b1.tar.gz
mtk-20170518-0f6e9c9fcc18fee284f3e4a1201c5a257d83b1b1.tar.bz2
gpio-button-hotplug: improve gpio button debouncing, verify state changes over multiple polls. fixes spurious failsafe triggers (#13784)
Signed-off-by: Felix Fietkau <nbd@openwrt.org> SVN-Revision: 37090
Diffstat (limited to 'package/kernel/gpio-button-hotplug/src/gpio-button-hotplug.c')
-rw-r--r--package/kernel/gpio-button-hotplug/src/gpio-button-hotplug.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/package/kernel/gpio-button-hotplug/src/gpio-button-hotplug.c b/package/kernel/gpio-button-hotplug/src/gpio-button-hotplug.c
index 9d91b57..412c045 100644
--- a/package/kernel/gpio-button-hotplug/src/gpio-button-hotplug.c
+++ b/package/kernel/gpio-button-hotplug/src/gpio-button-hotplug.c
@@ -274,10 +274,16 @@ static void gpio_keys_polled_check_state(struct gpio_keys_button *button,
if (state != bdata->last_state) {
unsigned int type = button->type ?: EV_KEY;
+ if (bdata->count < bdata->threshold) {
+ bdata->count++;
+ return;
+ }
+
button_hotplug_event(bdata, type, button->code, state);
- bdata->count = 0;
bdata->last_state = state;
}
+
+ bdata->count = 0;
}
static void gpio_keys_polled_queue_work(struct gpio_keys_polled_dev *bdev)
@@ -299,11 +305,7 @@ static void gpio_keys_polled_poll(struct work_struct *work)
for (i = 0; i < bdev->pdata->nbuttons; i++) {
struct gpio_keys_button_data *bdata = &bdev->data[i];
-
- if (bdata->count < bdata->threshold)
- bdata->count++;
- else
- gpio_keys_polled_check_state(&pdata->buttons[i], bdata);
+ gpio_keys_polled_check_state(&pdata->buttons[i], bdata);
}
gpio_keys_polled_queue_work(bdev);
}