Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 174187
b: refs/heads/master
c: 6241d8c
h: refs/heads/master
i:
  174185: 288edbe
  174183: 87f1b2b
v: v3
  • Loading branch information
Laurent Pinchart authored and Mauro Carvalho Chehab committed Dec 5, 2009
1 parent 7c224db commit 939c5af
Show file tree
Hide file tree
Showing 5 changed files with 37 additions and 57 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: bce039c099e97b07534518b5f3c0ce31b1606ff6
refs/heads/master: 6241d8ca1dc27356180011dff4d93a3c5b3cbd76
29 changes: 5 additions & 24 deletions trunk/drivers/media/video/uvc/uvc_ctrl.c
Original file line number Diff line number Diff line change
Expand Up @@ -742,17 +742,7 @@ struct uvc_control *uvc_find_control(struct uvc_video_chain *chain,
v4l2_id &= V4L2_CTRL_ID_MASK;

/* Find the control. */
__uvc_find_control(chain->processing, v4l2_id, mapping, &ctrl, next);
if (ctrl && !next)
return ctrl;

list_for_each_entry(entity, &chain->iterms, chain) {
__uvc_find_control(entity, v4l2_id, mapping, &ctrl, next);
if (ctrl && !next)
return ctrl;
}

list_for_each_entry(entity, &chain->extensions, chain) {
list_for_each_entry(entity, &chain->entities, chain) {
__uvc_find_control(entity, v4l2_id, mapping, &ctrl, next);
if (ctrl && !next)
return ctrl;
Expand Down Expand Up @@ -951,17 +941,7 @@ int __uvc_ctrl_commit(struct uvc_video_chain *chain, int rollback)
int ret = 0;

/* Find the control. */
ret = uvc_ctrl_commit_entity(chain->dev, chain->processing, rollback);
if (ret < 0)
goto done;

list_for_each_entry(entity, &chain->iterms, chain) {
ret = uvc_ctrl_commit_entity(chain->dev, entity, rollback);
if (ret < 0)
goto done;
}

list_for_each_entry(entity, &chain->extensions, chain) {
list_for_each_entry(entity, &chain->entities, chain) {
ret = uvc_ctrl_commit_entity(chain->dev, entity, rollback);
if (ret < 0)
goto done;
Expand Down Expand Up @@ -1075,8 +1055,9 @@ int uvc_xu_ctrl_query(struct uvc_video_chain *chain,
int ret;

/* Find the extension unit. */
list_for_each_entry(entity, &chain->extensions, chain) {
if (entity->id == xctrl->unit)
list_for_each_entry(entity, &chain->entities, chain) {
if (UVC_ENTITY_TYPE(entity) == UVC_VC_EXTENSION_UNIT &&
entity->id == xctrl->unit)
break;
}

Expand Down
48 changes: 22 additions & 26 deletions trunk/drivers/media/video/uvc/uvc_driver.c
Original file line number Diff line number Diff line change
Expand Up @@ -1224,7 +1224,6 @@ static int uvc_scan_chain_entity(struct uvc_video_chain *chain,
return -1;
}

list_add_tail(&entity->chain, &chain->extensions);
break;

case UVC_VC_PROCESSING_UNIT:
Expand Down Expand Up @@ -1263,7 +1262,6 @@ static int uvc_scan_chain_entity(struct uvc_video_chain *chain,
if (uvc_trace_param & UVC_TRACE_PROBE)
printk(" <- IT %d\n", entity->id);

list_add_tail(&entity->chain, &chain->iterms);
break;

case UVC_TT_STREAMING:
Expand All @@ -1276,7 +1274,6 @@ static int uvc_scan_chain_entity(struct uvc_video_chain *chain,
return -1;
}

list_add_tail(&entity->chain, &chain->iterms);
break;

default:
Expand All @@ -1285,6 +1282,7 @@ static int uvc_scan_chain_entity(struct uvc_video_chain *chain,
return -1;
}

list_add_tail(&entity->chain, &chain->entities);
return 0;
}

Expand Down Expand Up @@ -1315,7 +1313,7 @@ static int uvc_scan_chain_forward(struct uvc_video_chain *chain,
return -EINVAL;
}

list_add_tail(&forward->chain, &chain->extensions);
list_add_tail(&forward->chain, &chain->entities);
if (uvc_trace_param & UVC_TRACE_PROBE) {
if (!found)
printk(" (->");
Expand All @@ -1335,7 +1333,7 @@ static int uvc_scan_chain_forward(struct uvc_video_chain *chain,
return -EINVAL;
}

list_add_tail(&forward->chain, &chain->oterms);
list_add_tail(&forward->chain, &chain->entities);
if (uvc_trace_param & UVC_TRACE_PROBE) {
if (!found)
printk(" (->");
Expand Down Expand Up @@ -1391,7 +1389,7 @@ static int uvc_scan_chain_backward(struct uvc_video_chain *chain,
if (uvc_trace_param & UVC_TRACE_PROBE)
printk(" %d", term->id);

list_add_tail(&term->chain, &chain->iterms);
list_add_tail(&term->chain, &chain->entities);
uvc_scan_chain_forward(chain, term, entity);
}

Expand All @@ -1412,7 +1410,7 @@ static int uvc_scan_chain(struct uvc_video_chain *chain,
int id;

entity = oterm;
list_add_tail(&entity->chain, &chain->oterms);
list_add_tail(&entity->chain, &chain->entities);
uvc_trace(UVC_TRACE_PROBE, "Scanning UVC chain: OT %d", entity->id);

id = entity->output.bSourceID;
Expand Down Expand Up @@ -1452,21 +1450,25 @@ static int uvc_scan_chain(struct uvc_video_chain *chain,
return 0;
}

static unsigned int uvc_print_terms(struct list_head *terms, char *buffer)
static unsigned int uvc_print_terms(struct list_head *terms, u16 dir,
char *buffer)
{
struct uvc_entity *term;
unsigned int nterms = 0;
char *p = buffer;

list_for_each_entry(term, terms, chain) {
p += sprintf(p, "%u", term->id);
if (term->chain.next != terms) {
if (!UVC_ENTITY_IS_TERM(term) ||
UVC_TERM_DIRECTION(term) != dir)
continue;

if (nterms)
p += sprintf(p, ",");
if (++nterms >= 4) {
p += sprintf(p, "...");
break;
}
if (++nterms >= 4) {
p += sprintf(p, "...");
break;
}
p += sprintf(p, "%u", term->id);
}

return p - buffer;
Expand All @@ -1477,9 +1479,9 @@ static const char *uvc_print_chain(struct uvc_video_chain *chain)
static char buffer[43];
char *p = buffer;

p += uvc_print_terms(&chain->iterms, p);
p += uvc_print_terms(&chain->entities, UVC_TERM_INPUT, p);
p += sprintf(p, " -> ");
uvc_print_terms(&chain->oterms, p);
uvc_print_terms(&chain->entities, UVC_TERM_OUTPUT, p);

return buffer;
}
Expand Down Expand Up @@ -1510,9 +1512,7 @@ static int uvc_scan_device(struct uvc_device *dev)
if (chain == NULL)
return -ENOMEM;

INIT_LIST_HEAD(&chain->iterms);
INIT_LIST_HEAD(&chain->oterms);
INIT_LIST_HEAD(&chain->extensions);
INIT_LIST_HEAD(&chain->entities);
mutex_init(&chain->ctrl_mutex);
chain->dev = dev;

Expand Down Expand Up @@ -1685,13 +1685,13 @@ static int uvc_register_video(struct uvc_device *dev,
* Register all video devices in all chains.
*/
static int uvc_register_terms(struct uvc_device *dev,
struct uvc_video_chain *chain, struct list_head *terms)
struct uvc_video_chain *chain)
{
struct uvc_streaming *stream;
struct uvc_entity *term;
int ret;

list_for_each_entry(term, terms, chain) {
list_for_each_entry(term, &chain->entities, chain) {
if (UVC_ENTITY_TYPE(term) != UVC_TT_STREAMING)
continue;

Expand All @@ -1717,11 +1717,7 @@ static int uvc_register_chains(struct uvc_device *dev)
int ret;

list_for_each_entry(chain, &dev->chains, list) {
ret = uvc_register_terms(dev, chain, &chain->iterms);
if (ret < 0)
return ret;

ret = uvc_register_terms(dev, chain, &chain->oterms);
ret = uvc_register_terms(dev, chain);
if (ret < 0)
return ret;
}
Expand Down
10 changes: 7 additions & 3 deletions trunk/drivers/media/video/uvc/uvc_v4l2.c
Original file line number Diff line number Diff line change
Expand Up @@ -620,12 +620,16 @@ static long uvc_v4l2_do_ioctl(struct file *file, unsigned int cmd, void *arg)
(chain->dev->quirks & UVC_QUIRK_IGNORE_SELECTOR_UNIT)) {
if (index != 0)
return -EINVAL;
iterm = list_first_entry(&chain->iterms,
struct uvc_entity, chain);
list_for_each_entry(iterm, &chain->entities, chain) {
if (UVC_ENTITY_IS_ITERM(iterm))
break;
}
pin = iterm->id;
} else if (pin < selector->selector.bNrInPins) {
pin = selector->selector.baSourceID[index];
list_for_each_entry(iterm, chain->iterms.next, chain) {
list_for_each_entry(iterm, &chain->entities, chain) {
if (!UVC_ENTITY_IS_ITERM(iterm))
continue;
if (iterm->id == pin)
break;
}
Expand Down
5 changes: 2 additions & 3 deletions trunk/drivers/media/video/uvc/uvcvideo.h
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ struct uvc_xu_control {

#define UVC_TERM_INPUT 0x0000
#define UVC_TERM_OUTPUT 0x8000
#define UVC_TERM_DIRECTION(term) ((term)->type & 0x8000)

#define UVC_ENTITY_TYPE(entity) ((entity)->type & 0x7fff)
#define UVC_ENTITY_IS_UNIT(entity) (((entity)->type & 0xff00) == 0)
Expand Down Expand Up @@ -408,11 +409,9 @@ struct uvc_video_chain {
struct uvc_device *dev;
struct list_head list;

struct list_head iterms; /* Input terminals */
struct list_head oterms; /* Output terminals */
struct list_head entities; /* All entities */
struct uvc_entity *processing; /* Processing unit */
struct uvc_entity *selector; /* Selector unit */
struct list_head extensions; /* Extension units */

struct mutex ctrl_mutex;
};
Expand Down

0 comments on commit 939c5af

Please sign in to comment.