xref: /linux/drivers/media/v4l2-core/v4l2-async.c (revision 9cebfe6504488198b012e746bc6b313f88b95439)
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, &notifier->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, &notifier_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(&notifier->waiting_list))
262 		return false;
263 
264 	list_for_each_entry(asc, &notifier->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(&notifier->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, &notifier->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, &notifier->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, &notifier->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, &notifier->waiting_list, asc_entry)
511 		if (v4l2_async_match_equal(&asc->match, match))
512 			return true;
513 
514 	list_for_each_entry(asc, &notifier->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 		&notifier->waiting_list,
531 		&notifier->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, &notifier_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(&notifier->waiting_list);
583 	INIT_LIST_HEAD(&notifier->done_list);
584 	INIT_LIST_HEAD(&notifier->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(&notifier->waiting_list);
593 	INIT_LIST_HEAD(&notifier->done_list);
594 	INIT_LIST_HEAD(&notifier->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, &notifier->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(&notifier->notifier_entry, &notifier_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(&notifier->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(&notifier->done_list));
677 
678 	list_for_each_entry_safe(asc, tmp, &notifier->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, &notifier->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, &notifier_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, &notifier_list, notifier_entry) {
966 		seq_printf(s, "%s:\n", v4l2_async_nf_name(notif));
967 		list_for_each_entry(asc, &notif->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