1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Componentized device handling. 4 * 5 * This is work in progress. We gather up the component devices into a list, 6 * and bind them when instructed. At the moment, we're specific to the DRM 7 * subsystem, and only handles one master device, but this doesn't have to be 8 * the case. 9 */ 10 #include <linux/component.h> 11 #include <linux/device.h> 12 #include <linux/list.h> 13 #include <linux/mutex.h> 14 #include <linux/slab.h> 15 #include <linux/debugfs.h> 16 17 /** 18 * DOC: overview 19 * 20 * The component helper allows drivers to collect a pile of sub-devices, 21 * including their bound drivers, into an aggregate driver. Various subsystems 22 * already provide functions to get hold of such components, e.g. 23 * of_clk_get_by_name(). The component helper can be used when such a 24 * subsystem-specific way to find a device is not available: The component 25 * helper fills the niche of aggregate drivers for specific hardware, where 26 * further standardization into a subsystem would not be practical. The common 27 * example is when a logical device (e.g. a DRM display driver) is spread around 28 * the SoC on various components (scanout engines, blending blocks, transcoders 29 * for various outputs and so on). 30 * 31 * The component helper also doesn't solve runtime dependencies, e.g. for system 32 * suspend and resume operations. See also :ref:`device links<device_link>`. 33 * 34 * Components are registered using component_add() and unregistered with 35 * component_del(), usually from the driver's probe and disconnect functions. 36 * 37 * Aggregate drivers first assemble a component match list of what they need 38 * using component_match_add(). This is then registered as an aggregate driver 39 * using component_master_add_with_match(), and unregistered using 40 * component_master_del(). 41 */ 42 43 struct component; 44 45 struct component_match_array { 46 void *data; 47 int (*compare)(struct device *, void *); 48 int (*compare_typed)(struct device *, int, void *); 49 void (*release)(struct device *, void *); 50 struct component *component; 51 bool duplicate; 52 }; 53 54 struct component_match { 55 size_t alloc; 56 size_t num; 57 struct component_match_array *compare; 58 }; 59 60 struct master { 61 struct list_head node; 62 bool bound; 63 64 const struct component_master_ops *ops; 65 struct device *parent; 66 struct component_match *match; 67 }; 68 69 struct component { 70 struct list_head node; 71 struct master *master; 72 bool bound; 73 74 const struct component_ops *ops; 75 int subcomponent; 76 struct device *dev; 77 }; 78 79 static DEFINE_MUTEX(component_mutex); 80 static LIST_HEAD(component_list); 81 static LIST_HEAD(masters); 82 83 #ifdef CONFIG_DEBUG_FS 84 85 static struct dentry *component_debugfs_dir; 86 87 static int component_devices_show(struct seq_file *s, void *data) 88 { 89 struct master *m = s->private; 90 struct component_match *match = m->match; 91 size_t i; 92 93 mutex_lock(&component_mutex); 94 seq_printf(s, "%-40s %20s\n", "master name", "status"); 95 seq_puts(s, "-------------------------------------------------------------\n"); 96 seq_printf(s, "%-40s %20s\n\n", 97 dev_name(m->parent), m->bound ? "bound" : "not bound"); 98 99 seq_printf(s, "%-40s %20s\n", "device name", "status"); 100 seq_puts(s, "-------------------------------------------------------------\n"); 101 for (i = 0; i < match->num; i++) { 102 struct component *component = match->compare[i].component; 103 104 seq_printf(s, "%-40s %20s\n", 105 component ? dev_name(component->dev) : "(unknown)", 106 component ? (component->bound ? "bound" : "not bound") : "not registered"); 107 } 108 mutex_unlock(&component_mutex); 109 110 return 0; 111 } 112 113 DEFINE_SHOW_ATTRIBUTE(component_devices); 114 115 static int __init component_debug_init(void) 116 { 117 component_debugfs_dir = debugfs_create_dir("device_component", NULL); 118 119 return 0; 120 } 121 122 core_initcall(component_debug_init); 123 124 static void component_master_debugfs_add(struct master *m) 125 { 126 debugfs_create_file(dev_name(m->parent), 0444, component_debugfs_dir, m, 127 &component_devices_fops); 128 } 129 130 static void component_master_debugfs_del(struct master *m) 131 { 132 debugfs_remove(debugfs_lookup(dev_name(m->parent), component_debugfs_dir)); 133 } 134 135 #else 136 137 static void component_master_debugfs_add(struct master *m) 138 { } 139 140 static void component_master_debugfs_del(struct master *m) 141 { } 142 143 #endif 144 145 static struct master *__master_find(struct device *parent, 146 const struct component_master_ops *ops) 147 { 148 struct master *m; 149 150 list_for_each_entry(m, &masters, node) 151 if (m->parent == parent && (!ops || m->ops == ops)) 152 return m; 153 154 return NULL; 155 } 156 157 static struct component *find_component(struct master *master, 158 struct component_match_array *mc) 159 { 160 struct component *c; 161 162 list_for_each_entry(c, &component_list, node) { 163 if (c->master && c->master != master) 164 continue; 165 166 if (mc->compare && mc->compare(c->dev, mc->data)) 167 return c; 168 169 if (mc->compare_typed && 170 mc->compare_typed(c->dev, c->subcomponent, mc->data)) 171 return c; 172 } 173 174 return NULL; 175 } 176 177 static int find_components(struct master *master) 178 { 179 struct component_match *match = master->match; 180 size_t i; 181 int ret = 0; 182 183 /* 184 * Scan the array of match functions and attach 185 * any components which are found to this master. 186 */ 187 for (i = 0; i < match->num; i++) { 188 struct component_match_array *mc = &match->compare[i]; 189 struct component *c; 190 191 dev_dbg(master->parent, "Looking for component %zu\n", i); 192 193 if (match->compare[i].component) 194 continue; 195 196 c = find_component(master, mc); 197 if (!c) { 198 ret = -ENXIO; 199 break; 200 } 201 202 dev_dbg(master->parent, "found component %s, duplicate %u\n", dev_name(c->dev), !!c->master); 203 204 /* Attach this component to the master */ 205 match->compare[i].duplicate = !!c->master; 206 match->compare[i].component = c; 207 c->master = master; 208 } 209 return ret; 210 } 211 212 /* Detach component from associated master */ 213 static void remove_component(struct master *master, struct component *c) 214 { 215 size_t i; 216 217 /* Detach the component from this master. */ 218 for (i = 0; i < master->match->num; i++) 219 if (master->match->compare[i].component == c) 220 master->match->compare[i].component = NULL; 221 } 222 223 /* 224 * Try to bring up a master. If component is NULL, we're interested in 225 * this master, otherwise it's a component which must be present to try 226 * and bring up the master. 227 * 228 * Returns 1 for successful bringup, 0 if not ready, or -ve errno. 229 */ 230 static int try_to_bring_up_master(struct master *master, 231 struct component *component) 232 { 233 int ret; 234 235 dev_dbg(master->parent, "trying to bring up master\n"); 236 237 if (find_components(master)) { 238 dev_dbg(master->parent, "master has incomplete components\n"); 239 return 0; 240 } 241 242 if (component && component->master != master) { 243 dev_dbg(master->parent, "master is not for this component (%s)\n", 244 dev_name(component->dev)); 245 return 0; 246 } 247 248 if (!devres_open_group(master->parent, master, GFP_KERNEL)) 249 return -ENOMEM; 250 251 /* Found all components */ 252 ret = master->ops->bind(master->parent); 253 if (ret < 0) { 254 devres_release_group(master->parent, NULL); 255 if (ret != -EPROBE_DEFER) 256 dev_info(master->parent, "master bind failed: %d\n", ret); 257 return ret; 258 } 259 260 devres_close_group(master->parent, NULL); 261 master->bound = true; 262 return 1; 263 } 264 265 static int try_to_bring_up_masters(struct component *component) 266 { 267 struct master *m; 268 int ret = 0; 269 270 list_for_each_entry(m, &masters, node) { 271 if (!m->bound) { 272 ret = try_to_bring_up_master(m, component); 273 if (ret != 0) 274 break; 275 } 276 } 277 278 return ret; 279 } 280 281 static void take_down_master(struct master *master) 282 { 283 if (master->bound) { 284 master->ops->unbind(master->parent); 285 devres_release_group(master->parent, master); 286 master->bound = false; 287 } 288 } 289 290 static void devm_component_match_release(struct device *parent, void *res) 291 { 292 struct component_match *match = res; 293 unsigned int i; 294 295 for (i = 0; i < match->num; i++) { 296 struct component_match_array *mc = &match->compare[i]; 297 298 if (mc->release) 299 mc->release(parent, mc->data); 300 } 301 302 kfree(match->compare); 303 } 304 305 static int component_match_realloc(struct component_match *match, size_t num) 306 { 307 struct component_match_array *new; 308 309 if (match->alloc == num) 310 return 0; 311 312 new = kmalloc_array(num, sizeof(*new), GFP_KERNEL); 313 if (!new) 314 return -ENOMEM; 315 316 if (match->compare) { 317 memcpy(new, match->compare, sizeof(*new) * 318 min(match->num, num)); 319 kfree(match->compare); 320 } 321 match->compare = new; 322 match->alloc = num; 323 324 return 0; 325 } 326 327 static void __component_match_add(struct device *master, 328 struct component_match **matchptr, 329 void (*release)(struct device *, void *), 330 int (*compare)(struct device *, void *), 331 int (*compare_typed)(struct device *, int, void *), 332 void *compare_data) 333 { 334 struct component_match *match = *matchptr; 335 336 if (IS_ERR(match)) 337 return; 338 339 if (!match) { 340 match = devres_alloc(devm_component_match_release, 341 sizeof(*match), GFP_KERNEL); 342 if (!match) { 343 *matchptr = ERR_PTR(-ENOMEM); 344 return; 345 } 346 347 devres_add(master, match); 348 349 *matchptr = match; 350 } 351 352 if (match->num == match->alloc) { 353 size_t new_size = match->alloc + 16; 354 int ret; 355 356 ret = component_match_realloc(match, new_size); 357 if (ret) { 358 *matchptr = ERR_PTR(ret); 359 return; 360 } 361 } 362 363 match->compare[match->num].compare = compare; 364 match->compare[match->num].compare_typed = compare_typed; 365 match->compare[match->num].release = release; 366 match->compare[match->num].data = compare_data; 367 match->compare[match->num].component = NULL; 368 match->num++; 369 } 370 371 /** 372 * component_match_add_release - add a component match entry with release callback 373 * @master: device with the aggregate driver 374 * @matchptr: pointer to the list of component matches 375 * @release: release function for @compare_data 376 * @compare: compare function to match against all components 377 * @compare_data: opaque pointer passed to the @compare function 378 * 379 * Adds a new component match to the list stored in @matchptr, which the @master 380 * aggregate driver needs to function. The list of component matches pointed to 381 * by @matchptr must be initialized to NULL before adding the first match. This 382 * only matches against components added with component_add(). 383 * 384 * The allocated match list in @matchptr is automatically released using devm 385 * actions, where upon @release will be called to free any references held by 386 * @compare_data, e.g. when @compare_data is a &device_node that must be 387 * released with of_node_put(). 388 * 389 * See also component_match_add() and component_match_add_typed(). 390 */ 391 void component_match_add_release(struct device *master, 392 struct component_match **matchptr, 393 void (*release)(struct device *, void *), 394 int (*compare)(struct device *, void *), void *compare_data) 395 { 396 __component_match_add(master, matchptr, release, compare, NULL, 397 compare_data); 398 } 399 EXPORT_SYMBOL(component_match_add_release); 400 401 /** 402 * component_match_add_typed - add a component match entry for a typed component 403 * @master: device with the aggregate driver 404 * @matchptr: pointer to the list of component matches 405 * @compare_typed: compare function to match against all typed components 406 * @compare_data: opaque pointer passed to the @compare function 407 * 408 * Adds a new component match to the list stored in @matchptr, which the @master 409 * aggregate driver needs to function. The list of component matches pointed to 410 * by @matchptr must be initialized to NULL before adding the first match. This 411 * only matches against components added with component_add_typed(). 412 * 413 * The allocated match list in @matchptr is automatically released using devm 414 * actions. 415 * 416 * See also component_match_add_release() and component_match_add_typed(). 417 */ 418 void component_match_add_typed(struct device *master, 419 struct component_match **matchptr, 420 int (*compare_typed)(struct device *, int, void *), void *compare_data) 421 { 422 __component_match_add(master, matchptr, NULL, NULL, compare_typed, 423 compare_data); 424 } 425 EXPORT_SYMBOL(component_match_add_typed); 426 427 static void free_master(struct master *master) 428 { 429 struct component_match *match = master->match; 430 int i; 431 432 component_master_debugfs_del(master); 433 list_del(&master->node); 434 435 if (match) { 436 for (i = 0; i < match->num; i++) { 437 struct component *c = match->compare[i].component; 438 if (c) 439 c->master = NULL; 440 } 441 } 442 443 kfree(master); 444 } 445 446 /** 447 * component_master_add_with_match - register an aggregate driver 448 * @parent: parent device of the aggregate driver 449 * @ops: callbacks for the aggregate driver 450 * @match: component match list for the aggregate driver 451 * 452 * Registers a new aggregate driver consisting of the components added to @match 453 * by calling one of the component_match_add() functions. Once all components in 454 * @match are available, it will be assembled by calling 455 * &component_master_ops.bind from @ops. Must be unregistered by calling 456 * component_master_del(). 457 */ 458 int component_master_add_with_match(struct device *parent, 459 const struct component_master_ops *ops, 460 struct component_match *match) 461 { 462 struct master *master; 463 int ret; 464 465 /* Reallocate the match array for its true size */ 466 ret = component_match_realloc(match, match->num); 467 if (ret) 468 return ret; 469 470 master = kzalloc(sizeof(*master), GFP_KERNEL); 471 if (!master) 472 return -ENOMEM; 473 474 master->parent = parent; 475 master->ops = ops; 476 master->match = match; 477 478 component_master_debugfs_add(master); 479 /* Add to the list of available masters. */ 480 mutex_lock(&component_mutex); 481 list_add(&master->node, &masters); 482 483 ret = try_to_bring_up_master(master, NULL); 484 485 if (ret < 0) 486 free_master(master); 487 488 mutex_unlock(&component_mutex); 489 490 return ret < 0 ? ret : 0; 491 } 492 EXPORT_SYMBOL_GPL(component_master_add_with_match); 493 494 /** 495 * component_master_del - unregister an aggregate driver 496 * @parent: parent device of the aggregate driver 497 * @ops: callbacks for the aggregate driver 498 * 499 * Unregisters an aggregate driver registered with 500 * component_master_add_with_match(). If necessary the aggregate driver is first 501 * disassembled by calling &component_master_ops.unbind from @ops. 502 */ 503 void component_master_del(struct device *parent, 504 const struct component_master_ops *ops) 505 { 506 struct master *master; 507 508 mutex_lock(&component_mutex); 509 master = __master_find(parent, ops); 510 if (master) { 511 take_down_master(master); 512 free_master(master); 513 } 514 mutex_unlock(&component_mutex); 515 } 516 EXPORT_SYMBOL_GPL(component_master_del); 517 518 static void component_unbind(struct component *component, 519 struct master *master, void *data) 520 { 521 WARN_ON(!component->bound); 522 523 if (component->ops && component->ops->unbind) 524 component->ops->unbind(component->dev, master->parent, data); 525 component->bound = false; 526 527 /* Release all resources claimed in the binding of this component */ 528 devres_release_group(component->dev, component); 529 } 530 531 /** 532 * component_unbind_all - unbind all components of an aggregate driver 533 * @parent: parent device of the aggregate driver 534 * @data: opaque pointer, passed to all components 535 * 536 * Unbinds all components of the aggregate device by passing @data to their 537 * &component_ops.unbind functions. Should be called from 538 * &component_master_ops.unbind. 539 */ 540 void component_unbind_all(struct device *parent, void *data) 541 { 542 struct master *master; 543 struct component *c; 544 size_t i; 545 546 WARN_ON(!mutex_is_locked(&component_mutex)); 547 548 master = __master_find(parent, NULL); 549 if (!master) 550 return; 551 552 /* Unbind components in reverse order */ 553 for (i = master->match->num; i--; ) 554 if (!master->match->compare[i].duplicate) { 555 c = master->match->compare[i].component; 556 component_unbind(c, master, data); 557 } 558 } 559 EXPORT_SYMBOL_GPL(component_unbind_all); 560 561 static int component_bind(struct component *component, struct master *master, 562 void *data) 563 { 564 int ret; 565 566 /* 567 * Each component initialises inside its own devres group. 568 * This allows us to roll-back a failed component without 569 * affecting anything else. 570 */ 571 if (!devres_open_group(master->parent, NULL, GFP_KERNEL)) 572 return -ENOMEM; 573 574 /* 575 * Also open a group for the device itself: this allows us 576 * to release the resources claimed against the sub-device 577 * at the appropriate moment. 578 */ 579 if (!devres_open_group(component->dev, component, GFP_KERNEL)) { 580 devres_release_group(master->parent, NULL); 581 return -ENOMEM; 582 } 583 584 dev_dbg(master->parent, "binding %s (ops %ps)\n", 585 dev_name(component->dev), component->ops); 586 587 ret = component->ops->bind(component->dev, master->parent, data); 588 if (!ret) { 589 component->bound = true; 590 591 /* 592 * Close the component device's group so that resources 593 * allocated in the binding are encapsulated for removal 594 * at unbind. Remove the group on the DRM device as we 595 * can clean those resources up independently. 596 */ 597 devres_close_group(component->dev, NULL); 598 devres_remove_group(master->parent, NULL); 599 600 dev_info(master->parent, "bound %s (ops %ps)\n", 601 dev_name(component->dev), component->ops); 602 } else { 603 devres_release_group(component->dev, NULL); 604 devres_release_group(master->parent, NULL); 605 606 if (ret != -EPROBE_DEFER) 607 dev_err(master->parent, "failed to bind %s (ops %ps): %d\n", 608 dev_name(component->dev), component->ops, ret); 609 } 610 611 return ret; 612 } 613 614 /** 615 * component_bind_all - bind all components of an aggregate driver 616 * @parent: parent device of the aggregate driver 617 * @data: opaque pointer, passed to all components 618 * 619 * Binds all components of the aggregate @dev by passing @data to their 620 * &component_ops.bind functions. Should be called from 621 * &component_master_ops.bind. 622 */ 623 int component_bind_all(struct device *parent, void *data) 624 { 625 struct master *master; 626 struct component *c; 627 size_t i; 628 int ret = 0; 629 630 WARN_ON(!mutex_is_locked(&component_mutex)); 631 632 master = __master_find(parent, NULL); 633 if (!master) 634 return -EINVAL; 635 636 /* Bind components in match order */ 637 for (i = 0; i < master->match->num; i++) 638 if (!master->match->compare[i].duplicate) { 639 c = master->match->compare[i].component; 640 ret = component_bind(c, master, data); 641 if (ret) 642 break; 643 } 644 645 if (ret != 0) { 646 for (; i > 0; i--) 647 if (!master->match->compare[i - 1].duplicate) { 648 c = master->match->compare[i - 1].component; 649 component_unbind(c, master, data); 650 } 651 } 652 653 return ret; 654 } 655 EXPORT_SYMBOL_GPL(component_bind_all); 656 657 static int __component_add(struct device *dev, const struct component_ops *ops, 658 int subcomponent) 659 { 660 struct component *component; 661 int ret; 662 663 component = kzalloc(sizeof(*component), GFP_KERNEL); 664 if (!component) 665 return -ENOMEM; 666 667 component->ops = ops; 668 component->dev = dev; 669 component->subcomponent = subcomponent; 670 671 dev_dbg(dev, "adding component (ops %ps)\n", ops); 672 673 mutex_lock(&component_mutex); 674 list_add_tail(&component->node, &component_list); 675 676 ret = try_to_bring_up_masters(component); 677 if (ret < 0) { 678 if (component->master) 679 remove_component(component->master, component); 680 list_del(&component->node); 681 682 kfree(component); 683 } 684 mutex_unlock(&component_mutex); 685 686 return ret < 0 ? ret : 0; 687 } 688 689 /** 690 * component_add_typed - register a component 691 * @dev: component device 692 * @ops: component callbacks 693 * @subcomponent: nonzero identifier for subcomponents 694 * 695 * Register a new component for @dev. Functions in @ops will be call when the 696 * aggregate driver is ready to bind the overall driver by calling 697 * component_bind_all(). See also &struct component_ops. 698 * 699 * @subcomponent must be nonzero and is used to differentiate between multiple 700 * components registerd on the same device @dev. These components are match 701 * using component_match_add_typed(). 702 * 703 * The component needs to be unregistered at driver unload/disconnect by 704 * calling component_del(). 705 * 706 * See also component_add(). 707 */ 708 int component_add_typed(struct device *dev, const struct component_ops *ops, 709 int subcomponent) 710 { 711 if (WARN_ON(subcomponent == 0)) 712 return -EINVAL; 713 714 return __component_add(dev, ops, subcomponent); 715 } 716 EXPORT_SYMBOL_GPL(component_add_typed); 717 718 /** 719 * component_add - register a component 720 * @dev: component device 721 * @ops: component callbacks 722 * 723 * Register a new component for @dev. Functions in @ops will be called when the 724 * aggregate driver is ready to bind the overall driver by calling 725 * component_bind_all(). See also &struct component_ops. 726 * 727 * The component needs to be unregistered at driver unload/disconnect by 728 * calling component_del(). 729 * 730 * See also component_add_typed() for a variant that allows multipled different 731 * components on the same device. 732 */ 733 int component_add(struct device *dev, const struct component_ops *ops) 734 { 735 return __component_add(dev, ops, 0); 736 } 737 EXPORT_SYMBOL_GPL(component_add); 738 739 /** 740 * component_del - unregister a component 741 * @dev: component device 742 * @ops: component callbacks 743 * 744 * Unregister a component added with component_add(). If the component is bound 745 * into an aggregate driver, this will force the entire aggregate driver, including 746 * all its components, to be unbound. 747 */ 748 void component_del(struct device *dev, const struct component_ops *ops) 749 { 750 struct component *c, *component = NULL; 751 752 mutex_lock(&component_mutex); 753 list_for_each_entry(c, &component_list, node) 754 if (c->dev == dev && c->ops == ops) { 755 list_del(&c->node); 756 component = c; 757 break; 758 } 759 760 if (component && component->master) { 761 take_down_master(component->master); 762 remove_component(component->master, component); 763 } 764 765 mutex_unlock(&component_mutex); 766 767 WARN_ON(!component); 768 kfree(component); 769 } 770 EXPORT_SYMBOL_GPL(component_del); 771