domain.c 66.6 KB
Newer Older
1 2 3 4 5 6 7 8
/*
 * drivers/base/power/domain.c - Common code related to device power domains.
 *
 * Copyright (C) 2011 Rafael J. Wysocki <rjw@sisk.pl>, Renesas Electronics Corp.
 *
 * This file is released under the GPLv2.
 */

9
#include <linux/delay.h>
10 11
#include <linux/kernel.h>
#include <linux/io.h>
12
#include <linux/platform_device.h>
13 14
#include <linux/pm_runtime.h>
#include <linux/pm_domain.h>
15
#include <linux/pm_qos.h>
16
#include <linux/pm_clock.h>
17 18
#include <linux/slab.h>
#include <linux/err.h>
19 20
#include <linux/sched.h>
#include <linux/suspend.h>
21 22
#include <linux/export.h>

23 24
#include "power.h"

25 26
#define GENPD_RETRY_MAX_MS	250		/* Approximate */

27 28 29 30 31 32 33 34 35 36 37
#define GENPD_DEV_CALLBACK(genpd, type, callback, dev)		\
({								\
	type (*__routine)(struct device *__d); 			\
	type __ret = (type)0;					\
								\
	__routine = genpd->dev_ops.callback; 			\
	if (__routine) {					\
		__ret = __routine(dev); 			\
	}							\
	__ret;							\
})
38

39 40 41
static LIST_HEAD(gpd_list);
static DEFINE_MUTEX(gpd_list_lock);

L
Lina Iyer 已提交
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
struct genpd_lock_ops {
	void (*lock)(struct generic_pm_domain *genpd);
	void (*lock_nested)(struct generic_pm_domain *genpd, int depth);
	int (*lock_interruptible)(struct generic_pm_domain *genpd);
	void (*unlock)(struct generic_pm_domain *genpd);
};

static void genpd_lock_mtx(struct generic_pm_domain *genpd)
{
	mutex_lock(&genpd->mlock);
}

static void genpd_lock_nested_mtx(struct generic_pm_domain *genpd,
					int depth)
{
	mutex_lock_nested(&genpd->mlock, depth);
}

static int genpd_lock_interruptible_mtx(struct generic_pm_domain *genpd)
{
	return mutex_lock_interruptible(&genpd->mlock);
}

static void genpd_unlock_mtx(struct generic_pm_domain *genpd)
{
	return mutex_unlock(&genpd->mlock);
}

static const struct genpd_lock_ops genpd_mtx_ops = {
	.lock = genpd_lock_mtx,
	.lock_nested = genpd_lock_nested_mtx,
	.lock_interruptible = genpd_lock_interruptible_mtx,
	.unlock = genpd_unlock_mtx,
};

77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
static void genpd_lock_spin(struct generic_pm_domain *genpd)
	__acquires(&genpd->slock)
{
	unsigned long flags;

	spin_lock_irqsave(&genpd->slock, flags);
	genpd->lock_flags = flags;
}

static void genpd_lock_nested_spin(struct generic_pm_domain *genpd,
					int depth)
	__acquires(&genpd->slock)
{
	unsigned long flags;

	spin_lock_irqsave_nested(&genpd->slock, flags, depth);
	genpd->lock_flags = flags;
}

static int genpd_lock_interruptible_spin(struct generic_pm_domain *genpd)
	__acquires(&genpd->slock)
{
	unsigned long flags;

	spin_lock_irqsave(&genpd->slock, flags);
	genpd->lock_flags = flags;
	return 0;
}

static void genpd_unlock_spin(struct generic_pm_domain *genpd)
	__releases(&genpd->slock)
{
	spin_unlock_irqrestore(&genpd->slock, genpd->lock_flags);
}

static const struct genpd_lock_ops genpd_spin_ops = {
	.lock = genpd_lock_spin,
	.lock_nested = genpd_lock_nested_spin,
	.lock_interruptible = genpd_lock_interruptible_spin,
	.unlock = genpd_unlock_spin,
};

L
Lina Iyer 已提交
119 120 121 122 123
#define genpd_lock(p)			p->lock_ops->lock(p)
#define genpd_lock_nested(p, d)		p->lock_ops->lock_nested(p, d)
#define genpd_lock_interruptible(p)	p->lock_ops->lock_interruptible(p)
#define genpd_unlock(p)			p->lock_ops->unlock(p)

124
#define genpd_status_on(genpd)		(genpd->status == GPD_STATE_ACTIVE)
125
#define genpd_is_irq_safe(genpd)	(genpd->flags & GENPD_FLAG_IRQ_SAFE)
126
#define genpd_is_always_on(genpd)	(genpd->flags & GENPD_FLAG_ALWAYS_ON)
127
#define genpd_is_active_wakeup(genpd)	(genpd->flags & GENPD_FLAG_ACTIVE_WAKEUP)
128 129

static inline bool irq_safe_dev_in_no_sleep_domain(struct device *dev,
130
		const struct generic_pm_domain *genpd)
131 132 133 134 135
{
	bool ret;

	ret = pm_runtime_is_irq_safe(dev) && !genpd_is_irq_safe(genpd);

136 137 138 139 140 141
	/*
	 * Warn once if an IRQ safe device is attached to a no sleep domain, as
	 * to indicate a suboptimal configuration for PM. For an always on
	 * domain this isn't case, thus don't warn.
	 */
	if (ret && !genpd_is_always_on(genpd))
142 143 144 145 146 147
		dev_warn_once(dev, "PM domain %s will not be powered off\n",
				genpd->name);

	return ret;
}

148 149 150 151 152 153
/*
 * Get the generic PM domain for a particular struct device.
 * This validates the struct device pointer, the PM domain pointer,
 * and checks that the PM domain pointer is a real generic PM domain.
 * Any failure results in NULL being returned.
 */
154
static struct generic_pm_domain *genpd_lookup_dev(struct device *dev)
155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177
{
	struct generic_pm_domain *genpd = NULL, *gpd;

	if (IS_ERR_OR_NULL(dev) || IS_ERR_OR_NULL(dev->pm_domain))
		return NULL;

	mutex_lock(&gpd_list_lock);
	list_for_each_entry(gpd, &gpd_list, gpd_list_node) {
		if (&gpd->domain == dev->pm_domain) {
			genpd = gpd;
			break;
		}
	}
	mutex_unlock(&gpd_list_lock);

	return genpd;
}

/*
 * This should only be used where we are certain that the pm_domain
 * attached to the device is a genpd domain.
 */
static struct generic_pm_domain *dev_to_genpd(struct device *dev)
178 179 180 181
{
	if (IS_ERR_OR_NULL(dev->pm_domain))
		return ERR_PTR(-EINVAL);

182
	return pd_to_genpd(dev->pm_domain);
183
}
184

185 186
static int genpd_stop_dev(const struct generic_pm_domain *genpd,
			  struct device *dev)
187
{
188
	return GENPD_DEV_CALLBACK(genpd, int, stop, dev);
189 190
}

191 192
static int genpd_start_dev(const struct generic_pm_domain *genpd,
			   struct device *dev)
193
{
194
	return GENPD_DEV_CALLBACK(genpd, int, start, dev);
195 196
}

197
static bool genpd_sd_counter_dec(struct generic_pm_domain *genpd)
198
{
199 200 201 202 203 204 205 206 207 208 209
	bool ret = false;

	if (!WARN_ON(atomic_read(&genpd->sd_count) == 0))
		ret = !!atomic_dec_and_test(&genpd->sd_count);

	return ret;
}

static void genpd_sd_counter_inc(struct generic_pm_domain *genpd)
{
	atomic_inc(&genpd->sd_count);
210
	smp_mb__after_atomic();
211 212
}

213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240
#ifdef CONFIG_DEBUG_FS
static void genpd_update_accounting(struct generic_pm_domain *genpd)
{
	ktime_t delta, now;

	now = ktime_get();
	delta = ktime_sub(now, genpd->accounting_time);

	/*
	 * If genpd->status is active, it means we are just
	 * out of off and so update the idle time and vice
	 * versa.
	 */
	if (genpd->status == GPD_STATE_ACTIVE) {
		int state_idx = genpd->state_idx;

		genpd->states[state_idx].idle_time =
			ktime_add(genpd->states[state_idx].idle_time, delta);
	} else {
		genpd->on_time = ktime_add(genpd->on_time, delta);
	}

	genpd->accounting_time = now;
}
#else
static inline void genpd_update_accounting(struct generic_pm_domain *genpd) {}
#endif

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 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329
/**
 * dev_pm_genpd_set_performance_state- Set performance state of device's power
 * domain.
 *
 * @dev: Device for which the performance-state needs to be set.
 * @state: Target performance state of the device. This can be set as 0 when the
 *	   device doesn't have any performance state constraints left (And so
 *	   the device wouldn't participate anymore to find the target
 *	   performance state of the genpd).
 *
 * It is assumed that the users guarantee that the genpd wouldn't be detached
 * while this routine is getting called.
 *
 * Returns 0 on success and negative error values on failures.
 */
int dev_pm_genpd_set_performance_state(struct device *dev, unsigned int state)
{
	struct generic_pm_domain *genpd;
	struct generic_pm_domain_data *gpd_data, *pd_data;
	struct pm_domain_data *pdd;
	unsigned int prev;
	int ret = 0;

	genpd = dev_to_genpd(dev);
	if (IS_ERR(genpd))
		return -ENODEV;

	if (unlikely(!genpd->set_performance_state))
		return -EINVAL;

	if (unlikely(!dev->power.subsys_data ||
		     !dev->power.subsys_data->domain_data)) {
		WARN_ON(1);
		return -EINVAL;
	}

	genpd_lock(genpd);

	gpd_data = to_gpd_data(dev->power.subsys_data->domain_data);
	prev = gpd_data->performance_state;
	gpd_data->performance_state = state;

	/* New requested state is same as Max requested state */
	if (state == genpd->performance_state)
		goto unlock;

	/* New requested state is higher than Max requested state */
	if (state > genpd->performance_state)
		goto update_state;

	/* Traverse all devices within the domain */
	list_for_each_entry(pdd, &genpd->dev_list, list_node) {
		pd_data = to_gpd_data(pdd);

		if (pd_data->performance_state > state)
			state = pd_data->performance_state;
	}

	if (state == genpd->performance_state)
		goto unlock;

	/*
	 * We aren't propagating performance state changes of a subdomain to its
	 * masters as we don't have hardware that needs it. Over that, the
	 * performance states of subdomain and its masters may not have
	 * one-to-one mapping and would require additional information. We can
	 * get back to this once we have hardware that needs it. For that
	 * reason, we don't have to consider performance state of the subdomains
	 * of genpd here.
	 */

update_state:
	if (genpd_status_on(genpd)) {
		ret = genpd->set_performance_state(genpd, state);
		if (ret) {
			gpd_data->performance_state = prev;
			goto unlock;
		}
	}

	genpd->performance_state = state;

unlock:
	genpd_unlock(genpd);

	return ret;
}
EXPORT_SYMBOL_GPL(dev_pm_genpd_set_performance_state);

330
static int _genpd_power_on(struct generic_pm_domain *genpd, bool timed)
331
{
332
	unsigned int state_idx = genpd->state_idx;
333 334 335 336 337 338 339
	ktime_t time_start;
	s64 elapsed_ns;
	int ret;

	if (!genpd->power_on)
		return 0;

340 341 342
	if (!timed)
		return genpd->power_on(genpd);

343 344 345 346 347 348
	time_start = ktime_get();
	ret = genpd->power_on(genpd);
	if (ret)
		return ret;

	elapsed_ns = ktime_to_ns(ktime_sub(ktime_get(), time_start));
349 350 351 352 353 354 355 356 357

	if (unlikely(genpd->set_performance_state)) {
		ret = genpd->set_performance_state(genpd, genpd->performance_state);
		if (ret) {
			pr_warn("%s: Failed to set performance state %d (%d)\n",
				genpd->name, genpd->performance_state, ret);
		}
	}

358
	if (elapsed_ns <= genpd->states[state_idx].power_on_latency_ns)
359 360
		return ret;

361
	genpd->states[state_idx].power_on_latency_ns = elapsed_ns;
362
	genpd->max_off_time_changed = true;
363 364
	pr_debug("%s: Power-%s latency exceeded, new value %lld ns\n",
		 genpd->name, "on", elapsed_ns);
365 366 367 368

	return ret;
}

369
static int _genpd_power_off(struct generic_pm_domain *genpd, bool timed)
370
{
371
	unsigned int state_idx = genpd->state_idx;
372 373 374 375 376 377 378
	ktime_t time_start;
	s64 elapsed_ns;
	int ret;

	if (!genpd->power_off)
		return 0;

379 380 381
	if (!timed)
		return genpd->power_off(genpd);

382 383 384 385 386 387
	time_start = ktime_get();
	ret = genpd->power_off(genpd);
	if (ret == -EBUSY)
		return ret;

	elapsed_ns = ktime_to_ns(ktime_sub(ktime_get(), time_start));
388
	if (elapsed_ns <= genpd->states[state_idx].power_off_latency_ns)
389 390
		return ret;

391
	genpd->states[state_idx].power_off_latency_ns = elapsed_ns;
392
	genpd->max_off_time_changed = true;
393 394
	pr_debug("%s: Power-%s latency exceeded, new value %lld ns\n",
		 genpd->name, "off", elapsed_ns);
395 396 397 398

	return ret;
}

399
/**
400
 * genpd_queue_power_off_work - Queue up the execution of genpd_power_off().
401
 * @genpd: PM domain to power off.
402
 *
403
 * Queue up the execution of genpd_power_off() unless it's already been done
404 405 406 407 408 409 410
 * before.
 */
static void genpd_queue_power_off_work(struct generic_pm_domain *genpd)
{
	queue_work(pm_wq, &genpd->power_off_work);
}

411 412 413
/**
 * genpd_power_off - Remove power from a given PM domain.
 * @genpd: PM domain to power down.
414 415 416 417
 * @one_dev_on: If invoked from genpd's ->runtime_suspend|resume() callback, the
 * RPM status of the releated device is in an intermediate state, not yet turned
 * into RPM_SUSPENDED. This means genpd_power_off() must allow one device to not
 * be RPM_SUSPENDED, while it tries to power off the PM domain.
418 419 420 421
 *
 * If all of the @genpd's devices have been suspended and all of its subdomains
 * have been powered down, remove power from @genpd.
 */
422 423
static int genpd_power_off(struct generic_pm_domain *genpd, bool one_dev_on,
			   unsigned int depth)
424 425 426 427 428 429 430 431 432 433
{
	struct pm_domain_data *pdd;
	struct gpd_link *link;
	unsigned int not_suspended = 0;

	/*
	 * Do not try to power off the domain in the following situations:
	 * (1) The domain is already in the "power off" state.
	 * (2) System suspend is in progress.
	 */
434
	if (!genpd_status_on(genpd) || genpd->prepared_count > 0)
435 436
		return 0;

437 438 439 440 441 442
	/*
	 * Abort power off for the PM domain in the following situations:
	 * (1) The domain is configured as always on.
	 * (2) When the domain has a subdomain being powered on.
	 */
	if (genpd_is_always_on(genpd) || atomic_read(&genpd->sd_count) > 0)
443 444 445 446 447
		return -EBUSY;

	list_for_each_entry(pdd, &genpd->dev_list, list_node) {
		enum pm_qos_flags_status stat;

448
		stat = dev_pm_qos_flags(pdd->dev, PM_QOS_FLAG_NO_POWER_OFF);
449 450 451 452 453 454 455 456 457 458 459 460
		if (stat > PM_QOS_FLAGS_NONE)
			return -EBUSY;

		/*
		 * Do not allow PM domain to be powered off, when an IRQ safe
		 * device is part of a non-IRQ safe domain.
		 */
		if (!pm_runtime_suspended(pdd->dev) ||
			irq_safe_dev_in_no_sleep_domain(pdd->dev, genpd))
			not_suspended++;
	}

461
	if (not_suspended > 1 || (not_suspended == 1 && !one_dev_on))
462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488
		return -EBUSY;

	if (genpd->gov && genpd->gov->power_down_ok) {
		if (!genpd->gov->power_down_ok(&genpd->domain))
			return -EAGAIN;
	}

	if (genpd->power_off) {
		int ret;

		if (atomic_read(&genpd->sd_count) > 0)
			return -EBUSY;

		/*
		 * If sd_count > 0 at this point, one of the subdomains hasn't
		 * managed to call genpd_power_on() for the master yet after
		 * incrementing it.  In that case genpd_power_on() will wait
		 * for us to drop the lock, so we can call .power_off() and let
		 * the genpd_power_on() restore power for us (this shouldn't
		 * happen very often).
		 */
		ret = _genpd_power_off(genpd, true);
		if (ret)
			return ret;
	}

	genpd->status = GPD_STATE_POWER_OFF;
489
	genpd_update_accounting(genpd);
490 491 492

	list_for_each_entry(link, &genpd->slave_links, slave_node) {
		genpd_sd_counter_dec(link->master);
493 494 495
		genpd_lock_nested(link->master, depth + 1);
		genpd_power_off(link->master, false, depth + 1);
		genpd_unlock(link->master);
496 497 498 499 500
	}

	return 0;
}

501
/**
502
 * genpd_power_on - Restore power to a given PM domain and its masters.
503
 * @genpd: PM domain to power up.
504
 * @depth: nesting count for lockdep.
505
 *
506
 * Restore power to @genpd and all of its masters so that it is possible to
507 508
 * resume a device belonging to it.
 */
509
static int genpd_power_on(struct generic_pm_domain *genpd, unsigned int depth)
510
{
511
	struct gpd_link *link;
512 513
	int ret = 0;

514
	if (genpd_status_on(genpd))
515
		return 0;
516

517 518 519 520 521 522
	/*
	 * The list is guaranteed not to change while the loop below is being
	 * executed, unless one of the masters' .power_on() callbacks fiddles
	 * with it.
	 */
	list_for_each_entry(link, &genpd->slave_links, slave_node) {
523 524 525 526
		struct generic_pm_domain *master = link->master;

		genpd_sd_counter_inc(master);

L
Lina Iyer 已提交
527
		genpd_lock_nested(master, depth + 1);
528
		ret = genpd_power_on(master, depth + 1);
L
Lina Iyer 已提交
529
		genpd_unlock(master);
530

531
		if (ret) {
532
			genpd_sd_counter_dec(master);
533
			goto err;
534
		}
535 536
	}

537
	ret = _genpd_power_on(genpd, true);
538 539
	if (ret)
		goto err;
540

541
	genpd->status = GPD_STATE_ACTIVE;
542 543
	genpd_update_accounting(genpd);

544
	return 0;
545 546

 err:
547 548 549
	list_for_each_entry_continue_reverse(link,
					&genpd->slave_links,
					slave_node) {
550
		genpd_sd_counter_dec(link->master);
551 552 553
		genpd_lock_nested(link->master, depth + 1);
		genpd_power_off(link->master, false, depth + 1);
		genpd_unlock(link->master);
554
	}
555

556 557 558
	return ret;
}

559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575
static int genpd_dev_pm_qos_notifier(struct notifier_block *nb,
				     unsigned long val, void *ptr)
{
	struct generic_pm_domain_data *gpd_data;
	struct device *dev;

	gpd_data = container_of(nb, struct generic_pm_domain_data, nb);
	dev = gpd_data->base.dev;

	for (;;) {
		struct generic_pm_domain *genpd;
		struct pm_domain_data *pdd;

		spin_lock_irq(&dev->power.lock);

		pdd = dev->power.subsys_data ?
				dev->power.subsys_data->domain_data : NULL;
576
		if (pdd) {
577 578 579 580 581 582 583 584 585
			to_gpd_data(pdd)->td.constraint_changed = true;
			genpd = dev_to_genpd(dev);
		} else {
			genpd = ERR_PTR(-ENODATA);
		}

		spin_unlock_irq(&dev->power.lock);

		if (!IS_ERR(genpd)) {
L
Lina Iyer 已提交
586
			genpd_lock(genpd);
587
			genpd->max_off_time_changed = true;
L
Lina Iyer 已提交
588
			genpd_unlock(genpd);
589 590 591 592 593 594 595 596 597 598
		}

		dev = dev->parent;
		if (!dev || dev->power.ignore_children)
			break;
	}

	return NOTIFY_DONE;
}

599 600 601 602 603 604 605 606 607 608
/**
 * genpd_power_off_work_fn - Power off PM domain whose subdomain count is 0.
 * @work: Work structure used for scheduling the execution of this function.
 */
static void genpd_power_off_work_fn(struct work_struct *work)
{
	struct generic_pm_domain *genpd;

	genpd = container_of(work, struct generic_pm_domain, power_off_work);

L
Lina Iyer 已提交
609
	genpd_lock(genpd);
610
	genpd_power_off(genpd, false, 0);
L
Lina Iyer 已提交
611
	genpd_unlock(genpd);
612 613
}

614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659
/**
 * __genpd_runtime_suspend - walk the hierarchy of ->runtime_suspend() callbacks
 * @dev: Device to handle.
 */
static int __genpd_runtime_suspend(struct device *dev)
{
	int (*cb)(struct device *__dev);

	if (dev->type && dev->type->pm)
		cb = dev->type->pm->runtime_suspend;
	else if (dev->class && dev->class->pm)
		cb = dev->class->pm->runtime_suspend;
	else if (dev->bus && dev->bus->pm)
		cb = dev->bus->pm->runtime_suspend;
	else
		cb = NULL;

	if (!cb && dev->driver && dev->driver->pm)
		cb = dev->driver->pm->runtime_suspend;

	return cb ? cb(dev) : 0;
}

/**
 * __genpd_runtime_resume - walk the hierarchy of ->runtime_resume() callbacks
 * @dev: Device to handle.
 */
static int __genpd_runtime_resume(struct device *dev)
{
	int (*cb)(struct device *__dev);

	if (dev->type && dev->type->pm)
		cb = dev->type->pm->runtime_resume;
	else if (dev->class && dev->class->pm)
		cb = dev->class->pm->runtime_resume;
	else if (dev->bus && dev->bus->pm)
		cb = dev->bus->pm->runtime_resume;
	else
		cb = NULL;

	if (!cb && dev->driver && dev->driver->pm)
		cb = dev->driver->pm->runtime_resume;

	return cb ? cb(dev) : 0;
}

660
/**
661
 * genpd_runtime_suspend - Suspend a device belonging to I/O PM domain.
662 663 664 665 666 667
 * @dev: Device to suspend.
 *
 * Carry out a runtime suspend of a device under the assumption that its
 * pm_domain field points to the domain member of an object of type
 * struct generic_pm_domain representing a PM domain consisting of I/O devices.
 */
668
static int genpd_runtime_suspend(struct device *dev)
669 670
{
	struct generic_pm_domain *genpd;
671
	bool (*suspend_ok)(struct device *__dev);
672
	struct gpd_timing_data *td = &dev_gpd_data(dev)->td;
673
	bool runtime_pm = pm_runtime_enabled(dev);
674 675
	ktime_t time_start;
	s64 elapsed_ns;
676
	int ret;
677 678 679

	dev_dbg(dev, "%s()\n", __func__);

680 681
	genpd = dev_to_genpd(dev);
	if (IS_ERR(genpd))
682 683
		return -EINVAL;

684 685 686 687 688 689
	/*
	 * A runtime PM centric subsystem/driver may re-use the runtime PM
	 * callbacks for other purposes than runtime PM. In those scenarios
	 * runtime PM is disabled. Under these circumstances, we shall skip
	 * validating/measuring the PM QoS latency.
	 */
690 691
	suspend_ok = genpd->gov ? genpd->gov->suspend_ok : NULL;
	if (runtime_pm && suspend_ok && !suspend_ok(dev))
692 693
		return -EBUSY;

694
	/* Measure suspend latency. */
695
	time_start = 0;
696 697
	if (runtime_pm)
		time_start = ktime_get();
698

699
	ret = __genpd_runtime_suspend(dev);
700 701
	if (ret)
		return ret;
702

703
	ret = genpd_stop_dev(genpd, dev);
704
	if (ret) {
705
		__genpd_runtime_resume(dev);
706 707 708
		return ret;
	}

709
	/* Update suspend latency value if the measured time exceeds it. */
710 711 712 713 714 715 716 717 718
	if (runtime_pm) {
		elapsed_ns = ktime_to_ns(ktime_sub(ktime_get(), time_start));
		if (elapsed_ns > td->suspend_latency_ns) {
			td->suspend_latency_ns = elapsed_ns;
			dev_dbg(dev, "suspend latency exceeded, %lld ns\n",
				elapsed_ns);
			genpd->max_off_time_changed = true;
			td->constraint_changed = true;
		}
719 720
	}

721
	/*
722 723
	 * If power.irq_safe is set, this routine may be run with
	 * IRQs disabled, so suspend only if the PM domain also is irq_safe.
724
	 */
725
	if (irq_safe_dev_in_no_sleep_domain(dev, genpd))
726 727
		return 0;

L
Lina Iyer 已提交
728
	genpd_lock(genpd);
729
	genpd_power_off(genpd, true, 0);
L
Lina Iyer 已提交
730
	genpd_unlock(genpd);
731 732 733 734 735

	return 0;
}

/**
736
 * genpd_runtime_resume - Resume a device belonging to I/O PM domain.
737 738 739 740 741 742
 * @dev: Device to resume.
 *
 * Carry out a runtime resume of a device under the assumption that its
 * pm_domain field points to the domain member of an object of type
 * struct generic_pm_domain representing a PM domain consisting of I/O devices.
 */
743
static int genpd_runtime_resume(struct device *dev)
744 745
{
	struct generic_pm_domain *genpd;
746
	struct gpd_timing_data *td = &dev_gpd_data(dev)->td;
747
	bool runtime_pm = pm_runtime_enabled(dev);
748 749
	ktime_t time_start;
	s64 elapsed_ns;
750
	int ret;
751
	bool timed = true;
752 753 754

	dev_dbg(dev, "%s()\n", __func__);

755 756
	genpd = dev_to_genpd(dev);
	if (IS_ERR(genpd))
757 758
		return -EINVAL;

759 760 761 762 763
	/*
	 * As we don't power off a non IRQ safe domain, which holds
	 * an IRQ safe device, we don't need to restore power to it.
	 */
	if (irq_safe_dev_in_no_sleep_domain(dev, genpd)) {
764 765 766
		timed = false;
		goto out;
	}
767

L
Lina Iyer 已提交
768
	genpd_lock(genpd);
769
	ret = genpd_power_on(genpd, 0);
L
Lina Iyer 已提交
770
	genpd_unlock(genpd);
771

772 773
	if (ret)
		return ret;
774

775
 out:
776
	/* Measure resume latency. */
777
	time_start = 0;
778
	if (timed && runtime_pm)
779 780
		time_start = ktime_get();

781 782 783 784
	ret = genpd_start_dev(genpd, dev);
	if (ret)
		goto err_poweroff;

785
	ret = __genpd_runtime_resume(dev);
786 787
	if (ret)
		goto err_stop;
788 789

	/* Update resume latency value if the measured time exceeds it. */
790
	if (timed && runtime_pm) {
791 792 793 794 795 796 797 798 799
		elapsed_ns = ktime_to_ns(ktime_sub(ktime_get(), time_start));
		if (elapsed_ns > td->resume_latency_ns) {
			td->resume_latency_ns = elapsed_ns;
			dev_dbg(dev, "resume latency exceeded, %lld ns\n",
				elapsed_ns);
			genpd->max_off_time_changed = true;
			td->constraint_changed = true;
		}
	}
800

801
	return 0;
802 803 804 805

err_stop:
	genpd_stop_dev(genpd, dev);
err_poweroff:
806 807
	if (!pm_runtime_is_irq_safe(dev) ||
		(pm_runtime_is_irq_safe(dev) && genpd_is_irq_safe(genpd))) {
L
Lina Iyer 已提交
808
		genpd_lock(genpd);
809
		genpd_power_off(genpd, true, 0);
L
Lina Iyer 已提交
810
		genpd_unlock(genpd);
811 812 813
	}

	return ret;
814 815
}

816 817 818 819 820 821 822 823
static bool pd_ignore_unused;
static int __init pd_ignore_unused_setup(char *__unused)
{
	pd_ignore_unused = true;
	return 1;
}
__setup("pd_ignore_unused", pd_ignore_unused_setup);

824
/**
825
 * genpd_power_off_unused - Power off all PM domains with no devices in use.
826
 */
827
static int __init genpd_power_off_unused(void)
828 829 830
{
	struct generic_pm_domain *genpd;

831 832
	if (pd_ignore_unused) {
		pr_warn("genpd: Not disabling unused power domains\n");
833
		return 0;
834 835
	}

836 837 838 839 840 841 842
	mutex_lock(&gpd_list_lock);

	list_for_each_entry(genpd, &gpd_list, gpd_list_node)
		genpd_queue_power_off_work(genpd);

	mutex_unlock(&gpd_list_lock);

843 844
	return 0;
}
845
late_initcall(genpd_power_off_unused);
846

847
#if defined(CONFIG_PM_SLEEP) || defined(CONFIG_PM_GENERIC_DOMAINS_OF)
848

849
static bool genpd_present(const struct generic_pm_domain *genpd)
850
{
851
	const struct generic_pm_domain *gpd;
852 853 854 855 856 857 858 859 860 861 862

	if (IS_ERR_OR_NULL(genpd))
		return false;

	list_for_each_entry(gpd, &gpd_list, gpd_list_node)
		if (gpd == genpd)
			return true;

	return false;
}

863 864 865 866
#endif

#ifdef CONFIG_PM_SLEEP

867
/**
868
 * genpd_sync_power_off - Synchronously power off a PM domain and its masters.
869
 * @genpd: PM domain to power off, if possible.
870 871
 * @use_lock: use the lock.
 * @depth: nesting count for lockdep.
872 873
 *
 * Check if the given PM domain can be powered off (during system suspend or
874
 * hibernation) and do that if so.  Also, in that case propagate to its masters.
875
 *
876
 * This function is only called in "noirq" and "syscore" stages of system power
877 878
 * transitions. The "noirq" callbacks may be executed asynchronously, thus in
 * these cases the lock must be held.
879
 */
880 881
static void genpd_sync_power_off(struct generic_pm_domain *genpd, bool use_lock,
				 unsigned int depth)
882
{
883
	struct gpd_link *link;
884

885
	if (!genpd_status_on(genpd) || genpd_is_always_on(genpd))
886 887
		return;

888 889
	if (genpd->suspended_count != genpd->device_count
	    || atomic_read(&genpd->sd_count) > 0)
890 891
		return;

892 893
	/* Choose the deepest state when suspending */
	genpd->state_idx = genpd->state_count - 1;
894 895
	if (_genpd_power_off(genpd, false))
		return;
896

897
	genpd->status = GPD_STATE_POWER_OFF;
898 899 900

	list_for_each_entry(link, &genpd->slave_links, slave_node) {
		genpd_sd_counter_dec(link->master);
901 902 903 904 905 906 907 908

		if (use_lock)
			genpd_lock_nested(link->master, depth + 1);

		genpd_sync_power_off(link->master, use_lock, depth + 1);

		if (use_lock)
			genpd_unlock(link->master);
909 910 911
	}
}

912
/**
913
 * genpd_sync_power_on - Synchronously power on a PM domain and its masters.
914
 * @genpd: PM domain to power on.
915 916
 * @use_lock: use the lock.
 * @depth: nesting count for lockdep.
917
 *
918
 * This function is only called in "noirq" and "syscore" stages of system power
919 920
 * transitions. The "noirq" callbacks may be executed asynchronously, thus in
 * these cases the lock must be held.
921
 */
922 923
static void genpd_sync_power_on(struct generic_pm_domain *genpd, bool use_lock,
				unsigned int depth)
924 925 926
{
	struct gpd_link *link;

927
	if (genpd_status_on(genpd))
928 929 930 931
		return;

	list_for_each_entry(link, &genpd->slave_links, slave_node) {
		genpd_sd_counter_inc(link->master);
932 933 934 935 936 937 938 939

		if (use_lock)
			genpd_lock_nested(link->master, depth + 1);

		genpd_sync_power_on(link->master, use_lock, depth + 1);

		if (use_lock)
			genpd_unlock(link->master);
940 941
	}

942
	_genpd_power_on(genpd, false);
943 944 945 946

	genpd->status = GPD_STATE_ACTIVE;
}

947 948 949 950 951 952
/**
 * resume_needed - Check whether to resume a device before system suspend.
 * @dev: Device to check.
 * @genpd: PM domain the device belongs to.
 *
 * There are two cases in which a device that can wake up the system from sleep
953
 * states should be resumed by genpd_prepare(): (1) if the device is enabled
954 955 956 957 958 959 960 961 962
 * to wake up the system and it has to remain active for this purpose while the
 * system is in the sleep state and (2) if the device is not enabled to wake up
 * the system from sleep states and it generally doesn't generate wakeup signals
 * by itself (those signals are generated on its behalf by other parts of the
 * system).  In the latter case it may be necessary to reconfigure the device's
 * wakeup settings during system suspend, because it may have been set up to
 * signal remote wakeup from the system's working state as needed by runtime PM.
 * Return 'true' in either of the above cases.
 */
963 964
static bool resume_needed(struct device *dev,
			  const struct generic_pm_domain *genpd)
965 966 967 968 969 970
{
	bool active_wakeup;

	if (!device_can_wakeup(dev))
		return false;

971
	active_wakeup = genpd_is_active_wakeup(genpd);
972 973 974
	return device_may_wakeup(dev) ? active_wakeup : !active_wakeup;
}

975
/**
976
 * genpd_prepare - Start power transition of a device in a PM domain.
977 978 979 980 981 982 983
 * @dev: Device to start the transition of.
 *
 * Start a power transition of a device (during a system-wide power transition)
 * under the assumption that its pm_domain field points to the domain member of
 * an object of type struct generic_pm_domain representing a PM domain
 * consisting of I/O devices.
 */
984
static int genpd_prepare(struct device *dev)
985 986
{
	struct generic_pm_domain *genpd;
987
	int ret;
988 989 990 991 992 993 994

	dev_dbg(dev, "%s()\n", __func__);

	genpd = dev_to_genpd(dev);
	if (IS_ERR(genpd))
		return -EINVAL;

995 996 997 998 999
	/*
	 * If a wakeup request is pending for the device, it should be woken up
	 * at this point and a system wakeup event should be reported if it's
	 * set up to wake up the system from sleep states.
	 */
1000 1001 1002
	if (resume_needed(dev, genpd))
		pm_runtime_resume(dev);

L
Lina Iyer 已提交
1003
	genpd_lock(genpd);
1004

1005
	if (genpd->prepared_count++ == 0)
1006
		genpd->suspended_count = 0;
1007

L
Lina Iyer 已提交
1008
	genpd_unlock(genpd);
1009

1010
	ret = pm_generic_prepare(dev);
1011
	if (ret < 0) {
L
Lina Iyer 已提交
1012
		genpd_lock(genpd);
1013

1014
		genpd->prepared_count--;
1015

L
Lina Iyer 已提交
1016
		genpd_unlock(genpd);
1017
	}
1018

1019 1020
	/* Never return 1, as genpd don't cope with the direct_complete path. */
	return ret >= 0 ? 0 : ret;
1021 1022
}

1023
/**
1024 1025
 * genpd_finish_suspend - Completion of suspend or hibernation of device in an
 *   I/O pm domain.
1026
 * @dev: Device to suspend.
1027
 * @poweroff: Specifies if this is a poweroff_noirq or suspend_noirq callback.
1028 1029 1030 1031
 *
 * Stop the device and remove power from the domain if all devices in it have
 * been stopped.
 */
1032
static int genpd_finish_suspend(struct device *dev, bool poweroff)
1033 1034
{
	struct generic_pm_domain *genpd;
1035
	int ret = 0;
1036 1037 1038 1039

	genpd = dev_to_genpd(dev);
	if (IS_ERR(genpd))
		return -EINVAL;
1040

1041 1042 1043 1044 1045 1046 1047
	if (poweroff)
		ret = pm_generic_poweroff_noirq(dev);
	else
		ret = pm_generic_suspend_noirq(dev);
	if (ret)
		return ret;

1048 1049 1050
	if (dev->power.wakeup_path && genpd_is_active_wakeup(genpd))
		return 0;

1051 1052 1053
	if (genpd->dev_ops.stop && genpd->dev_ops.start &&
	    !pm_runtime_status_suspended(dev)) {
		ret = genpd_stop_dev(genpd, dev);
1054 1055 1056 1057 1058
		if (ret) {
			if (poweroff)
				pm_generic_restore_noirq(dev);
			else
				pm_generic_resume_noirq(dev);
1059
			return ret;
1060
		}
1061 1062
	}

1063
	genpd_lock(genpd);
1064
	genpd->suspended_count++;
1065 1066
	genpd_sync_power_off(genpd, true, 0);
	genpd_unlock(genpd);
1067 1068 1069 1070

	return 0;
}

1071
/**
1072
 * genpd_suspend_noirq - Completion of suspend of device in an I/O PM domain.
1073 1074 1075 1076 1077
 * @dev: Device to suspend.
 *
 * Stop the device and remove power from the domain if all devices in it have
 * been stopped.
 */
1078
static int genpd_suspend_noirq(struct device *dev)
1079 1080 1081 1082 1083 1084
{
	dev_dbg(dev, "%s()\n", __func__);

	return genpd_finish_suspend(dev, false);
}

1085
/**
1086
 * genpd_resume_noirq - Start of resume of device in an I/O PM domain.
1087 1088
 * @dev: Device to resume.
 *
1089
 * Restore power to the device's PM domain, if necessary, and start the device.
1090
 */
1091
static int genpd_resume_noirq(struct device *dev)
1092 1093
{
	struct generic_pm_domain *genpd;
1094
	int ret;
1095 1096 1097 1098 1099 1100 1101

	dev_dbg(dev, "%s()\n", __func__);

	genpd = dev_to_genpd(dev);
	if (IS_ERR(genpd))
		return -EINVAL;

1102
	if (dev->power.wakeup_path && genpd_is_active_wakeup(genpd))
1103
		return pm_generic_resume_noirq(dev);
1104

1105 1106
	genpd_lock(genpd);
	genpd_sync_power_on(genpd, true, 0);
1107
	genpd->suspended_count--;
1108
	genpd_unlock(genpd);
1109

1110 1111 1112
	if (genpd->dev_ops.stop && genpd->dev_ops.start &&
	    !pm_runtime_status_suspended(dev)) {
		ret = genpd_start_dev(genpd, dev);
1113 1114 1115
		if (ret)
			return ret;
	}
1116

1117
	return pm_generic_resume_noirq(dev);
1118 1119
}

1120
/**
1121
 * genpd_freeze_noirq - Completion of freezing a device in an I/O PM domain.
1122 1123 1124 1125 1126 1127 1128
 * @dev: Device to freeze.
 *
 * Carry out a late freeze of a device under the assumption that its
 * pm_domain field points to the domain member of an object of type
 * struct generic_pm_domain representing a power domain consisting of I/O
 * devices.
 */
1129
static int genpd_freeze_noirq(struct device *dev)
1130
{
1131
	const struct generic_pm_domain *genpd;
1132
	int ret = 0;
1133 1134 1135 1136 1137 1138 1139

	dev_dbg(dev, "%s()\n", __func__);

	genpd = dev_to_genpd(dev);
	if (IS_ERR(genpd))
		return -EINVAL;

1140 1141 1142 1143
	ret = pm_generic_freeze_noirq(dev);
	if (ret)
		return ret;

1144 1145 1146
	if (genpd->dev_ops.stop && genpd->dev_ops.start &&
	    !pm_runtime_status_suspended(dev))
		ret = genpd_stop_dev(genpd, dev);
1147 1148

	return ret;
1149
}
1150

1151
/**
1152
 * genpd_thaw_noirq - Early thaw of device in an I/O PM domain.
1153 1154 1155 1156 1157
 * @dev: Device to thaw.
 *
 * Start the device, unless power has been removed from the domain already
 * before the system transition.
 */
1158
static int genpd_thaw_noirq(struct device *dev)
1159
{
1160
	const struct generic_pm_domain *genpd;
1161
	int ret = 0;
1162

1163
	dev_dbg(dev, "%s()\n", __func__);
1164

1165 1166 1167 1168
	genpd = dev_to_genpd(dev);
	if (IS_ERR(genpd))
		return -EINVAL;

1169 1170 1171
	if (genpd->dev_ops.stop && genpd->dev_ops.start &&
	    !pm_runtime_status_suspended(dev)) {
		ret = genpd_start_dev(genpd, dev);
1172 1173 1174
		if (ret)
			return ret;
	}
1175

1176 1177 1178 1179
	return pm_generic_thaw_noirq(dev);
}

/**
1180
 * genpd_poweroff_noirq - Completion of hibernation of device in an
1181 1182 1183 1184 1185 1186
 *   I/O PM domain.
 * @dev: Device to poweroff.
 *
 * Stop the device and remove power from the domain if all devices in it have
 * been stopped.
 */
1187
static int genpd_poweroff_noirq(struct device *dev)
1188 1189 1190 1191
{
	dev_dbg(dev, "%s()\n", __func__);

	return genpd_finish_suspend(dev, true);
1192 1193 1194
}

/**
1195
 * genpd_restore_noirq - Start of restore of device in an I/O PM domain.
1196 1197
 * @dev: Device to resume.
 *
1198 1199
 * Make sure the domain will be in the same power state as before the
 * hibernation the system is resuming from and start the device if necessary.
1200
 */
1201
static int genpd_restore_noirq(struct device *dev)
1202 1203
{
	struct generic_pm_domain *genpd;
1204
	int ret = 0;
1205 1206 1207 1208 1209 1210 1211 1212

	dev_dbg(dev, "%s()\n", __func__);

	genpd = dev_to_genpd(dev);
	if (IS_ERR(genpd))
		return -EINVAL;

	/*
1213 1214
	 * At this point suspended_count == 0 means we are being run for the
	 * first time for the given domain in the present cycle.
1215
	 */
1216
	genpd_lock(genpd);
1217
	if (genpd->suspended_count++ == 0)
1218
		/*
1219
		 * The boot kernel might put the domain into arbitrary state,
1220
		 * so make it appear as powered off to genpd_sync_power_on(),
1221
		 * so that it tries to power it on in case it was really off.
1222
		 */
1223
		genpd->status = GPD_STATE_POWER_OFF;
1224

1225 1226
	genpd_sync_power_on(genpd, true, 0);
	genpd_unlock(genpd);
1227

1228 1229 1230
	if (genpd->dev_ops.stop && genpd->dev_ops.start &&
	    !pm_runtime_status_suspended(dev)) {
		ret = genpd_start_dev(genpd, dev);
1231 1232 1233
		if (ret)
			return ret;
	}
1234

1235
	return pm_generic_restore_noirq(dev);
1236 1237 1238
}

/**
1239
 * genpd_complete - Complete power transition of a device in a power domain.
1240 1241 1242 1243 1244 1245 1246
 * @dev: Device to complete the transition of.
 *
 * Complete a power transition of a device (during a system-wide power
 * transition) under the assumption that its pm_domain field points to the
 * domain member of an object of type struct generic_pm_domain representing
 * a power domain consisting of I/O devices.
 */
1247
static void genpd_complete(struct device *dev)
1248 1249 1250 1251 1252 1253 1254 1255 1256
{
	struct generic_pm_domain *genpd;

	dev_dbg(dev, "%s()\n", __func__);

	genpd = dev_to_genpd(dev);
	if (IS_ERR(genpd))
		return;

1257 1258
	pm_generic_complete(dev);

L
Lina Iyer 已提交
1259
	genpd_lock(genpd);
1260

1261
	genpd->prepared_count--;
1262 1263
	if (!genpd->prepared_count)
		genpd_queue_power_off_work(genpd);
1264

L
Lina Iyer 已提交
1265
	genpd_unlock(genpd);
1266 1267
}

1268
/**
1269
 * genpd_syscore_switch - Switch power during system core suspend or resume.
1270 1271 1272 1273 1274
 * @dev: Device that normally is marked as "always on" to switch power for.
 *
 * This routine may only be called during the system core (syscore) suspend or
 * resume phase for devices whose "always on" flags are set.
 */
1275
static void genpd_syscore_switch(struct device *dev, bool suspend)
1276 1277 1278
{
	struct generic_pm_domain *genpd;

1279
	genpd = dev_to_genpd(dev);
1280
	if (!genpd_present(genpd))
1281 1282 1283 1284
		return;

	if (suspend) {
		genpd->suspended_count++;
1285
		genpd_sync_power_off(genpd, false, 0);
1286
	} else {
1287
		genpd_sync_power_on(genpd, false, 0);
1288 1289 1290
		genpd->suspended_count--;
	}
}
1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302

void pm_genpd_syscore_poweroff(struct device *dev)
{
	genpd_syscore_switch(dev, true);
}
EXPORT_SYMBOL_GPL(pm_genpd_syscore_poweroff);

void pm_genpd_syscore_poweron(struct device *dev)
{
	genpd_syscore_switch(dev, false);
}
EXPORT_SYMBOL_GPL(pm_genpd_syscore_poweron);
1303

1304
#else /* !CONFIG_PM_SLEEP */
1305

1306 1307 1308 1309 1310 1311 1312 1313
#define genpd_prepare		NULL
#define genpd_suspend_noirq	NULL
#define genpd_resume_noirq	NULL
#define genpd_freeze_noirq	NULL
#define genpd_thaw_noirq	NULL
#define genpd_poweroff_noirq	NULL
#define genpd_restore_noirq	NULL
#define genpd_complete		NULL
1314 1315 1316

#endif /* CONFIG_PM_SLEEP */

1317 1318 1319
static struct generic_pm_domain_data *genpd_alloc_dev_data(struct device *dev,
					struct generic_pm_domain *genpd,
					struct gpd_timing_data *td)
1320 1321
{
	struct generic_pm_domain_data *gpd_data;
1322 1323 1324 1325 1326
	int ret;

	ret = dev_pm_get_subsys_data(dev);
	if (ret)
		return ERR_PTR(ret);
1327 1328

	gpd_data = kzalloc(sizeof(*gpd_data), GFP_KERNEL);
1329 1330 1331 1332
	if (!gpd_data) {
		ret = -ENOMEM;
		goto err_put;
	}
1333

1334 1335 1336 1337 1338
	if (td)
		gpd_data->td = *td;

	gpd_data->base.dev = dev;
	gpd_data->td.constraint_changed = true;
1339
	gpd_data->td.effective_constraint_ns = PM_QOS_RESUME_LATENCY_NO_CONSTRAINT_NS;
1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352
	gpd_data->nb.notifier_call = genpd_dev_pm_qos_notifier;

	spin_lock_irq(&dev->power.lock);

	if (dev->power.subsys_data->domain_data) {
		ret = -EINVAL;
		goto err_free;
	}

	dev->power.subsys_data->domain_data = &gpd_data->base;

	spin_unlock_irq(&dev->power.lock);

1353
	return gpd_data;
1354

1355 1356 1357
 err_free:
	spin_unlock_irq(&dev->power.lock);
	kfree(gpd_data);
1358 1359 1360
 err_put:
	dev_pm_put_subsys_data(dev);
	return ERR_PTR(ret);
1361 1362
}

1363 1364
static void genpd_free_dev_data(struct device *dev,
				struct generic_pm_domain_data *gpd_data)
1365
{
1366 1367 1368 1369 1370 1371
	spin_lock_irq(&dev->power.lock);

	dev->power.subsys_data->domain_data = NULL;

	spin_unlock_irq(&dev->power.lock);

1372
	kfree(gpd_data);
1373
	dev_pm_put_subsys_data(dev);
1374 1375
}

1376 1377
static int genpd_add_device(struct generic_pm_domain *genpd, struct device *dev,
			    struct gpd_timing_data *td)
1378
{
1379
	struct generic_pm_domain_data *gpd_data;
1380 1381 1382 1383 1384 1385 1386
	int ret = 0;

	dev_dbg(dev, "%s()\n", __func__);

	if (IS_ERR_OR_NULL(genpd) || IS_ERR_OR_NULL(dev))
		return -EINVAL;

1387
	gpd_data = genpd_alloc_dev_data(dev, genpd, td);
1388 1389
	if (IS_ERR(gpd_data))
		return PTR_ERR(gpd_data);
1390

L
Lina Iyer 已提交
1391
	genpd_lock(genpd);
1392

1393 1394 1395 1396 1397
	if (genpd->prepared_count > 0) {
		ret = -EAGAIN;
		goto out;
	}

1398 1399 1400
	ret = genpd->attach_dev ? genpd->attach_dev(genpd, dev) : 0;
	if (ret)
		goto out;
1401

1402 1403
	dev_pm_domain_set(dev, &genpd->domain);

1404 1405 1406
	genpd->device_count++;
	genpd->max_off_time_changed = true;

1407
	list_add_tail(&gpd_data->base.list_node, &genpd->dev_list);
1408

1409
 out:
L
Lina Iyer 已提交
1410
	genpd_unlock(genpd);
1411

1412 1413 1414 1415
	if (ret)
		genpd_free_dev_data(dev, gpd_data);
	else
		dev_pm_qos_add_notifier(dev, &gpd_data->nb);
1416

1417 1418
	return ret;
}
1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436

/**
 * __pm_genpd_add_device - Add a device to an I/O PM domain.
 * @genpd: PM domain to add the device to.
 * @dev: Device to be added.
 * @td: Set of PM QoS timing parameters to attach to the device.
 */
int __pm_genpd_add_device(struct generic_pm_domain *genpd, struct device *dev,
			  struct gpd_timing_data *td)
{
	int ret;

	mutex_lock(&gpd_list_lock);
	ret = genpd_add_device(genpd, dev, td);
	mutex_unlock(&gpd_list_lock);

	return ret;
}
1437
EXPORT_SYMBOL_GPL(__pm_genpd_add_device);
1438

1439 1440
static int genpd_remove_device(struct generic_pm_domain *genpd,
			       struct device *dev)
1441
{
1442
	struct generic_pm_domain_data *gpd_data;
1443
	struct pm_domain_data *pdd;
1444
	int ret = 0;
1445 1446 1447

	dev_dbg(dev, "%s()\n", __func__);

1448 1449 1450 1451
	pdd = dev->power.subsys_data->domain_data;
	gpd_data = to_gpd_data(pdd);
	dev_pm_qos_remove_notifier(dev, &gpd_data->nb);

L
Lina Iyer 已提交
1452
	genpd_lock(genpd);
1453

1454 1455 1456 1457 1458
	if (genpd->prepared_count > 0) {
		ret = -EAGAIN;
		goto out;
	}

1459 1460 1461
	genpd->device_count--;
	genpd->max_off_time_changed = true;

1462
	if (genpd->detach_dev)
1463
		genpd->detach_dev(genpd, dev);
1464

1465 1466
	dev_pm_domain_set(dev, NULL);

1467
	list_del_init(&pdd->list_node);
1468

L
Lina Iyer 已提交
1469
	genpd_unlock(genpd);
1470

1471
	genpd_free_dev_data(dev, gpd_data);
1472

1473
	return 0;
1474

1475
 out:
L
Lina Iyer 已提交
1476
	genpd_unlock(genpd);
1477
	dev_pm_qos_add_notifier(dev, &gpd_data->nb);
1478 1479 1480

	return ret;
}
1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494

/**
 * pm_genpd_remove_device - Remove a device from an I/O PM domain.
 * @genpd: PM domain to remove the device from.
 * @dev: Device to be removed.
 */
int pm_genpd_remove_device(struct generic_pm_domain *genpd,
			   struct device *dev)
{
	if (!genpd || genpd != genpd_lookup_dev(dev))
		return -EINVAL;

	return genpd_remove_device(genpd, dev);
}
1495
EXPORT_SYMBOL_GPL(pm_genpd_remove_device);
1496

1497 1498
static int genpd_add_subdomain(struct generic_pm_domain *genpd,
			       struct generic_pm_domain *subdomain)
1499
{
1500
	struct gpd_link *link, *itr;
1501 1502
	int ret = 0;

1503 1504
	if (IS_ERR_OR_NULL(genpd) || IS_ERR_OR_NULL(subdomain)
	    || genpd == subdomain)
1505 1506
		return -EINVAL;

1507 1508 1509 1510 1511 1512
	/*
	 * If the domain can be powered on/off in an IRQ safe
	 * context, ensure that the subdomain can also be
	 * powered on/off in that context.
	 */
	if (!genpd_is_irq_safe(genpd) && genpd_is_irq_safe(subdomain)) {
1513
		WARN(1, "Parent %s of subdomain %s must be IRQ safe\n",
1514 1515 1516 1517
				genpd->name, subdomain->name);
		return -EINVAL;
	}

1518 1519 1520 1521
	link = kzalloc(sizeof(*link), GFP_KERNEL);
	if (!link)
		return -ENOMEM;

L
Lina Iyer 已提交
1522 1523
	genpd_lock(subdomain);
	genpd_lock_nested(genpd, SINGLE_DEPTH_NESTING);
1524

1525
	if (!genpd_status_on(genpd) && genpd_status_on(subdomain)) {
1526 1527 1528 1529
		ret = -EINVAL;
		goto out;
	}

1530 1531
	list_for_each_entry(itr, &genpd->master_links, master_node) {
		if (itr->slave == subdomain && itr->master == genpd) {
1532 1533 1534 1535 1536
			ret = -EINVAL;
			goto out;
		}
	}

1537 1538
	link->master = genpd;
	list_add_tail(&link->master_node, &genpd->master_links);
1539 1540
	link->slave = subdomain;
	list_add_tail(&link->slave_node, &subdomain->slave_links);
1541
	if (genpd_status_on(subdomain))
1542
		genpd_sd_counter_inc(genpd);
1543 1544

 out:
L
Lina Iyer 已提交
1545 1546
	genpd_unlock(genpd);
	genpd_unlock(subdomain);
1547 1548
	if (ret)
		kfree(link);
1549 1550
	return ret;
}
1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567

/**
 * pm_genpd_add_subdomain - Add a subdomain to an I/O PM domain.
 * @genpd: Master PM domain to add the subdomain to.
 * @subdomain: Subdomain to be added.
 */
int pm_genpd_add_subdomain(struct generic_pm_domain *genpd,
			   struct generic_pm_domain *subdomain)
{
	int ret;

	mutex_lock(&gpd_list_lock);
	ret = genpd_add_subdomain(genpd, subdomain);
	mutex_unlock(&gpd_list_lock);

	return ret;
}
1568
EXPORT_SYMBOL_GPL(pm_genpd_add_subdomain);
1569 1570 1571 1572

/**
 * pm_genpd_remove_subdomain - Remove a subdomain from an I/O PM domain.
 * @genpd: Master PM domain to remove the subdomain from.
1573
 * @subdomain: Subdomain to be removed.
1574 1575
 */
int pm_genpd_remove_subdomain(struct generic_pm_domain *genpd,
1576
			      struct generic_pm_domain *subdomain)
1577
{
1578
	struct gpd_link *l, *link;
1579 1580
	int ret = -EINVAL;

1581
	if (IS_ERR_OR_NULL(genpd) || IS_ERR_OR_NULL(subdomain))
1582 1583
		return -EINVAL;

L
Lina Iyer 已提交
1584 1585
	genpd_lock(subdomain);
	genpd_lock_nested(genpd, SINGLE_DEPTH_NESTING);
1586

1587
	if (!list_empty(&subdomain->master_links) || subdomain->device_count) {
1588 1589 1590 1591 1592 1593
		pr_warn("%s: unable to remove subdomain %s\n", genpd->name,
			subdomain->name);
		ret = -EBUSY;
		goto out;
	}

1594
	list_for_each_entry_safe(link, l, &genpd->master_links, master_node) {
1595
		if (link->slave != subdomain)
1596 1597
			continue;

1598 1599 1600
		list_del(&link->master_node);
		list_del(&link->slave_node);
		kfree(link);
1601
		if (genpd_status_on(subdomain))
1602 1603 1604 1605 1606 1607
			genpd_sd_counter_dec(genpd);

		ret = 0;
		break;
	}

1608
out:
L
Lina Iyer 已提交
1609 1610
	genpd_unlock(genpd);
	genpd_unlock(subdomain);
1611 1612 1613

	return ret;
}
1614
EXPORT_SYMBOL_GPL(pm_genpd_remove_subdomain);
1615

1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630
static int genpd_set_default_power_state(struct generic_pm_domain *genpd)
{
	struct genpd_power_state *state;

	state = kzalloc(sizeof(*state), GFP_KERNEL);
	if (!state)
		return -ENOMEM;

	genpd->states = state;
	genpd->state_count = 1;
	genpd->free = state;

	return 0;
}

1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641
static void genpd_lock_init(struct generic_pm_domain *genpd)
{
	if (genpd->flags & GENPD_FLAG_IRQ_SAFE) {
		spin_lock_init(&genpd->slock);
		genpd->lock_ops = &genpd_spin_ops;
	} else {
		mutex_init(&genpd->mlock);
		genpd->lock_ops = &genpd_mtx_ops;
	}
}

1642 1643 1644 1645 1646
/**
 * pm_genpd_init - Initialize a generic I/O PM domain object.
 * @genpd: PM domain object to initialize.
 * @gov: PM domain governor to associate with the domain (may be NULL).
 * @is_off: Initial value of the domain's power_is_off field.
1647 1648
 *
 * Returns 0 on successful initialization, else a negative error code.
1649
 */
1650 1651
int pm_genpd_init(struct generic_pm_domain *genpd,
		  struct dev_power_governor *gov, bool is_off)
1652
{
1653 1654
	int ret;

1655
	if (IS_ERR_OR_NULL(genpd))
1656
		return -EINVAL;
1657

1658 1659
	INIT_LIST_HEAD(&genpd->master_links);
	INIT_LIST_HEAD(&genpd->slave_links);
1660
	INIT_LIST_HEAD(&genpd->dev_list);
1661
	genpd_lock_init(genpd);
1662 1663
	genpd->gov = gov;
	INIT_WORK(&genpd->power_off_work, genpd_power_off_work_fn);
1664
	atomic_set(&genpd->sd_count, 0);
1665
	genpd->status = is_off ? GPD_STATE_POWER_OFF : GPD_STATE_ACTIVE;
1666
	genpd->device_count = 0;
1667
	genpd->max_off_time_ns = -1;
1668
	genpd->max_off_time_changed = true;
1669 1670
	genpd->provider = NULL;
	genpd->has_provider = false;
1671
	genpd->accounting_time = ktime_get();
1672 1673
	genpd->domain.ops.runtime_suspend = genpd_runtime_suspend;
	genpd->domain.ops.runtime_resume = genpd_runtime_resume;
1674 1675 1676 1677 1678 1679 1680 1681
	genpd->domain.ops.prepare = genpd_prepare;
	genpd->domain.ops.suspend_noirq = genpd_suspend_noirq;
	genpd->domain.ops.resume_noirq = genpd_resume_noirq;
	genpd->domain.ops.freeze_noirq = genpd_freeze_noirq;
	genpd->domain.ops.thaw_noirq = genpd_thaw_noirq;
	genpd->domain.ops.poweroff_noirq = genpd_poweroff_noirq;
	genpd->domain.ops.restore_noirq = genpd_restore_noirq;
	genpd->domain.ops.complete = genpd_complete;
1682 1683 1684 1685 1686 1687

	if (genpd->flags & GENPD_FLAG_PM_CLK) {
		genpd->dev_ops.stop = pm_clk_suspend;
		genpd->dev_ops.start = pm_clk_resume;
	}

1688 1689 1690 1691
	/* Always-on domains must be powered on at initialization. */
	if (genpd_is_always_on(genpd) && !genpd_status_on(genpd))
		return -EINVAL;

1692
	/* Use only one "off" state if there were no states declared */
1693 1694 1695 1696 1697
	if (genpd->state_count == 0) {
		ret = genpd_set_default_power_state(genpd);
		if (ret)
			return ret;
	}
1698

1699 1700 1701
	mutex_lock(&gpd_list_lock);
	list_add(&genpd->gpd_list_node, &gpd_list);
	mutex_unlock(&gpd_list_lock);
1702 1703

	return 0;
1704
}
1705
EXPORT_SYMBOL_GPL(pm_genpd_init);
1706

1707 1708 1709 1710 1711 1712 1713
static int genpd_remove(struct generic_pm_domain *genpd)
{
	struct gpd_link *l, *link;

	if (IS_ERR_OR_NULL(genpd))
		return -EINVAL;

L
Lina Iyer 已提交
1714
	genpd_lock(genpd);
1715 1716

	if (genpd->has_provider) {
L
Lina Iyer 已提交
1717
		genpd_unlock(genpd);
1718 1719 1720 1721 1722
		pr_err("Provider present, unable to remove %s\n", genpd->name);
		return -EBUSY;
	}

	if (!list_empty(&genpd->master_links) || genpd->device_count) {
L
Lina Iyer 已提交
1723
		genpd_unlock(genpd);
1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734
		pr_err("%s: unable to remove %s\n", __func__, genpd->name);
		return -EBUSY;
	}

	list_for_each_entry_safe(link, l, &genpd->slave_links, slave_node) {
		list_del(&link->master_node);
		list_del(&link->slave_node);
		kfree(link);
	}

	list_del(&genpd->gpd_list_node);
L
Lina Iyer 已提交
1735
	genpd_unlock(genpd);
1736
	cancel_work_sync(&genpd->power_off_work);
1737
	kfree(genpd->free);
1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767
	pr_debug("%s: removed %s\n", __func__, genpd->name);

	return 0;
}

/**
 * pm_genpd_remove - Remove a generic I/O PM domain
 * @genpd: Pointer to PM domain that is to be removed.
 *
 * To remove the PM domain, this function:
 *  - Removes the PM domain as a subdomain to any parent domains,
 *    if it was added.
 *  - Removes the PM domain from the list of registered PM domains.
 *
 * The PM domain will only be removed, if the associated provider has
 * been removed, it is not a parent to any other PM domain and has no
 * devices associated with it.
 */
int pm_genpd_remove(struct generic_pm_domain *genpd)
{
	int ret;

	mutex_lock(&gpd_list_lock);
	ret = genpd_remove(genpd);
	mutex_unlock(&gpd_list_lock);

	return ret;
}
EXPORT_SYMBOL_GPL(pm_genpd_remove);

1768
#ifdef CONFIG_PM_GENERIC_DOMAINS_OF
1769

1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780
/*
 * Device Tree based PM domain providers.
 *
 * The code below implements generic device tree based PM domain providers that
 * bind device tree nodes with generic PM domains registered in the system.
 *
 * Any driver that registers generic PM domains and needs to support binding of
 * devices to these domains is supposed to register a PM domain provider, which
 * maps a PM domain specifier retrieved from the device tree to a PM domain.
 *
 * Two simple mapping functions have been provided for convenience:
1781 1782
 *  - genpd_xlate_simple() for 1:1 device tree node to PM domain mapping.
 *  - genpd_xlate_onecell() for mapping of multiple PM domains per node by
1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806
 *    index.
 */

/**
 * struct of_genpd_provider - PM domain provider registration structure
 * @link: Entry in global list of PM domain providers
 * @node: Pointer to device tree node of PM domain provider
 * @xlate: Provider-specific xlate callback mapping a set of specifier cells
 *         into a PM domain.
 * @data: context pointer to be passed into @xlate callback
 */
struct of_genpd_provider {
	struct list_head link;
	struct device_node *node;
	genpd_xlate_t xlate;
	void *data;
};

/* List of registered PM domain providers. */
static LIST_HEAD(of_genpd_providers);
/* Mutex to protect the list above. */
static DEFINE_MUTEX(of_genpd_mutex);

/**
1807
 * genpd_xlate_simple() - Xlate function for direct node-domain mapping
1808 1809 1810 1811 1812 1813 1814
 * @genpdspec: OF phandle args to map into a PM domain
 * @data: xlate function private data - pointer to struct generic_pm_domain
 *
 * This is a generic xlate function that can be used to model PM domains that
 * have their own device tree nodes. The private data of xlate function needs
 * to be a valid pointer to struct generic_pm_domain.
 */
1815
static struct generic_pm_domain *genpd_xlate_simple(
1816 1817 1818 1819 1820 1821 1822
					struct of_phandle_args *genpdspec,
					void *data)
{
	return data;
}

/**
1823
 * genpd_xlate_onecell() - Xlate function using a single index.
1824 1825 1826 1827 1828 1829 1830 1831
 * @genpdspec: OF phandle args to map into a PM domain
 * @data: xlate function private data - pointer to struct genpd_onecell_data
 *
 * This is a generic xlate function that can be used to model simple PM domain
 * controllers that have one device tree node and provide multiple PM domains.
 * A single cell is used as an index into an array of PM domains specified in
 * the genpd_onecell_data struct when registering the provider.
 */
1832
static struct generic_pm_domain *genpd_xlate_onecell(
1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853
					struct of_phandle_args *genpdspec,
					void *data)
{
	struct genpd_onecell_data *genpd_data = data;
	unsigned int idx = genpdspec->args[0];

	if (genpdspec->args_count != 1)
		return ERR_PTR(-EINVAL);

	if (idx >= genpd_data->num_domains) {
		pr_err("%s: invalid domain index %u\n", __func__, idx);
		return ERR_PTR(-EINVAL);
	}

	if (!genpd_data->domains[idx])
		return ERR_PTR(-ENOENT);

	return genpd_data->domains[idx];
}

/**
1854
 * genpd_add_provider() - Register a PM domain provider for a node
1855 1856 1857 1858
 * @np: Device node pointer associated with the PM domain provider.
 * @xlate: Callback for decoding PM domain from phandle arguments.
 * @data: Context pointer for @xlate callback.
 */
1859 1860
static int genpd_add_provider(struct device_node *np, genpd_xlate_t xlate,
			      void *data)
1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874
{
	struct of_genpd_provider *cp;

	cp = kzalloc(sizeof(*cp), GFP_KERNEL);
	if (!cp)
		return -ENOMEM;

	cp->node = of_node_get(np);
	cp->data = data;
	cp->xlate = xlate;

	mutex_lock(&of_genpd_mutex);
	list_add(&cp->link, &of_genpd_providers);
	mutex_unlock(&of_genpd_mutex);
1875
	pr_debug("Added domain provider from %pOF\n", np);
1876 1877 1878

	return 0;
}
1879 1880 1881 1882 1883 1884 1885 1886 1887

/**
 * of_genpd_add_provider_simple() - Register a simple PM domain provider
 * @np: Device node pointer associated with the PM domain provider.
 * @genpd: Pointer to PM domain associated with the PM domain provider.
 */
int of_genpd_add_provider_simple(struct device_node *np,
				 struct generic_pm_domain *genpd)
{
1888 1889 1890 1891 1892 1893 1894
	int ret = -EINVAL;

	if (!np || !genpd)
		return -EINVAL;

	mutex_lock(&gpd_list_lock);

1895
	if (genpd_present(genpd)) {
1896
		ret = genpd_add_provider(np, genpd_xlate_simple, genpd);
1897 1898 1899 1900
		if (!ret) {
			genpd->provider = &np->fwnode;
			genpd->has_provider = true;
		}
1901 1902
	}

1903 1904 1905
	mutex_unlock(&gpd_list_lock);

	return ret;
1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916
}
EXPORT_SYMBOL_GPL(of_genpd_add_provider_simple);

/**
 * of_genpd_add_provider_onecell() - Register a onecell PM domain provider
 * @np: Device node pointer associated with the PM domain provider.
 * @data: Pointer to the data associated with the PM domain provider.
 */
int of_genpd_add_provider_onecell(struct device_node *np,
				  struct genpd_onecell_data *data)
{
1917
	unsigned int i;
1918
	int ret = -EINVAL;
1919 1920 1921 1922 1923 1924

	if (!np || !data)
		return -EINVAL;

	mutex_lock(&gpd_list_lock);

1925 1926 1927
	if (!data->xlate)
		data->xlate = genpd_xlate_onecell;

1928
	for (i = 0; i < data->num_domains; i++) {
1929 1930
		if (!data->domains[i])
			continue;
1931
		if (!genpd_present(data->domains[i]))
1932 1933 1934 1935
			goto error;

		data->domains[i]->provider = &np->fwnode;
		data->domains[i]->has_provider = true;
1936 1937
	}

1938
	ret = genpd_add_provider(np, data->xlate, data);
1939 1940 1941 1942 1943 1944 1945 1946 1947
	if (ret < 0)
		goto error;

	mutex_unlock(&gpd_list_lock);

	return 0;

error:
	while (i--) {
1948 1949
		if (!data->domains[i])
			continue;
1950 1951 1952
		data->domains[i]->provider = NULL;
		data->domains[i]->has_provider = false;
	}
1953 1954 1955 1956

	mutex_unlock(&gpd_list_lock);

	return ret;
1957 1958
}
EXPORT_SYMBOL_GPL(of_genpd_add_provider_onecell);
1959 1960 1961 1962 1963 1964 1965

/**
 * of_genpd_del_provider() - Remove a previously registered PM domain provider
 * @np: Device node pointer associated with the PM domain provider
 */
void of_genpd_del_provider(struct device_node *np)
{
1966
	struct of_genpd_provider *cp, *tmp;
1967
	struct generic_pm_domain *gpd;
1968

1969
	mutex_lock(&gpd_list_lock);
1970
	mutex_lock(&of_genpd_mutex);
1971
	list_for_each_entry_safe(cp, tmp, &of_genpd_providers, link) {
1972
		if (cp->node == np) {
1973 1974 1975 1976 1977 1978 1979 1980 1981
			/*
			 * For each PM domain associated with the
			 * provider, set the 'has_provider' to false
			 * so that the PM domain can be safely removed.
			 */
			list_for_each_entry(gpd, &gpd_list, gpd_list_node)
				if (gpd->provider == &np->fwnode)
					gpd->has_provider = false;

1982 1983 1984 1985 1986 1987 1988
			list_del(&cp->link);
			of_node_put(cp->node);
			kfree(cp);
			break;
		}
	}
	mutex_unlock(&of_genpd_mutex);
1989
	mutex_unlock(&gpd_list_lock);
1990 1991 1992 1993
}
EXPORT_SYMBOL_GPL(of_genpd_del_provider);

/**
1994
 * genpd_get_from_provider() - Look-up PM domain
1995 1996 1997 1998 1999 2000 2001 2002 2003
 * @genpdspec: OF phandle args to use for look-up
 *
 * Looks for a PM domain provider under the node specified by @genpdspec and if
 * found, uses xlate function of the provider to map phandle args to a PM
 * domain.
 *
 * Returns a valid pointer to struct generic_pm_domain on success or ERR_PTR()
 * on failure.
 */
2004
static struct generic_pm_domain *genpd_get_from_provider(
2005 2006 2007 2008 2009
					struct of_phandle_args *genpdspec)
{
	struct generic_pm_domain *genpd = ERR_PTR(-ENOENT);
	struct of_genpd_provider *provider;

2010 2011 2012
	if (!genpdspec)
		return ERR_PTR(-EINVAL);

2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027
	mutex_lock(&of_genpd_mutex);

	/* Check if we have such a provider in our array */
	list_for_each_entry(provider, &of_genpd_providers, link) {
		if (provider->node == genpdspec->np)
			genpd = provider->xlate(genpdspec, provider->data);
		if (!IS_ERR(genpd))
			break;
	}

	mutex_unlock(&of_genpd_mutex);

	return genpd;
}

2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038
/**
 * of_genpd_add_device() - Add a device to an I/O PM domain
 * @genpdspec: OF phandle args to use for look-up PM domain
 * @dev: Device to be added.
 *
 * Looks-up an I/O PM domain based upon phandle args provided and adds
 * the device to the PM domain. Returns a negative error code on failure.
 */
int of_genpd_add_device(struct of_phandle_args *genpdspec, struct device *dev)
{
	struct generic_pm_domain *genpd;
2039 2040 2041
	int ret;

	mutex_lock(&gpd_list_lock);
2042

2043
	genpd = genpd_get_from_provider(genpdspec);
2044 2045 2046 2047 2048 2049
	if (IS_ERR(genpd)) {
		ret = PTR_ERR(genpd);
		goto out;
	}

	ret = genpd_add_device(genpd, dev, NULL);
2050

2051 2052 2053 2054
out:
	mutex_unlock(&gpd_list_lock);

	return ret;
2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070
}
EXPORT_SYMBOL_GPL(of_genpd_add_device);

/**
 * of_genpd_add_subdomain - Add a subdomain to an I/O PM domain.
 * @parent_spec: OF phandle args to use for parent PM domain look-up
 * @subdomain_spec: OF phandle args to use for subdomain look-up
 *
 * Looks-up a parent PM domain and subdomain based upon phandle args
 * provided and adds the subdomain to the parent PM domain. Returns a
 * negative error code on failure.
 */
int of_genpd_add_subdomain(struct of_phandle_args *parent_spec,
			   struct of_phandle_args *subdomain_spec)
{
	struct generic_pm_domain *parent, *subdomain;
2071 2072 2073
	int ret;

	mutex_lock(&gpd_list_lock);
2074

2075
	parent = genpd_get_from_provider(parent_spec);
2076 2077 2078 2079
	if (IS_ERR(parent)) {
		ret = PTR_ERR(parent);
		goto out;
	}
2080

2081
	subdomain = genpd_get_from_provider(subdomain_spec);
2082 2083 2084 2085 2086 2087
	if (IS_ERR(subdomain)) {
		ret = PTR_ERR(subdomain);
		goto out;
	}

	ret = genpd_add_subdomain(parent, subdomain);
2088

2089 2090 2091 2092
out:
	mutex_unlock(&gpd_list_lock);

	return ret;
2093 2094 2095
}
EXPORT_SYMBOL_GPL(of_genpd_add_subdomain);

2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110
/**
 * of_genpd_remove_last - Remove the last PM domain registered for a provider
 * @provider: Pointer to device structure associated with provider
 *
 * Find the last PM domain that was added by a particular provider and
 * remove this PM domain from the list of PM domains. The provider is
 * identified by the 'provider' device structure that is passed. The PM
 * domain will only be removed, if the provider associated with domain
 * has been removed.
 *
 * Returns a valid pointer to struct generic_pm_domain on success or
 * ERR_PTR() on failure.
 */
struct generic_pm_domain *of_genpd_remove_last(struct device_node *np)
{
2111
	struct generic_pm_domain *gpd, *tmp, *genpd = ERR_PTR(-ENOENT);
2112 2113 2114 2115 2116 2117
	int ret;

	if (IS_ERR_OR_NULL(np))
		return ERR_PTR(-EINVAL);

	mutex_lock(&gpd_list_lock);
2118
	list_for_each_entry_safe(gpd, tmp, &gpd_list, gpd_list_node) {
2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130
		if (gpd->provider == &np->fwnode) {
			ret = genpd_remove(gpd);
			genpd = ret ? ERR_PTR(ret) : gpd;
			break;
		}
	}
	mutex_unlock(&gpd_list_lock);

	return genpd;
}
EXPORT_SYMBOL_GPL(of_genpd_remove_last);

2131 2132
/**
 * genpd_dev_pm_detach - Detach a device from its PM domain.
2133
 * @dev: Device to detach.
2134 2135 2136 2137 2138 2139 2140
 * @power_off: Currently not used
 *
 * Try to locate a corresponding generic PM domain, which the device was
 * attached to previously. If such is found, the device is detached from it.
 */
static void genpd_dev_pm_detach(struct device *dev, bool power_off)
{
2141
	struct generic_pm_domain *pd;
2142
	unsigned int i;
2143 2144
	int ret = 0;

2145 2146
	pd = dev_to_genpd(dev);
	if (IS_ERR(pd))
2147 2148 2149 2150
		return;

	dev_dbg(dev, "removing from PM domain %s\n", pd->name);

2151
	for (i = 1; i < GENPD_RETRY_MAX_MS; i <<= 1) {
2152
		ret = genpd_remove_device(pd, dev);
2153 2154
		if (ret != -EAGAIN)
			break;
2155 2156

		mdelay(i);
2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169
		cond_resched();
	}

	if (ret < 0) {
		dev_err(dev, "failed to remove from PM domain %s: %d",
			pd->name, ret);
		return;
	}

	/* Check if PM domain can be powered off after removing this device. */
	genpd_queue_power_off_work(pd);
}

2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180
static void genpd_dev_pm_sync(struct device *dev)
{
	struct generic_pm_domain *pd;

	pd = dev_to_genpd(dev);
	if (IS_ERR(pd))
		return;

	genpd_queue_power_off_work(pd);
}

2181 2182 2183 2184 2185 2186 2187 2188 2189 2190
/**
 * genpd_dev_pm_attach - Attach a device to its PM domain using DT.
 * @dev: Device to attach.
 *
 * Parse device's OF node to find a PM domain specifier. If such is found,
 * attaches the device to retrieved pm_domain ops.
 *
 * Both generic and legacy Samsung-specific DT bindings are supported to keep
 * backwards compatibility with existing DTBs.
 *
2191 2192 2193 2194
 * Returns 0 on successfully attached PM domain or negative error code. Note
 * that if a power-domain exists for the device, but it cannot be found or
 * turned on, then return -EPROBE_DEFER to ensure that the device is not
 * probed and to re-try again later.
2195 2196 2197 2198 2199
 */
int genpd_dev_pm_attach(struct device *dev)
{
	struct of_phandle_args pd_args;
	struct generic_pm_domain *pd;
2200
	unsigned int i;
2201 2202 2203 2204 2205 2206 2207 2208 2209 2210
	int ret;

	if (!dev->of_node)
		return -ENODEV;

	if (dev->pm_domain)
		return -EEXIST;

	ret = of_parse_phandle_with_args(dev->of_node, "power-domains",
					"#power-domain-cells", 0, &pd_args);
2211 2212
	if (ret < 0)
		return ret;
2213

2214
	mutex_lock(&gpd_list_lock);
2215
	pd = genpd_get_from_provider(&pd_args);
2216
	of_node_put(pd_args.np);
2217
	if (IS_ERR(pd)) {
2218
		mutex_unlock(&gpd_list_lock);
2219 2220
		dev_dbg(dev, "%s() failed to find PM domain: %ld\n",
			__func__, PTR_ERR(pd));
2221
		return -EPROBE_DEFER;
2222 2223 2224 2225
	}

	dev_dbg(dev, "adding to PM domain %s\n", pd->name);

2226
	for (i = 1; i < GENPD_RETRY_MAX_MS; i <<= 1) {
2227
		ret = genpd_add_device(pd, dev, NULL);
2228 2229
		if (ret != -EAGAIN)
			break;
2230 2231

		mdelay(i);
2232 2233
		cond_resched();
	}
2234
	mutex_unlock(&gpd_list_lock);
2235 2236

	if (ret < 0) {
2237 2238 2239
		if (ret != -EPROBE_DEFER)
			dev_err(dev, "failed to add to PM domain %s: %d",
				pd->name, ret);
2240
		goto out;
2241 2242 2243
	}

	dev->pm_domain->detach = genpd_dev_pm_detach;
2244
	dev->pm_domain->sync = genpd_dev_pm_sync;
2245

L
Lina Iyer 已提交
2246
	genpd_lock(pd);
2247
	ret = genpd_power_on(pd, 0);
L
Lina Iyer 已提交
2248
	genpd_unlock(pd);
2249 2250
out:
	return ret ? -EPROBE_DEFER : 0;
2251 2252
}
EXPORT_SYMBOL_GPL(genpd_dev_pm_attach);
2253 2254

static const struct of_device_id idle_state_match[] = {
2255
	{ .compatible = "domain-idle-state", },
2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268
	{ }
};

static int genpd_parse_state(struct genpd_power_state *genpd_state,
				    struct device_node *state_node)
{
	int err;
	u32 residency;
	u32 entry_latency, exit_latency;

	err = of_property_read_u32(state_node, "entry-latency-us",
						&entry_latency);
	if (err) {
2269 2270
		pr_debug(" * %pOF missing entry-latency-us property\n",
						state_node);
2271 2272 2273 2274 2275 2276
		return -EINVAL;
	}

	err = of_property_read_u32(state_node, "exit-latency-us",
						&exit_latency);
	if (err) {
2277 2278
		pr_debug(" * %pOF missing exit-latency-us property\n",
						state_node);
2279 2280 2281 2282 2283 2284 2285 2286 2287
		return -EINVAL;
	}

	err = of_property_read_u32(state_node, "min-residency-us", &residency);
	if (!err)
		genpd_state->residency_ns = 1000 * residency;

	genpd_state->power_on_latency_ns = 1000 * exit_latency;
	genpd_state->power_off_latency_ns = 1000 * entry_latency;
2288
	genpd_state->fwnode = &state_node->fwnode;
2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312

	return 0;
}

/**
 * of_genpd_parse_idle_states: Return array of idle states for the genpd.
 *
 * @dn: The genpd device node
 * @states: The pointer to which the state array will be saved.
 * @n: The count of elements in the array returned from this function.
 *
 * Returns the device states parsed from the OF node. The memory for the states
 * is allocated by this function and is the responsibility of the caller to
 * free the memory after use.
 */
int of_genpd_parse_idle_states(struct device_node *dn,
			struct genpd_power_state **states, int *n)
{
	struct genpd_power_state *st;
	struct device_node *np;
	int i = 0;
	int err, ret;
	int count;
	struct of_phandle_iterator it;
2313
	const struct of_device_id *match_id;
2314 2315

	count = of_count_phandle_with_args(dn, "domain-idle-states", NULL);
2316
	if (count <= 0)
2317 2318 2319 2320 2321 2322 2323 2324 2325
		return -EINVAL;

	st = kcalloc(count, sizeof(*st), GFP_KERNEL);
	if (!st)
		return -ENOMEM;

	/* Loop over the phandles until all the requested entry is found */
	of_for_each_phandle(&it, err, dn, "domain-idle-states", NULL, 0) {
		np = it.node;
2326 2327 2328
		match_id = of_match_node(idle_state_match, np);
		if (!match_id)
			continue;
2329 2330 2331
		ret = genpd_parse_state(&st[i++], np);
		if (ret) {
			pr_err
2332 2333
			("Parsing idle state node %pOF failed with err %d\n",
							np, ret);
2334 2335 2336 2337 2338 2339
			of_node_put(np);
			kfree(st);
			return ret;
		}
	}

2340 2341 2342 2343 2344
	*n = i;
	if (!i)
		kfree(st);
	else
		*states = st;
2345 2346 2347 2348 2349

