diff options
author | Geert Uytterhoeven <geert+renesas@glider.be> | 2018-07-20 15:27:39 +0300 |
---|---|---|
committer | Tejun Heo <tj@kernel.org> | 2018-07-23 18:18:43 +0300 |
commit | 1ecd34ddf63ef1d4015da5e5de6881e6845a6b0a (patch) | |
tree | 833769609ee48758c8d4b196a8ec7d09de4110d1 /drivers/ata | |
parent | c01e229f24eb133ca85453597447477974b07f20 (diff) | |
download | linux-1ecd34ddf63ef1d4015da5e5de6881e6845a6b0a.tar.xz |
ata: sata_rcar: Add rudimentary Runtime PM support
Replace the explicit clock handling to enable/disable the SATA module by
calls to Runtime PM.
This makes the driver independent of actual SoC clock/power hierarchies,
and is needed to support virtualization, where the guest is not in full
control of power management.
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
Reviewed-by: Sergei Shtylyov <sergei.shtylyov@cogentembedded.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
Diffstat (limited to 'drivers/ata')
-rw-r--r-- | drivers/ata/sata_rcar.c | 40 |
1 files changed, 18 insertions, 22 deletions
diff --git a/drivers/ata/sata_rcar.c b/drivers/ata/sata_rcar.c index f972c2c5ebd3..3b8ed10bfb8f 100644 --- a/drivers/ata/sata_rcar.c +++ b/drivers/ata/sata_rcar.c @@ -17,7 +17,7 @@ #include <linux/libata.h> #include <linux/of_device.h> #include <linux/platform_device.h> -#include <linux/clk.h> +#include <linux/pm_runtime.h> #include <linux/err.h> #define DRV_NAME "sata_rcar" @@ -152,7 +152,6 @@ enum sata_rcar_type { struct sata_rcar_priv { void __iomem *base; - struct clk *clk; enum sata_rcar_type type; }; @@ -897,21 +896,17 @@ static int sata_rcar_probe(struct platform_device *pdev) return -ENOMEM; priv->type = (enum sata_rcar_type)of_device_get_match_data(dev); - priv->clk = devm_clk_get(dev, NULL); - if (IS_ERR(priv->clk)) { - dev_err(dev, "failed to get access to sata clock\n"); - return PTR_ERR(priv->clk); - } - ret = clk_prepare_enable(priv->clk); - if (ret) - return ret; + pm_runtime_enable(dev); + ret = pm_runtime_get_sync(dev); + if (ret < 0) + goto err_pm_disable; host = ata_host_alloc(dev, 1); if (!host) { dev_err(dev, "ata_host_alloc failed\n"); ret = -ENOMEM; - goto cleanup; + goto err_pm_put; } host->private_data = priv; @@ -920,7 +915,7 @@ static int sata_rcar_probe(struct platform_device *pdev) priv->base = devm_ioremap_resource(dev, mem); if (IS_ERR(priv->base)) { ret = PTR_ERR(priv->base); - goto cleanup; + goto err_pm_put; } /* setup port */ @@ -934,9 +929,10 @@ static int sata_rcar_probe(struct platform_device *pdev) if (!ret) return 0; -cleanup: - clk_disable_unprepare(priv->clk); - +err_pm_put: + pm_runtime_put(dev); +err_pm_disable: + pm_runtime_disable(dev); return ret; } @@ -954,7 +950,8 @@ static int sata_rcar_remove(struct platform_device *pdev) iowrite32(0, base + SATAINTSTAT_REG); iowrite32(0x7ff, base + SATAINTMASK_REG); - clk_disable_unprepare(priv->clk); + pm_runtime_put(&pdev->dev); + pm_runtime_disable(&pdev->dev); return 0; } @@ -974,7 +971,7 @@ static int sata_rcar_suspend(struct device *dev) /* mask */ iowrite32(0x7ff, base + SATAINTMASK_REG); - clk_disable_unprepare(priv->clk); + pm_runtime_put(dev); } return ret; @@ -987,8 +984,8 @@ static int sata_rcar_resume(struct device *dev) void __iomem *base = priv->base; int ret; - ret = clk_prepare_enable(priv->clk); - if (ret) + ret = pm_runtime_get_sync(dev); + if (ret < 0) return ret; if (priv->type == RCAR_GEN3_SATA) { @@ -1012,11 +1009,10 @@ static int sata_rcar_resume(struct device *dev) static int sata_rcar_restore(struct device *dev) { struct ata_host *host = dev_get_drvdata(dev); - struct sata_rcar_priv *priv = host->private_data; int ret; - ret = clk_prepare_enable(priv->clk); - if (ret) + ret = pm_runtime_get_sync(dev); + if (ret < 0) return ret; sata_rcar_setup_port(host); |