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 23 #include <linux/pm.h> 24 24 #include <linux/pm_runtime.h> 25 25 #include <linux/resume-trace.h> 26 - #include <linux/rwsem.h> 27 26 #include <linux/interrupt.h> 27 + #include <linux/sched.h> 28 28 29 29 #include "../base.h" 30 30 #include "power.h" ··· 172 172 pm_message_t state) 173 173 { 174 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 183 switch (state.event) { 177 184 #ifdef CONFIG_SUSPEND ··· 226 219 default: 227 220 error = -EINVAL; 228 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 + 229 230 return error; 230 231 } 231 232 ··· 251 236 pm_message_t state) 252 237 { 253 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 + } 254 246 255 247 switch (state.event) { 256 248 #ifdef CONFIG_SUSPEND ··· 305 283 default: 306 284 error = -EINVAL; 307 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 + 308 294 return error; 309 295 } 310 296 ··· 371 341 TRACE_DEVICE(dev); 372 342 TRACE_RESUME(0); 373 343 374 - if (!dev->bus) 375 - goto End; 376 - 377 - if (dev->bus->pm) { 344 + if (dev->bus && dev->bus->pm) { 378 345 pm_dev_dbg(dev, state, "EARLY "); 379 346 error = pm_noirq_op(dev, dev->bus->pm, state); 380 347 } 381 - End: 348 + 382 349 TRACE_RESUME(error); 383 350 return error; 384 351 } ··· 611 584 { 612 585 int error = 0; 613 586 614 - if (!dev->bus) 615 - return 0; 616 - 617 - if (dev->bus->pm) { 587 + if (dev->bus && dev->bus->pm) { 618 588 pm_dev_dbg(dev, state, "LATE "); 619 589 error = pm_noirq_op(dev, dev->bus->pm, state); 620 590 }
+5 -5
drivers/base/power/runtime.c
··· 701 701 * @dev: Device to handle. 702 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, 705 - * resume it or submit a resume request for it, depending on the value of @sync. 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 706 */ 707 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) 712 - retval = sync ? pm_runtime_resume(dev) : pm_request_resume(dev); 711 + atomic_inc(&dev->power.usage_count); 712 + retval = sync ? pm_runtime_resume(dev) : pm_request_resume(dev); 713 713 714 714 return retval; 715 715 }
+2
include/linux/init.h
··· 149 149 150 150 extern void (*late_time_init)(void); 151 151 152 + extern int initcall_debug; 153 + 152 154 #endif 153 155 154 156 #ifndef MODULE