driver: net: ethernet: davinci_mdio: runtime PM support
authorMugunthan V N <mugunthanvnm@ti.com>
Tue, 17 Jul 2012 08:09:49 +0000 (08:09 +0000)
committerDavid S. Miller <davem@davemloft.net>
Wed, 18 Jul 2012 16:40:54 +0000 (09:40 -0700)
Enabling runtime PM support for davinci mdio driver

Signed-off-by: Mugunthan V N <mugunthanvnm@ti.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/ti/davinci_mdio.c

index e4e47088e26b98fe0118c16ae17da61ec0f07dde..cd7ee204e94a10abaa88b3288dcd2cace5ceca3e 100644 (file)
@@ -34,6 +34,7 @@
 #include <linux/clk.h>
 #include <linux/err.h>
 #include <linux/io.h>
+#include <linux/pm_runtime.h>
 #include <linux/davinci_emac.h>
 
 /*
@@ -321,7 +322,9 @@ static int __devinit davinci_mdio_probe(struct platform_device *pdev)
        snprintf(data->bus->id, MII_BUS_ID_SIZE, "%s-%x",
                pdev->name, pdev->id);
 
-       data->clk = clk_get(dev, NULL);
+       pm_runtime_enable(&pdev->dev);
+       pm_runtime_get_sync(&pdev->dev);
+       data->clk = clk_get(&pdev->dev, "fck");
        if (IS_ERR(data->clk)) {
                dev_err(dev, "failed to get device clock\n");
                ret = PTR_ERR(data->clk);
@@ -329,8 +332,6 @@ static int __devinit davinci_mdio_probe(struct platform_device *pdev)
                goto bail_out;
        }
 
-       clk_enable(data->clk);
-
        dev_set_drvdata(dev, data);
        data->dev = dev;
        spin_lock_init(&data->lock);
@@ -378,10 +379,10 @@ bail_out:
        if (data->bus)
                mdiobus_free(data->bus);
 
-       if (data->clk) {
-               clk_disable(data->clk);
+       if (data->clk)
                clk_put(data->clk);
-       }
+       pm_runtime_put_sync(&pdev->dev);
+       pm_runtime_disable(&pdev->dev);
 
        kfree(data);
 
@@ -396,10 +397,10 @@ static int __devexit davinci_mdio_remove(struct platform_device *pdev)
        if (data->bus)
                mdiobus_free(data->bus);
 
-       if (data->clk) {
-               clk_disable(data->clk);
+       if (data->clk)
                clk_put(data->clk);
-       }
+       pm_runtime_put_sync(&pdev->dev);
+       pm_runtime_disable(&pdev->dev);
 
        dev_set_drvdata(dev, NULL);
 
@@ -421,8 +422,7 @@ static int davinci_mdio_suspend(struct device *dev)
        __raw_writel(ctrl, &data->regs->control);
        wait_for_idle(data);
 
-       if (data->clk)
-               clk_disable(data->clk);
+       pm_runtime_put_sync(data->dev);
 
        data->suspended = true;
        spin_unlock(&data->lock);
@@ -436,8 +436,7 @@ static int davinci_mdio_resume(struct device *dev)
        u32 ctrl;
 
        spin_lock(&data->lock);
-       if (data->clk)
-               clk_enable(data->clk);
+       pm_runtime_put_sync(data->dev);
 
        /* restart the scan state machine */
        ctrl = __raw_readl(&data->regs->control);