From: Jani Nikula <ext-jani.1.nikula@nokia.com>
To: ext Alek Du <alek.du@intel.com>
Cc: LKML <linux-kernel@vger.kernel.org>,
Trilok Soni <soni.trilok@gmail.com>,
"linux-input@vger.kernel.org" <linux-input@vger.kernel.org>,
Dmitry Torokhov <dmitry.torokhov@gmail.com>,
"ben-linux@fluff.org" <ben-linux@fluff.org>
Subject: Re: [PATCH]input: Change timer function to workqueue for gpio_keys driver
Date: Thu, 25 Jun 2009 17:52:45 +0300 [thread overview]
Message-ID: <1245941565.20530.134.camel@jani-desktop> (raw)
In-Reply-To: <20090625220826.1fa7413e@dxy.sh.intel.com>
On Thu, 2009-06-25 at 16:08 +0200, ext Alek Du wrote:
> On Thu, 25 Jun 2009 21:31:33 +0800
> Jani Nikula <ext-jani.1.nikula@nokia.com> wrote:
>
> > On Thu, 2009-06-25 at 15:06 +0200, ext Alek Du wrote:
> > > On Thu, 25 Jun 2009 18:29:25 +0800
> > > Jani Nikula <ext-jani.1.nikula@nokia.com> wrote:
> > > > Correct me if I'm wrong, but as far as I can tell,
> > > > schedule_delayed_work doesn't modify the timer if the work was already
> > > > pending. The result is not the same as with the timer. This breaks the
> > > > debouncing.
> > >
> > > No. The workqueue is per button, if the work is already pending, then last
> > > key press is not handled yet. That keeps the debouncing. Why you want the second
> > > key press to break the first one? The second key press should be ignored, that's
> > > the meaning of debouncing right?
> >
> > No, debouncing is supposed to let the gpio line stabilize to either
> > state before doing *anything*. You only want to schedule the work (and
> > send the input event) once the line has been in the same state for
> > debounce_interval ms. This is what the original code did, by kicking the
> > timer further at each state change.
> >
> If you schedule the timer when you decide it "stabilized", the final gpio_get_value()
> could still return 0 in the timer handler, if the key released at that time. So your previous
> "stabilized" state is useless.
True, gpio_keys_report_event should also compare the value to the
previous state and bail out if it's unchanged. Something along the lines
of:
@@ -46,6 +46,10 @@ static void gpio_keys_report_event(struct work_struct *work)
unsigned int type = button->type ?: EV_KEY;
int state = (gpio_get_value(button->gpio) ? 1 : 0) ^ button->active_low;
+ if (state == bdata->state)
+ return;
+ bdata->state = state;
+
input_event(input, type, button->code, !!state);
input_sync(input);
}
Bailing out would mean the gpio line wasn't quite long enough in the
same state after all.
> Isn't the delay work itself the mechanism to decide the "stabilized" ?
Delay is like "something happenened now, take a random sample later".
> The work will finally call gpio_get_value to determine the state to be sent
> to input layer. I don't think there is any defect here.
Please try to consider the difference in functionality before and after
your patch. What if the line keeps going high and low faster than
debounce_interval?
Debouncing should also completely ignore a single spike shorter than
debounce_interval. Admittedly gpio-keys was flawed, but please consider
a change like above which should fix that.
> No, the original timer handler will crash kernel if you are using a I2C GPIO or SPI GPIO expander
> Since it try to call sleep-able gpio_get_value in atomic context.
It should be fixed then.
BR,
Jani.
next prev parent reply other threads:[~2009-06-25 14:53 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-06-08 7:24 [PATCH]input: Change timer function to workqueue for gpio_keys driver Alek Du
2009-06-12 17:40 ` Trilok Soni
2009-06-25 10:29 ` Jani Nikula
2009-06-25 13:06 ` Alek Du
2009-06-25 13:31 ` Jani Nikula
2009-06-25 14:08 ` Alek Du
2009-06-25 14:52 ` Jani Nikula [this message]
2009-06-25 15:05 ` Jani Nikula
2009-06-25 15:09 ` Alek Du
2009-06-25 15:42 ` Jani Nikula
2009-06-25 15:48 ` Alek Du
2009-06-25 16:09 ` Phil Carmody
2009-06-25 16:23 ` Alek Du
2009-06-25 16:42 ` Dmitry Torokhov
2009-06-26 12:15 ` [PATCH 0/2] fix gpio-keys debouncing and timer sleep issues Jani Nikula
2009-06-26 12:15 ` [PATCH 1/2] Revert "Input: gpio-keys - change timer to workqueue" Jani Nikula
2009-06-26 12:15 ` [PATCH 2/2] input: gpio-keys: avoid possibility of sleeping in timer function Jani Nikula
2009-06-29 10:30 ` Alek Du
2009-06-26 12:50 ` [PATCH 0/2] fix gpio-keys debouncing and timer sleep issues Du, Alek
2009-06-29 5:59 ` Dmitry Torokhov
2009-06-29 10:32 ` Jani Nikula
[not found] <20090608135410.1cdbb581@dxy.sh.intel.com>
2009-06-08 6:04 ` [PATCH] input: Change timer function to workqueue for gpio_keys driver Trilok Soni
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1245941565.20530.134.camel@jani-desktop \
--to=ext-jani.1.nikula@nokia.com \
--cc=alek.du@intel.com \
--cc=ben-linux@fluff.org \
--cc=dmitry.torokhov@gmail.com \
--cc=linux-input@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=soni.trilok@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox