main.c 26.4 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14
/*
 * drivers/base/power/main.c - Where the driver meets power management.
 *
 * Copyright (c) 2003 Patrick Mochel
 * Copyright (c) 2003 Open Source Development Lab
 *
 * This file is released under the GPLv2
 *
 *
 * The driver model core calls device_pm_add() when a device is registered.
 * This will intialize the embedded device_pm_info object in the device
 * and add it to the list of power-controlled devices. sysfs entries for
 * controlling device power management will also be added.
 *
15 16 17
 * A separate list is used for keeping track of power info, because the power
 * domain dependencies may differ from the ancestral dependencies that the
 * subsystem list maintains.
L
Linus Torvalds 已提交
18 19 20
 */

#include <linux/device.h>
21
#include <linux/kallsyms.h>
22
#include <linux/mutex.h>
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
#include <linux/async.h>
29

30
#include "../base.h"
L
Linus Torvalds 已提交
31 32
#include "power.h"

33
/*
34
 * The entries in the dpm_list list are in a depth first order, simply
35 36 37
 * because children are guaranteed to be discovered after parents, and
 * are inserted at the back of the list on discovery.
 *
38 39
 * Since device_pm_add() may be called with a device lock held,
 * we must never try to acquire a device lock while holding
40 41 42
 * dpm_list_mutex.
 */

43
LIST_HEAD(dpm_list);
L
Linus Torvalds 已提交
44

45
static DEFINE_MUTEX(dpm_list_mtx);
46
static pm_message_t pm_transition;
L
Linus Torvalds 已提交
47

48 49 50 51 52 53
/*
 * Set once the preparation of devices for a PM transition has started, reset
 * before starting to resume devices.  Protected by dpm_list_mtx.
 */
static bool transition_started;

54
/**
55
 * device_pm_init - Initialize the PM-related part of a device object.
56 57 58 59 60
 * @dev: Device object being initialized.
 */
void device_pm_init(struct device *dev)
{
	dev->power.status = DPM_ON;
61
	init_completion(&dev->power.completion);
62
	complete_all(&dev->power.completion);
63
	dev->power.wakeup_count = 0;
64 65 66
	pm_runtime_init(dev);
}

67
/**
68
 * device_pm_lock - Lock the list of active devices used by the PM core.
69 70 71 72 73 74 75
 */
void device_pm_lock(void)
{
	mutex_lock(&dpm_list_mtx);
}

/**
76
 * device_pm_unlock - Unlock the list of active devices used by the PM core.
77 78 79 80 81
 */
void device_pm_unlock(void)
{
	mutex_unlock(&dpm_list_mtx);
}
82

83
/**
84 85
 * device_pm_add - Add a device to the PM core's list of active devices.
 * @dev: Device to add to the list.
86
 */
87
void device_pm_add(struct device *dev)
L
Linus Torvalds 已提交
88 89
{
	pr_debug("PM: Adding info for %s:%s\n",
90 91
		 dev->bus ? dev->bus->name : "No Bus",
		 kobject_name(&dev->kobj));
92
	mutex_lock(&dpm_list_mtx);
93
	if (dev->parent) {
94 95
		if (dev->parent->power.status >= DPM_SUSPENDING)
			dev_warn(dev, "parent %s should not be sleeping\n",
96
				 dev_name(dev->parent));
97 98 99 100 101 102
	} else if (transition_started) {
		/*
		 * We refuse to register parentless devices while a PM
		 * transition is in progress in order to avoid leaving them
		 * unhandled down the road
		 */
103
		dev_WARN(dev, "Parentless device registered during a PM transaction\n");
104
	}
105 106

	list_add_tail(&dev->power.entry, &dpm_list);
107
	mutex_unlock(&dpm_list_mtx);
L
Linus Torvalds 已提交
108 109
}

110
/**
111 112
 * device_pm_remove - Remove a device from the PM core's list of active devices.
 * @dev: Device to be removed from the list.
113
 */
114
void device_pm_remove(struct device *dev)
L
Linus Torvalds 已提交
115 116
{
	pr_debug("PM: Removing info for %s:%s\n",
117 118
		 dev->bus ? dev->bus->name : "No Bus",
		 kobject_name(&dev->kobj));
119
	complete_all(&dev->power.completion);
120
	mutex_lock(&dpm_list_mtx);
L
Linus Torvalds 已提交
121
	list_del_init(&dev->power.entry);
122
	mutex_unlock(&dpm_list_mtx);
123
	pm_runtime_remove(dev);
124 125
}

126
/**
127 128 129
 * device_pm_move_before - Move device in the PM core's list of active devices.
 * @deva: Device to move in dpm_list.
 * @devb: Device @deva should come before.
130 131 132 133 134 135 136 137 138 139 140 141 142
 */
void device_pm_move_before(struct device *deva, struct device *devb)
{
	pr_debug("PM: Moving %s:%s before %s:%s\n",
		 deva->bus ? deva->bus->name : "No Bus",
		 kobject_name(&deva->kobj),
		 devb->bus ? devb->bus->name : "No Bus",
		 kobject_name(&devb->kobj));
	/* Delete deva from dpm_list and reinsert before devb. */
	list_move_tail(&deva->power.entry, &devb->power.entry);
}

/**
143 144 145
 * device_pm_move_after - Move device in the PM core's list of active devices.
 * @deva: Device to move in dpm_list.
 * @devb: Device @deva should come after.
146 147 148 149 150 151 152 153 154 155 156 157 158
 */
void device_pm_move_after(struct device *deva, struct device *devb)
{
	pr_debug("PM: Moving %s:%s after %s:%s\n",
		 deva->bus ? deva->bus->name : "No Bus",
		 kobject_name(&deva->kobj),
		 devb->bus ? devb->bus->name : "No Bus",
		 kobject_name(&devb->kobj));
	/* Delete deva from dpm_list and reinsert after devb. */
	list_move(&deva->power.entry, &devb->power.entry);
}

/**
159 160
 * device_pm_move_last - Move device to end of the PM core's list of devices.
 * @dev: Device to move in dpm_list.
161 162 163 164 165 166 167 168 169
 */
void device_pm_move_last(struct device *dev)
{
	pr_debug("PM: Moving %s:%s to end of list\n",
		 dev->bus ? dev->bus->name : "No Bus",
		 kobject_name(&dev->kobj));
	list_move_tail(&dev->power.entry, &dpm_list);
}

170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195
static ktime_t initcall_debug_start(struct device *dev)
{
	ktime_t calltime = ktime_set(0, 0);

	if (initcall_debug) {
		pr_info("calling  %s+ @ %i\n",
				dev_name(dev), task_pid_nr(current));
		calltime = ktime_get();
	}

	return calltime;
}

static void initcall_debug_report(struct device *dev, ktime_t calltime,
				  int error)
{
	ktime_t delta, rettime;

	if (initcall_debug) {
		rettime = ktime_get();
		delta = ktime_sub(rettime, calltime);
		pr_info("call %s+ returned %d after %Ld usecs\n", dev_name(dev),
			error, (unsigned long long)ktime_to_ns(delta) >> 10);
	}
}

196 197 198 199 200 201 202 203 204 205
/**
 * dpm_wait - Wait for a PM operation to complete.
 * @dev: Device to wait for.
 * @async: If unset, wait only if the device's power.async_suspend flag is set.
 */
static void dpm_wait(struct device *dev, bool async)
{
	if (!dev)
		return;

206
	if (async || (pm_async_enabled && dev->power.async_suspend))
207 208 209 210 211 212 213 214 215 216 217 218 219 220
		wait_for_completion(&dev->power.completion);
}

static int dpm_wait_fn(struct device *dev, void *async_ptr)
{
	dpm_wait(dev, *((bool *)async_ptr));
	return 0;
}

static void dpm_wait_for_children(struct device *dev, bool async)
{
       device_for_each_child(dev, &async, dpm_wait_fn);
}

221
/**
222 223 224 225
 * pm_op - Execute the PM operation appropriate for given PM event.
 * @dev: Device to handle.
 * @ops: PM operations to choose from.
 * @state: PM transition of the system being carried out.
226
 */
227 228 229
static int pm_op(struct device *dev,
		 const struct dev_pm_ops *ops,
		 pm_message_t state)
230 231
{
	int error = 0;
232
	ktime_t calltime;
233

234
	calltime = initcall_debug_start(dev);
235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281

	switch (state.event) {
#ifdef CONFIG_SUSPEND
	case PM_EVENT_SUSPEND:
		if (ops->suspend) {
			error = ops->suspend(dev);
			suspend_report_result(ops->suspend, error);
		}
		break;
	case PM_EVENT_RESUME:
		if (ops->resume) {
			error = ops->resume(dev);
			suspend_report_result(ops->resume, error);
		}
		break;
#endif /* CONFIG_SUSPEND */
#ifdef CONFIG_HIBERNATION
	case PM_EVENT_FREEZE:
	case PM_EVENT_QUIESCE:
		if (ops->freeze) {
			error = ops->freeze(dev);
			suspend_report_result(ops->freeze, error);
		}
		break;
	case PM_EVENT_HIBERNATE:
		if (ops->poweroff) {
			error = ops->poweroff(dev);
			suspend_report_result(ops->poweroff, error);
		}
		break;
	case PM_EVENT_THAW:
	case PM_EVENT_RECOVER:
		if (ops->thaw) {
			error = ops->thaw(dev);
			suspend_report_result(ops->thaw, error);
		}
		break;
	case PM_EVENT_RESTORE:
		if (ops->restore) {
			error = ops->restore(dev);
			suspend_report_result(ops->restore, error);
		}
		break;
#endif /* CONFIG_HIBERNATION */
	default:
		error = -EINVAL;
	}
282

283
	initcall_debug_report(dev, calltime, error);
284

285 286 287 288
	return error;
}

/**
289 290 291 292
 * pm_noirq_op - Execute the PM operation appropriate for given PM event.
 * @dev: Device to handle.
 * @ops: PM operations to choose from.
 * @state: PM transition of the system being carried out.
293
 *
294 295
 * The driver of @dev will not receive interrupts while this function is being
 * executed.
296
 */
297 298
static int pm_noirq_op(struct device *dev,
			const struct dev_pm_ops *ops,
299 300 301
			pm_message_t state)
{
	int error = 0;
302 303 304
	ktime_t calltime, delta, rettime;

	if (initcall_debug) {
305 306 307
		pr_info("calling  %s+ @ %i, parent: %s\n",
				dev_name(dev), task_pid_nr(current),
				dev->parent ? dev_name(dev->parent) : "none");
308 309
		calltime = ktime_get();
	}
310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356

	switch (state.event) {
#ifdef CONFIG_SUSPEND
	case PM_EVENT_SUSPEND:
		if (ops->suspend_noirq) {
			error = ops->suspend_noirq(dev);
			suspend_report_result(ops->suspend_noirq, error);
		}
		break;
	case PM_EVENT_RESUME:
		if (ops->resume_noirq) {
			error = ops->resume_noirq(dev);
			suspend_report_result(ops->resume_noirq, error);
		}
		break;
#endif /* CONFIG_SUSPEND */
#ifdef CONFIG_HIBERNATION
	case PM_EVENT_FREEZE:
	case PM_EVENT_QUIESCE:
		if (ops->freeze_noirq) {
			error = ops->freeze_noirq(dev);
			suspend_report_result(ops->freeze_noirq, error);
		}
		break;
	case PM_EVENT_HIBERNATE:
		if (ops->poweroff_noirq) {
			error = ops->poweroff_noirq(dev);
			suspend_report_result(ops->poweroff_noirq, error);
		}
		break;
	case PM_EVENT_THAW:
	case PM_EVENT_RECOVER:
		if (ops->thaw_noirq) {
			error = ops->thaw_noirq(dev);
			suspend_report_result(ops->thaw_noirq, error);
		}
		break;
	case PM_EVENT_RESTORE:
		if (ops->restore_noirq) {
			error = ops->restore_noirq(dev);
			suspend_report_result(ops->restore_noirq, error);
		}
		break;
#endif /* CONFIG_HIBERNATION */
	default:
		error = -EINVAL;
	}
357 358 359 360

	if (initcall_debug) {
		rettime = ktime_get();
		delta = ktime_sub(rettime, calltime);
361 362 363
		printk("initcall %s_i+ returned %d after %Ld usecs\n",
			dev_name(dev), error,
			(unsigned long long)ktime_to_ns(delta) >> 10);
364 365
	}

366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406
	return error;
}

static char *pm_verb(int event)
{
	switch (event) {
	case PM_EVENT_SUSPEND:
		return "suspend";
	case PM_EVENT_RESUME:
		return "resume";
	case PM_EVENT_FREEZE:
		return "freeze";
	case PM_EVENT_QUIESCE:
		return "quiesce";
	case PM_EVENT_HIBERNATE:
		return "hibernate";
	case PM_EVENT_THAW:
		return "thaw";
	case PM_EVENT_RESTORE:
		return "restore";
	case PM_EVENT_RECOVER:
		return "recover";
	default:
		return "(unknown PM event)";
	}
}

static void pm_dev_dbg(struct device *dev, pm_message_t state, char *info)
{
	dev_dbg(dev, "%s%s%s\n", info, pm_verb(state.event),
		((state.event & PM_EVENT_SLEEP) && device_may_wakeup(dev)) ?
		", may wakeup" : "");
}

static void pm_dev_err(struct device *dev, pm_message_t state, char *info,
			int error)
{
	printk(KERN_ERR "PM: Device %s failed to %s%s: error %d\n",
		kobject_name(&dev->kobj), pm_verb(state.event), info, error);
}

407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423
static void dpm_show_time(ktime_t starttime, pm_message_t state, char *info)
{
	ktime_t calltime;
	s64 usecs64;
	int usecs;

	calltime = ktime_get();
	usecs64 = ktime_to_ns(ktime_sub(calltime, starttime));
	do_div(usecs64, NSEC_PER_USEC);
	usecs = usecs64;
	if (usecs == 0)
		usecs = 1;
	pr_info("PM: %s%s%s of devices complete after %ld.%03ld msecs\n",
		info ?: "", info ? " " : "", pm_verb(state.event),
		usecs / USEC_PER_MSEC, usecs % USEC_PER_MSEC);
}

424 425 426
/*------------------------- Resume routines -------------------------*/

/**
427 428 429
 * device_resume_noirq - Execute an "early resume" callback for given device.
 * @dev: Device to handle.
 * @state: PM transition of the system being carried out.
430
 *
431 432
 * The driver of @dev will not receive interrupts while this function is being
 * executed.
433
 */
434
static int device_resume_noirq(struct device *dev, pm_message_t state)
435 436 437 438 439 440
{
	int error = 0;

	TRACE_DEVICE(dev);
	TRACE_RESUME(0);

441
	if (dev->bus && dev->bus->pm) {
442 443
		pm_dev_dbg(dev, state, "EARLY ");
		error = pm_noirq_op(dev, dev->bus->pm, state);
444 445
		if (error)
			goto End;
446
	}
447

448 449 450 451 452 453 454 455 456 457 458 459 460
	if (dev->type && dev->type->pm) {
		pm_dev_dbg(dev, state, "EARLY type ");
		error = pm_noirq_op(dev, dev->type->pm, state);
		if (error)
			goto End;
	}

	if (dev->class && dev->class->pm) {
		pm_dev_dbg(dev, state, "EARLY class ");
		error = pm_noirq_op(dev, dev->class->pm, state);
	}

End:
461 462 463 464 465
	TRACE_RESUME(error);
	return error;
}

/**
466 467
 * dpm_resume_noirq - Execute "early resume" callbacks for non-sysdev devices.
 * @state: PM transition of the system being carried out.
468
 *
469 470
 * Call the "noirq" resume handlers for all devices marked as DPM_OFF_IRQ and
 * enable device drivers to receive interrupts.
471
 */
472
void dpm_resume_noirq(pm_message_t state)
473
{
474
	struct device *dev;
475
	ktime_t starttime = ktime_get();
476

477
	mutex_lock(&dpm_list_mtx);
478
	transition_started = false;
479 480 481
	list_for_each_entry(dev, &dpm_list, power.entry)
		if (dev->power.status > DPM_OFF) {
			int error;
482

483
			dev->power.status = DPM_OFF;
484
			error = device_resume_noirq(dev, state);
485 486 487
			if (error)
				pm_dev_err(dev, state, " early", error);
		}
488
	mutex_unlock(&dpm_list_mtx);
489
	dpm_show_time(starttime, state, "early");
490
	resume_device_irqs();
491
}
492
EXPORT_SYMBOL_GPL(dpm_resume_noirq);
493

494 495
/**
 * legacy_resume - Execute a legacy (bus or class) resume callback for device.
R
Randy Dunlap 已提交
496 497
 * @dev: Device to resume.
 * @cb: Resume callback to execute.
498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513
 */
static int legacy_resume(struct device *dev, int (*cb)(struct device *dev))
{
	int error;
	ktime_t calltime;

	calltime = initcall_debug_start(dev);

	error = cb(dev);
	suspend_report_result(cb, error);

	initcall_debug_report(dev, calltime, error);

	return error;
}

514
/**
515
 * device_resume - Execute "resume" callbacks for given device.
516 517
 * @dev: Device to handle.
 * @state: PM transition of the system being carried out.
518
 * @async: If true, the device is being resumed asynchronously.
519
 */
520
static int device_resume(struct device *dev, pm_message_t state, bool async)
521 522 523 524 525
{
	int error = 0;

	TRACE_DEVICE(dev);
	TRACE_RESUME(0);
526

527
	dpm_wait(dev->parent, async);
528
	device_lock(dev);
529

530 531
	dev->power.status = DPM_RESUMING;

532 533 534
	if (dev->bus) {
		if (dev->bus->pm) {
			pm_dev_dbg(dev, state, "");
535
			error = pm_op(dev, dev->bus->pm, state);
536 537
		} else if (dev->bus->resume) {
			pm_dev_dbg(dev, state, "legacy ");
538
			error = legacy_resume(dev, dev->bus->resume);
539 540 541
		}
		if (error)
			goto End;
542 543
	}

544 545 546 547 548 549 550
	if (dev->type) {
		if (dev->type->pm) {
			pm_dev_dbg(dev, state, "type ");
			error = pm_op(dev, dev->type->pm, state);
		}
		if (error)
			goto End;
551 552
	}

553 554 555 556 557 558
	if (dev->class) {
		if (dev->class->pm) {
			pm_dev_dbg(dev, state, "class ");
			error = pm_op(dev, dev->class->pm, state);
		} else if (dev->class->resume) {
			pm_dev_dbg(dev, state, "legacy class ");
559
			error = legacy_resume(dev, dev->class->resume);
560
		}
561
	}
562
 End:
563
	device_unlock(dev);
564
	complete_all(&dev->power.completion);
565

566 567 568 569
	TRACE_RESUME(error);
	return error;
}

570 571 572 573 574
static void async_resume(void *data, async_cookie_t cookie)
{
	struct device *dev = (struct device *)data;
	int error;

575
	error = device_resume(dev, pm_transition, true);
576 577 578 579 580
	if (error)
		pm_dev_err(dev, pm_transition, " async", error);
	put_device(dev);
}

581
static bool is_async(struct device *dev)
582
{
583 584
	return dev->power.async_suspend && pm_async_enabled
		&& !pm_trace_is_enabled();
585 586
}

587
/**
588 589
 * dpm_resume - Execute "resume" callbacks for non-sysdev devices.
 * @state: PM transition of the system being carried out.
590
 *
591 592
 * Execute the appropriate "resume" callback for all devices whose status
 * indicates that they are suspended.
593 594 595 596
 */
static void dpm_resume(pm_message_t state)
{
	struct list_head list;
597
	struct device *dev;
598
	ktime_t starttime = ktime_get();
599 600 601

	INIT_LIST_HEAD(&list);
	mutex_lock(&dpm_list_mtx);
602
	pm_transition = state;
603

604 605 606 607 608 609 610 611 612 613 614 615 616
	list_for_each_entry(dev, &dpm_list, power.entry) {
		if (dev->power.status < DPM_OFF)
			continue;

		INIT_COMPLETION(dev->power.completion);
		if (is_async(dev)) {
			get_device(dev);
			async_schedule(async_resume, dev);
		}
	}

	while (!list_empty(&dpm_list)) {
		dev = to_device(dpm_list.next);
617
		get_device(dev);
618
		if (dev->power.status >= DPM_OFF && !is_async(dev)) {
619 620 621 622
			int error;

			mutex_unlock(&dpm_list_mtx);

623
			error = device_resume(dev, state, false);
624 625 626 627 628 629 630 631 632 633 634 635 636 637

			mutex_lock(&dpm_list_mtx);
			if (error)
				pm_dev_err(dev, state, "", error);
		} else if (dev->power.status == DPM_SUSPENDING) {
			/* Allow new children of the device to be registered */
			dev->power.status = DPM_RESUMING;
		}
		if (!list_empty(&dev->power.entry))
			list_move_tail(&dev->power.entry, &list);
		put_device(dev);
	}
	list_splice(&list, &dpm_list);
	mutex_unlock(&dpm_list_mtx);
638
	async_synchronize_full();
639
	dpm_show_time(starttime, state, NULL);
640 641 642
}

/**
643 644 645
 * device_complete - Complete a PM transition for given device.
 * @dev: Device to handle.
 * @state: PM transition of the system being carried out.
646
 */
647
static void device_complete(struct device *dev, pm_message_t state)
648
{
649
	device_lock(dev);
650 651 652 653 654 655 656 657 658 659 660

	if (dev->class && dev->class->pm && dev->class->pm->complete) {
		pm_dev_dbg(dev, state, "completing class ");
		dev->class->pm->complete(dev);
	}

	if (dev->type && dev->type->pm && dev->type->pm->complete) {
		pm_dev_dbg(dev, state, "completing type ");
		dev->type->pm->complete(dev);
	}

661
	if (dev->bus && dev->bus->pm && dev->bus->pm->complete) {
662
		pm_dev_dbg(dev, state, "completing ");
663
		dev->bus->pm->complete(dev);
664 665
	}

666
	device_unlock(dev);
667 668 669
}

/**
670 671
 * dpm_complete - Complete a PM transition for all non-sysdev devices.
 * @state: PM transition of the system being carried out.
672
 *
673 674
 * Execute the ->complete() callbacks for all devices whose PM status is not
 * DPM_ON (this allows new devices to be registered).
675
 */
676
static void dpm_complete(pm_message_t state)
677
{
678 679 680
	struct list_head list;

	INIT_LIST_HEAD(&list);
681
	mutex_lock(&dpm_list_mtx);
R
Romit Dasgupta 已提交
682
	transition_started = false;
683 684
	while (!list_empty(&dpm_list)) {
		struct device *dev = to_device(dpm_list.prev);
685

686 687 688 689 690
		get_device(dev);
		if (dev->power.status > DPM_ON) {
			dev->power.status = DPM_ON;
			mutex_unlock(&dpm_list_mtx);

691
			device_complete(dev, state);
692
			pm_runtime_put_sync(dev);
693 694 695 696 697 698

			mutex_lock(&dpm_list_mtx);
		}
		if (!list_empty(&dev->power.entry))
			list_move(&dev->power.entry, &list);
		put_device(dev);
699
	}
700
	list_splice(&list, &dpm_list);
701 702 703 704
	mutex_unlock(&dpm_list_mtx);
}

/**
705 706
 * dpm_resume_end - Execute "resume" callbacks and complete system transition.
 * @state: PM transition of the system being carried out.
707
 *
708 709
 * Execute "resume" callbacks for all devices and complete the PM transition of
 * the system.
710
 */
711
void dpm_resume_end(pm_message_t state)
712
{
713
	might_sleep();
714 715
	dpm_resume(state);
	dpm_complete(state);
716
}
717
EXPORT_SYMBOL_GPL(dpm_resume_end);
718 719 720 721


/*------------------------- Suspend routines -------------------------*/

722
/**
723 724 725 726 727
 * resume_event - Return a "resume" message for given "suspend" sleep state.
 * @sleep_state: PM message representing a sleep state.
 *
 * Return a PM message representing the resume event corresponding to given
 * sleep state.
728 729
 */
static pm_message_t resume_event(pm_message_t sleep_state)
730
{
731 732 733 734 735 736 737 738
	switch (sleep_state.event) {
	case PM_EVENT_SUSPEND:
		return PMSG_RESUME;
	case PM_EVENT_FREEZE:
	case PM_EVENT_QUIESCE:
		return PMSG_RECOVER;
	case PM_EVENT_HIBERNATE:
		return PMSG_RESTORE;
739
	}
740
	return PMSG_ON;
741 742 743
}

/**
744 745 746
 * device_suspend_noirq - Execute a "late suspend" callback for given device.
 * @dev: Device to handle.
 * @state: PM transition of the system being carried out.
747
 *
748 749
 * The driver of @dev will not receive interrupts while this function is being
 * executed.
750
 */
751
static int device_suspend_noirq(struct device *dev, pm_message_t state)
752 753
{
	int error = 0;
754

755 756 757 758 759 760 761 762 763 764 765 766 767 768
	if (dev->class && dev->class->pm) {
		pm_dev_dbg(dev, state, "LATE class ");
		error = pm_noirq_op(dev, dev->class->pm, state);
		if (error)
			goto End;
	}

	if (dev->type && dev->type->pm) {
		pm_dev_dbg(dev, state, "LATE type ");
		error = pm_noirq_op(dev, dev->type->pm, state);
		if (error)
			goto End;
	}

769
	if (dev->bus && dev->bus->pm) {
770 771
		pm_dev_dbg(dev, state, "LATE ");
		error = pm_noirq_op(dev, dev->bus->pm, state);
772
	}
773 774

End:
775 776 777 778
	return error;
}

/**
779 780
 * dpm_suspend_noirq - Execute "late suspend" callbacks for non-sysdev devices.
 * @state: PM transition of the system being carried out.
781
 *
782 783
 * Prevent device drivers from receiving interrupts and call the "noirq" suspend
 * handlers for all non-sysdev devices.
784
 */
785
int dpm_suspend_noirq(pm_message_t state)
786
{
787
	struct device *dev;
788
	ktime_t starttime = ktime_get();
789 790
	int error = 0;

791
	suspend_device_irqs();
792
	mutex_lock(&dpm_list_mtx);
793
	list_for_each_entry_reverse(dev, &dpm_list, power.entry) {
794
		error = device_suspend_noirq(dev, state);
795
		if (error) {
796
			pm_dev_err(dev, state, " late", error);
797 798
			break;
		}
799
		dev->power.status = DPM_OFF_IRQ;
800
	}
801
	mutex_unlock(&dpm_list_mtx);
802
	if (error)
803
		dpm_resume_noirq(resume_event(state));
804 805
	else
		dpm_show_time(starttime, state, "late");
806 807
	return error;
}
808
EXPORT_SYMBOL_GPL(dpm_suspend_noirq);
809

