[OpenWrt-Devel] [PATCH v2] gpio-button-hotplug: mind debounce interval consistently

Christian Lamparter chunkeey at gmail.com
Thu Jun 20 15:28:00 EDT 2019


On Thursday, June 20, 2019 8:10:18 PM CEST David Bauer wrote:
> Hello Christian,
> On 20.06.19 17:21, Christian Lamparter wrote:
> > On Tuesday, June 18, 2019 1:06:12 PM CEST David Bauer wrote:
> >> This patch implements consistent handling of the debounce interval set
> >> for the GPIO buttons. Hotplug events will only be fired if
> >>
> >> 1. It's the initial stable state (no state-change for duration of the
> >> debounce interval) for a switch. Buttons will not trigger an event for
> >> the initial stable state.
> >>
> >> 2. The input changes it's state and remains stable for the debounce
> >> interval.
> >>
> >> Prior to this patch, this was handled inconsistently for interrupt-based
> >> an polled gpio-keys. We unify the shared logic in button_hotplug_event
> >> and modify both implementations to read the initial state.
> >>
> >> Run-tested for 'gpio-keys' and 'gpio-keys-polled' on
> >>
> >>  - devolo WiFi pro 1200e
> >>  - devolo WiFi pro 1750c
> >>  - devolo WiFi pro 1750x
> >>
> >> Signed-off-by: David Bauer <mail at david-bauer.net>
> >> ---
> >>  .../src/gpio-button-hotplug.c                 | 42 +++++++++----------
> >>  1 file changed, 20 insertions(+), 22 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 e63d414284..25150344e0 100644
> >> --- a/package/kernel/gpio-button-hotplug/src/gpio-button-hotplug.c
> >> +++ b/package/kernel/gpio-button-hotplug/src/gpio-button-hotplug.c
> >> @@ -351,8 +352,8 @@ static irqreturn_t button_handle_irq(int irq, void *_bdata)
> >>  	struct gpio_keys_button_data *bdata =
> >>  		(struct gpio_keys_button_data *) _bdata;
> >>  
> >> -	schedule_delayed_work(&bdata->work,
> >> -			      msecs_to_jiffies(bdata->software_debounce));
> >> +	mod_delayed_work(system_wq, &bdata->work,
> >> +			 msecs_to_jiffies(bdata->software_debounce));
> >>  
> >>  	return IRQ_HANDLED;
> >>  }
> >> @@ -608,6 +609,9 @@ static int gpio_keys_probe(struct platform_device *pdev)
> >>  
> >>  		INIT_DELAYED_WORK(&bdata->work, gpio_keys_irq_work_func);
> >>  
> >> +		schedule_delayed_work(&bdata->work,
> >> +				      msecs_to_jiffies(bdata->software_debounce));
> >> +
> > Hm, well since the first state is -1 we could just as well schedule the work
> > immediately here... 
> 
> Hmm, i have a bit trouble grasping your intention here.
> 
> Do you mean we can unify the scheduling for polled and
> interrupt-based keys?

I was gunning for making the polled and interrupt behave in the
same way. Currently the gpio_polled variant does

|	for (i = 0; i < pdata->nbuttons; i++)
|		gpio_keys_polled_check_state(&bdev->data[i]);

as part of it's probe function which immediately initializes the
button's state from -1 to either 0 or 1.

But with the 

| + schedule_delayed_work(&bdata->work,
| +				      msecs_to_jiffies(bdata->software_debounce));

the irq-path would wait software_debounce (5ms by default) time
until the -1 is cleared.

This is not really a problem, other than a symmetry mismatch when
targets switch from gpio-keys to gpio-keys-polled or vice versa
and expect the implementation to behave in the same manner.

Best Regards,
Christian



_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel



More information about the openwrt-devel mailing list