Linux Audio

Check our new training course

Loading...
Note: File does not exist in v5.4.
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * Copyright (C) 2024 Linaro Ltd.
   4 */
   5
   6#include <linux/bug.h>
   7#include <linux/cleanup.h>
   8#include <linux/debugfs.h>
   9#include <linux/device.h>
  10#include <linux/err.h>
  11#include <linux/export.h>
  12#include <linux/idr.h>
  13#include <linux/kernel.h>
  14#include <linux/kref.h>
  15#include <linux/list.h>
  16#include <linux/lockdep.h>
  17#include <linux/module.h>
  18#include <linux/mutex.h>
  19#include <linux/property.h>
  20#include <linux/pwrseq/consumer.h>
  21#include <linux/pwrseq/provider.h>
  22#include <linux/radix-tree.h>
  23#include <linux/rwsem.h>
  24#include <linux/slab.h>
  25
  26/*
  27 * Power-sequencing framework for linux.
  28 *
  29 * This subsystem allows power sequence providers to register a set of targets
  30 * that consumers may request and power-up/down.
  31 *
  32 * Glossary:
  33 *
  34 * Unit - a unit is a discreet chunk of a power sequence. For instance one unit
  35 * may enable a set of regulators, another may enable a specific GPIO. Units
  36 * can define dependencies in the form of other units that must be enabled
  37 * before it itself can be.
  38 *
  39 * Target - a target is a set of units (composed of the "final" unit and its
  40 * dependencies) that a consumer selects by its name when requesting a handle
  41 * to the power sequencer. Via the dependency system, multiple targets may
  42 * share the same parts of a power sequence but ignore parts that are
  43 * irrelevant.
  44 *
  45 * Descriptor - a handle passed by the pwrseq core to every consumer that
  46 * serves as the entry point to the provider layer. It ensures coherence
  47 * between different users and keeps reference counting consistent.
  48 *
  49 * Each provider must define a .match() callback whose role is to determine
  50 * whether a potential consumer is in fact associated with this sequencer.
  51 * This allows creating abstraction layers on top of regular device-tree
  52 * resources like regulators, clocks and other nodes connected to the consumer
  53 * via phandle.
  54 */
  55
  56static DEFINE_IDA(pwrseq_ida);
  57
  58/*
  59 * Protects the device list on the pwrseq bus from concurrent modifications
  60 * but allows simultaneous read-only access.
  61 */
  62static DECLARE_RWSEM(pwrseq_sem);
  63
  64/**
  65 * struct pwrseq_unit - Private power-sequence unit data.
  66 * @ref: Reference count for this object. When it goes to 0, the object is
  67 *       destroyed.
  68 * @name: Name of this target.
  69 * @list: Link to siblings on the list of all units of a single sequencer.
  70 * @deps: List of units on which this unit depends.
  71 * @enable: Callback running the part of the power-on sequence provided by
  72 *          this unit.
  73 * @disable: Callback running the part of the power-off sequence provided
  74 *           by this unit.
  75 * @enable_count: Current number of users that enabled this unit. May be the
  76 *                consumer of the power sequencer or other units that depend
  77 *                on this one.
  78 */
  79struct pwrseq_unit {
  80	struct kref ref;
  81	const char *name;
  82	struct list_head list;
  83	struct list_head deps;
  84	pwrseq_power_state_func enable;
  85	pwrseq_power_state_func disable;
  86	unsigned int enable_count;
  87};
  88
  89static struct pwrseq_unit *pwrseq_unit_new(const struct pwrseq_unit_data *data)
  90{
  91	struct pwrseq_unit *unit;
  92
  93	unit = kzalloc(sizeof(*unit), GFP_KERNEL);
  94	if (!unit)
  95		return NULL;
  96
  97	unit->name = kstrdup_const(data->name, GFP_KERNEL);
  98	if (!unit->name) {
  99		kfree(unit);
 100		return NULL;
 101	}
 102
 103	kref_init(&unit->ref);
 104	INIT_LIST_HEAD(&unit->deps);
 105	unit->enable = data->enable;
 106	unit->disable = data->disable;
 107
 108	return unit;
 109}
 110
 111static struct pwrseq_unit *pwrseq_unit_get(struct pwrseq_unit *unit)
 112{
 113	kref_get(&unit->ref);
 114
 115	return unit;
 116}
 117
 118static void pwrseq_unit_release(struct kref *ref);
 119
 120static void pwrseq_unit_put(struct pwrseq_unit *unit)
 121{
 122	kref_put(&unit->ref, pwrseq_unit_release);
 123}
 124
 125/**
 126 * struct pwrseq_unit_dep - Wrapper around a reference to the unit structure
 127 *                          allowing to keep it on multiple dependency lists
 128 *                          in different units.
 129 * @list: Siblings on the list.
 130 * @unit: Address of the referenced unit.
 131 */
 132struct pwrseq_unit_dep {
 133	struct list_head list;
 134	struct pwrseq_unit *unit;
 135};
 136
 137static struct pwrseq_unit_dep *pwrseq_unit_dep_new(struct pwrseq_unit *unit)
 138{
 139	struct pwrseq_unit_dep *dep;
 140
 141	dep = kzalloc(sizeof(*dep), GFP_KERNEL);
 142	if (!dep)
 143		return NULL;
 144
 145	dep->unit = unit;
 146
 147	return dep;
 148}
 149
 150static void pwrseq_unit_dep_free(struct pwrseq_unit_dep *ref)
 151{
 152	pwrseq_unit_put(ref->unit);
 153	kfree(ref);
 154}
 155
 156static void pwrseq_unit_free_deps(struct list_head *list)
 157{
 158	struct pwrseq_unit_dep *dep, *next;
 159
 160	list_for_each_entry_safe(dep, next, list, list) {
 161		list_del(&dep->list);
 162		pwrseq_unit_dep_free(dep);
 163	}
 164}
 165
 166static void pwrseq_unit_release(struct kref *ref)
 167{
 168	struct pwrseq_unit *unit = container_of(ref, struct pwrseq_unit, ref);
 169
 170	pwrseq_unit_free_deps(&unit->deps);
 171	list_del(&unit->list);
 172	kfree_const(unit->name);
 173	kfree(unit);
 174}
 175
 176/**
 177 * struct pwrseq_target - Private power-sequence target data.
 178 * @list: Siblings on the list of all targets exposed by a power sequencer.
 179 * @name: Name of the target.
 180 * @unit: Final unit for this target.
 181 * @post_enable: Callback run after the target unit has been enabled, *after*
 182 *               the state lock has been released. It's useful for implementing
 183 *               boot-up delays without blocking other users from powering up
 184 *               using the same power sequencer.
 185 */
 186struct pwrseq_target {
 187	struct list_head list;
 188	const char *name;
 189	struct pwrseq_unit *unit;
 190	pwrseq_power_state_func post_enable;
 191};
 192
 193static struct pwrseq_target *
 194pwrseq_target_new(const struct pwrseq_target_data *data)
 195{
 196	struct pwrseq_target *target;
 197
 198	target = kzalloc(sizeof(*target), GFP_KERNEL);
 199	if (!target)
 200		return NULL;
 201
 202	target->name = kstrdup_const(data->name, GFP_KERNEL);
 203	if (!target->name) {
 204		kfree(target);
 205		return NULL;
 206	}
 207
 208	target->post_enable = data->post_enable;
 209
 210	return target;
 211}
 212
 213static void pwrseq_target_free(struct pwrseq_target *target)
 214{
 215	if (!IS_ERR_OR_NULL(target->unit))
 216		pwrseq_unit_put(target->unit);
 217	kfree_const(target->name);
 218	kfree(target);
 219}
 220
 221/**
 222 * struct pwrseq_device - Private power sequencing data.
 223 * @dev: Device struct associated with this sequencer.
 224 * @id: Device ID.
 225 * @owner: Prevents removal of active power sequencing providers.
 226 * @rw_lock: Protects the device from being unregistered while in use.
 227 * @state_lock: Prevents multiple users running the power sequence at the same
 228 *              time.
 229 * @match: Power sequencer matching callback.
 230 * @targets: List of targets exposed by this sequencer.
 231 * @units: List of all units supported by this sequencer.
 232 */
 233struct pwrseq_device {
 234	struct device dev;
 235	int id;
 236	struct module *owner;
 237	struct rw_semaphore rw_lock;
 238	struct mutex state_lock;
 239	pwrseq_match_func match;
 240	struct list_head targets;
 241	struct list_head units;
 242};
 243
 244static struct pwrseq_device *to_pwrseq_device(struct device *dev)
 245{
 246	return container_of(dev, struct pwrseq_device, dev);
 247}
 248
 249static struct pwrseq_device *pwrseq_device_get(struct pwrseq_device *pwrseq)
 250{
 251	get_device(&pwrseq->dev);
 252
 253	return pwrseq;
 254}
 255
 256static void pwrseq_device_put(struct pwrseq_device *pwrseq)
 257{
 258	put_device(&pwrseq->dev);
 259}
 260
 261/**
 262 * struct pwrseq_desc - Wraps access to the pwrseq_device and ensures that one
 263 *                      user cannot break the reference counting for others.
 264 * @pwrseq: Reference to the power sequencing device.
 265 * @target: Reference to the target this descriptor allows to control.
 266 * @powered_on: Power state set by the holder of the descriptor (not necessarily
 267 * corresponding to the actual power state of the device).
 268 */
 269struct pwrseq_desc {
 270	struct pwrseq_device *pwrseq;
 271	struct pwrseq_target *target;
 272	bool powered_on;
 273};
 274
 275static const struct bus_type pwrseq_bus = {
 276	.name = "pwrseq",
 277};
 278
 279static void pwrseq_release(struct device *dev)
 280{
 281	struct pwrseq_device *pwrseq = to_pwrseq_device(dev);
 282	struct pwrseq_target *target, *pos;
 283
 284	list_for_each_entry_safe(target, pos, &pwrseq->targets, list) {
 285		list_del(&target->list);
 286		pwrseq_target_free(target);
 287	}
 288
 289	mutex_destroy(&pwrseq->state_lock);
 290	ida_free(&pwrseq_ida, pwrseq->id);
 291	kfree(pwrseq);
 292}
 293
 294static const struct device_type pwrseq_device_type = {
 295	.name = "power_sequencer",
 296	.release = pwrseq_release,
 297};
 298
 299static int pwrseq_check_unit_deps(const struct pwrseq_unit_data *data,
 300				  struct radix_tree_root *visited_units)
 301{
 302	const struct pwrseq_unit_data *tmp, **cur;
 303	int ret;
 304
 305	ret = radix_tree_insert(visited_units, (unsigned long)data,
 306				(void *)data);
 307	if (ret)
 308		return ret;
 309
 310	for (cur = data->deps; cur && *cur; cur++) {
 311		tmp = radix_tree_lookup(visited_units, (unsigned long)*cur);
 312		if (tmp) {
 313			WARN(1, "Circular dependency in power sequencing flow detected!\n");
 314			return -EINVAL;
 315		}
 316
 317		ret = pwrseq_check_unit_deps(*cur, visited_units);
 318		if (ret)
 319			return ret;
 320	}
 321
 322	return 0;
 323}
 324
 325static int pwrseq_check_target_deps(const struct pwrseq_target_data *data)
 326{
 327	struct radix_tree_root visited_units;
 328	struct radix_tree_iter iter;
 329	void __rcu **slot;
 330	int ret;
 331
 332	if (!data->unit)
 333		return -EINVAL;
 334
 335	INIT_RADIX_TREE(&visited_units, GFP_KERNEL);
 336	ret = pwrseq_check_unit_deps(data->unit, &visited_units);
 337	radix_tree_for_each_slot(slot, &visited_units, &iter, 0)
 338		radix_tree_delete(&visited_units, iter.index);
 339
 340	return ret;
 341}
 342
 343static int pwrseq_unit_setup_deps(const struct pwrseq_unit_data **data,
 344				  struct list_head *dep_list,
 345				  struct list_head *unit_list,
 346				  struct radix_tree_root *processed_units);
 347
 348static struct pwrseq_unit *
 349pwrseq_unit_setup(const struct pwrseq_unit_data *data,
 350		  struct list_head *unit_list,
 351		  struct radix_tree_root *processed_units)
 352{
 353	struct pwrseq_unit *unit;
 354	int ret;
 355
 356	unit = radix_tree_lookup(processed_units, (unsigned long)data);
 357	if (unit)
 358		return pwrseq_unit_get(unit);
 359
 360	unit = pwrseq_unit_new(data);
 361	if (!unit)
 362		return ERR_PTR(-ENOMEM);
 363
 364	if (data->deps) {
 365		ret = pwrseq_unit_setup_deps(data->deps, &unit->deps,
 366					     unit_list, processed_units);
 367		if (ret) {
 368			pwrseq_unit_put(unit);
 369			return ERR_PTR(ret);
 370		}
 371	}
 372
 373	ret = radix_tree_insert(processed_units, (unsigned long)data, unit);
 374	if (ret) {
 375		pwrseq_unit_put(unit);
 376		return ERR_PTR(ret);
 377	}
 378
 379	list_add_tail(&unit->list, unit_list);
 380
 381	return unit;
 382}
 383
 384static int pwrseq_unit_setup_deps(const struct pwrseq_unit_data **data,
 385				  struct list_head *dep_list,
 386				  struct list_head *unit_list,
 387				  struct radix_tree_root *processed_units)
 388{
 389	const struct pwrseq_unit_data *pos;
 390	struct pwrseq_unit_dep *dep;
 391	struct pwrseq_unit *unit;
 392	int i;
 393
 394	for (i = 0; data[i]; i++) {
 395		pos = data[i];
 396
 397		unit = pwrseq_unit_setup(pos, unit_list, processed_units);
 398		if (IS_ERR(unit))
 399			return PTR_ERR(unit);
 400
 401		dep = pwrseq_unit_dep_new(unit);
 402		if (!dep) {
 403			pwrseq_unit_put(unit);
 404			return -ENOMEM;
 405		}
 406
 407		list_add_tail(&dep->list, dep_list);
 408	}
 409
 410	return 0;
 411}
 412
 413static int pwrseq_do_setup_targets(const struct pwrseq_target_data **data,
 414				   struct pwrseq_device *pwrseq,
 415				   struct radix_tree_root *processed_units)
 416{
 417	const struct pwrseq_target_data *pos;
 418	struct pwrseq_target *target;
 419	int ret, i;
 420
 421	for (i = 0; data[i]; i++) {
 422		pos = data[i];
 423
 424		ret = pwrseq_check_target_deps(pos);
 425		if (ret)
 426			return ret;
 427
 428		target = pwrseq_target_new(pos);
 429		if (!target)
 430			return -ENOMEM;
 431
 432		target->unit = pwrseq_unit_setup(pos->unit, &pwrseq->units,
 433						 processed_units);
 434		if (IS_ERR(target->unit)) {
 435			ret = PTR_ERR(target->unit);
 436			pwrseq_target_free(target);
 437			return ret;
 438		}
 439
 440		list_add_tail(&target->list, &pwrseq->targets);
 441	}
 442
 443	return 0;
 444}
 445
 446static int pwrseq_setup_targets(const struct pwrseq_target_data **targets,
 447				struct pwrseq_device *pwrseq)
 448{
 449	struct radix_tree_root processed_units;
 450	struct radix_tree_iter iter;
 451	void __rcu **slot;
 452	int ret;
 453
 454	INIT_RADIX_TREE(&processed_units, GFP_KERNEL);
 455	ret = pwrseq_do_setup_targets(targets, pwrseq, &processed_units);
 456	radix_tree_for_each_slot(slot, &processed_units, &iter, 0)
 457		radix_tree_delete(&processed_units, iter.index);
 458
 459	return ret;
 460}
 461
 462/**
 463 * pwrseq_device_register() - Register a new power sequencer.
 464 * @config: Configuration of the new power sequencing device.
 465 *
 466 * The config structure is only used during the call and can be freed after
 467 * the function returns. The config structure *must* have the parent device
 468 * as well as the match() callback and at least one target set.
 469 *
 470 * Returns:
 471 * Returns the address of the new pwrseq device or ERR_PTR() on failure.
 472 */
 473struct pwrseq_device *
 474pwrseq_device_register(const struct pwrseq_config *config)
 475{
 476	struct pwrseq_device *pwrseq;
 477	int ret, id;
 478
 479	if (!config->parent || !config->match || !config->targets ||
 480	    !config->targets[0])
 481		return ERR_PTR(-EINVAL);
 482
 483	pwrseq = kzalloc(sizeof(*pwrseq), GFP_KERNEL);
 484	if (!pwrseq)
 485		return ERR_PTR(-ENOMEM);
 486
 487	pwrseq->dev.type = &pwrseq_device_type;
 488	pwrseq->dev.bus = &pwrseq_bus;
 489	pwrseq->dev.parent = config->parent;
 490	device_set_node(&pwrseq->dev, dev_fwnode(config->parent));
 491	dev_set_drvdata(&pwrseq->dev, config->drvdata);
 492
 493	id = ida_alloc(&pwrseq_ida, GFP_KERNEL);
 494	if (id < 0) {
 495		kfree(pwrseq);
 496		return ERR_PTR(id);
 497	}
 498
 499	pwrseq->id = id;
 500
 501	/*
 502	 * From this point onwards the device's release() callback is
 503	 * responsible for freeing resources.
 504	 */
 505	device_initialize(&pwrseq->dev);
 506
 507	ret = dev_set_name(&pwrseq->dev, "pwrseq.%d", pwrseq->id);
 508	if (ret)
 509		goto err_put_pwrseq;
 510
 511	pwrseq->owner = config->owner ?: THIS_MODULE;
 512	pwrseq->match = config->match;
 513
 514	init_rwsem(&pwrseq->rw_lock);
 515	mutex_init(&pwrseq->state_lock);
 516	INIT_LIST_HEAD(&pwrseq->targets);
 517	INIT_LIST_HEAD(&pwrseq->units);
 518
 519	ret = pwrseq_setup_targets(config->targets, pwrseq);
 520	if (ret)
 521		goto err_put_pwrseq;
 522
 523	scoped_guard(rwsem_write, &pwrseq_sem) {
 524		ret = device_add(&pwrseq->dev);
 525		if (ret)
 526			goto err_put_pwrseq;
 527	}
 528
 529	return pwrseq;
 530
 531err_put_pwrseq:
 532	pwrseq_device_put(pwrseq);
 533	return ERR_PTR(ret);
 534}
 535EXPORT_SYMBOL_GPL(pwrseq_device_register);
 536
 537/**
 538 * pwrseq_device_unregister() - Unregister the power sequencer.
 539 * @pwrseq: Power sequencer to unregister.
 540 */
 541void pwrseq_device_unregister(struct pwrseq_device *pwrseq)
 542{
 543	struct device *dev = &pwrseq->dev;
 544	struct pwrseq_target *target;
 545
 546	scoped_guard(mutex, &pwrseq->state_lock) {
 547		guard(rwsem_write)(&pwrseq->rw_lock);
 548
 549		list_for_each_entry(target, &pwrseq->targets, list)
 550			WARN(target->unit->enable_count,
 551			     "REMOVING POWER SEQUENCER WITH ACTIVE USERS\n");
 552
 553		guard(rwsem_write)(&pwrseq_sem);
 554
 555		device_del(dev);
 556	}
 557
 558	pwrseq_device_put(pwrseq);
 559}
 560EXPORT_SYMBOL_GPL(pwrseq_device_unregister);
 561
 562static void devm_pwrseq_device_unregister(void *data)
 563{
 564	struct pwrseq_device *pwrseq = data;
 565
 566	pwrseq_device_unregister(pwrseq);
 567}
 568
 569/**
 570 * devm_pwrseq_device_register() - Managed variant of pwrseq_device_register().
 571 * @dev: Managing device.
 572 * @config: Configuration of the new power sequencing device.
 573 *
 574 * Returns:
 575 * Returns the address of the new pwrseq device or ERR_PTR() on failure.
 576 */
 577struct pwrseq_device *
 578devm_pwrseq_device_register(struct device *dev,
 579			    const struct pwrseq_config *config)
 580{
 581	struct pwrseq_device *pwrseq;
 582	int ret;
 583
 584	pwrseq = pwrseq_device_register(config);
 585	if (IS_ERR(pwrseq))
 586		return pwrseq;
 587
 588	ret = devm_add_action_or_reset(dev, devm_pwrseq_device_unregister,
 589				       pwrseq);
 590	if (ret)
 591		return ERR_PTR(ret);
 592
 593	return pwrseq;
 594}
 595EXPORT_SYMBOL_GPL(devm_pwrseq_device_register);
 596
 597/**
 598 * pwrseq_device_get_drvdata() - Get the driver private data associated with
 599 *                               this sequencer.
 600 * @pwrseq: Power sequencer object.
 601 *
 602 * Returns:
 603 * Address of the private driver data.
 604 */
 605void *pwrseq_device_get_drvdata(struct pwrseq_device *pwrseq)
 606{
 607	return dev_get_drvdata(&pwrseq->dev);
 608}
 609EXPORT_SYMBOL_GPL(pwrseq_device_get_drvdata);
 610
 611struct pwrseq_match_data {
 612	struct pwrseq_desc *desc;
 613	struct device *dev;
 614	const char *target;
 615};
 616
 617static int pwrseq_match_device(struct device *pwrseq_dev, void *data)
 618{
 619	struct pwrseq_device *pwrseq = to_pwrseq_device(pwrseq_dev);
 620	struct pwrseq_match_data *match_data = data;
 621	struct pwrseq_target *target;
 622	int ret;
 623
 624	lockdep_assert_held_read(&pwrseq_sem);
 625
 626	guard(rwsem_read)(&pwrseq->rw_lock);
 627	if (!device_is_registered(&pwrseq->dev))
 628		return 0;
 629
 630	ret = pwrseq->match(pwrseq, match_data->dev);
 631	if (ret <= 0)
 632		return ret;
 633
 634	/* We got the matching device, let's find the right target. */
 635	list_for_each_entry(target, &pwrseq->targets, list) {
 636		if (strcmp(target->name, match_data->target))
 637			continue;
 638
 639		match_data->desc->target = target;
 640	}
 641
 642	/*
 643	 * This device does not have this target. No point in deferring as it
 644	 * will not get a new target dynamically later.
 645	 */
 646	if (!match_data->desc->target)
 647		return -ENOENT;
 648
 649	if (!try_module_get(pwrseq->owner))
 650		return -EPROBE_DEFER;
 651
 652	match_data->desc->pwrseq = pwrseq_device_get(pwrseq);
 653
 654	return 1;
 655}
 656
 657/**
 658 * pwrseq_get() - Get the power sequencer associated with this device.
 659 * @dev: Device for which to get the sequencer.
 660 * @target: Name of the target exposed by the sequencer this device wants to
 661 *          reach.
 662 *
 663 * Returns:
 664 * New power sequencer descriptor for use by the consumer driver or ERR_PTR()
 665 * on failure.
 666 */
 667struct pwrseq_desc *pwrseq_get(struct device *dev, const char *target)
 668{
 669	struct pwrseq_match_data match_data;
 670	int ret;
 671
 672	struct pwrseq_desc *desc __free(kfree) = kzalloc(sizeof(*desc),
 673							 GFP_KERNEL);
 674	if (!desc)
 675		return ERR_PTR(-ENOMEM);
 676
 677	match_data.desc = desc;
 678	match_data.dev = dev;
 679	match_data.target = target;
 680
 681	guard(rwsem_read)(&pwrseq_sem);
 682
 683	ret = bus_for_each_dev(&pwrseq_bus, NULL, &match_data,
 684			       pwrseq_match_device);
 685	if (ret < 0)
 686		return ERR_PTR(ret);
 687	if (ret == 0)
 688		/* No device matched. */
 689		return ERR_PTR(-EPROBE_DEFER);
 690
 691	return_ptr(desc);
 692}
 693EXPORT_SYMBOL_GPL(pwrseq_get);
 694
 695/**
 696 * pwrseq_put() - Release the power sequencer descriptor.
 697 * @desc: Descriptor to release.
 698 */
 699void pwrseq_put(struct pwrseq_desc *desc)
 700{
 701	struct pwrseq_device *pwrseq;
 702
 703	if (!desc)
 704		return;
 705
 706	pwrseq = desc->pwrseq;
 707
 708	if (desc->powered_on)
 709		pwrseq_power_off(desc);
 710
 711	kfree(desc);
 712	module_put(pwrseq->owner);
 713	pwrseq_device_put(pwrseq);
 714}
 715EXPORT_SYMBOL_GPL(pwrseq_put);
 716
 717static void devm_pwrseq_put(void *data)
 718{
 719	struct pwrseq_desc *desc = data;
 720
 721	pwrseq_put(desc);
 722}
 723
 724/**
 725 * devm_pwrseq_get() - Managed variant of pwrseq_get().
 726 * @dev: Device for which to get the sequencer and which also manages its
 727 *       lifetime.
 728 * @target: Name of the target exposed by the sequencer this device wants to
 729 *          reach.
 730 *
 731 * Returns:
 732 * New power sequencer descriptor for use by the consumer driver or ERR_PTR()
 733 * on failure.
 734 */
 735struct pwrseq_desc *devm_pwrseq_get(struct device *dev, const char *target)
 736{
 737	struct pwrseq_desc *desc;
 738	int ret;
 739
 740	desc = pwrseq_get(dev, target);
 741	if (IS_ERR(desc))
 742		return desc;
 743
 744	ret = devm_add_action_or_reset(dev, devm_pwrseq_put, desc);
 745	if (ret)
 746		return ERR_PTR(ret);
 747
 748	return desc;
 749}
 750EXPORT_SYMBOL_GPL(devm_pwrseq_get);
 751
 752static int pwrseq_unit_enable(struct pwrseq_device *pwrseq,
 753			      struct pwrseq_unit *target);
 754static int pwrseq_unit_disable(struct pwrseq_device *pwrseq,
 755			       struct pwrseq_unit *target);
 756
 757static int pwrseq_unit_enable_deps(struct pwrseq_device *pwrseq,
 758				   struct list_head *list)
 759{
 760	struct pwrseq_unit_dep *pos;
 761	int ret = 0;
 762
 763	list_for_each_entry(pos, list, list) {
 764		ret = pwrseq_unit_enable(pwrseq, pos->unit);
 765		if (ret) {
 766			list_for_each_entry_continue_reverse(pos, list, list)
 767				pwrseq_unit_disable(pwrseq, pos->unit);
 768			break;
 769		}
 770	}
 771
 772	return ret;
 773}
 774
 775static int pwrseq_unit_disable_deps(struct pwrseq_device *pwrseq,
 776				    struct list_head *list)
 777{
 778	struct pwrseq_unit_dep *pos;
 779	int ret = 0;
 780
 781	list_for_each_entry_reverse(pos, list, list) {
 782		ret = pwrseq_unit_disable(pwrseq, pos->unit);
 783		if (ret) {
 784			list_for_each_entry_continue(pos, list, list)
 785				pwrseq_unit_enable(pwrseq, pos->unit);
 786			break;
 787		}
 788	}
 789
 790	return ret;
 791}
 792
 793static int pwrseq_unit_enable(struct pwrseq_device *pwrseq,
 794			      struct pwrseq_unit *unit)
 795{
 796	int ret;
 797
 798	lockdep_assert_held_read(&pwrseq->rw_lock);
 799	lockdep_assert_held(&pwrseq->state_lock);
 800
 801	if (unit->enable_count != 0) {
 802		unit->enable_count++;
 803		return 0;
 804	}
 805
 806	ret = pwrseq_unit_enable_deps(pwrseq, &unit->deps);
 807	if (ret) {
 808		dev_err(&pwrseq->dev,
 809			"Failed to enable dependencies before power-on for target '%s': %d\n",
 810			unit->name, ret);
 811		return ret;
 812	}
 813
 814	if (unit->enable) {
 815		ret = unit->enable(pwrseq);
 816		if (ret) {
 817			dev_err(&pwrseq->dev,
 818				"Failed to enable target '%s': %d\n",
 819				unit->name, ret);
 820			pwrseq_unit_disable_deps(pwrseq, &unit->deps);
 821			return ret;
 822		}
 823	}
 824
 825	unit->enable_count++;
 826
 827	return 0;
 828}
 829
 830static int pwrseq_unit_disable(struct pwrseq_device *pwrseq,
 831			       struct pwrseq_unit *unit)
 832{
 833	int ret;
 834
 835	lockdep_assert_held_read(&pwrseq->rw_lock);
 836	lockdep_assert_held(&pwrseq->state_lock);
 837
 838	if (unit->enable_count == 0) {
 839		WARN(1, "Unmatched power-off for target '%s'\n",
 840		     unit->name);
 841		return -EBUSY;
 842	}
 843
 844	if (unit->enable_count != 1) {
 845		unit->enable_count--;
 846		return 0;
 847	}
 848
 849	if (unit->disable) {
 850		ret = unit->disable(pwrseq);
 851		if (ret) {
 852			dev_err(&pwrseq->dev,
 853				"Failed to disable target '%s': %d\n",
 854				unit->name, ret);
 855			return ret;
 856		}
 857	}
 858
 859	ret = pwrseq_unit_disable_deps(pwrseq, &unit->deps);
 860	if (ret) {
 861		dev_err(&pwrseq->dev,
 862			"Failed to disable dependencies after power-off for target '%s': %d\n",
 863			unit->name, ret);
 864		if (unit->enable)
 865			unit->enable(pwrseq);
 866		return ret;
 867	}
 868
 869	unit->enable_count--;
 870
 871	return 0;
 872}
 873
 874/**
 875 * pwrseq_power_on() - Issue a power-on request on behalf of the consumer
 876 *                     device.
 877 * @desc: Descriptor referencing the power sequencer.
 878 *
 879 * This function tells the power sequencer that the consumer wants to be
 880 * powered-up. The sequencer may already have powered-up the device in which
 881 * case the function returns 0. If the power-up sequence is already in
 882 * progress, the function will block until it's done and return 0. If this is
 883 * the first request, the device will be powered up.
 884 *
 885 * Returns:
 886 * 0 on success, negative error number on failure.
 887 */
 888int pwrseq_power_on(struct pwrseq_desc *desc)
 889{
 890	struct pwrseq_device *pwrseq;
 891	struct pwrseq_target *target;
 892	struct pwrseq_unit *unit;
 893	int ret;
 894
 895	might_sleep();
 896
 897	if (!desc || desc->powered_on)
 898		return 0;
 899
 900	pwrseq = desc->pwrseq;
 901	target = desc->target;
 902	unit = target->unit;
 903
 904	guard(rwsem_read)(&pwrseq->rw_lock);
 905	if (!device_is_registered(&pwrseq->dev))
 906		return -ENODEV;
 907
 908	scoped_guard(mutex, &pwrseq->state_lock) {
 909		ret = pwrseq_unit_enable(pwrseq, unit);
 910		if (!ret)
 911			desc->powered_on = true;
 912	}
 913
 914	if (target->post_enable) {
 915		ret = target->post_enable(pwrseq);
 916		if (ret) {
 917			pwrseq_unit_disable(pwrseq, unit);
 918			desc->powered_on = false;
 919		}
 920	}
 921
 922	return ret;
 923}
 924EXPORT_SYMBOL_GPL(pwrseq_power_on);
 925
 926/**
 927 * pwrseq_power_off() - Issue a power-off request on behalf of the consumer
 928 *                      device.
 929 * @desc: Descriptor referencing the power sequencer.
 930 *
 931 * This undoes the effects of pwrseq_power_on(). It issues a power-off request
 932 * on behalf of the consumer and when the last remaining user does so, the
 933 * power-down sequence will be started. If one is in progress, the function
 934 * will block until it's complete and then return.
 935 *
 936 * Returns:
 937 * 0 on success, negative error number on failure.
 938 */
 939int pwrseq_power_off(struct pwrseq_desc *desc)
 940{
 941	struct pwrseq_device *pwrseq;
 942	struct pwrseq_unit *unit;
 943	int ret;
 944
 945	might_sleep();
 946
 947	if (!desc || !desc->powered_on)
 948		return 0;
 949
 950	pwrseq = desc->pwrseq;
 951	unit = desc->target->unit;
 952
 953	guard(rwsem_read)(&pwrseq->rw_lock);
 954	if (!device_is_registered(&pwrseq->dev))
 955		return -ENODEV;
 956
 957	guard(mutex)(&pwrseq->state_lock);
 958
 959	ret = pwrseq_unit_disable(pwrseq, unit);
 960	if (!ret)
 961		desc->powered_on = false;
 962
 963	return ret;
 964}
 965EXPORT_SYMBOL_GPL(pwrseq_power_off);
 966
 967#if IS_ENABLED(CONFIG_DEBUG_FS)
 968
 969struct pwrseq_debugfs_count_ctx {
 970	struct device *dev;
 971	loff_t index;
 972};
 973
 974static int pwrseq_debugfs_seq_count(struct device *dev, void *data)
 975{
 976	struct pwrseq_debugfs_count_ctx *ctx = data;
 977
 978	ctx->dev = dev;
 979
 980	return ctx->index-- ? 0 : 1;
 981}
 982
 983static void *pwrseq_debugfs_seq_start(struct seq_file *seq, loff_t *pos)
 984{
 985	struct pwrseq_debugfs_count_ctx ctx;
 986
 987	ctx.dev = NULL;
 988	ctx.index = *pos;
 989
 990	/*
 991	 * We're holding the lock for the entire printout so no need to fiddle
 992	 * with device reference count.
 993	 */
 994	down_read(&pwrseq_sem);
 995
 996	bus_for_each_dev(&pwrseq_bus, NULL, &ctx, pwrseq_debugfs_seq_count);
 997	if (!ctx.index)
 998		return NULL;
 999
1000	return ctx.dev;
1001}
1002
1003static void *pwrseq_debugfs_seq_next(struct seq_file *seq, void *data,
1004				     loff_t *pos)
1005{
1006	struct device *curr = data;
1007
1008	++*pos;
1009
1010	struct device *next __free(put_device) =
1011			bus_find_next_device(&pwrseq_bus, curr);
1012	return next;
1013}
1014
1015static void pwrseq_debugfs_seq_show_target(struct seq_file *seq,
1016					   struct pwrseq_target *target)
1017{
1018	seq_printf(seq, "    target: [%s] (target unit: [%s])\n",
1019		   target->name, target->unit->name);
1020}
1021
1022static void pwrseq_debugfs_seq_show_unit(struct seq_file *seq,
1023					 struct pwrseq_unit *unit)
1024{
1025	struct pwrseq_unit_dep *ref;
1026
1027	seq_printf(seq, "    unit: [%s] - enable count: %u\n",
1028		   unit->name, unit->enable_count);
1029
1030	if (list_empty(&unit->deps))
1031		return;
1032
1033	seq_puts(seq, "      dependencies:\n");
1034	list_for_each_entry(ref, &unit->deps, list)
1035		seq_printf(seq, "        [%s]\n", ref->unit->name);
1036}
1037
1038static int pwrseq_debugfs_seq_show(struct seq_file *seq, void *data)
1039{
1040	struct device *dev = data;
1041	struct pwrseq_device *pwrseq = to_pwrseq_device(dev);
1042	struct pwrseq_target *target;
1043	struct pwrseq_unit *unit;
1044
1045	seq_printf(seq, "%s:\n", dev_name(dev));
1046
1047	seq_puts(seq, "  targets:\n");
1048	list_for_each_entry(target, &pwrseq->targets, list)
1049		pwrseq_debugfs_seq_show_target(seq, target);
1050
1051	seq_puts(seq, "  units:\n");
1052	list_for_each_entry(unit, &pwrseq->units, list)
1053		pwrseq_debugfs_seq_show_unit(seq, unit);
1054
1055	return 0;
1056}
1057
1058static void pwrseq_debugfs_seq_stop(struct seq_file *seq, void *data)
1059{
1060	up_read(&pwrseq_sem);
1061}
1062
1063static const struct seq_operations pwrseq_debugfs_sops = {
1064	.start = pwrseq_debugfs_seq_start,
1065	.next = pwrseq_debugfs_seq_next,
1066	.show = pwrseq_debugfs_seq_show,
1067	.stop = pwrseq_debugfs_seq_stop,
1068};
1069DEFINE_SEQ_ATTRIBUTE(pwrseq_debugfs);
1070
1071static struct dentry *pwrseq_debugfs_dentry;
1072
1073#endif /* CONFIG_DEBUG_FS */
1074
1075static int __init pwrseq_init(void)
1076{
1077	int ret;
1078
1079	ret = bus_register(&pwrseq_bus);
1080	if (ret) {
1081		pr_err("Failed to register the power sequencer bus\n");
1082		return ret;
1083	}
1084
1085#if IS_ENABLED(CONFIG_DEBUG_FS)
1086	pwrseq_debugfs_dentry = debugfs_create_file("pwrseq", 0444, NULL, NULL,
1087						    &pwrseq_debugfs_fops);
1088#endif  /* CONFIG_DEBUG_FS */
1089
1090	return 0;
1091}
1092subsys_initcall(pwrseq_init);
1093
1094static void __exit pwrseq_exit(void)
1095{
1096#if IS_ENABLED(CONFIG_DEBUG_FS)
1097	debugfs_remove_recursive(pwrseq_debugfs_dentry);
1098#endif  /* CONFIG_DEBUG_FS */
1099
1100	bus_unregister(&pwrseq_bus);
1101}
1102module_exit(pwrseq_exit);
1103
1104MODULE_AUTHOR("Bartosz Golaszewski <bartosz.golaszewski@linaro.org>");
1105MODULE_DESCRIPTION("Power Sequencing subsystem core");
1106MODULE_LICENSE("GPL");