810 811
/**
 * legacy_suspend - Execute a legacy (bus or class) suspend callback for device.
R
Randy Dunlap 已提交
812 813 814
 * @dev: Device to suspend.
 * @state: PM transition of the system being carried out.
 * @cb: Suspend callback to execute.
815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831
 */
static int legacy_suspend(struct device *dev, pm_message_t state,
			  int (*cb)(struct device *dev, pm_message_t state))
{
	int error;
	ktime_t calltime;

	calltime = initcall_debug_start(dev);

	error = cb(dev, state);
	suspend_report_result(cb, error);

	initcall_debug_report(dev, calltime, error);

	return error;
}

832 833
static int async_error;

834
/**
835 836 837
 * device_suspend - Execute "suspend" callbacks for given device.
 * @dev: Device to handle.
 * @state: PM transition of the system being carried out.
838
 * @async: If true, the device is being suspended asynchronously.
839
 */
840
static int __device_suspend(struct device *dev, pm_message_t state, bool async)
841 842 843
{
	int error = 0;

844
	dpm_wait_for_children(dev, async);
845
	device_lock(dev);
846

847 848 849
	if (async_error)
		goto End;

850 851 852 853 854 855
	if (dev->class) {
		if (dev->class->pm) {
			pm_dev_dbg(dev, state, "class ");
			error = pm_op(dev, dev->class->pm, state);
		} else if (dev->class->suspend) {
			pm_dev_dbg(dev, state, "legacy class ");
856
			error = legacy_suspend(dev, state, dev->class->suspend);
857 858 859
		}
		if (error)
			goto End;
860 861
	}

862 863 864 865 866 867 868
	if (dev->type) {
		if (dev->type->pm) {
			pm_dev_dbg(dev, state, "type ");
			error = pm_op(dev, dev->type->pm, state);
		}
		if (error)
			goto End;
869 870
	}

871 872 873
	if (dev->bus) {
		if (dev->bus->pm) {
			pm_dev_dbg(dev, state, "");
874
			error = pm_op(dev, dev->bus->pm, state);
875 876
		} else if (dev->bus->suspend) {
			pm_dev_dbg(dev, state, "legacy ");
877
			error = legacy_suspend(dev, state, dev->bus->suspend);
878
		}
879
	}
880 881 882 883

	if (!error)
		dev->power.status = DPM_OFF;

884
 End:
885
	device_unlock(dev);
886
	complete_all(&dev->power.completion);
887

888 889 890
	return error;
}

891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908
static void async_suspend(void *data, async_cookie_t cookie)
{
	struct device *dev = (struct device *)data;
	int error;

	error = __device_suspend(dev, pm_transition, true);
	if (error) {
		pm_dev_err(dev, pm_transition, " async", error);
		async_error = error;
	}

	put_device(dev);
}

static int device_suspend(struct device *dev)
{
	INIT_COMPLETION(dev->power.completion);

909
	if (pm_async_enabled && dev->power.async_suspend) {
910 911 912 913 914 915 916 917
		get_device(dev);
		async_schedule(async_suspend, dev);
		return 0;
	}

	return __device_suspend(dev, pm_transition, false);
}

918
/**
919 920
 * dpm_suspend - Execute "suspend" callbacks for all non-sysdev devices.
 * @state: PM transition of the system being carried out.
921
 */
922
static int dpm_suspend(pm_message_t state)
923
{
924
	struct list_head list;
925
	ktime_t starttime = ktime_get();
926 927
	int error = 0;

928
	INIT_LIST_HEAD(&list);
929
	mutex_lock(&dpm_list_mtx);
930 931
	pm_transition = state;
	async_error = 0;
932 933
	while (!list_empty(&dpm_list)) {
		struct device *dev = to_device(dpm_list.prev);
934

935
		get_device(dev);
936
		mutex_unlock(&dpm_list_mtx);
937

938
		error = device_suspend(dev);
939

940
		mutex_lock(&dpm_list_mtx);
941
		if (error) {
942 943
			pm_dev_err(dev, state, "", error);
			put_device(dev);
944 945
			break;
		}
946
		if (!list_empty(&dev->power.entry))
947 948
			list_move(&dev->power.entry, &list);
		put_device(dev);
949 950
		if (async_error)
			break;
951
	}
952
	list_splice(&list, dpm_list.prev);
953
	mutex_unlock(&dpm_list_mtx);
954 955 956
	async_synchronize_full();
	if (!error)
		error = async_error;
957 958
	if (!error)
		dpm_show_time(starttime, state, NULL);
959 960 961 962
	return error;
}

