From patchwork Mon Dec 9 16:21:13 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Felipe Balbi X-Patchwork-Id: 3311911 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 4C97BC0D4A for ; Mon, 9 Dec 2013 16:25:43 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 25D45202F8 for ; Mon, 9 Dec 2013 16:25:42 +0000 (UTC) Received: from casper.infradead.org (casper.infradead.org [85.118.1.10]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id B557E202EC for ; Mon, 9 Dec 2013 16:25:40 +0000 (UTC) Received: from merlin.infradead.org ([2001:4978:20e::2]) by casper.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1Vq3cq-0000Vq-DV; Mon, 09 Dec 2013 16:24:05 +0000 Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1Vq3cP-0001h1-C6; Mon, 09 Dec 2013 16:23:37 +0000 Received: from bear.ext.ti.com ([192.94.94.41]) by merlin.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1Vq3bR-0001Ya-5C for linux-arm-kernel@lists.infradead.org; Mon, 09 Dec 2013 16:22:44 +0000 Received: from dflxv15.itg.ti.com ([128.247.5.124]) by bear.ext.ti.com (8.13.7/8.13.7) with ESMTP id rB9GM6K6026336; Mon, 9 Dec 2013 10:22:06 -0600 Received: from DLEE71.ent.ti.com (dlee71.ent.ti.com [157.170.170.114]) by dflxv15.itg.ti.com (8.14.3/8.13.8) with ESMTP id rB9GM500027725; Mon, 9 Dec 2013 10:22:06 -0600 Received: from dlep33.itg.ti.com (157.170.170.75) by DLEE71.ent.ti.com (157.170.170.114) with Microsoft SMTP Server id 14.2.342.3; Mon, 9 Dec 2013 10:22:05 -0600 Received: from localhost (ileax41-snat.itg.ti.com [10.172.224.153]) by dlep33.itg.ti.com (8.14.3/8.13.8) with ESMTP id rB9GM5oP018400; Mon, 9 Dec 2013 10:22:05 -0600 From: Felipe Balbi To: Subject: [PATCH v3 03/15] mfd: menelaus: Convert to threaded irq Date: Mon, 9 Dec 2013 10:21:13 -0600 Message-ID: <1386606085-26838-3-git-send-email-balbi@ti.com> X-Mailer: git-send-email 1.8.4.GIT In-Reply-To: <1386606085-26838-1-git-send-email-balbi@ti.com> References: <20131209161422.GC24047@saruman.home> <1386606085-26838-1-git-send-email-balbi@ti.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20131209_112237_586297_97D324D0 X-CRM114-Status: GOOD ( 13.95 ) X-Spam-Score: -6.9 (------) Cc: Aaro Koskinen , Tony Lindgren , Linux Kernel Mailing List , Felipe Balbi , Linux OMAP Mailing List , Linux ARM Kernel Mailing List X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Spam-Status: No, score=-4.2 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP We don't need that extra workqueue when we have generic threaded irq handlers support. This patch just moves over to threaded irqs and deletes the unnecessary workqueue. Tested-by: Aaro Koskinen Signed-off-by: Felipe Balbi --- drivers/mfd/menelaus.c | 29 ++++------------------------- 1 file changed, 4 insertions(+), 25 deletions(-) diff --git a/drivers/mfd/menelaus.c b/drivers/mfd/menelaus.c index 8bd97ca..11d7d81 100644 --- a/drivers/mfd/menelaus.c +++ b/drivers/mfd/menelaus.c @@ -36,7 +36,6 @@ #include #include #include -#include #include #include #include @@ -161,12 +160,9 @@ #define MCT_PIN_ST_S1_CD_ST (1 << 0) #define MCT_PIN_ST_S2_CD_ST (1 << 1) -static void menelaus_work(struct work_struct *_menelaus); - struct menelaus_chip { struct mutex lock; struct i2c_client *client; - struct work_struct work; #ifdef CONFIG_RTC_DRV_TWL92330 struct rtc_device *rtc; u8 rtc_control; @@ -795,11 +791,9 @@ out: /*-----------------------------------------------------------------------*/ -/* Handles Menelaus interrupts. Does not run in interrupt context */ -static void menelaus_work(struct work_struct *_menelaus) +static irqreturn_t menelaus_irq(int irq, void *_menelaus) { - struct menelaus_chip *menelaus = - container_of(_menelaus, struct menelaus_chip, work); + struct menelaus_chip *menelaus = _menelaus; void (*handler)(struct menelaus_chip *menelaus); while (1) { @@ -826,18 +820,6 @@ static void menelaus_work(struct work_struct *_menelaus) mutex_unlock(&menelaus->lock); } } - enable_irq(menelaus->client->irq); -} - -/* - * We cannot use I2C in interrupt context, so we just schedule work. - */ -static irqreturn_t menelaus_irq(int irq, void *_menelaus) -{ - struct menelaus_chip *menelaus = _menelaus; - - disable_irq_nosync(irq); - (void)schedule_work(&menelaus->work); return IRQ_HANDLED; } @@ -1225,8 +1207,8 @@ static int menelaus_probe(struct i2c_client *client, menelaus_write_reg(MENELAUS_MCT_CTRL1, 0x73); if (client->irq > 0) { - err = request_irq(client->irq, menelaus_irq, 0, - DRIVER_NAME, menelaus); + err = request_threaded_irq(client->irq, NULL, menelaus_irq, + IRQF_ONESHOT, DRIVER_NAME, menelaus); if (err) { dev_dbg(&client->dev, "can't get IRQ %d, err %d\n", client->irq, err); @@ -1235,7 +1217,6 @@ static int menelaus_probe(struct i2c_client *client, } mutex_init(&menelaus->lock); - INIT_WORK(&menelaus->work, menelaus_work); pr_info("Menelaus rev %d.%d\n", rev >> 4, rev & 0x0f); @@ -1258,7 +1239,6 @@ static int menelaus_probe(struct i2c_client *client, return 0; fail: free_irq(client->irq, menelaus); - flush_work(&menelaus->work); return err; } @@ -1267,7 +1247,6 @@ static int menelaus_remove(struct i2c_client *client) struct menelaus_chip *menelaus = i2c_get_clientdata(client); free_irq(client->irq, menelaus); - flush_work(&menelaus->work); the_menelaus = NULL; return 0; }