1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * V4L2 asynchronous subdevice registration API 4 * 5 * Copyright (C) 2012-2013, Guennadi Liakhovetski <g.liakhovetski@gmx.de> 6 */ 7 8 #include <linux/debugfs.h> 9 #include <linux/device.h> 10 #include <linux/err.h> 11 #include <linux/i2c.h> 12 #include <linux/list.h> 13 #include <linux/mm.h> 14 #include <linux/module.h> 15 #include <linux/mutex.h> 16 #include <linux/of.h> 17 #include <linux/platform_device.h> 18 #include <linux/seq_file.h> 19 #include <linux/slab.h> 20 #include <linux/types.h> 21 22 #include <media/v4l2-async.h> 23 #include <media/v4l2-device.h> 24 #include <media/v4l2-fwnode.h> 25 #include <media/v4l2-subdev.h> 26 27 #include "v4l2-subdev-priv.h" 28 29 static int v4l2_async_nf_call_bound(struct v4l2_async_notifier *n, 30 struct v4l2_subdev *subdev, 31 struct v4l2_async_connection *asc) 32 { 33 if (!n->ops || !n->ops->bound) 34 return 0; 35 36 return n->ops->bound(n, subdev, asc); 37 } 38 39 static void v4l2_async_nf_call_unbind(struct v4l2_async_notifier *n, 40 struct v4l2_subdev *subdev, 41 struct v4l2_async_connection *asc) 42 { 43 if (!n->ops || !n->ops->unbind) 44 return; 45 46 n->ops->unbind(n, subdev, asc); 47 } 48 49 static int v4l2_async_nf_call_complete(struct v4l2_async_notifier *n) 50 { 51 if (!n->ops || !n->ops->complete) 52 return 0; 53 54 return n->ops->complete(n); 55 } 56 57 static void v4l2_async_nf_call_destroy(struct v4l2_async_notifier *n, 58 struct v4l2_async_connection *asc) 59 { 60 if (!n->ops || !n->ops->destroy) 61 return; 62 63 n->ops->destroy(asc); 64 } 65 66 static bool match_i2c(struct v4l2_async_notifier *notifier, 67 struct v4l2_subdev *sd, 68 struct v4l2_async_match_desc *match) 69 { 70 #if IS_ENABLED(CONFIG_I2C) 71 struct i2c_client *client = i2c_verify_client(sd->dev); 72 73 return client && 74 match->i2c.adapter_id == client->adapter->nr && 75 match->i2c.address == client->addr; 76 #else 77 return false; 78 #endif 79 } 80 81 static struct device *notifier_dev(struct v4l2_async_notifier *notifier) 82 { 83 if (notifier->sd) 84 return notifier->sd->dev; 85 86 if (notifier->v4l2_dev) 87 return notifier->v4l2_dev->dev; 88 89 return NULL; 90 } 91 92 static bool 93 match_fwnode_one(struct v4l2_async_notifier *notifier, 94 struct v4l2_subdev *sd, struct fwnode_handle *sd_fwnode, 95 struct v4l2_async_match_desc *match) 96 { 97 struct fwnode_handle *asd_dev_fwnode; 98 bool ret; 99 100 dev_dbg(notifier_dev(notifier), 101 "v4l2-async: fwnode match: need %pfw, trying %pfw\n", 102 sd_fwnode, match->fwnode); 103 104 if (sd_fwnode == match->fwnode) { 105 dev_dbg(notifier_dev(notifier), 106 "v4l2-async: direct match found\n"); 107 return true; 108 } 109 110 if (!fwnode_graph_is_endpoint(match->fwnode)) { 111 dev_dbg(notifier_dev(notifier), 112 "v4l2-async: direct match not found\n"); 113 return false; 114 } 115 116 asd_dev_fwnode = fwnode_graph_get_port_parent(match->fwnode); 117 118 ret = sd_fwnode == asd_dev_fwnode; 119 120 fwnode_handle_put(asd_dev_fwnode); 121 122 dev_dbg(notifier_dev(notifier), 123 "v4l2-async: device--endpoint match %sfound\n", 124 ret ? "" : "not "); 125 126 return ret; 127 } 128 129 static bool match_fwnode(struct v4l2_async_notifier *notifier, 130 struct v4l2_subdev *sd, 131 struct v4l2_async_match_desc *match) 132 { 133 dev_dbg(notifier_dev(notifier), 134 "v4l2-async: matching for notifier %pfw, sd fwnode %pfw\n", 135 dev_fwnode(notifier_dev(notifier)), sd->fwnode); 136 137 if (!list_empty(&sd->async_subdev_endpoint_list)) { 138 struct v4l2_async_subdev_endpoint *ase; 139 140 dev_dbg(sd->dev, 141 "v4l2-async: endpoint fwnode list available, looking for %pfw\n", 142 match->fwnode); 143 144 list_for_each_entry(ase, &sd->async_subdev_endpoint_list, 145 async_subdev_endpoint_entry) { 146 bool matched = ase->endpoint == match->fwnode; 147 148 dev_dbg(sd->dev, 149 "v4l2-async: endpoint-endpoint match %sfound with %pfw\n", 150 matched ? "" : "not ", ase->endpoint); 151 152 if (matched) 153 return true; 154 } 155 156 dev_dbg(sd->dev, "async: no endpoint matched\n"); 157 158 return false; 159 } 160 161 if (match_fwnode_one(notifier, sd, sd->fwnode, match)) 162 return true; 163 164 /* Also check the secondary fwnode. */ 165 if (IS_ERR_OR_NULL(sd->fwnode->secondary)) 166 return false; 167 168 dev_dbg(notifier_dev(notifier), 169 "v4l2-async: trying secondary fwnode match\n"); 170 171 return match_fwnode_one(notifier, sd, sd->fwnode->secondary, match); 172 } 173 174 static LIST_HEAD(subdev_list); 175 static LIST_HEAD(notifier_list); 176 static DEFINE_MUTEX(list_lock); 177 178 static struct v4l2_async_connection * 179 v4l2_async_find_match(struct v4l2_async_notifier *notifier, 180 struct v4l2_subdev *sd) 181 { 182 bool (*match)(struct v4l2_async_notifier *notifier, 183 struct v4l2_subdev *sd, 184 struct v4l2_async_match_desc *match); 185 struct v4l2_async_connection *asc; 186 187 list_for_each_entry(asc, ¬ifier->waiting_list, asc_entry) { 188 /* bus_type has been verified valid before */ 189 switch (asc->match.type) { 190 case V4L2_ASYNC_MATCH_TYPE_I2C: 191 match = match_i2c; 192 break; 193 case V4L2_ASYNC_MATCH_TYPE_FWNODE: 194 match = match_fwnode; 195 break; 196 default: 197 /* Cannot happen, unless someone breaks us */ 198 WARN_ON(true); 199 return NULL; 200 } 201 202 /* match cannot be NULL here */ 203 if (match(notifier, sd, &asc->match)) 204 return asc; 205 } 206 207 return NULL; 208 } 209 210 /* Compare two async match descriptors for equivalence */ 211 static bool v4l2_async_match_equal(struct v4l2_async_match_desc *match1, 212 struct v4l2_async_match_desc *match2) 213 { 214 if (match1->type != match2->type) 215 return false; 216 217 switch (match1->type) { 218 case V4L2_ASYNC_MATCH_TYPE_I2C: 219 return match1->i2c.adapter_id == match2->i2c.adapter_id && 220 match1->i2c.address == match2->i2c.address; 221 case V4L2_ASYNC_MATCH_TYPE_FWNODE: 222 return match1->fwnode == match2->fwnode; 223 default: 224 break; 225 } 226 227 return false; 228 } 229 230 /* Find the sub-device notifier registered by a sub-device driver. */ 231 static struct v4l2_async_notifier * 232 v4l2_async_find_subdev_notifier(struct v4l2_subdev *sd) 233 { 234 struct v4l2_async_notifier *n; 235 236 list_for_each_entry(n, ¬ifier_list, notifier_entry) 237 if (n->sd == sd) 238 return n; 239 240 return NULL; 241 } 242 243 /* Get v4l2_device related to the notifier if one can be found. */ 244 static struct v4l2_device * 245 v4l2_async_nf_find_v4l2_dev(struct v4l2_async_notifier *notifier) 246 { 247 while (notifier->parent) 248 notifier = notifier->parent; 249 250 return notifier->v4l2_dev; 251 } 252 253 /* 254 * Return true if all child sub-device notifiers are complete, false otherwise. 255 */ 256 static bool 257 v4l2_async_nf_can_complete(struct v4l2_async_notifier *notifier) 258 { 259 struct v4l2_async_connection *asc; 260 261 if (!list_empty(¬ifier->waiting_list)) 262 return false; 263 264 list_for_each_entry(asc, ¬ifier->done_list, asc_entry) { 265 struct v4l2_async_notifier *subdev_notifier = 266 v4l2_async_find_subdev_notifier(asc->sd); 267 268 if (subdev_notifier && 269 !v4l2_async_nf_can_complete(subdev_notifier)) 270 return false; 271 } 272 273 return true; 274 } 275 276 /* 277 * Complete the master notifier if possible. This is done when all async 278 * sub-devices have been bound; v4l2_device is also available then. 279 */ 280 static int 281 v4l2_async_nf_try_complete(struct v4l2_async_notifier *notifier) 282 { 283 struct v4l2_async_notifier *__notifier = notifier; 284 285 /* Quick check whether there are still more sub-devices here. */ 286 if (!list_empty(¬ifier->waiting_list)) 287 return 0; 288 289 if (notifier->sd) 290 dev_dbg(notifier_dev(notifier), 291 "v4l2-async: trying to complete\n"); 292 293 /* Check the entire notifier tree; find the root notifier first. */ 294 while (notifier->parent) 295 notifier = notifier->parent; 296 297 /* This is root if it has v4l2_dev. */ 298 if (!notifier->v4l2_dev) { 299 dev_dbg(notifier_dev(__notifier), 300 "v4l2-async: V4L2 device not available\n"); 301 return 0; 302 } 303 304 /* Is everything ready? */ 305 if (!v4l2_async_nf_can_complete(notifier)) 306 return 0; 307 308 dev_dbg(notifier_dev(__notifier), "v4l2-async: complete\n"); 309 310 return v4l2_async_nf_call_complete(notifier); 311 } 312 313 static int 314 v4l2_async_nf_try_all_subdevs(struct v4l2_async_notifier *notifier); 315 316 static int v4l2_async_create_ancillary_links(struct v4l2_async_notifier *n, 317 struct v4l2_subdev *sd) 318 { 319 #if IS_ENABLED(CONFIG_MEDIA_CONTROLLER) 320 struct media_link *link; 321 322 if (sd->entity.function != MEDIA_ENT_F_LENS && 323 sd->entity.function != MEDIA_ENT_F_FLASH) 324 return 0; 325 326 if (!n->sd) { 327 dev_warn(notifier_dev(n), 328 "not a sub-device notifier, not creating an ancillary link for %s!\n", 329 dev_name(sd->dev)); 330 return 0; 331 } 332 333 link = media_create_ancillary_link(&n->sd->entity, &sd->entity); 334 335 return IS_ERR(link) ? PTR_ERR(link) : 0; 336 #else 337 return 0; 338 #endif 339 } 340 341 static int v4l2_async_match_notify(struct v4l2_async_notifier *notifier, 342 struct v4l2_device *v4l2_dev, 343 struct v4l2_subdev *sd, 344 struct v4l2_async_connection *asc) 345 { 346 bool registered = false; 347 int ret; 348 349 if (list_empty(&sd->asc_list)) { 350 ret = __v4l2_device_register_subdev(v4l2_dev, sd, sd->owner); 351 if (ret < 0) 352 return ret; 353 registered = true; 354 } 355 356 ret = v4l2_async_nf_call_bound(notifier, sd, asc); 357 if (ret < 0) { 358 if (asc->match.type == V4L2_ASYNC_MATCH_TYPE_FWNODE) 359 dev_dbg(notifier_dev(notifier), 360 "failed binding %pfw (%d)\n", 361 asc->match.fwnode, ret); 362 goto err_unregister_subdev; 363 } 364 365 if (registered) { 366 /* 367 * Depending of the function of the entities involved, we may 368 * want to create links between them (for example between a 369 * sensor and its lens or between a sensor's source pad and the 370 * connected device's sink pad). 371 */ 372 ret = v4l2_async_create_ancillary_links(notifier, sd); 373 if (ret) { 374 if (asc->match.type == V4L2_ASYNC_MATCH_TYPE_FWNODE) 375 dev_dbg(notifier_dev(notifier), 376 "failed creating links for %pfw (%d)\n", 377 asc->match.fwnode, ret); 378 goto err_call_unbind; 379 } 380 } 381 382 list_add(&asc->asc_subdev_entry, &sd->asc_list); 383 asc->sd = sd; 384 385 /* Move from the waiting list to notifier's done */ 386 list_move(&asc->asc_entry, ¬ifier->done_list); 387 388 dev_dbg(notifier_dev(notifier), "v4l2-async: %s bound (ret %d)\n", 389 dev_name(sd->dev), ret); 390 391 return 0; 392 393 err_call_unbind: 394 v4l2_async_nf_call_unbind(notifier, sd, asc); 395 396 err_unregister_subdev: 397 if (registered) 398 v4l2_device_unregister_subdev(sd); 399 400 return ret; 401 } 402 403 static int 404 v4l2_async_nf_try_subdev_notifier(struct v4l2_async_notifier *notifier, 405 struct v4l2_subdev *sd) 406 { 407 struct v4l2_async_notifier *subdev_notifier; 408 409 /* 410 * See if the sub-device has a notifier. If not, return here. 411 */ 412 subdev_notifier = v4l2_async_find_subdev_notifier(sd); 413 if (!subdev_notifier || subdev_notifier->parent) 414 return 0; 415 416 /* 417 * Proceed with checking for the sub-device notifier's async 418 * sub-devices, and return the result. The error will be handled by the 419 * caller. 420 */ 421 subdev_notifier->parent = notifier; 422 423 return v4l2_async_nf_try_all_subdevs(subdev_notifier); 424 } 425 426 /* Test all async sub-devices in a notifier for a match. */ 427 static int 428 v4l2_async_nf_try_all_subdevs(struct v4l2_async_notifier *notifier) 429 { 430 struct v4l2_device *v4l2_dev = 431 v4l2_async_nf_find_v4l2_dev(notifier); 432 struct v4l2_subdev *sd; 433 434 if (!v4l2_dev) 435 return 0; 436 437 dev_dbg(notifier_dev(notifier), "v4l2-async: trying all sub-devices\n"); 438 439 again: 440 list_for_each_entry(sd, &subdev_list, async_list) { 441 struct v4l2_async_connection *asc; 442 int ret; 443 444 asc = v4l2_async_find_match(notifier, sd); 445 if (!asc) 446 continue; 447 448 dev_dbg(notifier_dev(notifier), 449 "v4l2-async: match found, subdev %s\n", sd->name); 450 451 ret = v4l2_async_match_notify(notifier, v4l2_dev, sd, asc); 452 if (ret < 0) 453 return ret; 454 455 ret = v4l2_async_nf_try_subdev_notifier(notifier, sd); 456 if (ret < 0) 457 return ret; 458 459 /* 460 * v4l2_async_match_notify() may lead to registering a 461 * new notifier and thus changing the async subdevs 462 * list. In order to proceed safely from here, restart 463 * parsing the list from the beginning. 464 */ 465 goto again; 466 } 467 468 return 0; 469 } 470 471 static void v4l2_async_unbind_subdev_one(struct v4l2_async_notifier *notifier, 472 struct v4l2_async_connection *asc) 473 { 474 list_move_tail(&asc->asc_entry, ¬ifier->waiting_list); 475 if (list_is_singular(&asc->asc_subdev_entry)) { 476 v4l2_async_nf_call_unbind(notifier, asc->sd, asc); 477 v4l2_device_unregister_subdev(asc->sd); 478 asc->sd = NULL; 479 } 480 list_del(&asc->asc_subdev_entry); 481 } 482 483 /* Unbind all sub-devices in the notifier tree. */ 484 static void 485 v4l2_async_nf_unbind_all_subdevs(struct v4l2_async_notifier *notifier) 486 { 487 struct v4l2_async_connection *asc, *asc_tmp; 488 489 list_for_each_entry_safe(asc, asc_tmp, ¬ifier->done_list, 490 asc_entry) { 491 struct v4l2_async_notifier *subdev_notifier = 492 v4l2_async_find_subdev_notifier(asc->sd); 493 494 if (subdev_notifier) 495 v4l2_async_nf_unbind_all_subdevs(subdev_notifier); 496 497 v4l2_async_unbind_subdev_one(notifier, asc); 498 } 499 500 notifier->parent = NULL; 501 } 502 503 /* See if an async sub-device can be found in a notifier's lists. */ 504 static bool 505 v4l2_async_nf_has_async_match_entry(struct v4l2_async_notifier *notifier, 506 struct v4l2_async_match_desc *match) 507 { 508 struct v4l2_async_connection *asc; 509 510 list_for_each_entry(asc, ¬ifier->waiting_list, asc_entry) 511 if (v4l2_async_match_equal(&asc->match, match)) 512 return true; 513 514 list_for_each_entry(asc, ¬ifier->done_list, asc_entry) 515 if (v4l2_async_match_equal(&asc->match, match)) 516 return true; 517 518 return false; 519 } 520 521 /* 522 * Find out whether an async sub-device was set up already or whether it exists 523 * in a given notifier. 524 */ 525 static bool 526 v4l2_async_nf_has_async_match(struct v4l2_async_notifier *notifier, 527 struct v4l2_async_match_desc *match) 528 { 529 struct list_head *heads[] = { 530 ¬ifier->waiting_list, 531 ¬ifier->done_list, 532 }; 533 unsigned int i; 534 535 lockdep_assert_held(&list_lock); 536 537 /* Check that an asd is not being added more than once. */ 538 for (i = 0; i < ARRAY_SIZE(heads); i++) { 539 struct v4l2_async_connection *asc; 540 541 list_for_each_entry(asc, heads[i], asc_entry) { 542 if (&asc->match == match) 543 continue; 544 if (v4l2_async_match_equal(&asc->match, match)) 545 return true; 546 } 547 } 548 549 /* Check that an asc does not exist in other notifiers. */ 550 list_for_each_entry(notifier, ¬ifier_list, notifier_entry) 551 if (v4l2_async_nf_has_async_match_entry(notifier, match)) 552 return true; 553 554 return false; 555 } 556 557 static int v4l2_async_nf_match_valid(struct v4l2_async_notifier *notifier, 558 struct v4l2_async_match_desc *match) 559 { 560 struct device *dev = notifier_dev(notifier); 561 562 switch (match->type) { 563 case V4L2_ASYNC_MATCH_TYPE_I2C: 564 case V4L2_ASYNC_MATCH_TYPE_FWNODE: 565 if (v4l2_async_nf_has_async_match(notifier, match)) { 566 dev_dbg(dev, "v4l2-async: match descriptor already listed in a notifier\n"); 567 return -EEXIST; 568 } 569 break; 570 default: 571 dev_err(dev, "v4l2-async: Invalid match type %u on %p\n", 572 match->type, match); 573 return -EINVAL; 574 } 575 576 return 0; 577 } 578 579 void v4l2_async_nf_init(struct v4l2_async_notifier *notifier, 580 struct v4l2_device *v4l2_dev) 581 { 582 INIT_LIST_HEAD(¬ifier->waiting_list); 583 INIT_LIST_HEAD(¬ifier->done_list); 584 INIT_LIST_HEAD(¬ifier->notifier_entry); 585 notifier->v4l2_dev = v4l2_dev; 586 } 587 EXPORT_SYMBOL(v4l2_async_nf_init); 588 589 void v4l2_async_subdev_nf_init(struct v4l2_async_notifier *notifier, 590 struct v4l2_subdev *sd) 591 { 592 INIT_LIST_HEAD(¬ifier->waiting_list); 593 INIT_LIST_HEAD(¬ifier->done_list); 594 INIT_LIST_HEAD(¬ifier->notifier_entry); 595 notifier->sd = sd; 596 } 597 EXPORT_SYMBOL_GPL(v4l2_async_subdev_nf_init); 598 599 static int __v4l2_async_nf_register(struct v4l2_async_notifier *notifier) 600 { 601 struct v4l2_async_connection *asc; 602 int ret; 603 604 mutex_lock(&list_lock); 605 606 list_for_each_entry(asc, ¬ifier->waiting_list, asc_entry) { 607 ret = v4l2_async_nf_match_valid(notifier, &asc->match); 608 if (ret) 609 goto err_unlock; 610 } 611 612 ret = v4l2_async_nf_try_all_subdevs(notifier); 613 if (ret < 0) 614 goto err_unbind; 615 616 ret = v4l2_async_nf_try_complete(notifier); 617 if (ret < 0) 618 goto err_unbind; 619 620 /* Keep also completed notifiers on the list */ 621 list_add(¬ifier->notifier_entry, ¬ifier_list); 622 623 mutex_unlock(&list_lock); 624 625 return 0; 626 627 err_unbind: 628 /* 629 * On failure, unbind all sub-devices registered through this notifier. 630 */ 631 v4l2_async_nf_unbind_all_subdevs(notifier); 632 633 err_unlock: 634 mutex_unlock(&list_lock); 635 636 return ret; 637 } 638 639 int v4l2_async_nf_register(struct v4l2_async_notifier *notifier) 640 { 641 if (WARN_ON(!notifier->v4l2_dev == !notifier->sd)) 642 return -EINVAL; 643 644 return __v4l2_async_nf_register(notifier); 645 } 646 EXPORT_SYMBOL(v4l2_async_nf_register); 647 648 static void 649 __v4l2_async_nf_unregister(struct v4l2_async_notifier *notifier) 650 { 651 if (!notifier || (!notifier->v4l2_dev && !notifier->sd)) 652 return; 653 654 v4l2_async_nf_unbind_all_subdevs(notifier); 655 656 list_del_init(¬ifier->notifier_entry); 657 } 658 659 void v4l2_async_nf_unregister(struct v4l2_async_notifier *notifier) 660 { 661 mutex_lock(&list_lock); 662 663 __v4l2_async_nf_unregister(notifier); 664 665 mutex_unlock(&list_lock); 666 } 667 EXPORT_SYMBOL(v4l2_async_nf_unregister); 668 669 static void __v4l2_async_nf_cleanup(struct v4l2_async_notifier *notifier) 670 { 671 struct v4l2_async_connection *asc, *tmp; 672 673 if (!notifier || !notifier->waiting_list.next) 674 return; 675 676 WARN_ON(!list_empty(¬ifier->done_list)); 677 678 list_for_each_entry_safe(asc, tmp, ¬ifier->waiting_list, asc_entry) { 679 list_del(&asc->asc_entry); 680 v4l2_async_nf_call_destroy(notifier, asc); 681 682 if (asc->match.type == V4L2_ASYNC_MATCH_TYPE_FWNODE) 683 fwnode_handle_put(asc->match.fwnode); 684 685 kfree(asc); 686 } 687 688 notifier->sd = NULL; 689 notifier->v4l2_dev = NULL; 690 } 691 692 void v4l2_async_nf_cleanup(struct v4l2_async_notifier *notifier) 693 { 694 mutex_lock(&list_lock); 695 696 __v4l2_async_nf_cleanup(notifier); 697 698 mutex_unlock(&list_lock); 699 } 700 EXPORT_SYMBOL_GPL(v4l2_async_nf_cleanup); 701 702 static void __v4l2_async_nf_add_connection(struct v4l2_async_notifier *notifier, 703 struct v4l2_async_connection *asc) 704 { 705 mutex_lock(&list_lock); 706 707 list_add_tail(&asc->asc_entry, ¬ifier->waiting_list); 708 709 mutex_unlock(&list_lock); 710 } 711 712 struct v4l2_async_connection * 713 __v4l2_async_nf_add_fwnode(struct v4l2_async_notifier *notifier, 714 struct fwnode_handle *fwnode, 715 unsigned int asc_struct_size) 716 { 717 struct v4l2_async_connection *asc; 718 719 asc = kzalloc(asc_struct_size, GFP_KERNEL); 720 if (!asc) 721 return ERR_PTR(-ENOMEM); 722 723 asc->notifier = notifier; 724 asc->match.type = V4L2_ASYNC_MATCH_TYPE_FWNODE; 725 asc->match.fwnode = fwnode_handle_get(fwnode); 726 727 __v4l2_async_nf_add_connection(notifier, asc); 728 729 return asc; 730 } 731 EXPORT_SYMBOL_GPL(__v4l2_async_nf_add_fwnode); 732 733 struct v4l2_async_connection * 734 __v4l2_async_nf_add_fwnode_remote(struct v4l2_async_notifier *notif, 735 struct fwnode_handle *endpoint, 736 unsigned int asc_struct_size) 737 { 738 struct v4l2_async_connection *asc; 739 struct fwnode_handle *remote; 740 741 remote = fwnode_graph_get_remote_endpoint(endpoint); 742 if (!remote) 743 return ERR_PTR(-ENOTCONN); 744 745 asc = __v4l2_async_nf_add_fwnode(notif, remote, asc_struct_size); 746 /* 747 * Calling __v4l2_async_nf_add_fwnode grabs a refcount, 748 * so drop the one we got in fwnode_graph_get_remote_port_parent. 749 */ 750 fwnode_handle_put(remote); 751 return asc; 752 } 753 EXPORT_SYMBOL_GPL(__v4l2_async_nf_add_fwnode_remote); 754 755 struct v4l2_async_connection * 756 __v4l2_async_nf_add_i2c(struct v4l2_async_notifier *notifier, int adapter_id, 757 unsigned short address, unsigned int asc_struct_size) 758 { 759 struct v4l2_async_connection *asc; 760 761 asc = kzalloc(asc_struct_size, GFP_KERNEL); 762 if (!asc) 763 return ERR_PTR(-ENOMEM); 764 765 asc->notifier = notifier; 766 asc->match.type = V4L2_ASYNC_MATCH_TYPE_I2C; 767 asc->match.i2c.adapter_id = adapter_id; 768 asc->match.i2c.address = address; 769 770 __v4l2_async_nf_add_connection(notifier, asc); 771 772 return asc; 773 } 774 EXPORT_SYMBOL_GPL(__v4l2_async_nf_add_i2c); 775 776 int v4l2_async_subdev_endpoint_add(struct v4l2_subdev *sd, 777 struct fwnode_handle *fwnode) 778 { 779 struct v4l2_async_subdev_endpoint *ase; 780 781 ase = kmalloc_obj(*ase); 782 if (!ase) 783 return -ENOMEM; 784 785 ase->endpoint = fwnode; 786 list_add(&ase->async_subdev_endpoint_entry, 787 &sd->async_subdev_endpoint_list); 788 789 return 0; 790 } 791 EXPORT_SYMBOL_GPL(v4l2_async_subdev_endpoint_add); 792 793 struct v4l2_async_connection * 794 v4l2_async_connection_unique(struct v4l2_subdev *sd) 795 { 796 if (!list_is_singular(&sd->asc_list)) 797 return NULL; 798 799 return list_first_entry(&sd->asc_list, 800 struct v4l2_async_connection, asc_subdev_entry); 801 } 802 EXPORT_SYMBOL_GPL(v4l2_async_connection_unique); 803 804 int __v4l2_async_register_subdev(struct v4l2_subdev *sd, struct module *module) 805 { 806 struct v4l2_async_notifier *subdev_notifier; 807 struct v4l2_async_notifier *notifier; 808 struct v4l2_async_connection *asc; 809 int ret; 810 811 INIT_LIST_HEAD(&sd->asc_list); 812 813 /* 814 * No reference taken. The reference is held by the device (struct 815 * v4l2_subdev.dev), and async sub-device does not exist independently 816 * of the device at any point of time. 817 * 818 * The async sub-device shall always be registered for its device node, 819 * not the endpoint node. 820 */ 821 if (!sd->fwnode && sd->dev) { 822 sd->fwnode = dev_fwnode(sd->dev); 823 } else if (fwnode_graph_is_endpoint(sd->fwnode)) { 824 dev_warn(sd->dev, "sub-device fwnode is an endpoint!\n"); 825 return -EINVAL; 826 } 827 828 sd->owner = module; 829 830 mutex_lock(&list_lock); 831 832 list_for_each_entry(notifier, ¬ifier_list, notifier_entry) { 833 struct v4l2_device *v4l2_dev = 834 v4l2_async_nf_find_v4l2_dev(notifier); 835 836 if (!v4l2_dev) 837 continue; 838 839 while ((asc = v4l2_async_find_match(notifier, sd))) { 840 ret = v4l2_async_match_notify(notifier, v4l2_dev, sd, 841 asc); 842 if (ret) 843 goto err_unlock; 844 845 ret = v4l2_async_nf_try_subdev_notifier(notifier, sd); 846 if (ret) 847 goto err_unbind_one; 848 849 ret = v4l2_async_nf_try_complete(notifier); 850 if (ret) 851 goto err_unbind; 852 } 853 } 854 855 /* None matched, wait for hot-plugging */ 856 list_add(&sd->async_list, &subdev_list); 857 858 mutex_unlock(&list_lock); 859 860 return 0; 861 862 err_unbind: 863 /* 864 * Complete failed. Unbind the sub-devices bound through registering 865 * this async sub-device. 866 */ 867 subdev_notifier = v4l2_async_find_subdev_notifier(sd); 868 if (subdev_notifier) 869 v4l2_async_nf_unbind_all_subdevs(subdev_notifier); 870 871 err_unbind_one: 872 v4l2_async_unbind_subdev_one(notifier, asc); 873 874 err_unlock: 875 mutex_unlock(&list_lock); 876 877 sd->owner = NULL; 878 879 return ret; 880 } 881 EXPORT_SYMBOL(__v4l2_async_register_subdev); 882 883 void v4l2_async_unregister_subdev(struct v4l2_subdev *sd) 884 { 885 struct v4l2_async_connection *asc, *asc_tmp; 886 887 if (!sd->async_list.next) 888 return; 889 890 v4l2_subdev_put_privacy_led(sd); 891 892 mutex_lock(&list_lock); 893 894 __v4l2_async_nf_unregister(sd->subdev_notifier); 895 __v4l2_async_nf_cleanup(sd->subdev_notifier); 896 kfree(sd->subdev_notifier); 897 sd->subdev_notifier = NULL; 898 899 if (sd->asc_list.next) { 900 if (list_empty(&sd->asc_list)) { 901 /* 902 * If the sub-device was registered through other means 903 * than v4l2-async, there are no async connections but 904 * the sub-device may still well be registered. 905 * Unregister it now. 906 */ 907 v4l2_device_unregister_subdev(sd); 908 } else { 909 list_for_each_entry_safe(asc, asc_tmp, &sd->asc_list, 910 asc_subdev_entry) 911 v4l2_async_unbind_subdev_one(asc->notifier, asc); 912 } 913 } 914 915 list_del(&sd->async_list); 916 sd->async_list.next = NULL; 917 918 mutex_unlock(&list_lock); 919 } 920 EXPORT_SYMBOL(v4l2_async_unregister_subdev); 921 922 static void print_waiting_match(struct seq_file *s, 923 struct v4l2_async_match_desc *match) 924 { 925 switch (match->type) { 926 case V4L2_ASYNC_MATCH_TYPE_I2C: 927 seq_printf(s, " [i2c] dev=%d-%04x\n", match->i2c.adapter_id, 928 match->i2c.address); 929 break; 930 case V4L2_ASYNC_MATCH_TYPE_FWNODE: { 931 struct fwnode_handle *devnode, *fwnode = match->fwnode; 932 933 devnode = fwnode_graph_is_endpoint(fwnode) ? 934 fwnode_graph_get_port_parent(fwnode) : 935 fwnode_handle_get(fwnode); 936 937 seq_printf(s, " [fwnode] dev=%s, node=%pfw\n", 938 devnode->dev ? dev_name(devnode->dev) : "nil", 939 fwnode); 940 941 fwnode_handle_put(devnode); 942 break; 943 } 944 } 945 } 946 947 static const char * 948 v4l2_async_nf_name(struct v4l2_async_notifier *notifier) 949 { 950 if (notifier->v4l2_dev) 951 return notifier->v4l2_dev->name; 952 else if (notifier->sd) 953 return notifier->sd->name; 954 else 955 return "nil"; 956 } 957 958 static int pending_subdevs_show(struct seq_file *s, void *data) 959 { 960 struct v4l2_async_notifier *notif; 961 struct v4l2_async_connection *asc; 962 963 mutex_lock(&list_lock); 964 965 list_for_each_entry(notif, ¬ifier_list, notifier_entry) { 966 seq_printf(s, "%s:\n", v4l2_async_nf_name(notif)); 967 list_for_each_entry(asc, ¬if->waiting_list, asc_entry) 968 print_waiting_match(s, &asc->match); 969 } 970 971 mutex_unlock(&list_lock); 972 973 return 0; 974 } 975 DEFINE_SHOW_ATTRIBUTE(pending_subdevs); 976 977 static struct dentry *v4l2_async_debugfs_dir; 978 979 static int __init v4l2_async_init(void) 980 { 981 v4l2_async_debugfs_dir = debugfs_create_dir("v4l2-async", NULL); 982 debugfs_create_file("pending_async_subdevices", 0444, 983 v4l2_async_debugfs_dir, NULL, 984 &pending_subdevs_fops); 985 986 return 0; 987 } 988 989 static void __exit v4l2_async_exit(void) 990 { 991 debugfs_remove_recursive(v4l2_async_debugfs_dir); 992 } 993 994 subsys_initcall(v4l2_async_init); 995 module_exit(v4l2_async_exit); 996 997 MODULE_AUTHOR("Guennadi Liakhovetski <g.liakhovetski@gmx.de>"); 998 MODULE_AUTHOR("Sakari Ailus <sakari.ailus@linux.intel.com>"); 999 MODULE_AUTHOR("Ezequiel Garcia <ezequiel@collabora.com>"); 1000 MODULE_DESCRIPTION("V4L2 asynchronous subdevice registration API"); 1001 MODULE_LICENSE("GPL"); 1002