	return 0;
}
EXPORT_SYMBOL_GPL(of_genpd_parse_idle_states);

2350
#endif /* CONFIG_PM_GENERIC_DOMAINS_OF */
2351 2352 2353 2354


/***        debugfs support        ***/

2355
#ifdef CONFIG_DEBUG_FS
2356 2357 2358 2359 2360 2361
#include <linux/pm.h>
#include <linux/device.h>
#include <linux/debugfs.h>
#include <linux/seq_file.h>
#include <linux/init.h>
#include <linux/kobject.h>
2362
static struct dentry *genpd_debugfs_dir;
2363 2364 2365

/*
 * TODO: This function is a slightly modified version of rtpm_status_show
2366
 * from sysfs.c, so generalize it.
2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389
 */
static void rtpm_status_str(struct seq_file *s, struct device *dev)
{
	static const char * const status_lookup[] = {
		[RPM_ACTIVE] = "active",
		[RPM_RESUMING] = "resuming",
		[RPM_SUSPENDED] = "suspended",
		[RPM_SUSPENDING] = "suspending"
	};
	const char *p = "";

	if (dev->power.runtime_error)
		p = "error";
	else if (dev->power.disable_depth)
		p = "unsupported";
	else if (dev->power.runtime_status < ARRAY_SIZE(status_lookup))
		p = status_lookup[dev->power.runtime_status];
	else
		WARN_ON(1);

	seq_puts(s, p);
}

2390 2391
static int genpd_summary_one(struct seq_file *s,
			struct generic_pm_domain *genpd)
2392 2393 2394 2395 2396 2397 2398 2399
{
	static const char * const status_lookup[] = {
		[GPD_STATE_ACTIVE] = "on",
		[GPD_STATE_POWER_OFF] = "off"
	};
	struct pm_domain_data *pm_data;
	const char *kobj_path;
	struct gpd_link *link;
2400
	char state[16];
2401 2402
	int ret;

L
Lina Iyer 已提交
2403
	ret = genpd_lock_interruptible(genpd);
2404 2405 2406
	if (ret)
		return -ERESTARTSYS;

2407
	if (WARN_ON(genpd->status >= ARRAY_SIZE(status_lookup)))
2408
		goto exit;
2409
	if (!genpd_status_on(genpd))
2410
		snprintf(state, sizeof(state), "%s-%u",
2411
			 status_lookup[genpd->status], genpd->state_idx);
2412
	else
2413 2414 2415
		snprintf(state, sizeof(state), "%s",
			 status_lookup[genpd->status]);
	seq_printf(s, "%-30s  %-15s ", genpd->name, state);
2416 2417 2418 2419

	/*
	 * Modifications on the list require holding locks on both
	 * master and slave, so we are safe.
2420
	 * Also genpd->name is immutable.
2421
	 */
2422
	list_for_each_entry(link, &genpd->master_links, master_node) {
2423
		seq_printf(s, "%s", link->slave->name);
2424
		if (!list_is_last(&link->master_node, &genpd->master_links))
2425 2426 2427
			seq_puts(s, ", ");
	}

2428
	list_for_each_entry(pm_data, &genpd->dev_list, list_node) {
2429 2430 2431
		kobj_path = kobject_get_path(&pm_data->dev->kobj,
				genpd_is_irq_safe(genpd) ?
				GFP_ATOMIC : GFP_KERNEL);
2432 2433 2434 2435 2436 2437 2438 2439 2440 2441
		if (kobj_path == NULL)
			continue;

		seq_printf(s, "\n    %-50s  ", kobj_path);
		rtpm_status_str(s, pm_data->dev);
		kfree(kobj_path);
	}

	seq_puts(s, "\n");
exit:
L
Lina Iyer 已提交
2442
	genpd_unlock(genpd);
2443 2444 2445 2446

	return 0;
}

2447
static int genpd_summary_show(struct seq_file *s, void *data)
2448
{
2449
	struct generic_pm_domain *genpd;
2450 2451
	int ret = 0;

2452 2453
	seq_puts(s, "domain                          status          slaves\n");
	seq_puts(s, "    /device                                             runtime status\n");
2454 2455 2456 2457 2458 2459
	seq_puts(s, "----------------------------------------------------------------------\n");

	ret = mutex_lock_interruptible(&gpd_list_lock);
	if (ret)
		return -ERESTARTSYS;

2460
	list_for_each_entry(genpd, &gpd_list, gpd_list_node) {
2461
		ret = genpd_summary_one(s, genpd);
2462 2463 2464 2465 2466 2467 2468 2469
		if (ret)
			break;
	}
	mutex_unlock(&gpd_list_lock);

	return ret;
}

2470
static int genpd_status_show(struct seq_file *s, void *data)
2471
{
2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494
	static const char * const status_lookup[] = {
		[GPD_STATE_ACTIVE] = "on",
		[GPD_STATE_POWER_OFF] = "off"
	};

	struct generic_pm_domain *genpd = s->private;
	int ret = 0;

	ret = genpd_lock_interruptible(genpd);
	if (ret)
		return -ERESTARTSYS;

	if (WARN_ON_ONCE(genpd->status >= ARRAY_SIZE(status_lookup)))
		goto exit;

	if (genpd->status == GPD_STATE_POWER_OFF)
		seq_printf(s, "%s-%u\n", status_lookup[genpd->status],
			genpd->state_idx);
	else
		seq_printf(s, "%s\n", status_lookup[genpd->status]);
exit:
	genpd_unlock(genpd);
	return ret;
2495 2496
}

2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645
static int genpd_sub_domains_show(struct seq_file *s, void *data)
{
	struct generic_pm_domain *genpd = s->private;
	struct gpd_link *link;
	int ret = 0;

	ret = genpd_lock_interruptible(genpd);
	if (ret)
		return -ERESTARTSYS;

	list_for_each_entry(link, &genpd->master_links, master_node)
		seq_printf(s, "%s\n", link->slave->name);

	genpd_unlock(genpd);
	return ret;
}

static int genpd_idle_states_show(struct seq_file *s, void *data)
{
	struct generic_pm_domain *genpd = s->private;
	unsigned int i;
	int ret = 0;

	ret = genpd_lock_interruptible(genpd);
	if (ret)
		return -ERESTARTSYS;

	seq_puts(s, "State          Time Spent(ms)\n");

	for (i = 0; i < genpd->state_count; i++) {
		ktime_t delta = 0;
		s64 msecs;

		if ((genpd->status == GPD_STATE_POWER_OFF) &&
				(genpd->state_idx == i))
			delta = ktime_sub(ktime_get(), genpd->accounting_time);

		msecs = ktime_to_ms(
			ktime_add(genpd->states[i].idle_time, delta));
		seq_printf(s, "S%-13i %lld\n", i, msecs);
	}

	genpd_unlock(genpd);
	return ret;
}

static int genpd_active_time_show(struct seq_file *s, void *data)
{
	struct generic_pm_domain *genpd = s->private;
	ktime_t delta = 0;
	int ret = 0;

	ret = genpd_lock_interruptible(genpd);
	if (ret)
		return -ERESTARTSYS;

	if (genpd->status == GPD_STATE_ACTIVE)
		delta = ktime_sub(ktime_get(), genpd->accounting_time);

	seq_printf(s, "%lld ms\n", ktime_to_ms(
				ktime_add(genpd->on_time, delta)));

	genpd_unlock(genpd);
	return ret;
}

static int genpd_total_idle_time_show(struct seq_file *s, void *data)
{
	struct generic_pm_domain *genpd = s->private;
	ktime_t delta = 0, total = 0;
	unsigned int i;
	int ret = 0;

	ret = genpd_lock_interruptible(genpd);
	if (ret)
		return -ERESTARTSYS;

	for (i = 0; i < genpd->state_count; i++) {

		if ((genpd->status == GPD_STATE_POWER_OFF) &&
				(genpd->state_idx == i))
			delta = ktime_sub(ktime_get(), genpd->accounting_time);

		total = ktime_add(total, genpd->states[i].idle_time);
	}
	total = ktime_add(total, delta);

	seq_printf(s, "%lld ms\n", ktime_to_ms(total));

	genpd_unlock(genpd);
	return ret;
}


static int genpd_devices_show(struct seq_file *s, void *data)
{
	struct generic_pm_domain *genpd = s->private;
	struct pm_domain_data *pm_data;
	const char *kobj_path;
	int ret = 0;

	ret = genpd_lock_interruptible(genpd);
	if (ret)
		return -ERESTARTSYS;

	list_for_each_entry(pm_data, &genpd->dev_list, list_node) {
		kobj_path = kobject_get_path(&pm_data->dev->kobj,
				genpd_is_irq_safe(genpd) ?
				GFP_ATOMIC : GFP_KERNEL);
		if (kobj_path == NULL)
			continue;

		seq_printf(s, "%s\n", kobj_path);
		kfree(kobj_path);
	}

	genpd_unlock(genpd);
	return ret;
}

#define define_genpd_open_function(name) \
static int genpd_##name##_open(struct inode *inode, struct file *file) \
{ \
	return single_open(file, genpd_##name##_show, inode->i_private); \
}

define_genpd_open_function(summary);
define_genpd_open_function(status);
define_genpd_open_function(sub_domains);
define_genpd_open_function(idle_states);
define_genpd_open_function(active_time);
define_genpd_open_function(total_idle_time);
define_genpd_open_function(devices);

#define define_genpd_debugfs_fops(name) \
static const struct file_operations genpd_##name##_fops = { \
	.open = genpd_##name##_open, \
	.read = seq_read, \
	.llseek = seq_lseek, \
	.release = single_release, \
}

define_genpd_debugfs_fops(summary);
define_genpd_debugfs_fops(status);
define_genpd_debugfs_fops(sub_domains);
define_genpd_debugfs_fops(idle_states);
define_genpd_debugfs_fops(active_time);
define_genpd_debugfs_fops(total_idle_time);
define_genpd_debugfs_fops(devices);
2646

2647
static int __init genpd_debug_init(void)
2648 2649
{
	struct dentry *d;
2650
	struct generic_pm_domain *genpd;
2651

2652
	genpd_debugfs_dir = debugfs_create_dir("pm_genpd", NULL);
2653

2654
	if (!genpd_debugfs_dir)
2655 2656 2657
		return -ENOMEM;

	d = debugfs_create_file("pm_genpd_summary", S_IRUGO,
2658
			genpd_debugfs_dir, NULL, &genpd_summary_fops);
2659 2660 2661
	if (!d)
		return -ENOMEM;

2662
	list_for_each_entry(genpd, &gpd_list, gpd_list_node) {
2663
		d = debugfs_create_dir(genpd->name, genpd_debugfs_dir);
2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680
		if (!d)
			return -ENOMEM;

		debugfs_create_file("current_state", 0444,
				d, genpd, &genpd_status_fops);
		debugfs_create_file("sub_domains", 0444,
				d, genpd, &genpd_sub_domains_fops);
		debugfs_create_file("idle_states", 0444,
				d, genpd, &genpd_idle_states_fops);
		debugfs_create_file("active_time", 0444,
				d, genpd, &genpd_active_time_fops);
		debugfs_create_file("total_idle_time", 0444,
				d, genpd, &genpd_total_idle_time_fops);
		debugfs_create_file("devices", 0444,
				d, genpd, &genpd_devices_fops);
	}

2681 2682
	return 0;
}
2683
late_initcall(genpd_debug_init);
2684

2685
static void __exit genpd_debug_exit(void)
2686
{
2687
	debugfs_remove_recursive(genpd_debugfs_dir);
2688
}
2689
__exitcall(genpd_debug_exit);
2690
#endif /* CONFIG_DEBUG_FS */