Re: [PATCH v3 1/2] i2c: davinci: Add PM Runtime Support
From: Franklin S Cooper Jr <hidden>
Date: 2017-09-11 20:07:53
Also in:
linux-arm-kernel, linux-i2c, lkml
On 09/11/2017 06:29 AM, Sekhar Nori wrote:
On Friday 08 September 2017 11:24 PM, Franklin S Cooper Jr wrote:quoted
66AK2G has I2C instances that are not apart of the ALWAYS_ON power domain like other Keystone 2 SoCs and OMAPL138. Therefore, pm_runtimeunlike ?quoted
is required to insure the power domain used by the specific I2C instance is properly turned on along with its functional clock. Signed-off-by: Franklin S Cooper Jr <redacted> --- Version 3 changes: Remove several statements that set clk to NULL Fix error path drivers/i2c/busses/i2c-davinci.c | 64 +++++++++++++++++++++++++++++++++------- 1 file changed, 53 insertions(+), 11 deletions(-)quoted
@@ -802,12 +821,22 @@ static int davinci_i2c_probe(struct platform_device *pdev) dev->clk = devm_clk_get(&pdev->dev, NULL); if (IS_ERR(dev->clk)) return PTR_ERR(dev->clk); - clk_prepare_enable(dev->clk); mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); dev->base = devm_ioremap_resource(&pdev->dev, mem); if (IS_ERR(dev->base)) { - r = PTR_ERR(dev->base); + return PTR_ERR(dev->base); + } + + pm_runtime_set_autosuspend_delay(dev->dev, + DAVINCI_I2C_PM_TIMEOUT); + pm_runtime_use_autosuspend(dev->dev); + + pm_runtime_enable(dev->dev); + + r = pm_runtime_get_sync(dev->dev); + if (r < 0) { + dev_err(dev->dev, "failed to runtime_get device: %d\n", r); goto err_unuse_clocks;You end up doing a pm_runtime_put_sync() on failure here, instead of pm_runtime_put_noidle() like rest of the patch. May be handle this failure here instead of relying on the goto path.
Ok
quoted
}@@ -849,27 +878,40 @@ static int davinci_i2c_probe(struct platform_device *pdev) if (r) goto err_unuse_clocks; + pm_runtime_mark_last_busy(dev->dev); + pm_runtime_put_autosuspend(dev->dev); + return 0; err_unuse_clocks: - clk_disable_unprepare(dev->clk); - dev->clk = NULL; + pm_runtime_dont_use_autosuspend(dev->dev); + pm_runtime_put_sync(dev->dev); + pm_runtime_disable(dev->dev); + return r; }Thanks, Sekhar