From patchwork Fri Oct 12 14:46:12 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Grygorii Strashko X-Patchwork-Id: 1587001 Return-Path: X-Original-To: patchwork-linux-omap@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork2.kernel.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by patchwork2.kernel.org (Postfix) with ESMTP id 97777DFF71 for ; Fri, 12 Oct 2012 14:46:38 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757951Ab2JLOqg (ORCPT ); Fri, 12 Oct 2012 10:46:36 -0400 Received: from arroyo.ext.ti.com ([192.94.94.40]:47640 "EHLO arroyo.ext.ti.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757623Ab2JLOqf convert rfc822-to-8bit (ORCPT ); Fri, 12 Oct 2012 10:46:35 -0400 Received: from dlelxv30.itg.ti.com ([172.17.2.17]) by arroyo.ext.ti.com (8.13.7/8.13.7) with ESMTP id q9CEkErf015549; Fri, 12 Oct 2012 09:46:14 -0500 Received: from DNCE71.ent.ti.com (dnce71.ent.ti.com [137.167.131.20]) by dlelxv30.itg.ti.com (8.13.8/8.13.8) with ESMTP id q9CEkEUd008406; Fri, 12 Oct 2012 09:46:14 -0500 Received: from DNCE04.ent.ti.com ([fe80::1df0:dc7c:d06:77a3]) by DNCE71.ent.ti.com ([fe80::3dd1:4b04:86e6:bfd0%29]) with mapi id 14.01.0323.003; Fri, 12 Oct 2012 16:46:13 +0200 From: "Strashko, Grygorii" To: Kevin Hilman CC: Kalle Jokiniemi , "linux-i2c@vger.kernel.org" , "w.sang@pengutronix.de" , "ben-linux@fluff.org" , "tony@atomide.com" , "linux-omap@vger.kernel.org" , "Datta, Shubhrajyoti" , "Kankroliwala, Huzefa" Subject: RE: [PATCH v3] ARM: OMAP: i2c: fix interrupt flood during resume Thread-Topic: [PATCH v3] ARM: OMAP: i2c: fix interrupt flood during resume Thread-Index: AQHNqIaj6kdVEyH/WEG5Rp6J/oa2ape1vaOW Date: Fri, 12 Oct 2012 14:46:12 +0000 Message-ID: <902E09E6452B0E43903E4F2D568737AB2C8C9F@DNCE04.ent.ti.com> References: <1349871480-25182-1-git-send-email-kalle.jokiniemi@jollamobile.com> <87ipag90om.fsf@deeprootsystems.com> <902E09E6452B0E43903E4F2D568737AB2C87B0@DNCE04.ent.ti.com>, <87d30n7o9q.fsf@deeprootsystems.com> In-Reply-To: <87d30n7o9q.fsf@deeprootsystems.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [137.167.131.94] x-exclaimer-md-config: f9c360f5-3d1e-4c3c-8703-f45bf52eff6b MIME-Version: 1.0 Sender: linux-omap-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-omap@vger.kernel.org Hi Kevin, yep, [1] is the same fix - thanks. Hi Kalle, i've applied these changes and PM runtime fix on top of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap.git (omap2plus_defconfig) Could you check it with your use case, pls? (just to be sure that idea is right) - Grygorii diff --git a/drivers/i2c/busses/i2c-omap.c b/drivers/i2c/busses/i2c-omap.c index a0e49f6..cb09e20 100644 --- a/drivers/i2c/busses/i2c-omap.c +++ b/drivers/i2c/busses/i2c-omap.c @@ -586,6 +586,9 @@ omap_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num) if (IS_ERR_VALUE(r)) goto out; + /* We have the bus, enable IRQ */ + enable_irq(dev->irq); + r = omap_i2c_wait_for_bb(dev); if (r < 0) goto out; @@ -606,6 +609,7 @@ omap_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num) r = num; omap_i2c_wait_for_bb(dev); + disable_irq(dev->irq); out: pm_runtime_put(dev->dev); return r; @@ -1060,6 +1064,9 @@ omap_i2c_probe(struct platform_device *pdev) omap_i2c_isr; r = request_irq(dev->irq, isr, IRQF_NO_SUSPEND, pdev->name, dev); + /* We enable IRQ only when request for I2C from master */ + disable_irq(dev->irq); + if (r) { dev_err(dev->dev, "failure requesting irq %i\n", dev->irq); goto err_unuse_clocks; @@ -1182,7 +1189,23 @@ static int omap_i2c_runtime_resume(struct device *dev) } #endif /* CONFIG_PM_RUNTIME */ +static int omap_i2c_suspend(struct device *dev) +{ + int ret; + + /* + * Enable I2C device, so it will be accessible during + * later stages of suspending when device Runtime PM is disabled. + * I2C device will be turned off at "noirq" suspend stage. + */ + ret = pm_runtime_resume(dev); + if (ret < 0) + return ret; + return 0; +} + static struct dev_pm_ops omap_i2c_pm_ops = { + SET_SYSTEM_SLEEP_PM_OPS(omap_i2c_suspend, NULL) SET_RUNTIME_PM_OPS(omap_i2c_runtime_suspend, omap_i2c_runtime_resume, NULL) };