/**
963 964 965 966 967 968
 * device_prepare - Prepare a device for system power transition.
 * @dev: Device to handle.
 * @state: PM transition of the system being carried out.
 *
 * Execute the ->prepare() callback(s) for given device.  No new children of the
 * device may be registered after this function has returned.
969
 */
970
static int device_prepare(struct device *dev, pm_message_t state)
971 972 973
{
	int error = 0;

974
	device_lock(dev);
975

976
	if (dev->bus && dev->bus->pm && dev->bus->pm->prepare) {
977
		pm_dev_dbg(dev, state, "preparing ");
978 979
		error = dev->bus->pm->prepare(dev);
		suspend_report_result(dev->bus->pm->prepare, error);
980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997
		if (error)
			goto End;
	}

	if (dev->type && dev->type->pm && dev->type->pm->prepare) {
		pm_dev_dbg(dev, state, "preparing type ");
		error = dev->type->pm->prepare(dev);
		suspend_report_result(dev->type->pm->prepare, error);
		if (error)
			goto End;
	}

	if (dev->class && dev->class->pm && dev->class->pm->prepare) {
		pm_dev_dbg(dev, state, "preparing class ");
		error = dev->class->pm->prepare(dev);
		suspend_report_result(dev->class->pm->prepare, error);
	}
 End:
998
	device_unlock(dev);
999 1000 1001

	return error;
}
1002

1003
/**
1004 1005
 * dpm_prepare - Prepare all non-sysdev devices for a system PM transition.
 * @state: PM transition of the system being carried out.
1006
 *
1007
 * Execute the ->prepare() callback(s) for all devices.
1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023
 */
static int dpm_prepare(pm_message_t state)
{
	struct list_head list;
	int error = 0;

	INIT_LIST_HEAD(&list);
	mutex_lock(&dpm_list_mtx);
	transition_started = true;
	while (!list_empty(&dpm_list)) {
		struct device *dev = to_device(dpm_list.next);

		get_device(dev);
		dev->power.status = DPM_PREPARING;
		mutex_unlock(&dpm_list_mtx);

1024 1025 1026
		pm_runtime_get_noresume(dev);
		if (pm_runtime_barrier(dev) && device_may_wakeup(dev)) {
			/* Wake-up requested during system sleep transition. */
1027
			pm_runtime_put_sync(dev);
1028 1029 1030 1031
			error = -EBUSY;
		} else {
			error = device_prepare(dev, state);
		}
1032 1033 1034 1035 1036 1037

		mutex_lock(&dpm_list_mtx);
		if (error) {
			dev->power.status = DPM_ON;
			if (error == -EAGAIN) {
				put_device(dev);
S
Sebastian Ott 已提交
1038
				error = 0;
1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053
				continue;
			}
			printk(KERN_ERR "PM: Failed to prepare device %s "
				"for power transition: error %d\n",
				kobject_name(&dev->kobj), error);
			put_device(dev);
			break;
		}
		dev->power.status = DPM_SUSPENDING;
		if (!list_empty(&dev->power.entry))
			list_move_tail(&dev->power.entry, &list);
		put_device(dev);
	}
	list_splice(&list, &dpm_list);
	mutex_unlock(&dpm_list_mtx);
1054 1055 1056
	return error;
}

1057
/**
1058 1059
 * dpm_suspend_start - Prepare devices for PM transition and suspend them.
 * @state: PM transition of the system being carried out.
1060
 *
1061 1062
 * Prepare all non-sysdev devices for system PM transition and execute "suspend"
 * callbacks for them.
1063
 */
1064
int dpm_suspend_start(pm_message_t state)
1065 1066
{
	int error;
1067

1068
	might_sleep();
1069 1070 1071
	error = dpm_prepare(state);
	if (!error)
		error = dpm_suspend(state);
1072 1073
	return error;
}
1074
EXPORT_SYMBOL_GPL(dpm_suspend_start);
1075 1076 1077

void __suspend_report_result(const char *function, void *fn, int ret)
{
1078 1079
	if (ret)
		printk(KERN_ERR "%s(): %pF returns %d\n", function, fn, ret);
1080 1081
}
EXPORT_SYMBOL_GPL(__suspend_report_result);
1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092

/**
 * device_pm_wait_for_dev - Wait for suspend/resume of a device to complete.
 * @dev: Device to wait for.
 * @subordinate: Device that needs to wait for @dev.
 */
void device_pm_wait_for_dev(struct device *subordinate, struct device *dev)
{
	dpm_wait(dev, subordinate->power.async_suspend);
}
EXPORT_SYMBOL_GPL(device_pm_wait_for_dev);