From: Uwe Kleine-König <mailto:[email protected]> Sent: Tuesday,
October 13, 2015 3:07 PM
> To: Gao Pan-B54642
> Cc: [email protected]; [email protected]; Li Frank-B20596; Duan
> Fugang-B38611; [email protected]; [email protected]
> Subject: Re: [Patch V8] i2c: imx: add runtime pm support to improve the
> performance
>
> Hello,
>
> On Fri, Sep 18, 2015 at 05:51:09PM +0800, Gao Pan wrote:
> > In our former i2c driver, i2c clk is enabled and disabled in xfer
> > function, which contributes to power saving. However, the clk enable
> > process brings a busy wait delay until the core is stable. As a
> > result, the performance is sacrificed.
> >
> > To weigh the power consumption and i2c bus performance, runtime pm is
> > the good solution for it. The clk is enabled when a i2c transfer
> > starts, and disabled after a specifically defined delay.
> >
> > Without the patch the test case (many eeprom reads) executes with
> approx:
> > real 1m7.735s
> > user 0m0.488s
> > sys 0m20.040s
> >
> > With the patch the same test case (many eeprom reads) executes with
> approx:
> > real 0m54.241s
> > user 0m0.440s
> > sys 0m5.920s
> >
> > Signed-off-by: Fugang Duan <[email protected]>
> > Signed-off-by: Gao Pan <[email protected]>
>
> If runtime-pm is disabled the net result of this patch is that the clock
> is never disabled, right? I think this is ok, but I would have pointed
> that out in the commit log.
Yes, you are right, I will point that out in the commit log in next version.
> > @@ -1037,6 +1045,18 @@ static int i2c_imx_probe(struct platform_device
> *pdev)
> > /* Set up adapter data */
> > i2c_set_adapdata(&i2c_imx->adapter, i2c_imx);
> >
> > + /* Set up platform driver data */
> > + platform_set_drvdata(pdev, i2c_imx);
> > +
> > + pm_runtime_set_autosuspend_delay(&pdev->dev, I2C_PM_TIMEOUT);
> > + pm_runtime_use_autosuspend(&pdev->dev);
> > + pm_runtime_set_active(&pdev->dev);
> > + pm_runtime_enable(&pdev->dev);
> > +
> > + ret = pm_runtime_get_sync(&pdev->dev);
> > + if (ret < 0)
> > + goto rpm_disable;
> > +
> > /* Set up clock divider */
> > i2c_imx->bitrate = IMX_I2C_BIT_RATE;
> > ret = of_property_read_u32(pdev->dev.of_node,
> > @@ -1053,12 +1073,11 @@ static int i2c_imx_probe(struct platform_device
> *pdev)
> > ret = i2c_add_numbered_adapter(&i2c_imx->adapter);
> > if (ret < 0) {
> > dev_err(&pdev->dev, "registration failed\n");
> > - goto clk_disable;
> > + goto rpm_disable;
>
> Is it right, that here the same error path is taken as when
> pm_runtime_get_sync fails above? Even if it works now, not having the
> error cleanup path undo all things in reverse order is a danger to get it
> wrong in the next change. So if this is fixable, it would be nice to
> implement.
When i2c_add_numbered_adapter fails, the cleanup should include the runtime pm
stuff.
So it's ok to take the same error patch.
What do you mean by undo all things in reverse order, I think the cleanup is in
reverse order.
The calling sequence is:
pm_runtime_use_autosuspend(&pdev->dev);
pm_runtime_set_active(&pdev->dev);
pm_runtime_enable(&pdev->dev);
pm_runtime_get_sync(&pdev->dev);
The cleanup order is:
pm_runtime_put_noidle(&pdev->dev);
pm_runtime_disable(&pdev->dev);
pm_runtime_set_suspended(&pdev->dev);
Is it that I miss pm_runtime_dont_use_autosuspend(&pdev->dev);
Thank you!
Best Reguards
Gao Pan
--
To unsubscribe from this list: send the line "unsubscribe linux-i2c" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html