diff options
author | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2014-01-16 19:56:56 -0500 |
---|---|---|
committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2014-01-16 19:56:56 -0500 |
commit | 380062bd66dc65287a3e9f937bc0dee2c434d25d (patch) | |
tree | 2dd8ee2f4c598a21bf7eed2b3af96dd91dc08bd6 /drivers/base | |
parent | 9612a461c1e48f75ca1e1f0faf9c928761baae5b (diff) | |
parent | 5cda3fbb155bff96c971d058ed040d5c85612fd8 (diff) |
Merge branch 'pm-clk'
* pm-clk:
PM / clock_ops: report clock errors from clk_enable()
PM / clock_ops: check return of clk_enable() in pm_clk_resume()
PM / clock_ops: fix up clk prepare/unprepare count
Diffstat (limited to 'drivers/base')
-rw-r--r-- | drivers/base/power/clock_ops.c | 30 |
1 files changed, 25 insertions, 5 deletions
diff --git a/drivers/base/power/clock_ops.c b/drivers/base/power/clock_ops.c index 9d8fde709390..e870bbe9ec4e 100644 --- a/drivers/base/power/clock_ops.c +++ b/drivers/base/power/clock_ops.c | |||
@@ -33,6 +33,21 @@ struct pm_clock_entry { | |||
33 | }; | 33 | }; |
34 | 34 | ||
35 | /** | 35 | /** |
36 | * pm_clk_enable - Enable a clock, reporting any errors | ||
37 | * @dev: The device for the given clock | ||
38 | * @clk: The clock being enabled. | ||
39 | */ | ||
40 | static inline int __pm_clk_enable(struct device *dev, struct clk *clk) | ||
41 | { | ||
42 | int ret = clk_enable(clk); | ||
43 | if (ret) | ||
44 | dev_err(dev, "%s: failed to enable clk %p, error %d\n", | ||
45 | __func__, clk, ret); | ||
46 | |||
47 | return ret; | ||
48 | } | ||
49 | |||
50 | /** | ||
36 | * pm_clk_acquire - Acquire a device clock. | 51 | * pm_clk_acquire - Acquire a device clock. |
37 | * @dev: Device whose clock is to be acquired. | 52 | * @dev: Device whose clock is to be acquired. |
38 | * @ce: PM clock entry corresponding to the clock. | 53 | * @ce: PM clock entry corresponding to the clock. |
@@ -43,6 +58,7 @@ static void pm_clk_acquire(struct device *dev, struct pm_clock_entry *ce) | |||
43 | if (IS_ERR(ce->clk)) { | 58 | if (IS_ERR(ce->clk)) { |
44 | ce->status = PCE_STATUS_ERROR; | 59 | ce->status = PCE_STATUS_ERROR; |
45 | } else { | 60 | } else { |
61 | clk_prepare(ce->clk); | ||
46 | ce->status = PCE_STATUS_ACQUIRED; | 62 | ce->status = PCE_STATUS_ACQUIRED; |
47 | dev_dbg(dev, "Clock %s managed by runtime PM.\n", ce->con_id); | 63 | dev_dbg(dev, "Clock %s managed by runtime PM.\n", ce->con_id); |
48 | } | 64 | } |
@@ -99,10 +115,12 @@ static void __pm_clk_remove(struct pm_clock_entry *ce) | |||
99 | 115 | ||
100 | if (ce->status < PCE_STATUS_ERROR) { | 116 | if (ce->status < PCE_STATUS_ERROR) { |
101 | if (ce->status == PCE_STATUS_ENABLED) | 117 | if (ce->status == PCE_STATUS_ENABLED) |
102 | clk_disable_unprepare(ce->clk); | 118 | clk_disable(ce->clk); |
103 | 119 | ||
104 | if (ce->status >= PCE_STATUS_ACQUIRED) | 120 | if (ce->status >= PCE_STATUS_ACQUIRED) { |
121 | clk_unprepare(ce->clk); | ||
105 | clk_put(ce->clk); | 122 | clk_put(ce->clk); |
123 | } | ||
106 | } | 124 | } |
107 | 125 | ||
108 | kfree(ce->con_id); | 126 | kfree(ce->con_id); |
@@ -249,6 +267,7 @@ int pm_clk_resume(struct device *dev) | |||
249 | struct pm_subsys_data *psd = dev_to_psd(dev); | 267 | struct pm_subsys_data *psd = dev_to_psd(dev); |
250 | struct pm_clock_entry *ce; | 268 | struct pm_clock_entry *ce; |
251 | unsigned long flags; | 269 | unsigned long flags; |
270 | int ret; | ||
252 | 271 | ||
253 | dev_dbg(dev, "%s()\n", __func__); | 272 | dev_dbg(dev, "%s()\n", __func__); |
254 | 273 | ||
@@ -259,8 +278,9 @@ int pm_clk_resume(struct device *dev) | |||
259 | 278 | ||
260 | list_for_each_entry(ce, &psd->clock_list, node) { | 279 | list_for_each_entry(ce, &psd->clock_list, node) { |
261 | if (ce->status < PCE_STATUS_ERROR) { | 280 | if (ce->status < PCE_STATUS_ERROR) { |
262 | clk_enable(ce->clk); | 281 | ret = __pm_clk_enable(dev, ce->clk); |
263 | ce->status = PCE_STATUS_ENABLED; | 282 | if (!ret) |
283 | ce->status = PCE_STATUS_ENABLED; | ||
264 | } | 284 | } |
265 | } | 285 | } |
266 | 286 | ||
@@ -376,7 +396,7 @@ int pm_clk_resume(struct device *dev) | |||
376 | spin_lock_irqsave(&psd->lock, flags); | 396 | spin_lock_irqsave(&psd->lock, flags); |
377 | 397 | ||
378 | list_for_each_entry(ce, &psd->clock_list, node) | 398 | list_for_each_entry(ce, &psd->clock_list, node) |
379 | clk_enable(ce->clk); | 399 | __pm_clk_enable(dev, ce->clk); |
380 | 400 | ||
381 | spin_unlock_irqrestore(&psd->lock, flags); | 401 | spin_unlock_irqrestore(&psd->lock, flags); |
382 | 402 | ||