Lines Matching full:chain

1282 	struct uvc_video_chain *chain;  in uvc_gpio_event()  local
1290 /* GPIO entities are always on the first chain. */ in uvc_gpio_event()
1291 chain = list_first_entry(&dev->chains, struct uvc_video_chain, list); in uvc_gpio_event()
1292 uvc_ctrl_status_event(chain, unit->controls, &new_val); in uvc_gpio_event()
1397 * Scan the UVC descriptors to locate a chain starting at an Output Terminal
1419 * Extension Units connected to the main chain as single-unit branches are
1422 static int uvc_scan_chain_entity(struct uvc_video_chain *chain, in uvc_scan_chain_entity() argument
1430 uvc_dbg(chain->dev, DESCR, in uvc_scan_chain_entity()
1441 if (chain->processing != NULL) { in uvc_scan_chain_entity()
1442 uvc_dbg(chain->dev, DESCR, in uvc_scan_chain_entity()
1443 "Found multiple Processing Units in chain\n"); in uvc_scan_chain_entity()
1447 chain->processing = entity; in uvc_scan_chain_entity()
1457 if (chain->selector != NULL) { in uvc_scan_chain_entity()
1458 uvc_dbg(chain->dev, DESCR, in uvc_scan_chain_entity()
1459 "Found multiple Selector Units in chain\n"); in uvc_scan_chain_entity()
1463 chain->selector = entity; in uvc_scan_chain_entity()
1489 uvc_dbg(chain->dev, DESCR, in uvc_scan_chain_entity()
1490 "Unsupported entity type 0x%04x found in chain\n", in uvc_scan_chain_entity()
1495 list_add_tail(&entity->chain, &chain->entities); in uvc_scan_chain_entity()
1499 static int uvc_scan_chain_forward(struct uvc_video_chain *chain, in uvc_scan_chain_forward() argument
1510 forward = uvc_entity_by_reference(chain->dev, entity->id, in uvc_scan_chain_forward()
1516 if (forward->chain.next || forward->chain.prev) { in uvc_scan_chain_forward()
1517 uvc_dbg(chain->dev, DESCR, in uvc_scan_chain_forward()
1518 "Found reference to entity %d already in chain\n", in uvc_scan_chain_forward()
1526 uvc_dbg(chain->dev, DESCR, in uvc_scan_chain_forward()
1545 source = uvc_entity_by_id(chain->dev, in uvc_scan_chain_forward()
1548 uvc_dbg(chain->dev, DESCR, in uvc_scan_chain_forward()
1549 "Can't connect extension unit %u in chain\n", in uvc_scan_chain_forward()
1557 list_add_tail(&forward->chain, &chain->entities); in uvc_scan_chain_forward()
1570 uvc_dbg(chain->dev, DESCR, in uvc_scan_chain_forward()
1577 uvc_dbg(chain->dev, DESCR, in uvc_scan_chain_forward()
1583 list_add_tail(&forward->chain, &chain->entities); in uvc_scan_chain_forward()
1598 static int uvc_scan_chain_backward(struct uvc_video_chain *chain, in uvc_scan_chain_backward() argument
1620 chain->selector = entity; in uvc_scan_chain_backward()
1623 term = uvc_entity_by_id(chain->dev, id); in uvc_scan_chain_backward()
1625 uvc_dbg(chain->dev, DESCR, in uvc_scan_chain_backward()
1631 if (term->chain.next || term->chain.prev) { in uvc_scan_chain_backward()
1632 uvc_dbg(chain->dev, DESCR, in uvc_scan_chain_backward()
1633 "Found reference to entity %d already in chain\n", in uvc_scan_chain_backward()
1640 list_add_tail(&term->chain, &chain->entities); in uvc_scan_chain_backward()
1641 uvc_scan_chain_forward(chain, term, entity); in uvc_scan_chain_backward()
1665 entity = uvc_entity_by_id(chain->dev, id); in uvc_scan_chain_backward()
1667 uvc_dbg(chain->dev, DESCR, in uvc_scan_chain_backward()
1676 static int uvc_scan_chain(struct uvc_video_chain *chain, in uvc_scan_chain() argument
1681 uvc_dbg(chain->dev, PROBE, "Scanning UVC chain:"); in uvc_scan_chain()
1687 /* Entity must not be part of an existing chain */ in uvc_scan_chain()
1688 if (entity->chain.next || entity->chain.prev) { in uvc_scan_chain()
1689 uvc_dbg(chain->dev, DESCR, in uvc_scan_chain()
1690 "Found reference to entity %d already in chain\n", in uvc_scan_chain()
1696 if (uvc_scan_chain_entity(chain, entity) < 0) in uvc_scan_chain()
1700 if (uvc_scan_chain_forward(chain, entity, prev) < 0) in uvc_scan_chain()
1705 if (uvc_scan_chain_backward(chain, &entity) < 0) in uvc_scan_chain()
1719 list_for_each_entry(term, terms, chain) { in uvc_print_terms()
1736 static const char *uvc_print_chain(struct uvc_video_chain *chain) in uvc_print_chain() argument
1741 p += uvc_print_terms(&chain->entities, UVC_TERM_INPUT, p); in uvc_print_chain()
1743 uvc_print_terms(&chain->entities, UVC_TERM_OUTPUT, p); in uvc_print_chain()
1750 struct uvc_video_chain *chain; in uvc_alloc_chain() local
1752 chain = kzalloc(sizeof(*chain), GFP_KERNEL); in uvc_alloc_chain()
1753 if (chain == NULL) in uvc_alloc_chain()
1756 INIT_LIST_HEAD(&chain->entities); in uvc_alloc_chain()
1757 mutex_init(&chain->ctrl_mutex); in uvc_alloc_chain()
1758 chain->dev = dev; in uvc_alloc_chain()
1759 v4l2_prio_init(&chain->prio); in uvc_alloc_chain()
1761 return chain; in uvc_alloc_chain()
1766 * valid chain.
1770 * in the most sensible chain we can think of, turns out they do work anyway.
1771 * Note: This heuristic assumes there is a single chain.
1773 * At the time of writing, devices known to have such a broken chain are
1779 struct uvc_video_chain *chain; in uvc_scan_fallback() local
1806 /* Allocate the chain and fill it. */ in uvc_scan_fallback()
1807 chain = uvc_alloc_chain(dev); in uvc_scan_fallback()
1808 if (chain == NULL) in uvc_scan_fallback()
1811 if (uvc_scan_chain_entity(chain, oterm) < 0) in uvc_scan_fallback()
1819 * UVC descriptor order as we build the chain from output to input. This in uvc_scan_fallback()
1831 if (uvc_scan_chain_entity(chain, entity) < 0) in uvc_scan_fallback()
1838 if (uvc_scan_chain_entity(chain, iterm) < 0) in uvc_scan_fallback()
1843 list_add_tail(&chain->list, &dev->chains); in uvc_scan_fallback()
1845 uvc_dbg(dev, PROBE, "Found a video chain by fallback heuristic (%s)\n", in uvc_scan_fallback()
1846 uvc_print_chain(chain)); in uvc_scan_fallback()
1851 kfree(chain); in uvc_scan_fallback()
1862 struct uvc_video_chain *chain; in uvc_scan_device() local
1870 * If the terminal is already included in a chain, skip it. in uvc_scan_device()
1873 * will be inserted in the chain in forward scans. in uvc_scan_device()
1875 if (term->chain.next || term->chain.prev) in uvc_scan_device()
1878 chain = uvc_alloc_chain(dev); in uvc_scan_device()
1879 if (chain == NULL) in uvc_scan_device()
1884 if (uvc_scan_chain(chain, term) < 0) { in uvc_scan_device()
1885 kfree(chain); in uvc_scan_device()
1889 uvc_dbg(dev, PROBE, "Found a valid video chain (%s)\n", in uvc_scan_device()
1890 uvc_print_chain(chain)); in uvc_scan_device()
1892 list_add_tail(&chain->list, &dev->chains); in uvc_scan_device()
1899 dev_info(&dev->intf->dev, "No valid video chain found.\n"); in uvc_scan_device()
1903 /* Add GPIO entity to the first chain. */ in uvc_scan_device()
1905 chain = list_first_entry(&dev->chains, in uvc_scan_device()
1907 list_add_tail(&dev->gpio_unit->chain, &chain->entities); in uvc_scan_device()
1943 struct uvc_video_chain *chain; in uvc_delete() local
1945 chain = list_entry(p, struct uvc_video_chain, list); in uvc_delete()
1946 kfree(chain); in uvc_delete()
2039 vdev->prio = &stream->chain->prio; in uvc_register_video_device()
2094 stream->chain->caps |= V4L2_CAP_VIDEO_CAPTURE in uvc_register_video()
2097 stream->chain->caps |= V4L2_CAP_VIDEO_OUTPUT; in uvc_register_video()
2111 struct uvc_video_chain *chain) in uvc_register_terms() argument
2117 list_for_each_entry(term, &chain->entities, chain) { in uvc_register_terms()
2129 stream->chain = chain; in uvc_register_terms()
2148 struct uvc_video_chain *chain; in uvc_register_chains() local
2151 list_for_each_entry(chain, &dev->chains, list) { in uvc_register_chains()
2152 ret = uvc_register_terms(dev, chain); in uvc_register_chains()
2157 ret = uvc_mc_register_entities(chain); in uvc_register_chains()