hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/usb/gadget/function/uvc_configfs.c
....@@ -506,11 +506,68 @@
506506 UVCG_DEFAULT_OUTPUT_ATTR(b_terminal_id, bTerminalID, 8);
507507 UVCG_DEFAULT_OUTPUT_ATTR(w_terminal_type, wTerminalType, 16);
508508 UVCG_DEFAULT_OUTPUT_ATTR(b_assoc_terminal, bAssocTerminal, 8);
509
-UVCG_DEFAULT_OUTPUT_ATTR(b_source_id, bSourceID, 8);
510509 UVCG_DEFAULT_OUTPUT_ATTR(i_terminal, iTerminal, 8);
511510
512511 #undef UVCG_DEFAULT_OUTPUT_ATTR
513512
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
+
514571 static struct configfs_attribute *uvcg_default_output_attrs[] = {
515572 &uvcg_default_output_attr_b_terminal_id,
516573 &uvcg_default_output_attr_w_terminal_type,