From: Robin van der Gracht <robin@protonic.nl>
To: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Cc: Miguel Ojeda Sandonis <miguel.ojeda.sandonis@gmail.com>,
linux-kernel@vger.kernel.org,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Linus Walleij <linus.walleij@linaro.org>
Subject: Re: [PATCH 2/3] auxdisplay: ht16k33: rework input device initialization
Date: Wed, 8 Feb 2017 17:48:02 +0100 [thread overview]
Message-ID: <20170208174802.26c370f6@erd979> (raw)
In-Reply-To: <20170131205438.7531-2-dmitry.torokhov@gmail.com>
On Tue, 31 Jan 2017 12:54:37 -0800
Dmitry Torokhov <dmitry.torokhov@gmail.com> wrote:
...
> +
> +static irqreturn_t ht16k33_keypad_irq_thread(int irq, void *dev)
> +{
> + struct ht16k33_keypad *keypad = dev;
> +
> + do {
> + wait_event_timeout(keypad->wait, keypad->stopped,
> + msecs_to_jiffies(keypad->debounce_ms));
> + if (keypad->stopped)
> + break;
> + } while (ht16k33_keypad_scan(keypad));
I like how you worked this one out! Its way cleaner and simpler.
> +
> + return IRQ_HANDLED;
> +}
> +
> +static int ht16k33_keypad_start(struct input_dev *dev)
> +{
> + struct ht16k33_keypad *keypad = input_get_drvdata(dev);
> +
> + keypad->stopped = false;
> + mb();
> + enable_irq(keypad->client->irq);
> +
> + return 0;
> +}
> +
> +static void ht16k33_keypad_stop(struct input_dev *dev)
> +{
> + struct ht16k33_keypad *keypad = input_get_drvdata(dev);
> +
> + keypad->stopped = true;
> + mb();
> + wake_up(&keypad->wait);
> + disable_irq(keypad->client->irq);
> +}
Nice!
> +
> +static int ht16k33_keypad_probe(struct i2c_client *client,
> + struct ht16k33_keypad *keypad)
> +{
...
> +
> + err = devm_request_threaded_irq(&client->dev, client->irq,
> + NULL, ht16k33_keypad_irq_thread,
> + IRQF_TRIGGER_RISING | IRQF_ONESHOT,
> + DRIVER_NAME, keypad);
I believe the interrupt trigger should be switched to IRQF_TRIGGER_HIGH
combined with IRQF_ONESHOT, for this new setup. This is causing a race
condition.
In the previous situation a 'key data' read was triggered by
ht16k33_keypad_start(). This cleared the IRQ and gave a (somewhat racy)
known state. Now, when the IRQ line is HIGH during probe keyscan
wont work.
Also, when ht16k33_keypad_stop() is run while the irq thread is waiting
for debounce, the scan will be skipped and irq will never be cleared.
This also breaks keyscan.
Regards,
Robin
next prev parent reply other threads:[~2017-02-08 16:48 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-01-31 20:54 [PATCH 1/3] auxdisplay: ht16k33: do not try to free fbdev Dmitry Torokhov
2017-01-31 20:54 ` [PATCH 2/3] auxdisplay: ht16k33: rework input device initialization Dmitry Torokhov
2017-02-08 16:48 ` Robin van der Gracht [this message]
2017-02-09 18:10 ` Dmitry Torokhov
2017-01-31 20:54 ` [PATCH 3/3] auxdisplay: ht16k33: remove private workqueue Dmitry Torokhov
2017-02-08 16:52 ` Robin van der Gracht
2017-02-07 7:45 ` [PATCH 1/3] auxdisplay: ht16k33: do not try to free fbdev Robin van der Gracht
2017-02-08 16:12 ` Robin van der Gracht
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=20170208174802.26c370f6@erd979 \
--to=robin@protonic.nl \
--cc=dmitry.torokhov@gmail.com \
--cc=gregkh@linuxfoundation.org \
--cc=linus.walleij@linaro.org \
--cc=linux-kernel@vger.kernel.org \
--cc=miguel.ojeda.sandonis@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