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