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->deps); 105 unit->enable = data->enable; 106 unit->disable = data->disable; 107 108 return unit; 109 } 110 111 static struct pwrseq_unit *pwrseq_unit_get(struct pwrseq_unit *unit) 112 { 113 kref_get(&unit->ref); 114 115 return unit; 116 } 117 118 static void pwrseq_unit_release(struct kref *ref); 119 120 static 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 */ 132 struct pwrseq_unit_dep { 133 struct list_head list; 134 struct pwrseq_unit *unit; 135 }; 136 137 static struct pwrseq_unit_dep *pwrseq_unit_dep_new(struct pwrseq_unit *unit) 138 { 139 struct pwrseq_unit_dep *dep; 140 141 dep = kzalloc_obj(*dep); 142 if (!dep) 143 return NULL; 144 145 dep->unit = unit; 146 147 return dep; 148 } 149 150 static void pwrseq_unit_dep_free(struct pwrseq_unit_dep *ref) 151 { 152 pwrseq_unit_put(ref->unit); 153 kfree(ref); 154 } 155 156 static 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 166 static 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 */ 186 struct 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 193 static struct pwrseq_target * 194 pwrseq_target_new(const struct pwrseq_target_data *data) 195 { 196 struct pwrseq_target *target; 197 198 target = kzalloc_obj(*target); 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 213 static 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 */ 233 struct 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 244 static struct pwrseq_device *to_pwrseq_device(struct device *dev) 245 { 246 return container_of(dev, struct pwrseq_device, dev); 247 } 248 249 static struct pwrseq_device *pwrseq_device_get(struct pwrseq_device *pwrseq) 250 { 251 get_device(&pwrseq->dev); 252 253 return pwrseq; 254 } 255 256 static 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 */ 269 struct pwrseq_desc { 270 struct pwrseq_device *pwrseq; 271 struct pwrseq_target *target; 272 bool powered_on; 273 }; 274 275 static const struct bus_type pwrseq_bus = { 276 .name = "pwrseq", 277 }; 278 279 static 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 294 static const struct device_type pwrseq_device_type = { 295 .name = "power_sequencer", 296 .release = pwrseq_release, 297 }; 298 299 static 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 325 static 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 343 static 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 348 static struct pwrseq_unit * 349 pwrseq_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 384 static 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 413 static 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 446 static 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 */ 473 struct pwrseq_device * 474 pwrseq_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 531 err_put_pwrseq: 532 pwrseq_device_put(pwrseq); 533 return ERR_PTR(ret); 534 } 535 EXPORT_SYMBOL_GPL(pwrseq_device_register); 536 537 /** 538 * pwrseq_device_unregister() - Unregister the power sequencer. 539 * @pwrseq: Power sequencer to unregister. 540 */ 541 void pwrseq_device_unregister(struct pwrseq_device *pwrseq) 542 { 543 struct device *dev = &pwrseq->dev; 544 struct pwrseq_target *target; 545 546 scoped_guard(rwsem_write, &pwrseq_sem) { 547 guard(rwsem_write)(&pwrseq->rw_lock); 548 549 /* 550 * Holding rw_lock for write excludes all power on/off callers 551 * (they hold it for read), so it's safe to read enable_count 552 * here without taking the state_lock. 553 */ 554 list_for_each_entry(target, &pwrseq->targets, list) 555 WARN(target->unit->enable_count, 556 "REMOVING POWER SEQUENCER WITH ACTIVE USERS\n"); 557 558 device_del(dev); 559 } 560 561 pwrseq_device_put(pwrseq); 562 } 563 EXPORT_SYMBOL_GPL(pwrseq_device_unregister); 564 565 static void devm_pwrseq_device_unregister(void *data) 566 { 567 struct pwrseq_device *pwrseq = data; 568 569 pwrseq_device_unregister(pwrseq); 570 } 571 572 /** 573 * devm_pwrseq_device_register() - Managed variant of pwrseq_device_register(). 574 * @dev: Managing device. 575 * @config: Configuration of the new power sequencing device. 576 * 577 * Returns: 578 * Returns the address of the new pwrseq device or ERR_PTR() on failure. 579 */ 580 struct pwrseq_device * 581 devm_pwrseq_device_register(struct device *dev, 582 const struct pwrseq_config *config) 583 { 584 struct pwrseq_device *pwrseq; 585 int ret; 586 587 pwrseq = pwrseq_device_register(config); 588 if (IS_ERR(pwrseq)) 589 return pwrseq; 590 591 ret = devm_add_action_or_reset(dev, devm_pwrseq_device_unregister, 592 pwrseq); 593 if (ret) 594 return ERR_PTR(ret); 595 596 return pwrseq; 597 } 598 EXPORT_SYMBOL_GPL(devm_pwrseq_device_register); 599 600 /** 601 * pwrseq_device_get_drvdata() - Get the driver private data associated with 602 * this sequencer. 603 * @pwrseq: Power sequencer object. 604 * 605 * Returns: 606 * Address of the private driver data. 607 */ 608 void *pwrseq_device_get_drvdata(struct pwrseq_device *pwrseq) 609 { 610 return dev_get_drvdata(&pwrseq->dev); 611 } 612 EXPORT_SYMBOL_GPL(pwrseq_device_get_drvdata); 613 614 struct pwrseq_match_data { 615 struct pwrseq_desc *desc; 616 struct device *dev; 617 const char *target; 618 }; 619 620 static int pwrseq_match_device(struct device *pwrseq_dev, void *data) 621 { 622 struct pwrseq_device *pwrseq = to_pwrseq_device(pwrseq_dev); 623 struct pwrseq_match_data *match_data = data; 624 struct pwrseq_target *target; 625 int ret; 626 627 lockdep_assert_held_read(&pwrseq_sem); 628 629 guard(rwsem_read)(&pwrseq->rw_lock); 630 if (!device_is_registered(&pwrseq->dev)) 631 return 0; 632 633 ret = pwrseq->match(pwrseq, match_data->dev); 634 if (ret == PWRSEQ_NO_MATCH || ret < 0) 635 return ret; 636 637 /* We got the matching device, let's find the right target. */ 638 list_for_each_entry(target, &pwrseq->targets, list) { 639 if (strcmp(target->name, match_data->target)) 640 continue; 641 642 match_data->desc->target = target; 643 } 644 645 /* 646 * This device does not have this target. No point in deferring as it 647 * will not get a new target dynamically later. 648 */ 649 if (!match_data->desc->target) 650 return -ENOENT; 651 652 if (!try_module_get(pwrseq->owner)) 653 return -EPROBE_DEFER; 654 655 match_data->desc->pwrseq = pwrseq_device_get(pwrseq); 656 657 return PWRSEQ_MATCH_OK; 658 } 659 660 /** 661 * pwrseq_get() - Get the power sequencer associated with this device. 662 * @dev: Device for which to get the sequencer. 663 * @target: Name of the target exposed by the sequencer this device wants to 664 * reach. 665 * 666 * Returns: 667 * New power sequencer descriptor for use by the consumer driver or ERR_PTR() 668 * on failure. 669 */ 670 struct pwrseq_desc *pwrseq_get(struct device *dev, const char *target) 671 { 672 struct pwrseq_match_data match_data; 673 int ret; 674 675 struct pwrseq_desc *desc __free(kfree) = kzalloc_obj(*desc); 676 if (!desc) 677 return ERR_PTR(-ENOMEM); 678 679 match_data.desc = desc; 680 match_data.dev = dev; 681 match_data.target = target; 682 683 guard(rwsem_read)(&pwrseq_sem); 684 685 ret = bus_for_each_dev(&pwrseq_bus, NULL, &match_data, 686 pwrseq_match_device); 687 if (ret < 0) 688 return ERR_PTR(ret); 689 if (ret == PWRSEQ_NO_MATCH) 690 /* No device matched. */ 691 return ERR_PTR(-EPROBE_DEFER); 692 693 return_ptr(desc); 694 } 695 EXPORT_SYMBOL_GPL(pwrseq_get); 696 697 /** 698 * pwrseq_put() - Release the power sequencer descriptor. 699 * @desc: Descriptor to release. 700 */ 701 void pwrseq_put(struct pwrseq_desc *desc) 702 { 703 struct pwrseq_device *pwrseq; 704 705 if (!desc) 706 return; 707 708 pwrseq = desc->pwrseq; 709 710 if (desc->powered_on) 711 pwrseq_power_off(desc); 712 713 kfree(desc); 714 module_put(pwrseq->owner); 715 pwrseq_device_put(pwrseq); 716 } 717 EXPORT_SYMBOL_GPL(pwrseq_put); 718 719 static void devm_pwrseq_put(void *data) 720 { 721 struct pwrseq_desc *desc = data; 722 723 pwrseq_put(desc); 724 } 725 726 /** 727 * devm_pwrseq_get() - Managed variant of pwrseq_get(). 728 * @dev: Device for which to get the sequencer and which also manages its 729 * lifetime. 730 * @target: Name of the target exposed by the sequencer this device wants to 731 * reach. 732 * 733 * Returns: 734 * New power sequencer descriptor for use by the consumer driver or ERR_PTR() 735 * on failure. 736 */ 737 struct pwrseq_desc *devm_pwrseq_get(struct device *dev, const char *target) 738 { 739 struct pwrseq_desc *desc; 740 int ret; 741 742 desc = pwrseq_get(dev, target); 743 if (IS_ERR(desc)) 744 return desc; 745 746 ret = devm_add_action_or_reset(dev, devm_pwrseq_put, desc); 747 if (ret) 748 return ERR_PTR(ret); 749 750 return desc; 751 } 752 EXPORT_SYMBOL_GPL(devm_pwrseq_get); 753 754 static int pwrseq_unit_enable(struct pwrseq_device *pwrseq, 755 struct pwrseq_unit *target); 756 static int pwrseq_unit_disable(struct pwrseq_device *pwrseq, 757 struct pwrseq_unit *target); 758 759 static int pwrseq_unit_enable_deps(struct pwrseq_device *pwrseq, 760 struct list_head *list) 761 { 762 struct pwrseq_unit_dep *pos; 763 int ret = 0; 764 765 list_for_each_entry(pos, list, list) { 766 ret = pwrseq_unit_enable(pwrseq, pos->unit); 767 if (ret) { 768 list_for_each_entry_continue_reverse(pos, list, list) 769 pwrseq_unit_disable(pwrseq, pos->unit); 770 break; 771 } 772 } 773 774 return ret; 775 } 776 777 static int pwrseq_unit_disable_deps(struct pwrseq_device *pwrseq, 778 struct list_head *list) 779 { 780 struct pwrseq_unit_dep *pos; 781 int ret = 0; 782 783 list_for_each_entry_reverse(pos, list, list) { 784 ret = pwrseq_unit_disable(pwrseq, pos->unit); 785 if (ret) { 786 list_for_each_entry_continue(pos, list, list) 787 pwrseq_unit_enable(pwrseq, pos->unit); 788 break; 789 } 790 } 791 792 return ret; 793 } 794 795 static int pwrseq_unit_enable(struct pwrseq_device *pwrseq, 796 struct pwrseq_unit *unit) 797 { 798 int ret; 799 800 lockdep_assert_held_read(&pwrseq->rw_lock); 801 lockdep_assert_held(&pwrseq->state_lock); 802 803 if (unit->enable_count != 0) { 804 unit->enable_count++; 805 return 0; 806 } 807 808 ret = pwrseq_unit_enable_deps(pwrseq, &unit->deps); 809 if (ret) { 810 dev_err(&pwrseq->dev, 811 "Failed to enable dependencies before power-on for target '%s': %d\n", 812 unit->name, ret); 813 return ret; 814 } 815 816 if (unit->enable) { 817 ret = unit->enable(pwrseq); 818 if (ret) { 819 dev_err(&pwrseq->dev, 820 "Failed to enable target '%s': %d\n", 821 unit->name, ret); 822 pwrseq_unit_disable_deps(pwrseq, &unit->deps); 823 return ret; 824 } 825 } 826 827 unit->enable_count++; 828 829 return 0; 830 } 831 832 static int pwrseq_unit_disable(struct pwrseq_device *pwrseq, 833 struct pwrseq_unit *unit) 834 { 835 int ret; 836 837 lockdep_assert_held_read(&pwrseq->rw_lock); 838 lockdep_assert_held(&pwrseq->state_lock); 839 840 if (unit->enable_count == 0) { 841 WARN(1, "Unmatched power-off for target '%s'\n", 842 unit->name); 843 return -EBUSY; 844 } 845 846 if (unit->enable_count != 1) { 847 unit->enable_count--; 848 return 0; 849 } 850 851 if (unit->disable) { 852 ret = unit->disable(pwrseq); 853 if (ret) { 854 dev_err(&pwrseq->dev, 855 "Failed to disable target '%s': %d\n", 856 unit->name, ret); 857 return ret; 858 } 859 } 860 861 ret = pwrseq_unit_disable_deps(pwrseq, &unit->deps); 862 if (ret) { 863 dev_err(&pwrseq->dev, 864 "Failed to disable dependencies after power-off for target '%s': %d\n", 865 unit->name, ret); 866 if (unit->enable) 867 unit->enable(pwrseq); 868 return ret; 869 } 870 871 unit->enable_count--; 872 873 return 0; 874 } 875 876 /** 877 * pwrseq_power_on() - Issue a power-on request on behalf of the consumer 878 * device. 879 * @desc: Descriptor referencing the power sequencer. 880 * 881 * This function tells the power sequencer that the consumer wants to be 882 * powered-up. The sequencer may already have powered-up the device in which 883 * case the function returns 0. If the power-up sequence is already in 884 * progress, the function will block until it's done and return 0. If this is 885 * the first request, the device will be powered up. 886 * 887 * Returns: 888 * 0 on success, negative error number on failure. 889 */ 890 int pwrseq_power_on(struct pwrseq_desc *desc) 891 { 892 struct pwrseq_device *pwrseq; 893 struct pwrseq_target *target; 894 struct pwrseq_unit *unit; 895 int ret; 896 897 might_sleep(); 898 899 if (!desc || desc->powered_on) 900 return 0; 901 902 pwrseq = desc->pwrseq; 903 target = desc->target; 904 unit = target->unit; 905 906 guard(rwsem_read)(&pwrseq->rw_lock); 907 if (!device_is_registered(&pwrseq->dev)) 908 return -ENODEV; 909 910 scoped_guard(mutex, &pwrseq->state_lock) { 911 ret = pwrseq_unit_enable(pwrseq, unit); 912 if (!ret) 913 desc->powered_on = true; 914 } 915 916 if (target->post_enable) { 917 ret = target->post_enable(pwrseq); 918 if (ret) { 919 scoped_guard(mutex, &pwrseq->state_lock) { 920 pwrseq_unit_disable(pwrseq, unit); 921 desc->powered_on = false; 922 } 923 } 924 } 925 926 return ret; 927 } 928 EXPORT_SYMBOL_GPL(pwrseq_power_on); 929 930 /** 931 * pwrseq_power_off() - Issue a power-off request on behalf of the consumer 932 * device. 933 * @desc: Descriptor referencing the power sequencer. 934 * 935 * This undoes the effects of pwrseq_power_on(). It issues a power-off request 936 * on behalf of the consumer and when the last remaining user does so, the 937 * power-down sequence will be started. If one is in progress, the function 938 * will block until it's complete and then return. 939 * 940 * Returns: 941 * 0 on success, negative error number on failure. 942 */ 943 int pwrseq_power_off(struct pwrseq_desc *desc) 944 { 945 struct pwrseq_device *pwrseq; 946 struct pwrseq_unit *unit; 947 int ret; 948 949 might_sleep(); 950 951 if (!desc || !desc->powered_on) 952 return 0; 953 954 pwrseq = desc->pwrseq; 955 unit = desc->target->unit; 956 957 guard(rwsem_read)(&pwrseq->rw_lock); 958 if (!device_is_registered(&pwrseq->dev)) 959 return -ENODEV; 960 961 guard(mutex)(&pwrseq->state_lock); 962 963 ret = pwrseq_unit_disable(pwrseq, unit); 964 if (!ret) 965 desc->powered_on = false; 966 967 return ret; 968 } 969 EXPORT_SYMBOL_GPL(pwrseq_power_off); 970 971 /** 972 * pwrseq_to_device() - Get the pwrseq device pointer from a descriptor. 973 * @desc: Descriptor referencing the power sequencer. 974 * 975 * Return the 'dev' pointer of the power sequencer device associated with @desc. 976 * Consumer drivers can use this to query the pwrseq provider's device tree 977 * node, for example to check for the existence of specific properties. 978 * 979 * Since pwrseq_get() already takes a reference to the pwrseq device, this 980 * function does not take an additional reference. 981 * 982 * Returns: 983 * Pointer to the pwrseq struct device, or NULL if @desc is NULL. 984 */ 985 struct device *pwrseq_to_device(struct pwrseq_desc *desc) 986 { 987 if (!desc) 988 return NULL; 989 990 return &desc->pwrseq->dev; 991 } 992 EXPORT_SYMBOL_GPL(pwrseq_to_device); 993 994 #if IS_ENABLED(CONFIG_DEBUG_FS) 995 996 struct pwrseq_debugfs_count_ctx { 997 struct device *dev; 998 loff_t index; 999 }; 1000 1001 static int pwrseq_debugfs_seq_count(struct device *dev, void *data) 1002 { 1003 struct pwrseq_debugfs_count_ctx *ctx = data; 1004 1005 ctx->dev = dev; 1006 1007 return ctx->index-- ? 0 : 1; 1008 } 1009 1010 static void *pwrseq_debugfs_seq_start(struct seq_file *seq, loff_t *pos) 1011 { 1012 struct pwrseq_debugfs_count_ctx ctx; 1013 1014 ctx.dev = NULL; 1015 ctx.index = *pos; 1016 1017 /* 1018 * Hold the lock for the entire printout to prevent device removal. 1019 * Reference counts are managed by start()/next()/stop() as required 1020 * by the seq_file contract. 1021 */ 1022 down_read(&pwrseq_sem); 1023 1024 bus_for_each_dev(&pwrseq_bus, NULL, &ctx, pwrseq_debugfs_seq_count); 1025 if (!ctx.index) 1026 return NULL; 1027 1028 return get_device(ctx.dev); 1029 } 1030 1031 static void *pwrseq_debugfs_seq_next(struct seq_file *seq, void *data, 1032 loff_t *pos) 1033 { 1034 struct device *curr = data; 1035 1036 ++*pos; 1037 1038 struct device *next = bus_find_next_device(&pwrseq_bus, curr); 1039 1040 put_device(curr); 1041 return next; 1042 } 1043 1044 static void pwrseq_debugfs_seq_show_target(struct seq_file *seq, 1045 struct pwrseq_target *target) 1046 { 1047 seq_printf(seq, " target: [%s] (target unit: [%s])\n", 1048 target->name, target->unit->name); 1049 } 1050 1051 static void pwrseq_debugfs_seq_show_unit(struct seq_file *seq, 1052 struct pwrseq_unit *unit) 1053 { 1054 struct pwrseq_unit_dep *ref; 1055 1056 seq_printf(seq, " unit: [%s] - enable count: %u\n", 1057 unit->name, unit->enable_count); 1058 1059 if (list_empty(&unit->deps)) 1060 return; 1061 1062 seq_puts(seq, " dependencies:\n"); 1063 list_for_each_entry(ref, &unit->deps, list) 1064 seq_printf(seq, " [%s]\n", ref->unit->name); 1065 } 1066 1067 static int pwrseq_debugfs_seq_show(struct seq_file *seq, void *data) 1068 { 1069 struct device *dev = data; 1070 struct pwrseq_device *pwrseq = to_pwrseq_device(dev); 1071 struct pwrseq_target *target; 1072 struct pwrseq_unit *unit; 1073 1074 seq_printf(seq, "%s (%s):\n", dev_name(dev), dev_name(dev->parent)); 1075 1076 seq_puts(seq, " targets:\n"); 1077 list_for_each_entry(target, &pwrseq->targets, list) 1078 pwrseq_debugfs_seq_show_target(seq, target); 1079 1080 seq_puts(seq, " units:\n"); 1081 list_for_each_entry(unit, &pwrseq->units, list) 1082 pwrseq_debugfs_seq_show_unit(seq, unit); 1083 1084 return 0; 1085 } 1086 1087 static void pwrseq_debugfs_seq_stop(struct seq_file *seq, void *data) 1088 { 1089 if (data) 1090 put_device(data); 1091 up_read(&pwrseq_sem); 1092 } 1093 1094 static const struct seq_operations pwrseq_debugfs_sops = { 1095 .start = pwrseq_debugfs_seq_start, 1096 .next = pwrseq_debugfs_seq_next, 1097 .show = pwrseq_debugfs_seq_show, 1098 .stop = pwrseq_debugfs_seq_stop, 1099 }; 1100 DEFINE_SEQ_ATTRIBUTE(pwrseq_debugfs); 1101 1102 static struct dentry *pwrseq_debugfs_dentry; 1103 1104 #endif /* CONFIG_DEBUG_FS */ 1105 1106 static int __init pwrseq_init(void) 1107 { 1108 int ret; 1109 1110 ret = bus_register(&pwrseq_bus); 1111 if (ret) { 1112 pr_err("Failed to register the power sequencer bus\n"); 1113 return ret; 1114 } 1115 1116 #if IS_ENABLED(CONFIG_DEBUG_FS) 1117 pwrseq_debugfs_dentry = debugfs_create_file("pwrseq", 0444, NULL, NULL, 1118 &pwrseq_debugfs_fops); 1119 #endif /* CONFIG_DEBUG_FS */ 1120 1121 return 0; 1122 } 1123 subsys_initcall(pwrseq_init); 1124 1125 static void __exit pwrseq_exit(void) 1126 { 1127 #if IS_ENABLED(CONFIG_DEBUG_FS) 1128 debugfs_remove_recursive(pwrseq_debugfs_dentry); 1129 #endif /* CONFIG_DEBUG_FS */ 1130 1131 bus_unregister(&pwrseq_bus); 1132 } 1133 module_exit(pwrseq_exit); 1134 1135 MODULE_AUTHOR("Bartosz Golaszewski <bartosz.golaszewski@linaro.org>"); 1136 MODULE_DESCRIPTION("Power Sequencing subsystem core"); 1137 MODULE_LICENSE("GPL"); 1138