Commit 7272194e authored by Mika Westerberg's avatar Mika Westerberg Committed by Wolfram Sang

i2c-designware: add minimal support for runtime PM

In order to save power the device should be put to low power states
whenever it is not being used. We implement this by enabling minimal
runtime PM support.

There isn't much to do for the device itself as it is disabled once the
last transfer is completed but subsystem/domain runtime PM hooks can save
more power by power gating the device etc.
Signed-off-by: default avatarMika Westerberg <mika.westerberg@linux.intel.com>
Signed-off-by: default avatarWolfram Sang <w.sang@pengutronix.de>
parent 17a76b4b
...@@ -37,6 +37,7 @@ ...@@ -37,6 +37,7 @@
#include <linux/of_i2c.h> #include <linux/of_i2c.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/pm.h> #include <linux/pm.h>
#include <linux/pm_runtime.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/slab.h> #include <linux/slab.h>
#include "i2c-designware-core.h" #include "i2c-designware-core.h"
...@@ -149,6 +150,10 @@ static int dw_i2c_probe(struct platform_device *pdev) ...@@ -149,6 +150,10 @@ static int dw_i2c_probe(struct platform_device *pdev)
} }
of_i2c_register_devices(adap); of_i2c_register_devices(adap);
pm_runtime_set_active(&pdev->dev);
pm_runtime_enable(&pdev->dev);
pm_runtime_put(&pdev->dev);
return 0; return 0;
err_free_irq: err_free_irq:
...@@ -175,6 +180,8 @@ static int dw_i2c_remove(struct platform_device *pdev) ...@@ -175,6 +180,8 @@ static int dw_i2c_remove(struct platform_device *pdev)
struct resource *mem; struct resource *mem;
platform_set_drvdata(pdev, NULL); platform_set_drvdata(pdev, NULL);
pm_runtime_get_sync(&pdev->dev);
i2c_del_adapter(&dev->adapter); i2c_del_adapter(&dev->adapter);
put_device(&pdev->dev); put_device(&pdev->dev);
...@@ -186,6 +193,9 @@ static int dw_i2c_remove(struct platform_device *pdev) ...@@ -186,6 +193,9 @@ static int dw_i2c_remove(struct platform_device *pdev)
free_irq(dev->irq, dev); free_irq(dev->irq, dev);
kfree(dev); kfree(dev);
pm_runtime_put(&pdev->dev);
pm_runtime_disable(&pdev->dev);
mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
release_mem_region(mem->start, resource_size(mem)); release_mem_region(mem->start, resource_size(mem));
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment