.. | .. |
---|
506 | 506 | UVCG_DEFAULT_OUTPUT_ATTR(b_terminal_id, bTerminalID, 8); |
---|
507 | 507 | UVCG_DEFAULT_OUTPUT_ATTR(w_terminal_type, wTerminalType, 16); |
---|
508 | 508 | UVCG_DEFAULT_OUTPUT_ATTR(b_assoc_terminal, bAssocTerminal, 8); |
---|
509 | | -UVCG_DEFAULT_OUTPUT_ATTR(b_source_id, bSourceID, 8); |
---|
510 | 509 | UVCG_DEFAULT_OUTPUT_ATTR(i_terminal, iTerminal, 8); |
---|
511 | 510 | |
---|
512 | 511 | #undef UVCG_DEFAULT_OUTPUT_ATTR |
---|
513 | 512 | |
---|
| 513 | +static ssize_t uvcg_default_output_b_source_id_show(struct config_item *item, |
---|
| 514 | + char *page) |
---|
| 515 | +{ |
---|
| 516 | + struct config_group *group = to_config_group(item); |
---|
| 517 | + struct f_uvc_opts *opts; |
---|
| 518 | + struct config_item *opts_item; |
---|
| 519 | + struct mutex *su_mutex = &group->cg_subsys->su_mutex; |
---|
| 520 | + struct uvc_output_terminal_descriptor *cd; |
---|
| 521 | + int result; |
---|
| 522 | + |
---|
| 523 | + mutex_lock(su_mutex); /* for navigating configfs hierarchy */ |
---|
| 524 | + |
---|
| 525 | + opts_item = group->cg_item.ci_parent->ci_parent-> |
---|
| 526 | + ci_parent->ci_parent; |
---|
| 527 | + opts = to_f_uvc_opts(opts_item); |
---|
| 528 | + cd = &opts->uvc_output_terminal; |
---|
| 529 | + |
---|
| 530 | + mutex_lock(&opts->lock); |
---|
| 531 | + result = sprintf(page, "%u\n", le8_to_cpu(cd->bSourceID)); |
---|
| 532 | + mutex_unlock(&opts->lock); |
---|
| 533 | + |
---|
| 534 | + mutex_unlock(su_mutex); |
---|
| 535 | + |
---|
| 536 | + return result; |
---|
| 537 | +} |
---|
| 538 | + |
---|
| 539 | +static ssize_t uvcg_default_output_b_source_id_store(struct config_item *item, |
---|
| 540 | + const char *page, size_t len) |
---|
| 541 | +{ |
---|
| 542 | + struct config_group *group = to_config_group(item); |
---|
| 543 | + struct f_uvc_opts *opts; |
---|
| 544 | + struct config_item *opts_item; |
---|
| 545 | + struct mutex *su_mutex = &group->cg_subsys->su_mutex; |
---|
| 546 | + struct uvc_output_terminal_descriptor *cd; |
---|
| 547 | + int result; |
---|
| 548 | + u8 num; |
---|
| 549 | + |
---|
| 550 | + result = kstrtou8(page, 0, &num); |
---|
| 551 | + if (result) |
---|
| 552 | + return result; |
---|
| 553 | + |
---|
| 554 | + mutex_lock(su_mutex); /* for navigating configfs hierarchy */ |
---|
| 555 | + |
---|
| 556 | + opts_item = group->cg_item.ci_parent->ci_parent-> |
---|
| 557 | + ci_parent->ci_parent; |
---|
| 558 | + opts = to_f_uvc_opts(opts_item); |
---|
| 559 | + cd = &opts->uvc_output_terminal; |
---|
| 560 | + |
---|
| 561 | + mutex_lock(&opts->lock); |
---|
| 562 | + cd->bSourceID = num; |
---|
| 563 | + mutex_unlock(&opts->lock); |
---|
| 564 | + |
---|
| 565 | + mutex_unlock(su_mutex); |
---|
| 566 | + |
---|
| 567 | + return len; |
---|
| 568 | +} |
---|
| 569 | +UVC_ATTR(uvcg_default_output_, b_source_id, bSourceID); |
---|
| 570 | + |
---|
514 | 571 | static struct configfs_attribute *uvcg_default_output_attrs[] = { |
---|
515 | 572 | &uvcg_default_output_attr_b_terminal_id, |
---|
516 | 573 | &uvcg_default_output_attr_w_terminal_type, |
---|