On 01/21/2012 02:28 PM, Mark Brown wrote: > Add stub runtime_pm calls which go through the flow of enabling and > disabling but don't actually do anything with the device itself as > there's nothing useful we can do. This provides the core PM framework > with information about when the device is idle, enabling chip wide > power savings. > > Signed-off-by: Mark Brown<broonie-yzvPICuk2AATkU/dhu1WVueM+bqZidxxQQ4Iyu8u01E@xxxxxxxxxxxxxxxx> > Acked-by: Heiko Stuebner<heiko-4mtYJXux2i+zQB+pC5nmwQ@xxxxxxxxxxxxxxxx> > --- > drivers/i2c/busses/i2c-s3c2410.c | 10 ++++++++++ > 1 files changed, 10 insertions(+), 0 deletions(-) > > diff --git a/drivers/i2c/busses/i2c-s3c2410.c b/drivers/i2c/busses/i2c-s3c2410.c > index e6f982b..737f721 100644 > --- a/drivers/i2c/busses/i2c-s3c2410.c > +++ b/drivers/i2c/busses/i2c-s3c2410.c > @@ -31,6 +31,7 @@ > #include<linux/errno.h> > #include<linux/err.h> > #include<linux/platform_device.h> > +#include<linux/pm_runtime.h> > #include<linux/clk.h> > #include<linux/cpufreq.h> > #include<linux/slab.h> > @@ -564,6 +565,7 @@ static int s3c24xx_i2c_xfer(struct i2c_adapter *adap, > int retry; > int ret; > > + pm_runtime_get_sync(&adap->dev); > clk_enable(i2c->clk); It looks a bit strange to have pm_runtime* and manual clock control side by side. How about implementing proper runtime_suspend/resume calls and moving clk_enable/disable to these handlers ? It might also make sense to check return value of pm_runtime_get_sync(). > for (retry = 0; retry< adap->retries; retry++) { > @@ -572,6 +574,7 @@ static int s3c24xx_i2c_xfer(struct i2c_adapter *adap, > > if (ret != -EAGAIN) { > clk_disable(i2c->clk); > + pm_runtime_put_sync(&adap->dev); I would go for just pm_runtime_put() here... > return ret; > } > > @@ -581,6 +584,7 @@ static int s3c24xx_i2c_xfer(struct i2c_adapter *adap, > } > > clk_disable(i2c->clk); > + pm_runtime_put_sync(&adap->dev); .. and here as well. > return -EREMOTEIO; > } > > @@ -1013,6 +1017,9 @@ static int s3c24xx_i2c_probe(struct platform_device *pdev) > of_i2c_register_devices(&i2c->adap); > platform_set_drvdata(pdev, i2c); > > + pm_runtime_enable(&pdev->dev); > + pm_runtime_enable(&i2c->adap.dev); Why do we need pm_runtime_enable() on i2c->adap.dev ? AFAIK enabling runtime PM on the platform device only should do. > + > dev_info(&pdev->dev, "%s: S3C I2C adapter\n", dev_name(&i2c->adap.dev)); > clk_disable(i2c->clk); > return 0; > @@ -1047,6 +1054,9 @@ static int s3c24xx_i2c_remove(struct platform_device *pdev) > { > struct s3c24xx_i2c *i2c = platform_get_drvdata(pdev); > > + pm_runtime_disable(&i2c->adap.dev); > + pm_runtime_disable(&pdev->dev); Ditto. > + > s3c24xx_i2c_deregister_cpufreq(i2c); > > i2c_del_adapter(&i2c->adap); -- Thanks, Sylwester -- To unsubscribe from this list: send the line "unsubscribe linux-i2c" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html