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_disable(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_enable() - 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_enable(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 if (ret) 916 return ret; 917 918 if (target->post_enable) { 919 ret = target->post_enable(pwrseq); 920 if (ret) { 921 scoped_guard(mutex, &pwrseq->state_lock) { 922 pwrseq_unit_disable(pwrseq, unit); 923 desc->powered_on = false; 924 } 925 } 926 } 927 928 return ret; 929 } 930 EXPORT_SYMBOL_GPL(pwrseq_enable); 931 932 /** 933 * pwrseq_disable() - Issue a power-off request on behalf of the consumer 934 * device. 935 * @desc: Descriptor referencing the power sequencer. 936 * 937 * This undoes the effects of pwrseq_enable(). It issues a power-off request 938 * on behalf of the consumer and when the last remaining user does so, the 939 * power-down sequence will be started. If one is in progress, the function 940 * will block until it's complete and then return. 941 * 942 * Returns: 943 * 0 on success, negative error number on failure. 944 */ 945 int pwrseq_disable(struct pwrseq_desc *desc) 946 { 947 struct pwrseq_device *pwrseq; 948 struct pwrseq_unit *unit; 949 int ret; 950 951 might_sleep(); 952 953 if (!desc || !desc->powered_on) 954 return 0; 955 956 pwrseq = desc->pwrseq; 957 unit = desc->target->unit; 958 959 guard(rwsem_read)(&pwrseq->rw_lock); 960 if (!device_is_registered(&pwrseq->dev)) 961 return -ENODEV; 962 963 guard(mutex)(&pwrseq->state_lock); 964 965 ret = pwrseq_unit_disable(pwrseq, unit); 966 if (!ret) 967 desc->powered_on = false; 968 969 return ret; 970 } 971 EXPORT_SYMBOL_GPL(pwrseq_disable); 972 973 /** 974 * pwrseq_to_device() - Get the pwrseq device pointer from a descriptor. 975 * @desc: Descriptor referencing the power sequencer. 976 * 977 * Return the 'dev' pointer of the power sequencer device associated with @desc. 978 * Consumer drivers can use this to query the pwrseq provider's device tree 979 * node, for example to check for the existence of specific properties. 980 * 981 * Since pwrseq_get() already takes a reference to the pwrseq device, this 982 * function does not take an additional reference. 983 * 984 * Returns: 985 * Pointer to the pwrseq struct device, or NULL if @desc is NULL. 986 */ 987 struct device *pwrseq_to_device(struct pwrseq_desc *desc) 988 { 989 if (!desc) 990 return NULL; 991 992 return &desc->pwrseq->dev; 993 } 994 EXPORT_SYMBOL_GPL(pwrseq_to_device); 995 996 #if IS_ENABLED(CONFIG_DEBUG_FS) 997 998 struct pwrseq_debugfs_count_ctx { 999 struct device *dev; 1000 loff_t index; 1001 }; 1002 1003 static int pwrseq_debugfs_seq_count(struct device *dev, void *data) 1004 { 1005 struct pwrseq_debugfs_count_ctx *ctx = data; 1006 1007 ctx->dev = dev; 1008 1009 return ctx->index-- ? 0 : 1; 1010 } 1011 1012 static void *pwrseq_debugfs_seq_start(struct seq_file *seq, loff_t *pos) 1013 { 1014 struct pwrseq_debugfs_count_ctx ctx; 1015 1016 ctx.dev = NULL; 1017 ctx.index = *pos; 1018 1019 /* 1020 * Hold the lock for the entire printout to prevent device removal. 1021 * Reference counts are managed by start()/next()/stop() as required 1022 * by the seq_file contract. 1023 */ 1024 down_read(&pwrseq_sem); 1025 1026 bus_for_each_dev(&pwrseq_bus, NULL, &ctx, pwrseq_debugfs_seq_count); 1027 if (!ctx.index) 1028 return NULL; 1029 1030 return get_device(ctx.dev); 1031 } 1032 1033 static void *pwrseq_debugfs_seq_next(struct seq_file *seq, void *data, 1034 loff_t *pos) 1035 { 1036 struct device *curr = data; 1037 1038 ++*pos; 1039 1040 struct device *next = bus_find_next_device(&pwrseq_bus, curr); 1041 1042 put_device(curr); 1043 return next; 1044 } 1045 1046 static void pwrseq_debugfs_seq_show_target(struct seq_file *seq, 1047 struct pwrseq_target *target) 1048 { 1049 seq_printf(seq, " target: [%s] (target unit: [%s])\n", 1050 target->name, target->unit->name); 1051 } 1052 1053 static void pwrseq_debugfs_seq_show_unit(struct seq_file *seq, 1054 struct pwrseq_unit *unit) 1055 { 1056 struct pwrseq_unit_dep *ref; 1057 1058 seq_printf(seq, " unit: [%s] - enable count: %u\n", 1059 unit->name, unit->enable_count); 1060 1061 if (list_empty(&unit->deps)) 1062 return; 1063 1064 seq_puts(seq, " dependencies:\n"); 1065 list_for_each_entry(ref, &unit->deps, list) 1066 seq_printf(seq, " [%s]\n", ref->unit->name); 1067 } 1068 1069 static int pwrseq_debugfs_seq_show(struct seq_file *seq, void *data) 1070 { 1071 struct device *dev = data; 1072 struct pwrseq_device *pwrseq = to_pwrseq_device(dev); 1073 struct pwrseq_target *target; 1074 struct pwrseq_unit *unit; 1075 1076 seq_printf(seq, "%s (%s):\n", dev_name(dev), dev_name(dev->parent)); 1077 1078 seq_puts(seq, " targets:\n"); 1079 list_for_each_entry(target, &pwrseq->targets, list) 1080 pwrseq_debugfs_seq_show_target(seq, target); 1081 1082 seq_puts(seq, " units:\n"); 1083 list_for_each_entry(unit, &pwrseq->units, list) 1084 pwrseq_debugfs_seq_show_unit(seq, unit); 1085 1086 return 0; 1087 } 1088 1089 static void pwrseq_debugfs_seq_stop(struct seq_file *seq, void *data) 1090 { 1091 if (data) 1092 put_device(data); 1093 up_read(&pwrseq_sem); 1094 } 1095 1096 static const struct seq_operations pwrseq_debugfs_sops = { 1097 .start = pwrseq_debugfs_seq_start, 1098 .next = pwrseq_debugfs_seq_next, 1099 .show = pwrseq_debugfs_seq_show, 1100 .stop = pwrseq_debugfs_seq_stop, 1101 }; 1102 DEFINE_SEQ_ATTRIBUTE(pwrseq_debugfs); 1103 1104 static struct dentry *pwrseq_debugfs_dentry; 1105 1106 #endif /* CONFIG_DEBUG_FS */ 1107 1108 static int __init pwrseq_init(void) 1109 { 1110 int ret; 1111 1112 ret = bus_register(&pwrseq_bus); 1113 if (ret) { 1114 pr_err("Failed to register the power sequencer bus\n"); 1115 return ret; 1116 } 1117 1118 #if IS_ENABLED(CONFIG_DEBUG_FS) 1119 pwrseq_debugfs_dentry = debugfs_create_file("pwrseq", 0444, NULL, NULL, 1120 &pwrseq_debugfs_fops); 1121 #endif /* CONFIG_DEBUG_FS */ 1122 1123 return 0; 1124 } 1125 subsys_initcall(pwrseq_init); 1126 1127 static void __exit pwrseq_exit(void) 1128 { 1129 #if IS_ENABLED(CONFIG_DEBUG_FS) 1130 debugfs_remove_recursive(pwrseq_debugfs_dentry); 1131 #endif /* CONFIG_DEBUG_FS */ 1132 1133 bus_unregister(&pwrseq_bus); 1134 } 1135 module_exit(pwrseq_exit); 1136 1137 MODULE_AUTHOR("Bartosz Golaszewski <bartosz.golaszewski@linaro.org>"); 1138 MODULE_DESCRIPTION("Power Sequencing subsystem core"); 1139 MODULE_LICENSE("GPL"); 1140