Hi,

pe, 2012-10-12 kello 14:46 +0000, Strashko, Grygorii kirjoitti:
> 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)

Odd, it's not working. I'll add some debug prints to see what happens
there.

- Kalle

> 
> 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)
>  };
> 
> - Grygorii
> ________________________________________
> From: Kevin Hilman [khil...@deeprootsystems.com]
> Sent: Friday, October 12, 2012 5:34 PM
> To: Strashko, Grygorii
> Cc: Kalle Jokiniemi; linux-i2c@vger.kernel.org; w.s...@pengutronix.de; 
> ben-li...@fluff.org; t...@atomide.com; linux-o...@vger.kernel.org; Datta, 
> Shubhrajyoti; Kankroliwala, Huzefa
> Subject: Re: [PATCH v3] ARM: OMAP: i2c: fix interrupt flood during resume
> 
> "Strashko, Grygorii" <grygorii.stras...@ti.com> writes:
> 
> > Hi All,
> >
> > Sorry, for the late reply.
> > + CC Huzefa Kankroliwala - who is I2C driver owner on Android Kernel 3.4.
> 
> Hi Grygorii, thanks for reviewing.  I was hoping you would have some
> ideas here as this was sounding familiar to something you had
> mentioned elsewhere.
> 
> > 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)
> >    - 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)
> 
> I agree, that should work and cover the cases where I2C is used by other
> processors also.  Shubhrajyoti already posted something similar[1] but
> it needed some rework (comments from Russell and myself.)
> 
> Huzefa, Shubhrajyoti, who can rework this idea for the upstream and/or
> follow up with the earlier patch[1]?
> 
> Wolfram, I guess for now lets hold off on $SUBJECT patch.  Seems we can
> come up with a broader solution.  Thanks.
> 
> Kevin
> 
> [1] 
> http://lists.infradead.org/pipermail/linux-arm-kernel/2012-October/124427.html


--
To unsubscribe from this list: send the line "unsubscribe linux-i2c" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to