linux-i2c.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Kalle Jokiniemi <kalle.jokiniemi@jollamobile.com>
To: "Strashko, Grygorii" <grygorii.strashko@ti.com>
Cc: Kevin Hilman <khilman@deeprootsystems.com>,
	"linux-i2c@vger.kernel.org" <linux-i2c@vger.kernel.org>,
	"w.sang@pengutronix.de" <w.sang@pengutronix.de>,
	"ben-linux@fluff.org" <ben-linux@fluff.org>,
	"tony@atomide.com" <tony@atomide.com>,
	"linux-omap@vger.kernel.org" <linux-omap@vger.kernel.org>,
	"Datta, Shubhrajyoti" <shubhrajyoti@ti.com>,
	"Kankroliwala, Huzefa" <huzefank@ti.com>
Subject: RE: [PATCH v3] ARM: OMAP: i2c: fix interrupt flood during resume
Date: Fri, 12 Oct 2012 16:28:33 +0300	[thread overview]
Message-ID: <1350048513.17145.33.camel@kj-X230> (raw)
In-Reply-To: <902E09E6452B0E43903E4F2D568737AB2C87B0@DNCE04.ent.ti.com>

Hi,

pe, 2012-10-12 kello 10:18 +0000, Strashko, Grygorii kirjoitti:
> Hi All,
> 
> Sorry, for the late reply.
> + CC Huzefa Kankroliwala - who is I2C driver owner on Android Kernel 3.4.
> 
> Regarding this patch -  from my point of view, it fixes corner case and not an issue in general.
> Let take a look on resume sequence:
>    - platform resume
>    - syscore resume
>    - resume_noirq
>    - enable IRQs - resume_device_irqs()
>      |- at this point IRQ handler will be invoked if IRQ state is IRQS_PENDING.
>      |- so, the I2C device IRQ handler may be called at time when I2C
> 	adapter IRQ is still disabled and, as result, the I2C device
> 	IRQ-handler may fail. (I2C device and I2C adapter may use different
> 	physical IRQ lines)

The use case is to wake up the the device from suspend via twl4030 power
key line. The twl4030 then will interrupt host via the i2c bus. And on
the host the i2c bus is then read by the twl4030-pwrkey threaded SW
interrupt (which is disabled at the point when i2c bus HW interrupt
occurs).


>   - resume_late
>      |- enable I2C bus IRQ
> 
> Possibly, the better way is to enable/disable I2C bus IRQ when needed - in our case in omap_i2c_xfer().
> We use such approach in Android kernel 3.4
> (http://git.omapzoom.org/?p=kernel/omap.git;a=commitdiff;h=1445a4d3b587c164bd30d108b61760aaaa07365e)

Sounds like it could work... however I tested the patch above, but my
device now dies when waking it from suspend (autosleep, actually) with
power key :(

Have you guys considered reworking that patch for upstream? There seems
to be some spinlocking there that was not in linux-omap that I tested
on.

- Kalle

> 
> Grygorii
> ________________________________________
> From: Kevin Hilman [khilman@deeprootsystems.com]
> Sent: Friday, October 12, 2012 12:08 AM
> To: Kalle Jokiniemi
> Cc: linux-i2c@vger.kernel.org; w.sang@pengutronix.de; ben-linux@fluff.org; tony@atomide.com; linux-omap@vger.kernel.org; Strashko, Grygorii; Datta, Shubhrajyoti
> Subject: Re: [PATCH v3] ARM: OMAP: i2c: fix interrupt flood during resume
> 
> Hi Kalle,
> 
> Kalle Jokiniemi <kalle.jokiniemi@jollamobile.com> writes:
> 
> > The resume_noirq enables interrupts one-by-one starting from
> > first one. Now if the wake up event for suspend came from i2c
> > device, the i2c bus irq gets enabled before the threaded
> > i2c device irq, causing a flood of i2c bus interrupts as the
> > threaded irq that should clear the event is not enabled yet.
> >
> > Fixed the issue by adding suspend_noirq and resume_early
> > functions that keep i2c bus interrupts disabled until
> > resume_noirq has run completely.
> >
> > Issue was detected doing a wake up from autosleep with
> > twl4030 power key on N9. Patch tested on N9.
> >
> > Signed-off-by: Kalle Jokiniemi <kalle.jokiniemi@jollamobile.com>
> 
> This version looks good, thanks for the extra comments.
> 
> Reviewed-by: Kevin Hilman <khilman@ti.com>
> Tested-by: Kevin Hilman <khilman@ti.com>
> 
> Wolfram, This should also probably be Cc'd to stable since it affects
> earlier kernels as well.  Thanks,
> 
> Kevin
> 
> > ---
> >  drivers/i2c/busses/i2c-omap.c |   34 ++++++++++++++++++++++++++++++++++
> >  1 files changed, 34 insertions(+), 0 deletions(-)
> >
> > diff --git a/drivers/i2c/busses/i2c-omap.c b/drivers/i2c/busses/i2c-omap.c
> > index a0e49f6..991341b 100644
> > --- a/drivers/i2c/busses/i2c-omap.c
> > +++ b/drivers/i2c/busses/i2c-omap.c
> > @@ -1132,6 +1132,36 @@ static int __devexit omap_i2c_remove(struct platform_device *pdev)
> >  }
> >
> >  #ifdef CONFIG_PM
> > +#ifdef CONFIG_PM_SLEEP
> > +static int omap_i2c_suspend_noirq(struct device *dev)
> > +{
> > +
> > +     struct platform_device *pdev = to_platform_device(dev);
> > +     struct omap_i2c_dev *_dev = platform_get_drvdata(pdev);
> > +
> > +     /* Disabling irq here to balance the enable in resume_early */
> > +     disable_irq(_dev->irq);
> > +     return 0;
> > +}
> > +
> > +static int omap_i2c_resume_early(struct device *dev)
> > +{
> > +
> > +     struct platform_device *pdev = to_platform_device(dev);
> > +     struct omap_i2c_dev *_dev = platform_get_drvdata(pdev);
> > +
> > +     /*
> > +      * The noirq_resume enables the interrupts one by one,
> > +      * this causes a interrupt flood if the SW irq actually reading
> > +      * event from i2c device is enabled only after i2c bus irq, as the
> > +      * irq that should clear the event is still disabled. We have to
> > +      * keep the bus irq disabled until all other irqs have been enabled.
> > +      */
> > +     enable_irq(_dev->irq);
> > +
> > +     return 0;
> > +}
> > +#endif
> >  #ifdef CONFIG_PM_RUNTIME
> >  static int omap_i2c_runtime_suspend(struct device *dev)
> >  {
> > @@ -1183,6 +1213,10 @@ static int omap_i2c_runtime_resume(struct device *dev)
> >  #endif /* CONFIG_PM_RUNTIME */
> >
> >  static struct dev_pm_ops omap_i2c_pm_ops = {
> > +#ifdef CONFIG_PM_SLEEP
> > +     .suspend_noirq = omap_i2c_suspend_noirq,
> > +     .resume_early = omap_i2c_resume_early,
> > +#endif
> >       SET_RUNTIME_PM_OPS(omap_i2c_runtime_suspend,
> >                          omap_i2c_runtime_resume, NULL)
> >  };



  parent reply	other threads:[~2012-10-12 13:28 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-10-10 12:18 [PATCH v3] ARM: OMAP: i2c: fix interrupt flood during resume Kalle Jokiniemi
     [not found] ` <1349871480-25182-1-git-send-email-kalle.jokiniemi-4y2FMlU5MS8onNqTyK5kxQ@public.gmane.org>
2012-10-11  7:59   ` Shubhrajyoti Datta
2012-10-11 21:08   ` Kevin Hilman
     [not found]     ` <87ipag90om.fsf-1D3HCaltpLuhEniVeURVKkEOCMrvLtNR@public.gmane.org>
2012-10-12 10:18       ` Strashko, Grygorii
2012-10-12 11:33         ` Shubhrajyoti
     [not found]           ` <5077FFEC.5040407-l0cyMroinI0@public.gmane.org>
2012-10-12 12:55             ` Kankroliwala, Huzefa
2012-10-12 13:28         ` Kalle Jokiniemi [this message]
     [not found]         ` <902E09E6452B0E43903E4F2D568737AB2C87B0-bXo5r3zvlxeIQmiDNMet8wC/G2K4zDHf@public.gmane.org>
2012-10-12 14:17           ` Kevin Hilman
2012-10-12 14:34         ` Kevin Hilman
     [not found]           ` <87d30n7o9q.fsf-1D3HCaltpLuhEniVeURVKkEOCMrvLtNR@public.gmane.org>
2012-10-12 14:46             ` Strashko, Grygorii
2012-10-12 16:43               ` Kevin Hilman
     [not found]                 ` <87r4p363ps.fsf-1D3HCaltpLuhEniVeURVKkEOCMrvLtNR@public.gmane.org>
2012-10-12 18:11                   ` Shubhrajyoti Datta
2012-10-12 19:04                     ` Kevin Hilman
     [not found]                       ` <87txtzy0jf.fsf-1D3HCaltpLuhEniVeURVKkEOCMrvLtNR@public.gmane.org>
2012-10-12 19:15                         ` shubhro
     [not found]               ` <902E09E6452B0E43903E4F2D568737AB2C8C9F-bXo5r3zvlxeIQmiDNMet8wC/G2K4zDHf@public.gmane.org>
2012-10-15  6:21                 ` Kalle Jokiniemi
2012-10-15  9:16                   ` Kalle Jokiniemi
2012-10-15 10:11                     ` Shubhrajyoti Datta
     [not found]                       ` <CAM=Q2cuJ-0VSgkBme_Cg8YD2cBG5NZcO6aBeTsPZ_PQGMwJ=bw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2012-10-15 14:10                         ` Kalle Jokiniemi
2012-10-17 16:02       ` Felipe Balbi
     [not found]         ` <20121017160200.GA6567-S8G//mZuvNWo5Im9Ml3/Zg@public.gmane.org>
2012-10-18  6:51           ` Kalle Jokiniemi
2012-10-18  7:11             ` Felipe Balbi

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=1350048513.17145.33.camel@kj-X230 \
    --to=kalle.jokiniemi@jollamobile.com \
    --cc=ben-linux@fluff.org \
    --cc=grygorii.strashko@ti.com \
    --cc=huzefank@ti.com \
    --cc=kalle.jokiniemi@jolla.com \
    --cc=khilman@deeprootsystems.com \
    --cc=linux-i2c@vger.kernel.org \
    --cc=linux-omap@vger.kernel.org \
    --cc=shubhrajyoti@ti.com \
    --cc=tony@atomide.com \
    --cc=w.sang@pengutronix.de \
    /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;
as well as URLs for NNTP newsgroup(s).