i2c-designware: add minimal support for runtime PM
authorMika Westerberg <mika.westerberg@linux.intel.com>
Thu, 17 Jan 2013 10:31:06 +0000 (12:31 +0200)
committerWolfram Sang <w.sang@pengutronix.de>
Mon, 28 Jan 2013 04:26:42 +0000 (05:26 +0100)
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: Mika Westerberg <mika.westerberg@linux.intel.com>
Signed-off-by: Wolfram Sang <w.sang@pengutronix.de>
drivers/i2c/busses/i2c-designware-platdrv.c

index 343357a2b5b42fda96d27d2f3514a183e0bd901f..d8afc85420be0a524d31c9c4d430e4253bd02a59 100644 (file)
@@ -37,6 +37,7 @@
 #include <linux/of_i2c.h>
 #include <linux/platform_device.h>
 #include <linux/pm.h>
+#include <linux/pm_runtime.h>
 #include <linux/io.h>
 #include <linux/slab.h>
 #include "i2c-designware-core.h"
@@ -149,6 +150,10 @@ static int dw_i2c_probe(struct platform_device *pdev)
        }
        of_i2c_register_devices(adap);
 
+       pm_runtime_set_active(&pdev->dev);
+       pm_runtime_enable(&pdev->dev);
+       pm_runtime_put(&pdev->dev);
+
        return 0;
 
 err_free_irq:
@@ -175,6 +180,8 @@ static int dw_i2c_remove(struct platform_device *pdev)
        struct resource *mem;
 
        platform_set_drvdata(pdev, NULL);
+       pm_runtime_get_sync(&pdev->dev);
+
        i2c_del_adapter(&dev->adapter);
        put_device(&pdev->dev);
 
@@ -186,6 +193,9 @@ static int dw_i2c_remove(struct platform_device *pdev)
        free_irq(dev->irq, dev);
        kfree(dev);
 
+       pm_runtime_put(&pdev->dev);
+       pm_runtime_disable(&pdev->dev);
+
        mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        release_mem_region(mem->start, resource_size(mem));
        return 0;