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 @@ | |||
15 | #include <linux/clkdev.h> | 15 | #include <linux/clkdev.h> |
16 | #include <linux/slab.h> | 16 | #include <linux/slab.h> |
17 | #include <linux/err.h> | 17 | #include <linux/err.h> |
18 | #include <linux/pm_runtime.h> | ||
18 | 19 | ||
19 | #ifdef CONFIG_PM | 20 | #ifdef CONFIG_PM |
20 | 21 | ||
@@ -67,7 +68,8 @@ static void pm_clk_acquire(struct device *dev, struct pm_clock_entry *ce) | |||
67 | } else { | 68 | } else { |
68 | clk_prepare(ce->clk); | 69 | clk_prepare(ce->clk); |
69 | ce->status = PCE_STATUS_ACQUIRED; | 70 | ce->status = PCE_STATUS_ACQUIRED; |
70 | dev_dbg(dev, "Clock %s managed by runtime PM.\n", ce->con_id); | 71 | dev_dbg(dev, "Clock %pC con_id %s managed by runtime PM.\n", |
72 | ce->clk, ce->con_id); | ||
71 | } | 73 | } |
72 | } | 74 | } |
73 | 75 | ||
@@ -93,7 +95,7 @@ static int __pm_clk_add(struct device *dev, const char *con_id, | |||
93 | return -ENOMEM; | 95 | return -ENOMEM; |
94 | } | 96 | } |
95 | } else { | 97 | } else { |
96 | if (IS_ERR(ce->clk) || !__clk_get(clk)) { | 98 | if (IS_ERR(clk) || !__clk_get(clk)) { |
97 | kfree(ce); | 99 | kfree(ce); |
98 | return -ENOENT; | 100 | return -ENOENT; |
99 | } | 101 | } |
@@ -367,6 +369,43 @@ static int pm_clk_notify(struct notifier_block *nb, | |||
367 | return 0; | 369 | return 0; |
368 | } | 370 | } |
369 | 371 | ||
372 | int pm_clk_runtime_suspend(struct device *dev) | ||
373 | { | ||
374 | int ret; | ||
375 | |||
376 | dev_dbg(dev, "%s\n", __func__); | ||
377 | |||
378 | ret = pm_generic_runtime_suspend(dev); | ||
379 | if (ret) { | ||
380 | dev_err(dev, "failed to suspend device\n"); | ||
381 | return ret; | ||
382 | } | ||
383 | |||
384 | ret = pm_clk_suspend(dev); | ||
385 | if (ret) { | ||
386 | dev_err(dev, "failed to suspend clock\n"); | ||
387 | pm_generic_runtime_resume(dev); | ||
388 | return ret; | ||
389 | } | ||
390 | |||
391 | return 0; | ||
392 | } | ||
393 | |||
394 | int pm_clk_runtime_resume(struct device *dev) | ||
395 | { | ||
396 | int ret; | ||
397 | |||
398 | dev_dbg(dev, "%s\n", __func__); | ||
399 | |||
400 | ret = pm_clk_resume(dev); | ||
401 | if (ret) { | ||
402 | dev_err(dev, "failed to resume clock\n"); | ||
403 | return ret; | ||
404 | } | ||
405 | |||
406 | return pm_generic_runtime_resume(dev); | ||
407 | } | ||
408 | |||
370 | #else /* !CONFIG_PM */ | 409 | #else /* !CONFIG_PM */ |
371 | 410 | ||
372 | /** | 411 | /** |