Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/suspend-2.6

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/suspend-2.6:
PM: rwsem.h need not be included into main.c
PM: Remove unnecessary goto from device_resume_noirq()
PM: Add initcall_debug style timing for suspend/resume
PM: allow for usage_count > 0 in pm_runtime_get()

+41 -15
+34 -10
drivers/base/power/main.c
··· 23 #include <linux/pm.h> 24 #include <linux/pm_runtime.h> 25 #include <linux/resume-trace.h> 26 - #include <linux/rwsem.h> 27 #include <linux/interrupt.h> 28 29 #include "../base.h" 30 #include "power.h" ··· 172 pm_message_t state) 173 { 174 int error = 0; 175 176 switch (state.event) { 177 #ifdef CONFIG_SUSPEND ··· 226 default: 227 error = -EINVAL; 228 } 229 return error; 230 } 231 ··· 251 pm_message_t state) 252 { 253 int error = 0; 254 255 switch (state.event) { 256 #ifdef CONFIG_SUSPEND ··· 305 default: 306 error = -EINVAL; 307 } 308 return error; 309 } 310 ··· 371 TRACE_DEVICE(dev); 372 TRACE_RESUME(0); 373 374 - if (!dev->bus) 375 - goto End; 376 - 377 - if (dev->bus->pm) { 378 pm_dev_dbg(dev, state, "EARLY "); 379 error = pm_noirq_op(dev, dev->bus->pm, state); 380 } 381 - End: 382 TRACE_RESUME(error); 383 return error; 384 } ··· 611 { 612 int error = 0; 613 614 - if (!dev->bus) 615 - return 0; 616 - 617 - if (dev->bus->pm) { 618 pm_dev_dbg(dev, state, "LATE "); 619 error = pm_noirq_op(dev, dev->bus->pm, state); 620 }
··· 23 #include <linux/pm.h> 24 #include <linux/pm_runtime.h> 25 #include <linux/resume-trace.h> 26 #include <linux/interrupt.h> 27 + #include <linux/sched.h> 28 29 #include "../base.h" 30 #include "power.h" ··· 172 pm_message_t state) 173 { 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 + } 182 183 switch (state.event) { 184 #ifdef CONFIG_SUSPEND ··· 219 default: 220 error = -EINVAL; 221 } 222 + 223 + if (initcall_debug) { 224 + rettime = ktime_get(); 225 + delta = ktime_sub(rettime, calltime); 226 + pr_info("call %s+ returned %d after %Ld usecs\n", dev_name(dev), 227 + error, (unsigned long long)ktime_to_ns(delta) >> 10); 228 + } 229 + 230 return error; 231 } 232 ··· 236 pm_message_t state) 237 { 238 int error = 0; 239 + ktime_t calltime, delta, rettime; 240 + 241 + if (initcall_debug) { 242 + pr_info("calling %s_i+ @ %i\n", 243 + dev_name(dev), task_pid_nr(current)); 244 + calltime = ktime_get(); 245 + } 246 247 switch (state.event) { 248 #ifdef CONFIG_SUSPEND ··· 283 default: 284 error = -EINVAL; 285 } 286 + 287 + if (initcall_debug) { 288 + rettime = ktime_get(); 289 + delta = ktime_sub(rettime, calltime); 290 + printk("initcall %s_i+ returned %d after %Ld usecs\n", dev_name(dev), 291 + error, (unsigned long long)ktime_to_ns(delta) >> 10); 292 + } 293 + 294 return error; 295 } 296 ··· 341 TRACE_DEVICE(dev); 342 TRACE_RESUME(0); 343 344 + if (dev->bus && dev->bus->pm) { 345 pm_dev_dbg(dev, state, "EARLY "); 346 error = pm_noirq_op(dev, dev->bus->pm, state); 347 } 348 + 349 TRACE_RESUME(error); 350 return error; 351 } ··· 584 { 585 int error = 0; 586 587 + if (dev->bus && dev->bus->pm) { 588 pm_dev_dbg(dev, state, "LATE "); 589 error = pm_noirq_op(dev, dev->bus->pm, state); 590 }
+5 -5
drivers/base/power/runtime.c
··· 701 * @dev: Device to handle. 702 * @sync: If set and the device is suspended, resume it synchronously. 703 * 704 - * Increment the usage count of the device and if it was zero previously, 705 - * resume it or submit a resume request for it, depending on the value of @sync. 706 */ 707 int __pm_runtime_get(struct device *dev, bool sync) 708 { 709 - int retval = 1; 710 711 - if (atomic_add_return(1, &dev->power.usage_count) == 1) 712 - retval = sync ? pm_runtime_resume(dev) : pm_request_resume(dev); 713 714 return retval; 715 }
··· 701 * @dev: Device to handle. 702 * @sync: If set and the device is suspended, resume it synchronously. 703 * 704 + * Increment the usage count of the device and resume it or submit a resume 705 + * request for it, depending on the value of @sync. 706 */ 707 int __pm_runtime_get(struct device *dev, bool sync) 708 { 709 + int retval; 710 711 + atomic_inc(&dev->power.usage_count); 712 + retval = sync ? pm_runtime_resume(dev) : pm_request_resume(dev); 713 714 return retval; 715 }
+2
include/linux/init.h
··· 149 150 extern void (*late_time_init)(void); 151 152 #endif 153 154 #ifndef MODULE
··· 149 150 extern void (*late_time_init)(void); 151 152 + extern int initcall_debug; 153 + 154 #endif 155 156 #ifndef MODULE