From: Dmitry Torokhov <dmitry.torokhov@gmail.com>
To: Tejun Heo <tj@kernel.org>
Cc: linux-kernel@vger.kernel.org,
Mark Brown <broonie@opensource.wolfsonmicro.com>,
Liam Girdwood <lrg@slimlogic.co.uk>,
linux-input@vger.kernel.org
Subject: Re: [PATCH 17/25] wm97xx: don't use [delayed_]work_pending()
Date: Sun, 23 Dec 2012 01:54:50 -0800 [thread overview]
Message-ID: <20121223095450.GA17407@core.coreip.homeip.net> (raw)
In-Reply-To: <1356141435-17340-18-git-send-email-tj@kernel.org>
Hi Tejun,
On Fri, Dec 21, 2012 at 05:57:07PM -0800, Tejun Heo wrote:
> There's no need to test whether a (delayed) work item in pending
> before queueing, flushing or cancelling it. Most uses are unnecessary
> and quite a few of them are buggy.
>
> Remove unnecessary pending tests from wm97xx. Instead of testing
> work_pending(), use the return value of queue_work() to decide whether
> to disable IRQ or not.
>
> Only compile tested.
>
> Signed-off-by: Tejun Heo <tj@kernel.org>
> Cc: Mark Brown <broonie@opensource.wolfsonmicro.com>
> Cc: Liam Girdwood <lrg@slimlogic.co.uk>
> Cc: linux-input@vger.kernel.org
> Cc: Dmitry Torokhov <dmitry.torokhov@gmail.com>
> ---
> Please let me know how this patch should be routed. I can take it
> through the workqueue tree if necessary.
>
> Thanks.
>
> drivers/input/touchscreen/wm97xx-core.c | 4 +---
> 1 file changed, 1 insertion(+), 3 deletions(-)
>
> diff --git a/drivers/input/touchscreen/wm97xx-core.c b/drivers/input/touchscreen/wm97xx-core.c
> index 5dbe73a..fd16c63 100644
> --- a/drivers/input/touchscreen/wm97xx-core.c
> +++ b/drivers/input/touchscreen/wm97xx-core.c
> @@ -363,10 +363,8 @@ static irqreturn_t wm97xx_pen_interrupt(int irq, void *dev_id)
> {
> struct wm97xx *wm = dev_id;
>
> - if (!work_pending(&wm->pen_event_work)) {
> + if (queue_work(wm->ts_workq, &wm->pen_event_work))
> wm->mach_ops->irq_enable(wm, 0);
> - queue_work(wm->ts_workq, &wm->pen_event_work);
> - }
>
This is not 100% equivalent transformation as now we schedule first and
disable IRQ later... Anyway, I think the driver shoudl be converted to
threaded IRQ instead. Mark, does the patch below make any sense to you?
Thanks.
--
Dmitry
Input: wm97xx - switch to using threaded IRQ
Instead of manually disabling and enabling interrupts and scheduling work to
access the device, let's use threaded oneshot interrupt handler. It simplifies
things.
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
---
drivers/input/touchscreen/wm97xx-core.c | 42 +++++--------------------------
include/linux/wm97xx.h | 1 -
2 files changed, 7 insertions(+), 36 deletions(-)
diff --git a/drivers/input/touchscreen/wm97xx-core.c b/drivers/input/touchscreen/wm97xx-core.c
index 5dbe73a..bf5eddf 100644
--- a/drivers/input/touchscreen/wm97xx-core.c
+++ b/drivers/input/touchscreen/wm97xx-core.c
@@ -289,11 +289,12 @@ void wm97xx_set_suspend_mode(struct wm97xx *wm, u16 mode)
EXPORT_SYMBOL_GPL(wm97xx_set_suspend_mode);
/*
- * Handle a pen down interrupt.
+ * Codec PENDOWN irq handler
+ *
*/
-static void wm97xx_pen_irq_worker(struct work_struct *work)
+static irqreturn_t wm97xx_pen_interrupt(int irq, void *dev_id)
{
- struct wm97xx *wm = container_of(work, struct wm97xx, pen_event_work);
+ struct wm97xx *wm = dev_id;
int pen_was_down = wm->pen_is_down;
/* do we need to enable the touch panel reader */
@@ -347,27 +348,6 @@ static void wm97xx_pen_irq_worker(struct work_struct *work)
if (!wm->pen_is_down && wm->mach_ops->acc_enabled)
wm->mach_ops->acc_pen_up(wm);
- wm->mach_ops->irq_enable(wm, 1);
-}
-
-/*
- * Codec PENDOWN irq handler
- *
- * We have to disable the codec interrupt in the handler because it
- * can take up to 1ms to clear the interrupt source. We schedule a task
- * in a work queue to do the actual interaction with the chip. The
- * interrupt is then enabled again in the slow handler when the source
- * has been cleared.
- */
-static irqreturn_t wm97xx_pen_interrupt(int irq, void *dev_id)
-{
- struct wm97xx *wm = dev_id;
-
- if (!work_pending(&wm->pen_event_work)) {
- wm->mach_ops->irq_enable(wm, 0);
- queue_work(wm->ts_workq, &wm->pen_event_work);
- }
-
return IRQ_HANDLED;
}
@@ -378,12 +358,9 @@ static int wm97xx_init_pen_irq(struct wm97xx *wm)
{
u16 reg;
- /* If an interrupt is supplied an IRQ enable operation must also be
- * provided. */
- BUG_ON(!wm->mach_ops->irq_enable);
-
- if (request_irq(wm->pen_irq, wm97xx_pen_interrupt, IRQF_SHARED,
- "wm97xx-pen", wm)) {
+ if (request_threaded_irq(wm->pen_irq, NULL, wm97xx_pen_interrupt,
+ IRQF_SHARED | IRQF_ONESHOT,
+ "wm97xx-pen", wm)) {
dev_err(wm->dev,
"Failed to register pen down interrupt, polling");
wm->pen_irq = 0;
@@ -502,7 +479,6 @@ static int wm97xx_ts_input_open(struct input_dev *idev)
wm->codec->dig_enable(wm, 1);
INIT_DELAYED_WORK(&wm->ts_reader, wm97xx_ts_reader);
- INIT_WORK(&wm->pen_event_work, wm97xx_pen_irq_worker);
wm->ts_reader_min_interval = HZ >= 100 ? HZ / 100 : 1;
if (wm->ts_reader_min_interval < 1)
@@ -553,10 +529,6 @@ static void wm97xx_ts_input_close(struct input_dev *idev)
wm->pen_is_down = 0;
- /* Balance out interrupt disables/enables */
- if (cancel_work_sync(&wm->pen_event_work))
- wm->mach_ops->irq_enable(wm, 1);
-
/* ts_reader rearms itself so we need to explicitly stop it
* before we destroy the workqueue.
*/
diff --git a/include/linux/wm97xx.h b/include/linux/wm97xx.h
index fd98bb9..12f793d 100644
--- a/include/linux/wm97xx.h
+++ b/include/linux/wm97xx.h
@@ -280,7 +280,6 @@ struct wm97xx {
unsigned long ts_reader_min_interval; /* Minimum interval */
unsigned int pen_irq; /* Pen IRQ number in use */
struct workqueue_struct *ts_workq;
- struct work_struct pen_event_work;
u16 acc_slot; /* AC97 slot used for acc touch data */
u16 acc_rate; /* acc touch data rate */
unsigned pen_is_down:1; /* Pen is down */
next prev parent reply other threads:[~2012-12-23 9:54 UTC|newest]
Thread overview: 84+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-12-22 1:56 [PATCHSET] workqueue: don't use [delayed_]work_pending() Tejun Heo
2012-12-22 1:56 ` [PATCH 01/25] charger_manager: " Tejun Heo
2013-01-05 22:11 ` Anton Vorontsov
2012-12-22 1:56 ` [PATCH 02/25] ab8500_charger: " Tejun Heo
[not found] ` <CACRpkdYE3F22rnW+ZRhOWT4VGRhG2CSnb7Rj3gdCosTK8wLQmA@mail.gmail.com>
[not found] ` <50EAA53F.1000304@stericsson.com>
2013-01-07 10:48 ` Arun MURTHY
2013-01-08 14:30 ` Linus Walleij
2012-12-22 1:56 ` [PATCH 03/25] sja1000: " Tejun Heo
2012-12-22 8:01 ` David Miller
2012-12-28 21:40 ` Tejun Heo
2012-12-22 1:56 ` [PATCH 04/25] ipw2x00: simplify scan_event handling Tejun Heo
2013-01-27 21:02 ` Stanislav Yakovlev
2013-02-09 19:31 ` Tejun Heo
2012-12-22 1:56 ` [PATCH 05/25] devfreq: don't use [delayed_]work_pending() Tejun Heo
2012-12-22 1:56 ` [PATCH 06/25] libertas: " Tejun Heo
2012-12-22 1:56 ` [PATCH 07/25] mwifiex: " Tejun Heo
2012-12-22 22:29 ` Bing Zhao
2012-12-28 21:41 ` Tejun Heo
2012-12-22 1:56 ` [PATCH 08/25] thinkpad_acpi: " Tejun Heo
[not found] ` <1356141435-17340-9-git-send-email-tj-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
2012-12-22 23:55 ` Henrique de Moraes Holschuh
2012-12-22 23:55 ` Henrique de Moraes Holschuh
2012-12-28 21:41 ` Tejun Heo
2012-12-22 1:56 ` [PATCH 09/25] wl1251: " Tejun Heo
2012-12-22 14:14 ` Luciano Coelho
2012-12-28 21:42 ` Tejun Heo
2012-12-22 1:57 ` [PATCH 10/25] kprobes: fix wait_for_kprobe_optimizer() Tejun Heo
2012-12-25 3:51 ` Masami Hiramatsu
2013-01-28 19:49 ` Tejun Heo
2013-01-29 11:53 ` Masami Hiramatsu
2013-02-09 19:33 ` Tejun Heo
2012-12-22 1:57 ` [PATCH 11/25] pm: don't use [delayed_]work_pending() Tejun Heo
2012-12-22 11:53 ` Rafael J. Wysocki
2012-12-25 16:44 ` Tejun Heo
2012-12-22 1:57 ` [PATCH 12/25] bluetooth/l2cap: " Tejun Heo
2013-01-03 22:27 ` Gustavo Padovan
2012-12-22 1:57 ` [PATCH 13/25] sound/wm8350: " Tejun Heo
2012-12-24 16:11 ` Mark Brown
2012-12-22 1:57 ` [PATCH 14/25] rfkill: " Tejun Heo
2012-12-22 20:22 ` Johannes Berg
2012-12-28 21:42 ` Tejun Heo
2012-12-22 1:57 ` [PATCH 15/25] x86/mce: " Tejun Heo
2012-12-25 11:07 ` Borislav Petkov
2012-12-28 21:44 ` [PATCH v2 " Tejun Heo
2012-12-22 1:57 ` [PATCH 16/25] PM / Domains: " Tejun Heo
2012-12-22 11:57 ` Rafael J. Wysocki
2012-12-25 17:03 ` Tejun Heo
2012-12-25 20:33 ` Rafael J. Wysocki
2012-12-26 1:23 ` Tejun Heo
2012-12-22 1:57 ` [PATCH 17/25] wm97xx: " Tejun Heo
2012-12-23 9:54 ` Dmitry Torokhov [this message]
2012-12-24 16:18 ` Mark Brown
2013-03-09 23:53 ` Dmitry Torokhov
2013-03-12 18:49 ` Mark Brown
2012-12-24 18:25 ` Tejun Heo
2012-12-22 1:57 ` [PATCH 18/25] TMIO MMC: " Tejun Heo
2012-12-24 22:31 ` Guennadi Liakhovetski
2012-12-22 1:57 ` [PATCH 19/25] net/caif: " Tejun Heo
2012-12-22 1:57 ` [PATCH 20/25] wimax/i2400m: fix i2400m->wake_tx_skb handling Tejun Heo
2012-12-22 15:28 ` Perez-Gonzalez, Inaky
2013-01-04 21:19 ` Dan Williams
2013-02-09 19:35 ` Tejun Heo
2012-12-22 1:57 ` [PATCH 21/25] tty/max3100: don't use [delayed_]work_pending() Tejun Heo
2012-12-22 4:21 ` Greg Kroah-Hartman
2012-12-28 21:44 ` Tejun Heo
2012-12-22 1:57 ` [PATCH 22/25] usb/at91_udc: " Tejun Heo
2013-01-07 16:25 ` Nicolas Ferre
2012-12-22 1:57 ` [PATCH 23/25] video/exynos: " Tejun Heo
2012-12-22 3:05 ` Kukjin Kim
2012-12-26 4:04 ` Jingoo Han
2012-12-28 21:44 ` 'Tejun Heo'
2012-12-22 1:57 ` [PATCH 24/25] debugobjects: " Tejun Heo
2012-12-22 1:57 ` [PATCH 25/25] ipc: " Tejun Heo
2012-12-22 2:15 ` Andrew Morton
2012-12-22 2:22 ` Tejun Heo
2012-12-22 11:09 ` Borislav Petkov
2012-12-24 18:33 ` Tejun Heo
2012-12-24 18:45 ` Tejun Heo
2012-12-24 19:41 ` Borislav Petkov
2012-12-25 3:29 ` Tejun Heo
2012-12-25 10:46 ` Borislav Petkov
2012-12-25 16:35 ` Tejun Heo
2012-12-24 18:55 ` Borislav Petkov
2012-12-24 19:07 ` Tejun Heo
2012-12-24 19:32 ` Borislav Petkov
2012-12-25 3:18 ` Tejun Heo
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=20121223095450.GA17407@core.coreip.homeip.net \
--to=dmitry.torokhov@gmail.com \
--cc=broonie@opensource.wolfsonmicro.com \
--cc=linux-input@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=lrg@slimlogic.co.uk \
--cc=tj@kernel.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.