* [PATCH] gpio-keys debouncing support
@ 2008-03-19 22:13 Dmitry Baryshkov
2008-04-21 14:40 ` Dmitry Baryshkov
0 siblings, 1 reply; 5+ messages in thread
From: Dmitry Baryshkov @ 2008-03-19 22:13 UTC (permalink / raw)
To: linux-input; +Cc: dtor
Sometimes the gpio line can generates jitter while transitioning
from one state to another. Implement a way to filter such noise during
transitions.
Signed-off-by: Dmitry Baryshkov <dbaryshkov@gmail.com>
---
drivers/input/keyboard/Kconfig | 7 +++
drivers/input/keyboard/gpio_keys.c | 96 ++++++++++++++++++++++++++++++++++--
include/linux/gpio_keys.h | 6 ++
3 files changed, 104 insertions(+), 5 deletions(-)
diff --git a/drivers/input/keyboard/Kconfig b/drivers/input/keyboard/Kconfig
index 8ea709b..0fb4592 100644
--- a/drivers/input/keyboard/Kconfig
+++ b/drivers/input/keyboard/Kconfig
@@ -295,6 +295,13 @@ config KEYBOARD_GPIO
To compile this driver as a module, choose M here: the
module will be called gpio-keys.
+config KEYBOARD_GPIO_DEBOUNCE
+ bool "GPIO Buttons debouncer"
+ depends on KEYBOARD_GPIO
+ help
+ This driver will enable the debouncer in the gpio-keys
+ driver for pins that take some time to come to stable state.
+
config KEYBOARD_MAPLE
tristate "Maple bus keyboard"
depends on SH_DREAMCAST && MAPLE
diff --git a/drivers/input/keyboard/gpio_keys.c b/drivers/input/keyboard/gpio_keys.c
index 6a9ca4b..577dfea 100644
--- a/drivers/input/keyboard/gpio_keys.c
+++ b/drivers/input/keyboard/gpio_keys.c
@@ -26,6 +26,39 @@
#include <asm/gpio.h>
+#ifdef CONFIG_KEYBOARD_GPIO_DEBOUNCE
+struct gpio_debounce_data {
+ struct platform_device *pdev;
+ struct gpio_keys_button *button;
+ int state;
+ int count;
+};
+
+static void gpio_debounce_timer(unsigned long _data)
+{
+ struct gpio_debounce_data *data = (struct gpio_debounce_data *)_data;
+ struct gpio_keys_button *button = data->button;
+ int gpio = button->gpio;
+ unsigned int type = button->type ?: EV_KEY;
+ int state = (gpio_get_value(gpio) ? 1 : 0) ^ button->active_low;
+ struct input_dev *input = platform_get_drvdata(data->pdev);
+
+ if (state != data->state) {
+ data->count = 0;
+ data->state = state;
+ mod_timer(&button->timer, jiffies +
+ msecs_to_jiffies(button->interval));
+ } else if (data->count < button->count) {
+ data->count ++;
+ mod_timer(&button->timer, jiffies +
+ msecs_to_jiffies(button->interval));
+ } else {
+ input_event(input, type, button->code, !!state);
+ input_sync(input);
+ }
+}
+#endif
+
static irqreturn_t gpio_keys_isr(int irq, void *dev_id)
{
int i;
@@ -38,11 +71,21 @@ static irqreturn_t gpio_keys_isr(int irq, void *dev_id)
int gpio = button->gpio;
if (irq == gpio_to_irq(gpio)) {
- unsigned int type = button->type ?: EV_KEY;
- int state = (gpio_get_value(gpio) ? 1 : 0) ^ button->active_low;
+#ifdef CONFIG_KEYBOARD_GPIO_DEBOUNCE
+ if (button->count) {
+ if (!timer_pending(&button->timer))
+ mod_timer(&button->timer, jiffies +
+ msecs_to_jiffies(
+ button->interval));
+ } else
+#endif
+ {
+ unsigned int type = button->type ?: EV_KEY;
+ int state = (gpio_get_value(gpio) ? 1 : 0) ^ button->active_low;
- input_event(input, type, button->code, !!state);
- input_sync(input);
+ input_event(input, type, button->code, !!state);
+ input_sync(input);
+ }
}
}
@@ -103,6 +146,31 @@ static int __devinit gpio_keys_probe(struct platform_device *pdev)
gpio_free(button->gpio);
goto fail;
}
+#ifdef CONFIG_KEYBOARD_GPIO_DEBOUNCE
+ if (button->count && button->interval) {
+ struct gpio_debounce_data *data;
+ data = kzalloc(sizeof(struct gpio_debounce_data), GFP_KERNEL);
+ if (!data) {
+ error = -ENOMEM;
+ pr_err("gpio-keys: Unable to allocate debounce data"
+ " for GPIO %d, error %d\n",
+ button->gpio, error);
+ gpio_free(button->gpio);
+ goto fail;
+ }
+
+ data->pdev = pdev;
+ data->button = button;
+ data->state = -1;
+
+ init_timer(&button->timer);
+ button->timer.function = gpio_debounce_timer;
+ button->timer.data = (unsigned long)data;
+
+ mod_timer(&button->timer, jiffies +
+ msecs_to_jiffies(button->interval));
+ }
+#endif
error = request_irq(irq, gpio_keys_isr,
IRQF_SAMPLE_RANDOM | IRQF_TRIGGER_RISING |
@@ -112,6 +180,12 @@ static int __devinit gpio_keys_probe(struct platform_device *pdev)
if (error) {
pr_err("gpio-keys: Unable to claim irq %d; error %d\n",
irq, error);
+#ifdef CONFIG_KEYBOARD_GPIO_DEBOUNCE
+ if (button->count) {
+ del_timer_sync(&button->timer);
+ kfree((void*)button->timer.data);
+ }
+#endif
gpio_free(button->gpio);
goto fail;
}
@@ -136,6 +210,12 @@ static int __devinit gpio_keys_probe(struct platform_device *pdev)
fail:
while (--i >= 0) {
free_irq(gpio_to_irq(pdata->buttons[i].gpio), pdev);
+#ifdef CONFIG_KEYBOARD_GPIO_DEBOUNCE
+ if (pdata->buttons[i].count) {
+ del_timer_sync(&pdata->buttons[i].timer);
+ kfree((void*)pdata->buttons[i].timer.data);
+ }
+#endif
gpio_free(pdata->buttons[i].gpio);
}
@@ -156,6 +236,12 @@ static int __devexit gpio_keys_remove(struct platform_device *pdev)
for (i = 0; i < pdata->nbuttons; i++) {
int irq = gpio_to_irq(pdata->buttons[i].gpio);
free_irq(irq, pdev);
+#ifdef CONFIG_KEYBOARD_GPIO_DEBOUNCE
+ if (pdata->buttons[i].count) {
+ del_timer_sync(&pdata->buttons[i].timer);
+ kfree((void*)pdata->buttons[i].timer.data);
+ }
+#endif
gpio_free(pdata->buttons[i].gpio);
}
diff --git a/include/linux/gpio_keys.h b/include/linux/gpio_keys.h
index c6d3a9d..2432e62 100644
--- a/include/linux/gpio_keys.h
+++ b/include/linux/gpio_keys.h
@@ -9,6 +9,12 @@ struct gpio_keys_button {
char *desc;
int type; /* input event type (EV_KEY, EV_SW) */
int wakeup; /* configure the button as a wake-up source */
+#ifdef CONFIG_KEYBOARD_GPIO_DEBOUNCE
+ int count;
+ int interval; /* in msecs */
+ /* private: */
+ struct timer_list timer;
+#endif
};
struct gpio_keys_platform_data {
--
1.5.4.3
--
With best wishes
Dmitry
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH] gpio-keys debouncing support
2008-03-19 22:13 [PATCH] gpio-keys debouncing support Dmitry Baryshkov
@ 2008-04-21 14:40 ` Dmitry Baryshkov
2008-04-21 15:55 ` Dmitry Torokhov
0 siblings, 1 reply; 5+ messages in thread
From: Dmitry Baryshkov @ 2008-04-21 14:40 UTC (permalink / raw)
To: linux-input; +Cc: dtor
Hi,
What about this patch? I still got no comments.
On Thu, Mar 20, 2008 at 01:13:23AM +0300, Dmitry Baryshkov wrote:
> Sometimes the gpio line can generates jitter while transitioning
> from one state to another. Implement a way to filter such noise during
> transitions.
>
> Signed-off-by: Dmitry Baryshkov <dbaryshkov@gmail.com>
> ---
> drivers/input/keyboard/Kconfig | 7 +++
> drivers/input/keyboard/gpio_keys.c | 96 ++++++++++++++++++++++++++++++++++--
> include/linux/gpio_keys.h | 6 ++
> 3 files changed, 104 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/input/keyboard/Kconfig b/drivers/input/keyboard/Kconfig
> index 8ea709b..0fb4592 100644
> --- a/drivers/input/keyboard/Kconfig
> +++ b/drivers/input/keyboard/Kconfig
> @@ -295,6 +295,13 @@ config KEYBOARD_GPIO
> To compile this driver as a module, choose M here: the
> module will be called gpio-keys.
>
> +config KEYBOARD_GPIO_DEBOUNCE
> + bool "GPIO Buttons debouncer"
> + depends on KEYBOARD_GPIO
> + help
> + This driver will enable the debouncer in the gpio-keys
> + driver for pins that take some time to come to stable state.
> +
> config KEYBOARD_MAPLE
> tristate "Maple bus keyboard"
> depends on SH_DREAMCAST && MAPLE
> diff --git a/drivers/input/keyboard/gpio_keys.c b/drivers/input/keyboard/gpio_keys.c
> index 6a9ca4b..577dfea 100644
> --- a/drivers/input/keyboard/gpio_keys.c
> +++ b/drivers/input/keyboard/gpio_keys.c
> @@ -26,6 +26,39 @@
>
> #include <asm/gpio.h>
>
> +#ifdef CONFIG_KEYBOARD_GPIO_DEBOUNCE
> +struct gpio_debounce_data {
> + struct platform_device *pdev;
> + struct gpio_keys_button *button;
> + int state;
> + int count;
> +};
> +
> +static void gpio_debounce_timer(unsigned long _data)
> +{
> + struct gpio_debounce_data *data = (struct gpio_debounce_data *)_data;
> + struct gpio_keys_button *button = data->button;
> + int gpio = button->gpio;
> + unsigned int type = button->type ?: EV_KEY;
> + int state = (gpio_get_value(gpio) ? 1 : 0) ^ button->active_low;
> + struct input_dev *input = platform_get_drvdata(data->pdev);
> +
> + if (state != data->state) {
> + data->count = 0;
> + data->state = state;
> + mod_timer(&button->timer, jiffies +
> + msecs_to_jiffies(button->interval));
> + } else if (data->count < button->count) {
> + data->count ++;
> + mod_timer(&button->timer, jiffies +
> + msecs_to_jiffies(button->interval));
> + } else {
> + input_event(input, type, button->code, !!state);
> + input_sync(input);
> + }
> +}
> +#endif
> +
> static irqreturn_t gpio_keys_isr(int irq, void *dev_id)
> {
> int i;
> @@ -38,11 +71,21 @@ static irqreturn_t gpio_keys_isr(int irq, void *dev_id)
> int gpio = button->gpio;
>
> if (irq == gpio_to_irq(gpio)) {
> - unsigned int type = button->type ?: EV_KEY;
> - int state = (gpio_get_value(gpio) ? 1 : 0) ^ button->active_low;
> +#ifdef CONFIG_KEYBOARD_GPIO_DEBOUNCE
> + if (button->count) {
> + if (!timer_pending(&button->timer))
> + mod_timer(&button->timer, jiffies +
> + msecs_to_jiffies(
> + button->interval));
> + } else
> +#endif
> + {
> + unsigned int type = button->type ?: EV_KEY;
> + int state = (gpio_get_value(gpio) ? 1 : 0) ^ button->active_low;
>
> - input_event(input, type, button->code, !!state);
> - input_sync(input);
> + input_event(input, type, button->code, !!state);
> + input_sync(input);
> + }
> }
> }
>
> @@ -103,6 +146,31 @@ static int __devinit gpio_keys_probe(struct platform_device *pdev)
> gpio_free(button->gpio);
> goto fail;
> }
> +#ifdef CONFIG_KEYBOARD_GPIO_DEBOUNCE
> + if (button->count && button->interval) {
> + struct gpio_debounce_data *data;
> + data = kzalloc(sizeof(struct gpio_debounce_data), GFP_KERNEL);
> + if (!data) {
> + error = -ENOMEM;
> + pr_err("gpio-keys: Unable to allocate debounce data"
> + " for GPIO %d, error %d\n",
> + button->gpio, error);
> + gpio_free(button->gpio);
> + goto fail;
> + }
> +
> + data->pdev = pdev;
> + data->button = button;
> + data->state = -1;
> +
> + init_timer(&button->timer);
> + button->timer.function = gpio_debounce_timer;
> + button->timer.data = (unsigned long)data;
> +
> + mod_timer(&button->timer, jiffies +
> + msecs_to_jiffies(button->interval));
> + }
> +#endif
>
> error = request_irq(irq, gpio_keys_isr,
> IRQF_SAMPLE_RANDOM | IRQF_TRIGGER_RISING |
> @@ -112,6 +180,12 @@ static int __devinit gpio_keys_probe(struct platform_device *pdev)
> if (error) {
> pr_err("gpio-keys: Unable to claim irq %d; error %d\n",
> irq, error);
> +#ifdef CONFIG_KEYBOARD_GPIO_DEBOUNCE
> + if (button->count) {
> + del_timer_sync(&button->timer);
> + kfree((void*)button->timer.data);
> + }
> +#endif
> gpio_free(button->gpio);
> goto fail;
> }
> @@ -136,6 +210,12 @@ static int __devinit gpio_keys_probe(struct platform_device *pdev)
> fail:
> while (--i >= 0) {
> free_irq(gpio_to_irq(pdata->buttons[i].gpio), pdev);
> +#ifdef CONFIG_KEYBOARD_GPIO_DEBOUNCE
> + if (pdata->buttons[i].count) {
> + del_timer_sync(&pdata->buttons[i].timer);
> + kfree((void*)pdata->buttons[i].timer.data);
> + }
> +#endif
> gpio_free(pdata->buttons[i].gpio);
> }
>
> @@ -156,6 +236,12 @@ static int __devexit gpio_keys_remove(struct platform_device *pdev)
> for (i = 0; i < pdata->nbuttons; i++) {
> int irq = gpio_to_irq(pdata->buttons[i].gpio);
> free_irq(irq, pdev);
> +#ifdef CONFIG_KEYBOARD_GPIO_DEBOUNCE
> + if (pdata->buttons[i].count) {
> + del_timer_sync(&pdata->buttons[i].timer);
> + kfree((void*)pdata->buttons[i].timer.data);
> + }
> +#endif
> gpio_free(pdata->buttons[i].gpio);
> }
>
> diff --git a/include/linux/gpio_keys.h b/include/linux/gpio_keys.h
> index c6d3a9d..2432e62 100644
> --- a/include/linux/gpio_keys.h
> +++ b/include/linux/gpio_keys.h
> @@ -9,6 +9,12 @@ struct gpio_keys_button {
> char *desc;
> int type; /* input event type (EV_KEY, EV_SW) */
> int wakeup; /* configure the button as a wake-up source */
> +#ifdef CONFIG_KEYBOARD_GPIO_DEBOUNCE
> + int count;
> + int interval; /* in msecs */
> + /* private: */
> + struct timer_list timer;
> +#endif
> };
>
> struct gpio_keys_platform_data {
> --
> 1.5.4.3
>
>
> --
> With best wishes
> Dmitry
>
--
With best wishes
Dmitry
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] gpio-keys debouncing support
2008-04-21 14:40 ` Dmitry Baryshkov
@ 2008-04-21 15:55 ` Dmitry Torokhov
2008-04-22 1:14 ` Dmitry Baryshkov
0 siblings, 1 reply; 5+ messages in thread
From: Dmitry Torokhov @ 2008-04-21 15:55 UTC (permalink / raw)
To: Dmitry Baryshkov; +Cc: linux-input
Hi Dmitry,
On Mon, Apr 21, 2008 at 06:40:19PM +0400, Dmitry Baryshkov wrote:
> Hi,
>
> What about this patch? I still got no comments.
>
I thought I CCed you form slightly different thread. I don't think that
this should be a separate Kconfig option, we shoudl make it permanent
in the driver. I also wonder if it would be better to allocate debounce
data once for all buttons instead of nickel-and-dime-ing memory
allocator with tiny requests. Timer shoudl be moved into debounce data
too BTW.
Thanks.
--
Dmitry
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] gpio-keys debouncing support
2008-04-21 15:55 ` Dmitry Torokhov
@ 2008-04-22 1:14 ` Dmitry Baryshkov
2008-04-26 19:14 ` Dmitry Baryshkov
0 siblings, 1 reply; 5+ messages in thread
From: Dmitry Baryshkov @ 2008-04-22 1:14 UTC (permalink / raw)
To: Dmitry Torokhov; +Cc: linux-input
Hi,
On Mon, Apr 21, 2008 at 11:55:16AM -0400, Dmitry Torokhov wrote:
> Hi Dmitry,
>
> On Mon, Apr 21, 2008 at 06:40:19PM +0400, Dmitry Baryshkov wrote:
> > Hi,
> >
> > What about this patch? I still got no comments.
> >
>
> I thought I CCed you form slightly different thread. I don't think that
> this should be a separate Kconfig option, we shoudl make it permanent
> in the driver. I also wonder if it would be better to allocate debounce
> data once for all buttons instead of nickel-and-dime-ing memory
> allocator with tiny requests. Timer shoudl be moved into debounce data
> too BTW.
Please review the updated patch:
>From acf6027db75bca502d1baf45e48418ddb7aadcb7 Mon Sep 17 00:00:00 2001
From: Dmitry Baryshkov <dbaryshkov@gmail.com>
Date: Tue, 22 Apr 2008 05:12:07 +0400
Subject: [PATCH] gpio-keys debouncing support
Signed-off-by: Dmitry Baryshkov <dbaryshkov@gmail.com>
---
drivers/input/keyboard/gpio_keys.c | 102 ++++++++++++++++++++++++++++++++---
include/linux/gpio_keys.h | 2 +
2 files changed, 95 insertions(+), 9 deletions(-)
diff --git a/drivers/input/keyboard/gpio_keys.c b/drivers/input/keyboard/gpio_keys.c
index 6a9ca4b..33901e4 100644
--- a/drivers/input/keyboard/gpio_keys.c
+++ b/drivers/input/keyboard/gpio_keys.c
@@ -26,23 +26,72 @@
#include <asm/gpio.h>
+struct gpio_button_data {
+ struct platform_device *pdev;
+ struct gpio_keys_button *button;
+
+ /* For debounce */
+ int state;
+ int count;
+ struct timer_list timer;
+};
+
+struct gpio_keys_drvdata {
+ struct input_dev *input;
+ struct gpio_button_data data[0];
+};
+
+static void gpio_debounce_timer(unsigned long _data)
+{
+ struct gpio_button_data *data = (struct gpio_button_data *)_data;
+ struct gpio_keys_button *button = data->button;
+ int gpio = button->gpio;
+ unsigned int type = button->type ?: EV_KEY;
+ int state = (gpio_get_value(gpio) ? 1 : 0) ^ button->active_low;
+ struct gpio_keys_drvdata *ddata = platform_get_drvdata(data->pdev);
+ struct input_dev *input = ddata->input;
+
+ if (state != data->state) {
+ data->count = 0;
+ data->state = state;
+ mod_timer(&data->timer, jiffies +
+ msecs_to_jiffies(button->interval));
+ } else if (data->count < button->count) {
+ data->count ++;
+ mod_timer(&data->timer, jiffies +
+ msecs_to_jiffies(button->interval));
+ } else {
+ input_event(input, type, button->code, !!state);
+ input_sync(input);
+ }
+}
+
static irqreturn_t gpio_keys_isr(int irq, void *dev_id)
{
int i;
struct platform_device *pdev = dev_id;
struct gpio_keys_platform_data *pdata = pdev->dev.platform_data;
- struct input_dev *input = platform_get_drvdata(pdev);
+ struct gpio_keys_drvdata *ddata = platform_get_drvdata(pdev);
+ struct input_dev *input = ddata->input;
for (i = 0; i < pdata->nbuttons; i++) {
struct gpio_keys_button *button = &pdata->buttons[i];
+ struct gpio_button_data *data = &ddata->data[i];
int gpio = button->gpio;
if (irq == gpio_to_irq(gpio)) {
- unsigned int type = button->type ?: EV_KEY;
- int state = (gpio_get_value(gpio) ? 1 : 0) ^ button->active_low;
-
- input_event(input, type, button->code, !!state);
- input_sync(input);
+ if (button->count) {
+ if (!timer_pending(&data->timer))
+ mod_timer(&data->timer, jiffies +
+ msecs_to_jiffies(
+ button->interval));
+ } else {
+ unsigned int type = button->type ?: EV_KEY;
+ int state = (gpio_get_value(gpio) ? 1 : 0) ^ button->active_low;
+
+ input_event(input, type, button->code, !!state);
+ input_sync(input);
+ }
}
}
@@ -52,15 +101,26 @@ static irqreturn_t gpio_keys_isr(int irq, void *dev_id)
static int __devinit gpio_keys_probe(struct platform_device *pdev)
{
struct gpio_keys_platform_data *pdata = pdev->dev.platform_data;
+ struct gpio_keys_drvdata *ddata;
struct input_dev *input;
int i, error;
int wakeup = 0;
+ ddata = kzalloc(sizeof(struct gpio_keys_drvdata) +
+ sizeof(struct gpio_button_data) * pdata->nbuttons,
+ GFP_KERNEL);
+
+ if (!ddata)
+ return -ENOMEM;
+
input = input_allocate_device();
- if (!input)
+ if (!input) {
+ kfree(ddata);
return -ENOMEM;
+ }
+ ddata->input = input;
- platform_set_drvdata(pdev, input);
+ platform_set_drvdata(pdev, ddata);
input->evbit[0] = BIT_MASK(EV_KEY);
@@ -77,6 +137,10 @@ static int __devinit gpio_keys_probe(struct platform_device *pdev)
struct gpio_keys_button *button = &pdata->buttons[i];
int irq;
unsigned int type = button->type ?: EV_KEY;
+ struct gpio_button_data *data = &ddata->data[i];
+
+ data->pdev = pdev;
+ data->button = button;
error = gpio_request(button->gpio, button->desc ?: "gpio_keys");
if (error < 0) {
@@ -103,6 +167,16 @@ static int __devinit gpio_keys_probe(struct platform_device *pdev)
gpio_free(button->gpio);
goto fail;
}
+ if (button->count && button->interval) {
+ data->state = -1;
+
+ init_timer(&data->timer);
+ data->timer.function = gpio_debounce_timer;
+ data->timer.data = (unsigned long)data;
+
+ mod_timer(&data->timer, jiffies +
+ msecs_to_jiffies(button->interval));
+ }
error = request_irq(irq, gpio_keys_isr,
IRQF_SAMPLE_RANDOM | IRQF_TRIGGER_RISING |
@@ -112,7 +186,10 @@ static int __devinit gpio_keys_probe(struct platform_device *pdev)
if (error) {
pr_err("gpio-keys: Unable to claim irq %d; error %d\n",
irq, error);
+ if (button->count)
+ del_timer_sync(&data->timer);
gpio_free(button->gpio);
+
goto fail;
}
@@ -136,11 +213,15 @@ static int __devinit gpio_keys_probe(struct platform_device *pdev)
fail:
while (--i >= 0) {
free_irq(gpio_to_irq(pdata->buttons[i].gpio), pdev);
+ if (pdata->buttons[i].count) {
+ del_timer_sync(&ddata->data[i].timer);
+ }
gpio_free(pdata->buttons[i].gpio);
}
platform_set_drvdata(pdev, NULL);
input_free_device(input);
+ kfree(ddata);
return error;
}
@@ -148,7 +229,8 @@ static int __devinit gpio_keys_probe(struct platform_device *pdev)
static int __devexit gpio_keys_remove(struct platform_device *pdev)
{
struct gpio_keys_platform_data *pdata = pdev->dev.platform_data;
- struct input_dev *input = platform_get_drvdata(pdev);
+ struct gpio_keys_drvdata *ddata = platform_get_drvdata(pdev);
+ struct input_dev *input = ddata->input;
int i;
device_init_wakeup(&pdev->dev, 0);
@@ -156,6 +238,8 @@ static int __devexit gpio_keys_remove(struct platform_device *pdev)
for (i = 0; i < pdata->nbuttons; i++) {
int irq = gpio_to_irq(pdata->buttons[i].gpio);
free_irq(irq, pdev);
+ if (pdata->buttons[i].count)
+ del_timer_sync(&ddata->data[i].timer);
gpio_free(pdata->buttons[i].gpio);
}
diff --git a/include/linux/gpio_keys.h b/include/linux/gpio_keys.h
index c6d3a9d..5d09862 100644
--- a/include/linux/gpio_keys.h
+++ b/include/linux/gpio_keys.h
@@ -9,6 +9,8 @@ struct gpio_keys_button {
char *desc;
int type; /* input event type (EV_KEY, EV_SW) */
int wakeup; /* configure the button as a wake-up source */
+ int count; /* debounce ticks count */
+ int interval; /* debounce ticks interval in msecs */
};
struct gpio_keys_platform_data {
--
1.5.5
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH] gpio-keys debouncing support
2008-04-22 1:14 ` Dmitry Baryshkov
@ 2008-04-26 19:14 ` Dmitry Baryshkov
0 siblings, 0 replies; 5+ messages in thread
From: Dmitry Baryshkov @ 2008-04-26 19:14 UTC (permalink / raw)
To: linux-input
Hi,
Dmitry Baryshkov wrote:
> Hi,
>
> On Mon, Apr 21, 2008 at 11:55:16AM -0400, Dmitry Torokhov wrote:
>> Hi Dmitry,
>>
>> On Mon, Apr 21, 2008 at 06:40:19PM +0400, Dmitry Baryshkov wrote:
>> > Hi,
>> >
>> > What about this patch? I still got no comments.
>> >
>> >
>> I thought I CCed you form slightly different thread. I don't think that
>> this should be a separate Kconfig option, we shoudl make it permanent
>> in the driver. I also wonder if it would be better to allocate debounce
>> data once for all buttons instead of nickel-and-dime-ing memory
>> allocator with tiny requests. Timer shoudl be moved into debounce data
>> too BTW.
>
> Please review the updated patch:
>
> From acf6027db75bca502d1baf45e48418ddb7aadcb7 Mon Sep 17 00:00:00 2001
> From: Dmitry Baryshkov <dbaryshkov@gmail.com>
> Date: Tue, 22 Apr 2008 05:12:07 +0400
> Subject: [PATCH] gpio-keys debouncing support
>
So, what about this patch?
--
With best wishes
Dmitry
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2008-04-26 19:14 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-03-19 22:13 [PATCH] gpio-keys debouncing support Dmitry Baryshkov
2008-04-21 14:40 ` Dmitry Baryshkov
2008-04-21 15:55 ` Dmitry Torokhov
2008-04-22 1:14 ` Dmitry Baryshkov
2008-04-26 19:14 ` Dmitry Baryshkov
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).