Ignore:
Timestamp:
Apr 21, 2017, 4:28:29 AM (3 months ago)
Author:
brainslayer
Message:

update

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/linux/universal/linux-3.18/drivers/media/usb/uvc/uvc_driver.c

    r26017 r31885  
    15541554}
    15551555
     1556static struct uvc_video_chain *uvc_alloc_chain(struct uvc_device *dev)
     1557{
     1558        struct uvc_video_chain *chain;
     1559
     1560        chain = kzalloc(sizeof(*chain), GFP_KERNEL);
     1561        if (chain == NULL)
     1562                return NULL;
     1563
     1564        INIT_LIST_HEAD(&chain->entities);
     1565        mutex_init(&chain->ctrl_mutex);
     1566        chain->dev = dev;
     1567        v4l2_prio_init(&chain->prio);
     1568
     1569        return chain;
     1570}
     1571
     1572/*
     1573 * Fallback heuristic for devices that don't connect units and terminals in a
     1574 * valid chain.
     1575 *
     1576 * Some devices have invalid baSourceID references, causing uvc_scan_chain()
     1577 * to fail, but if we just take the entities we can find and put them together
     1578 * in the most sensible chain we can think of, turns out they do work anyway.
     1579 * Note: This heuristic assumes there is a single chain.
     1580 *
     1581 * At the time of writing, devices known to have such a broken chain are
     1582 *  - Acer Integrated Camera (5986:055a)
     1583 *  - Realtek rtl157a7 (0bda:57a7)
     1584 */
     1585static int uvc_scan_fallback(struct uvc_device *dev)
     1586{
     1587        struct uvc_video_chain *chain;
     1588        struct uvc_entity *iterm = NULL;
     1589        struct uvc_entity *oterm = NULL;
     1590        struct uvc_entity *entity;
     1591        struct uvc_entity *prev;
     1592
     1593        /*
     1594         * Start by locating the input and output terminals. We only support
     1595         * devices with exactly one of each for now.
     1596         */
     1597        list_for_each_entry(entity, &dev->entities, list) {
     1598                if (UVC_ENTITY_IS_ITERM(entity)) {
     1599                        if (iterm)
     1600                                return -EINVAL;
     1601                        iterm = entity;
     1602                }
     1603
     1604                if (UVC_ENTITY_IS_OTERM(entity)) {
     1605                        if (oterm)
     1606                                return -EINVAL;
     1607                        oterm = entity;
     1608                }
     1609        }
     1610
     1611        if (iterm == NULL || oterm == NULL)
     1612                return -EINVAL;
     1613
     1614        /* Allocate the chain and fill it. */
     1615        chain = uvc_alloc_chain(dev);
     1616        if (chain == NULL)
     1617                return -ENOMEM;
     1618
     1619        if (uvc_scan_chain_entity(chain, oterm) < 0)
     1620                goto error;
     1621
     1622        prev = oterm;
     1623
     1624        /*
     1625         * Add all Processing and Extension Units with two pads. The order
     1626         * doesn't matter much, use reverse list traversal to connect units in
     1627         * UVC descriptor order as we build the chain from output to input. This
     1628         * leads to units appearing in the order meant by the manufacturer for
     1629         * the cameras known to require this heuristic.
     1630         */
     1631        list_for_each_entry_reverse(entity, &dev->entities, list) {
     1632                if (entity->type != UVC_VC_PROCESSING_UNIT &&
     1633                    entity->type != UVC_VC_EXTENSION_UNIT)
     1634                        continue;
     1635
     1636                if (entity->num_pads != 2)
     1637                        continue;
     1638
     1639                if (uvc_scan_chain_entity(chain, entity) < 0)
     1640                        goto error;
     1641
     1642                prev->baSourceID[0] = entity->id;
     1643                prev = entity;
     1644        }
     1645
     1646        if (uvc_scan_chain_entity(chain, iterm) < 0)
     1647                goto error;
     1648
     1649        prev->baSourceID[0] = iterm->id;
     1650
     1651        list_add_tail(&chain->list, &dev->chains);
     1652
     1653        uvc_trace(UVC_TRACE_PROBE,
     1654                  "Found a video chain by fallback heuristic (%s).\n",
     1655                  uvc_print_chain(chain));
     1656
     1657        return 0;
     1658
     1659error:
     1660        kfree(chain);
     1661        return -EINVAL;
     1662}
     1663
    15561664/*
    15571665 * Scan the device for video chains and register video devices.
     
    15761684                        continue;
    15771685
    1578                 chain = kzalloc(sizeof(*chain), GFP_KERNEL);
     1686                chain = uvc_alloc_chain(dev);
    15791687                if (chain == NULL)
    15801688                        return -ENOMEM;
    1581 
    1582                 INIT_LIST_HEAD(&chain->entities);
    1583                 mutex_init(&chain->ctrl_mutex);
    1584                 chain->dev = dev;
    1585                 v4l2_prio_init(&chain->prio);
    15861689
    15871690                term->flags |= UVC_ENTITY_FLAG_DEFAULT;
     
    15971700                list_add_tail(&chain->list, &dev->chains);
    15981701        }
     1702
     1703        if (list_empty(&dev->chains))
     1704                uvc_scan_fallback(dev);
    15991705
    16001706        if (list_empty(&dev->chains)) {
Note: See TracChangeset for help on using the changeset viewer.