diff options
Diffstat (limited to 'drivers/base/power/clock_ops.c')
| -rw-r--r-- | drivers/base/power/clock_ops.c | 43 | 
1 files changed, 41 insertions, 2 deletions
diff --git a/drivers/base/power/clock_ops.c b/drivers/base/power/clock_ops.c index 7fdd0172605a..acef9f9f759a 100644 --- a/drivers/base/power/clock_ops.c +++ b/drivers/base/power/clock_ops.c @@ -15,6 +15,7 @@  #include <linux/clkdev.h>  #include <linux/slab.h>  #include <linux/err.h> +#include <linux/pm_runtime.h>  #ifdef CONFIG_PM @@ -67,7 +68,8 @@ static void pm_clk_acquire(struct device *dev, struct pm_clock_entry *ce)  	} else {  		clk_prepare(ce->clk);  		ce->status = PCE_STATUS_ACQUIRED; -		dev_dbg(dev, "Clock %s managed by runtime PM.\n", ce->con_id); +		dev_dbg(dev, "Clock %pC con_id %s managed by runtime PM.\n", +			ce->clk, ce->con_id);  	}  } @@ -93,7 +95,7 @@ static int __pm_clk_add(struct device *dev, const char *con_id,  			return -ENOMEM;  		}  	} else { -		if (IS_ERR(ce->clk) || !__clk_get(clk)) { +		if (IS_ERR(clk) || !__clk_get(clk)) {  			kfree(ce);  			return -ENOENT;  		} @@ -367,6 +369,43 @@ static int pm_clk_notify(struct notifier_block *nb,  	return 0;  } +int pm_clk_runtime_suspend(struct device *dev) +{ +	int ret; + +	dev_dbg(dev, "%s\n", __func__); + +	ret = pm_generic_runtime_suspend(dev); +	if (ret) { +		dev_err(dev, "failed to suspend device\n"); +		return ret; +	} + +	ret = pm_clk_suspend(dev); +	if (ret) { +		dev_err(dev, "failed to suspend clock\n"); +		pm_generic_runtime_resume(dev); +		return ret; +	} + +	return 0; +} + +int pm_clk_runtime_resume(struct device *dev) +{ +	int ret; + +	dev_dbg(dev, "%s\n", __func__); + +	ret = pm_clk_resume(dev); +	if (ret) { +		dev_err(dev, "failed to resume clock\n"); +		return ret; +	} + +	return pm_generic_runtime_resume(dev); +} +  #else /* !CONFIG_PM */  /**  |