diff options
| -rw-r--r-- | drivers/base/power/main.c | 44 | ||||
| -rw-r--r-- | drivers/base/power/runtime.c | 10 | ||||
| -rw-r--r-- | include/linux/init.h | 2 |
3 files changed, 41 insertions, 15 deletions
diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c index 8aa2443182d5..1a216c114a0f 100644 --- a/drivers/base/power/main.c +++ b/drivers/base/power/main.c | |||
| @@ -23,8 +23,8 @@ | |||
| 23 | #include <linux/pm.h> | 23 | #include <linux/pm.h> |
| 24 | #include <linux/pm_runtime.h> | 24 | #include <linux/pm_runtime.h> |
| 25 | #include <linux/resume-trace.h> | 25 | #include <linux/resume-trace.h> |
| 26 | #include <linux/rwsem.h> | ||
| 27 | #include <linux/interrupt.h> | 26 | #include <linux/interrupt.h> |
| 27 | #include <linux/sched.h> | ||
| 28 | 28 | ||
| 29 | #include "../base.h" | 29 | #include "../base.h" |
| 30 | #include "power.h" | 30 | #include "power.h" |
| @@ -172,6 +172,13 @@ static int pm_op(struct device *dev, | |||
| 172 | pm_message_t state) | 172 | pm_message_t state) |
| 173 | { | 173 | { |
| 174 | int error = 0; | 174 | int error = 0; |
| 175 | ktime_t calltime, delta, rettime; | ||
| 176 | |||
| 177 | if (initcall_debug) { | ||
| 178 | pr_info("calling %s+ @ %i\n", | ||
| 179 | dev_name(dev), task_pid_nr(current)); | ||
| 180 | calltime = ktime_get(); | ||
| 181 | } | ||
| 175 | 182 | ||
| 176 | switch (state.event) { | 183 | switch (state.event) { |
| 177 | #ifdef CONFIG_SUSPEND | 184 | #ifdef CONFIG_SUSPEND |
| @@ -219,6 +226,14 @@ static int pm_op(struct device *dev, | |||
| 219 | default: | 226 | default: |
| 220 | error = -EINVAL; | 227 | error = -EINVAL; |
| 221 | } | 228 | } |
| 229 | |||
| 230 | if (initcall_debug) { | ||
| 231 | rettime = ktime_get(); | ||
| 232 | delta = ktime_sub(rettime, calltime); | ||
| 233 | pr_info("call %s+ returned %d after %Ld usecs\n", dev_name(dev), | ||
| 234 | error, (unsigned long long)ktime_to_ns(delta) >> 10); | ||
| 235 | } | ||
| 236 | |||
| 222 | return error; | 237 | return error; |
| 223 | } | 238 | } |
| 224 | 239 | ||
| @@ -236,6 +251,13 @@ static int pm_noirq_op(struct device *dev, | |||
| 236 | pm_message_t state) | 251 | pm_message_t state) |
| 237 | { | 252 | { |
| 238 | int error = 0; | 253 | int error = 0; |
| 254 | ktime_t calltime, delta, rettime; | ||
| 255 | |||
| 256 | if (initcall_debug) { | ||
| 257 | pr_info("calling %s_i+ @ %i\n", | ||
| 258 | dev_name(dev), task_pid_nr(current)); | ||
| 259 | calltime = ktime_get(); | ||
| 260 | } | ||
| 239 | 261 | ||
| 240 | switch (state.event) { | 262 | switch (state.event) { |
| 241 | #ifdef CONFIG_SUSPEND | 263 | #ifdef CONFIG_SUSPEND |
| @@ -283,6 +305,14 @@ static int pm_noirq_op(struct device *dev, | |||
| 283 | default: | 305 | default: |
| 284 | error = -EINVAL; | 306 | error = -EINVAL; |
| 285 | } | 307 | } |
| 308 | |||
| 309 | if (initcall_debug) { | ||
| 310 | rettime = ktime_get(); | ||
| 311 | delta = ktime_sub(rettime, calltime); | ||
| 312 | printk("initcall %s_i+ returned %d after %Ld usecs\n", dev_name(dev), | ||
| 313 | error, (unsigned long long)ktime_to_ns(delta) >> 10); | ||
| 314 | } | ||
| 315 | |||
| 286 | return error; | 316 | return error; |
| 287 | } | 317 | } |
| 288 | 318 | ||
| @@ -341,14 +371,11 @@ static int device_resume_noirq(struct device *dev, pm_message_t state) | |||
| 341 | TRACE_DEVICE(dev); | 371 | TRACE_DEVICE(dev); |
| 342 | TRACE_RESUME(0); | 372 | TRACE_RESUME(0); |
| 343 | 373 | ||
| 344 | if (!dev->bus) | 374 | if (dev->bus && dev->bus->pm) { |
| 345 | goto End; | ||
| 346 | |||
| 347 | if (dev->bus->pm) { | ||
| 348 | pm_dev_dbg(dev, state, "EARLY "); | 375 | pm_dev_dbg(dev, state, "EARLY "); |
| 349 | error = pm_noirq_op(dev, dev->bus->pm, state); | 376 | error = pm_noirq_op(dev, dev->bus->pm, state); |
| 350 | } | 377 | } |
| 351 | End: | 378 | |
| 352 | TRACE_RESUME(error); | 379 | TRACE_RESUME(error); |
| 353 | return error; | 380 | return error; |
| 354 | } | 381 | } |
| @@ -584,10 +611,7 @@ static int device_suspend_noirq(struct device *dev, pm_message_t state) | |||
| 584 | { | 611 | { |
| 585 | int error = 0; | 612 | int error = 0; |
| 586 | 613 | ||
| 587 | if (!dev->bus) | 614 | if (dev->bus && dev->bus->pm) { |
| 588 | return 0; | ||
| 589 | |||
| 590 | if (dev->bus->pm) { | ||
| 591 | pm_dev_dbg(dev, state, "LATE "); | 615 | pm_dev_dbg(dev, state, "LATE "); |
| 592 | error = pm_noirq_op(dev, dev->bus->pm, state); | 616 | error = pm_noirq_op(dev, dev->bus->pm, state); |
| 593 | } | 617 | } |
diff --git a/drivers/base/power/runtime.c b/drivers/base/power/runtime.c index 5a01ecef4af3..40d7720a4b21 100644 --- a/drivers/base/power/runtime.c +++ b/drivers/base/power/runtime.c | |||
| @@ -701,15 +701,15 @@ EXPORT_SYMBOL_GPL(pm_request_resume); | |||
| 701 | * @dev: Device to handle. | 701 | * @dev: Device to handle. |
| 702 | * @sync: If set and the device is suspended, resume it synchronously. | 702 | * @sync: If set and the device is suspended, resume it synchronously. |
| 703 | * | 703 | * |
| 704 | * Increment the usage count of the device and if it was zero previously, | 704 | * Increment the usage count of the device and resume it or submit a resume |
| 705 | * resume it or submit a resume request for it, depending on the value of @sync. | 705 | * request for it, depending on the value of @sync. |
| 706 | */ | 706 | */ |
| 707 | int __pm_runtime_get(struct device *dev, bool sync) | 707 | int __pm_runtime_get(struct device *dev, bool sync) |
| 708 | { | 708 | { |
| 709 | int retval = 1; | 709 | int retval; |
| 710 | 710 | ||
| 711 | if (atomic_add_return(1, &dev->power.usage_count) == 1) | 711 | atomic_inc(&dev->power.usage_count); |
| 712 | retval = sync ? pm_runtime_resume(dev) : pm_request_resume(dev); | 712 | retval = sync ? pm_runtime_resume(dev) : pm_request_resume(dev); |
| 713 | 713 | ||
| 714 | return retval; | 714 | return retval; |
| 715 | } | 715 | } |
diff --git a/include/linux/init.h b/include/linux/init.h index ff8bde520d03..ab1d31f9352b 100644 --- a/include/linux/init.h +++ b/include/linux/init.h | |||
| @@ -149,6 +149,8 @@ void prepare_namespace(void); | |||
| 149 | 149 | ||
| 150 | extern void (*late_time_init)(void); | 150 | extern void (*late_time_init)(void); |
| 151 | 151 | ||
| 152 | extern int initcall_debug; | ||
| 153 | |||
| 152 | #endif | 154 | #endif |
| 153 | 155 | ||
| 154 | #ifndef MODULE | 156 | #ifndef MODULE |
