aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/usb/gadget/f_acm.c27
-rw-r--r--drivers/usb/gadget/f_ecm.c42
-rw-r--r--drivers/usb/gadget/f_ncm.c40
-rw-r--r--drivers/usb/gadget/f_obex.c19
-rw-r--r--drivers/usb/gadget/f_rndis.c27
-rw-r--r--drivers/usb/gadget/f_subset.c23
-rw-r--r--drivers/usb/gadget/f_uac2.c100
-rw-r--r--drivers/usb/gadget/f_uvc.c26
8 files changed, 71 insertions, 233 deletions
diff --git a/drivers/usb/gadget/f_acm.c b/drivers/usb/gadget/f_acm.c
index 308242b5d6e0..549174466c21 100644
--- a/drivers/usb/gadget/f_acm.c
+++ b/drivers/usb/gadget/f_acm.c
@@ -705,6 +705,7 @@ acm_unbind(struct usb_configuration *c, struct usb_function *f)
705{ 705{
706 struct f_acm *acm = func_to_acm(f); 706 struct f_acm *acm = func_to_acm(f);
707 707
708 acm_string_defs[0].id = 0;
708 usb_free_all_descriptors(f); 709 usb_free_all_descriptors(f);
709 gs_free_req(acm->notify, acm->notify_req); 710 gs_free_req(acm->notify, acm->notify_req);
710 kfree(acm); 711 kfree(acm);
@@ -742,27 +743,15 @@ int acm_bind_config(struct usb_configuration *c, u8 port_num)
742 */ 743 */
743 744
744 /* maybe allocate device-global string IDs, and patch descriptors */ 745 /* maybe allocate device-global string IDs, and patch descriptors */
745 if (acm_string_defs[ACM_CTRL_IDX].id == 0) { 746 if (acm_string_defs[0].id == 0) {
746 status = usb_string_id(c->cdev); 747 status = usb_string_ids_tab(c->cdev, acm_string_defs);
747 if (status < 0) 748 if (status < 0)
748 return status; 749 return status;
749 acm_string_defs[ACM_CTRL_IDX].id = status; 750 acm_control_interface_desc.iInterface =
750 751 acm_string_defs[ACM_CTRL_IDX].id;
751 acm_control_interface_desc.iInterface = status; 752 acm_data_interface_desc.iInterface =
752 753 acm_string_defs[ACM_DATA_IDX].id;
753 status = usb_string_id(c->cdev); 754 acm_iad_descriptor.iFunction = acm_string_defs[ACM_IAD_IDX].id;
754 if (status < 0)
755 return status;
756 acm_string_defs[ACM_DATA_IDX].id = status;
757
758 acm_data_interface_desc.iInterface = status;
759
760 status = usb_string_id(c->cdev);
761 if (status < 0)
762 return status;
763 acm_string_defs[ACM_IAD_IDX].id = status;
764
765 acm_iad_descriptor.iFunction = status;
766 } 755 }
767 756
768 /* allocate and initialize one new instance */ 757 /* allocate and initialize one new instance */
diff --git a/drivers/usb/gadget/f_ecm.c b/drivers/usb/gadget/f_ecm.c
index 2d3c5a46de8e..83420a310fb7 100644
--- a/drivers/usb/gadget/f_ecm.c
+++ b/drivers/usb/gadget/f_ecm.c
@@ -354,7 +354,7 @@ static struct usb_descriptor_header *ecm_ss_function[] = {
354 354
355static struct usb_string ecm_string_defs[] = { 355static struct usb_string ecm_string_defs[] = {
356 [0].s = "CDC Ethernet Control Model (ECM)", 356 [0].s = "CDC Ethernet Control Model (ECM)",
357 [1].s = NULL /* DYNAMIC */, 357 [1].s = "",
358 [2].s = "CDC Ethernet Data", 358 [2].s = "CDC Ethernet Data",
359 [3].s = "CDC ECM", 359 [3].s = "CDC ECM",
360 { } /* end of list */ 360 { } /* end of list */
@@ -803,12 +803,11 @@ ecm_unbind(struct usb_configuration *c, struct usb_function *f)
803 803
804 DBG(c->cdev, "ecm unbind\n"); 804 DBG(c->cdev, "ecm unbind\n");
805 805
806 ecm_string_defs[0].id = 0;
806 usb_free_all_descriptors(f); 807 usb_free_all_descriptors(f);
807 808
808 kfree(ecm->notify_req->buf); 809 kfree(ecm->notify_req->buf);
809 usb_ep_free_request(ecm->notify, ecm->notify_req); 810 usb_ep_free_request(ecm->notify, ecm->notify_req);
810
811 ecm_string_defs[1].s = NULL;
812 kfree(ecm); 811 kfree(ecm);
813} 812}
814 813
@@ -833,36 +832,15 @@ ecm_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN])
833 if (!can_support_ecm(c->cdev->gadget) || !ethaddr) 832 if (!can_support_ecm(c->cdev->gadget) || !ethaddr)
834 return -EINVAL; 833 return -EINVAL;
835 834
836 /* maybe allocate device-global string IDs */
837 if (ecm_string_defs[0].id == 0) { 835 if (ecm_string_defs[0].id == 0) {
838 836 status = usb_string_ids_tab(c->cdev, ecm_string_defs);
839 /* control interface label */ 837 if (status)
840 status = usb_string_id(c->cdev);
841 if (status < 0)
842 return status; 838 return status;
843 ecm_string_defs[0].id = status;
844 ecm_control_intf.iInterface = status;
845 839
846 /* data interface label */ 840 ecm_control_intf.iInterface = ecm_string_defs[0].id;
847 status = usb_string_id(c->cdev); 841 ecm_data_intf.iInterface = ecm_string_defs[2].id;
848 if (status < 0) 842 ecm_desc.iMACAddress = ecm_string_defs[1].id;
849 return status; 843 ecm_iad_descriptor.iFunction = ecm_string_defs[3].id;
850 ecm_string_defs[2].id = status;
851 ecm_data_intf.iInterface = status;
852
853 /* MAC address */
854 status = usb_string_id(c->cdev);
855 if (status < 0)
856 return status;
857 ecm_string_defs[1].id = status;
858 ecm_desc.iMACAddress = status;
859
860 /* IAD label */
861 status = usb_string_id(c->cdev);
862 if (status < 0)
863 return status;
864 ecm_string_defs[3].id = status;
865 ecm_iad_descriptor.iFunction = status;
866 } 844 }
867 845
868 /* allocate and initialize one new instance */ 846 /* allocate and initialize one new instance */
@@ -887,9 +865,7 @@ ecm_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN])
887 ecm->port.func.disable = ecm_disable; 865 ecm->port.func.disable = ecm_disable;
888 866
889 status = usb_add_function(c, &ecm->port.func); 867 status = usb_add_function(c, &ecm->port.func);
890 if (status) { 868 if (status)
891 ecm_string_defs[1].s = NULL;
892 kfree(ecm); 869 kfree(ecm);
893 }
894 return status; 870 return status;
895} 871}
diff --git a/drivers/usb/gadget/f_ncm.c b/drivers/usb/gadget/f_ncm.c
index 326d7e6c297c..f1f66e9c76ba 100644
--- a/drivers/usb/gadget/f_ncm.c
+++ b/drivers/usb/gadget/f_ncm.c
@@ -321,7 +321,7 @@ static struct usb_descriptor_header *ncm_hs_function[] __initdata = {
321 321
322static struct usb_string ncm_string_defs[] = { 322static struct usb_string ncm_string_defs[] = {
323 [STRING_CTRL_IDX].s = "CDC Network Control Model (NCM)", 323 [STRING_CTRL_IDX].s = "CDC Network Control Model (NCM)",
324 [STRING_MAC_IDX].s = NULL /* DYNAMIC */, 324 [STRING_MAC_IDX].s = "",
325 [STRING_DATA_IDX].s = "CDC Network Data", 325 [STRING_DATA_IDX].s = "CDC Network Data",
326 [STRING_IAD_IDX].s = "CDC NCM", 326 [STRING_IAD_IDX].s = "CDC NCM",
327 { } /* end of list */ 327 { } /* end of list */
@@ -1262,12 +1262,12 @@ ncm_unbind(struct usb_configuration *c, struct usb_function *f)
1262 1262
1263 DBG(c->cdev, "ncm unbind\n"); 1263 DBG(c->cdev, "ncm unbind\n");
1264 1264
1265 ncm_string_defs[0].id = 0;
1265 usb_free_all_descriptors(f); 1266 usb_free_all_descriptors(f);
1266 1267
1267 kfree(ncm->notify_req->buf); 1268 kfree(ncm->notify_req->buf);
1268 usb_ep_free_request(ncm->notify, ncm->notify_req); 1269 usb_ep_free_request(ncm->notify, ncm->notify_req);
1269 1270
1270 ncm_string_defs[1].s = NULL;
1271 kfree(ncm); 1271 kfree(ncm);
1272} 1272}
1273 1273
@@ -1291,37 +1291,19 @@ int __init ncm_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN])
1291 if (!can_support_ecm(c->cdev->gadget) || !ethaddr) 1291 if (!can_support_ecm(c->cdev->gadget) || !ethaddr)
1292 return -EINVAL; 1292 return -EINVAL;
1293 1293
1294 /* maybe allocate device-global string IDs */
1295 if (ncm_string_defs[0].id == 0) { 1294 if (ncm_string_defs[0].id == 0) {
1296 1295 status = usb_string_ids_tab(c->cdev, ncm_string_defs);
1297 /* control interface label */
1298 status = usb_string_id(c->cdev);
1299 if (status < 0) 1296 if (status < 0)
1300 return status; 1297 return status;
1301 ncm_string_defs[STRING_CTRL_IDX].id = status; 1298 ncm_control_intf.iInterface =
1302 ncm_control_intf.iInterface = status; 1299 ncm_string_defs[STRING_CTRL_IDX].id;
1303 1300
1304 /* data interface label */ 1301 status = ncm_string_defs[STRING_DATA_IDX].id;
1305 status = usb_string_id(c->cdev);
1306 if (status < 0)
1307 return status;
1308 ncm_string_defs[STRING_DATA_IDX].id = status;
1309 ncm_data_nop_intf.iInterface = status; 1302 ncm_data_nop_intf.iInterface = status;
1310 ncm_data_intf.iInterface = status; 1303 ncm_data_intf.iInterface = status;
1311 1304
1312 /* MAC address */ 1305 ecm_desc.iMACAddress = ncm_string_defs[STRING_MAC_IDX].id;
1313 status = usb_string_id(c->cdev); 1306 ncm_iad_desc.iFunction = ncm_string_defs[STRING_IAD_IDX].id;
1314 if (status < 0)
1315 return status;
1316 ncm_string_defs[STRING_MAC_IDX].id = status;
1317 ecm_desc.iMACAddress = status;
1318
1319 /* IAD */
1320 status = usb_string_id(c->cdev);
1321 if (status < 0)
1322 return status;
1323 ncm_string_defs[STRING_IAD_IDX].id = status;
1324 ncm_iad_desc.iFunction = status;
1325 } 1307 }
1326 1308
1327 /* allocate and initialize one new instance */ 1309 /* allocate and initialize one new instance */
@@ -1331,7 +1313,7 @@ int __init ncm_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN])
1331 1313
1332 /* export host's Ethernet address in CDC format */ 1314 /* export host's Ethernet address in CDC format */
1333 snprintf(ncm->ethaddr, sizeof ncm->ethaddr, "%pm", ethaddr); 1315 snprintf(ncm->ethaddr, sizeof ncm->ethaddr, "%pm", ethaddr);
1334 ncm_string_defs[1].s = ncm->ethaddr; 1316 ncm_string_defs[STRING_MAC_IDX].s = ncm->ethaddr;
1335 1317
1336 spin_lock_init(&ncm->lock); 1318 spin_lock_init(&ncm->lock);
1337 ncm_reset_values(ncm); 1319 ncm_reset_values(ncm);
@@ -1351,9 +1333,7 @@ int __init ncm_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN])
1351 ncm->port.unwrap = ncm_unwrap_ntb; 1333 ncm->port.unwrap = ncm_unwrap_ntb;
1352 1334
1353 status = usb_add_function(c, &ncm->port.func); 1335 status = usb_add_function(c, &ncm->port.func);
1354 if (status) { 1336 if (status)
1355 ncm_string_defs[1].s = NULL;
1356 kfree(ncm); 1337 kfree(ncm);
1357 }
1358 return status; 1338 return status;
1359} 1339}
diff --git a/drivers/usb/gadget/f_obex.c b/drivers/usb/gadget/f_obex.c
index d74491ad82cb..d8dd8782768c 100644
--- a/drivers/usb/gadget/f_obex.c
+++ b/drivers/usb/gadget/f_obex.c
@@ -379,6 +379,7 @@ fail:
379static void 379static void
380obex_unbind(struct usb_configuration *c, struct usb_function *f) 380obex_unbind(struct usb_configuration *c, struct usb_function *f)
381{ 381{
382 obex_string_defs[OBEX_CTRL_IDX].id = 0;
382 usb_free_all_descriptors(f); 383 usb_free_all_descriptors(f);
383 kfree(func_to_obex(f)); 384 kfree(func_to_obex(f));
384} 385}
@@ -418,22 +419,16 @@ int __init obex_bind_config(struct usb_configuration *c, u8 port_num)
418 if (!can_support_obex(c)) 419 if (!can_support_obex(c))
419 return -EINVAL; 420 return -EINVAL;
420 421
421 /* maybe allocate device-global string IDs, and patch descriptors */
422 if (obex_string_defs[OBEX_CTRL_IDX].id == 0) { 422 if (obex_string_defs[OBEX_CTRL_IDX].id == 0) {
423 status = usb_string_id(c->cdev); 423 status = usb_string_ids_tab(c->cdev, obex_string_defs);
424 if (status < 0) 424 if (status < 0)
425 return status; 425 return status;
426 obex_string_defs[OBEX_CTRL_IDX].id = status; 426 obex_control_intf.iInterface =
427 obex_string_defs[OBEX_CTRL_IDX].id;
427 428
428 obex_control_intf.iInterface = status; 429 status = obex_string_defs[OBEX_DATA_IDX].id;
429 430 obex_data_nop_intf.iInterface = status;
430 status = usb_string_id(c->cdev); 431 obex_data_intf.iInterface = status;
431 if (status < 0)
432 return status;
433 obex_string_defs[OBEX_DATA_IDX].id = status;
434
435 obex_data_nop_intf.iInterface =
436 obex_data_intf.iInterface = status;
437 } 432 }
438 433
439 /* allocate and initialize one new instance */ 434 /* allocate and initialize one new instance */
diff --git a/drivers/usb/gadget/f_rndis.c b/drivers/usb/gadget/f_rndis.c
index e7c25105bd8e..71beeb833558 100644
--- a/drivers/usb/gadget/f_rndis.c
+++ b/drivers/usb/gadget/f_rndis.c
@@ -795,8 +795,8 @@ rndis_unbind(struct usb_configuration *c, struct usb_function *f)
795 795
796 rndis_deregister(rndis->config); 796 rndis_deregister(rndis->config);
797 rndis_exit(); 797 rndis_exit();
798 rndis_string_defs[0].id = 0;
799 798
799 rndis_string_defs[0].id = 0;
800 usb_free_all_descriptors(f); 800 usb_free_all_descriptors(f);
801 801
802 kfree(rndis->notify_req->buf); 802 kfree(rndis->notify_req->buf);
@@ -822,34 +822,19 @@ rndis_bind_config_vendor(struct usb_configuration *c, u8 ethaddr[ETH_ALEN],
822 if (!can_support_rndis(c) || !ethaddr) 822 if (!can_support_rndis(c) || !ethaddr)
823 return -EINVAL; 823 return -EINVAL;
824 824
825 /* maybe allocate device-global string IDs */
826 if (rndis_string_defs[0].id == 0) { 825 if (rndis_string_defs[0].id == 0) {
827
828 /* ... and setup RNDIS itself */ 826 /* ... and setup RNDIS itself */
829 status = rndis_init(); 827 status = rndis_init();
830 if (status < 0) 828 if (status < 0)
831 return status; 829 return status;
832 830
833 /* control interface label */ 831 status = usb_string_ids_tab(c->cdev, rndis_string_defs);
834 status = usb_string_id(c->cdev); 832 if (status)
835 if (status < 0)
836 return status; 833 return status;
837 rndis_string_defs[0].id = status;
838 rndis_control_intf.iInterface = status;
839 834
840 /* data interface label */ 835 rndis_control_intf.iInterface = rndis_string_defs[0].id;
841 status = usb_string_id(c->cdev); 836 rndis_data_intf.iInterface = rndis_string_defs[1].id;
842 if (status < 0) 837 rndis_iad_descriptor.iFunction = rndis_string_defs[2].id;
843 return status;
844 rndis_string_defs[1].id = status;
845 rndis_data_intf.iInterface = status;
846
847 /* IAD iFunction label */
848 status = usb_string_id(c->cdev);
849 if (status < 0)
850 return status;
851 rndis_string_defs[2].id = status;
852 rndis_iad_descriptor.iFunction = status;
853 } 838 }
854 839
855 /* allocate and initialize one new instance */ 840 /* allocate and initialize one new instance */
diff --git a/drivers/usb/gadget/f_subset.c b/drivers/usb/gadget/f_subset.c
index 856dbae586f1..f172bd152fbb 100644
--- a/drivers/usb/gadget/f_subset.c
+++ b/drivers/usb/gadget/f_subset.c
@@ -236,7 +236,7 @@ static struct usb_descriptor_header *ss_eth_function[] = {
236 236
237static struct usb_string geth_string_defs[] = { 237static struct usb_string geth_string_defs[] = {
238 [0].s = "CDC Ethernet Subset/SAFE", 238 [0].s = "CDC Ethernet Subset/SAFE",
239 [1].s = NULL /* DYNAMIC */, 239 [1].s = "",
240 { } /* end of list */ 240 { } /* end of list */
241}; 241};
242 242
@@ -363,8 +363,8 @@ fail:
363static void 363static void
364geth_unbind(struct usb_configuration *c, struct usb_function *f) 364geth_unbind(struct usb_configuration *c, struct usb_function *f)
365{ 365{
366 geth_string_defs[0].id = 0;
366 usb_free_all_descriptors(f); 367 usb_free_all_descriptors(f);
367 geth_string_defs[1].s = NULL;
368 kfree(func_to_geth(f)); 368 kfree(func_to_geth(f));
369} 369}
370 370
@@ -390,20 +390,11 @@ int geth_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN])
390 390
391 /* maybe allocate device-global string IDs */ 391 /* maybe allocate device-global string IDs */
392 if (geth_string_defs[0].id == 0) { 392 if (geth_string_defs[0].id == 0) {
393 393 status = usb_string_ids_tab(c->cdev, geth_string_defs);
394 /* interface label */
395 status = usb_string_id(c->cdev);
396 if (status < 0)
397 return status;
398 geth_string_defs[0].id = status;
399 subset_data_intf.iInterface = status;
400
401 /* MAC address */
402 status = usb_string_id(c->cdev);
403 if (status < 0) 394 if (status < 0)
404 return status; 395 return status;
405 geth_string_defs[1].id = status; 396 subset_data_intf.iInterface = geth_string_defs[0].id;
406 ether_desc.iMACAddress = status; 397 ether_desc.iMACAddress = geth_string_defs[1].id;
407 } 398 }
408 399
409 /* allocate and initialize one new instance */ 400 /* allocate and initialize one new instance */
@@ -425,9 +416,7 @@ int geth_bind_config(struct usb_configuration *c, u8 ethaddr[ETH_ALEN])
425 geth->port.func.disable = geth_disable; 416 geth->port.func.disable = geth_disable;
426 417
427 status = usb_add_function(c, &geth->port.func); 418 status = usb_add_function(c, &geth->port.func);
428 if (status) { 419 if (status)
429 geth_string_defs[1].s = NULL;
430 kfree(geth); 420 kfree(geth);
431 }
432 return status; 421 return status;
433} 422}
diff --git a/drivers/usb/gadget/f_uac2.c b/drivers/usb/gadget/f_uac2.c
index 2840f1819065..91396a1683eb 100644
--- a/drivers/usb/gadget/f_uac2.c
+++ b/drivers/usb/gadget/f_uac2.c
@@ -1312,7 +1312,7 @@ afunc_setup(struct usb_function *fn, const struct usb_ctrlrequest *cr)
1312 1312
1313static int audio_bind_config(struct usb_configuration *cfg) 1313static int audio_bind_config(struct usb_configuration *cfg)
1314{ 1314{
1315 int id, res; 1315 int res;
1316 1316
1317 agdev_g = kzalloc(sizeof *agdev_g, GFP_KERNEL); 1317 agdev_g = kzalloc(sizeof *agdev_g, GFP_KERNEL);
1318 if (agdev_g == NULL) { 1318 if (agdev_g == NULL) {
@@ -1320,89 +1320,21 @@ static int audio_bind_config(struct usb_configuration *cfg)
1320 return -ENOMEM; 1320 return -ENOMEM;
1321 } 1321 }
1322 1322
1323 id = usb_string_id(cfg->cdev); 1323 res = usb_string_ids_tab(cfg->cdev, strings_fn);
1324 if (id < 0) 1324 if (res)
1325 return id; 1325 return res;
1326 1326 iad_desc.iFunction = strings_fn[STR_ASSOC].id;
1327 strings_fn[STR_ASSOC].id = id; 1327 std_ac_if_desc.iInterface = strings_fn[STR_IF_CTRL].id;
1328 iad_desc.iFunction = id, 1328 in_clk_src_desc.iClockSource = strings_fn[STR_CLKSRC_IN].id;
1329 1329 out_clk_src_desc.iClockSource = strings_fn[STR_CLKSRC_OUT].id;
1330 id = usb_string_id(cfg->cdev); 1330 usb_out_it_desc.iTerminal = strings_fn[STR_USB_IT].id;
1331 if (id < 0) 1331 io_in_it_desc.iTerminal = strings_fn[STR_IO_IT].id;
1332 return id; 1332 usb_in_ot_desc.iTerminal = strings_fn[STR_USB_OT].id;
1333 1333 io_out_ot_desc.iTerminal = strings_fn[STR_IO_OT].id;
1334 strings_fn[STR_IF_CTRL].id = id; 1334 std_as_out_if0_desc.iInterface = strings_fn[STR_AS_OUT_ALT0].id;
1335 std_ac_if_desc.iInterface = id, 1335 std_as_out_if1_desc.iInterface = strings_fn[STR_AS_OUT_ALT1].id;
1336 1336 std_as_in_if0_desc.iInterface = strings_fn[STR_AS_IN_ALT0].id;
1337 id = usb_string_id(cfg->cdev); 1337 std_as_in_if1_desc.iInterface = strings_fn[STR_AS_IN_ALT1].id;
1338 if (id < 0)
1339 return id;
1340
1341 strings_fn[STR_CLKSRC_IN].id = id;
1342 in_clk_src_desc.iClockSource = id,
1343
1344 id = usb_string_id(cfg->cdev);
1345 if (id < 0)
1346 return id;
1347
1348 strings_fn[STR_CLKSRC_OUT].id = id;
1349 out_clk_src_desc.iClockSource = id,
1350
1351 id = usb_string_id(cfg->cdev);
1352 if (id < 0)
1353 return id;
1354
1355 strings_fn[STR_USB_IT].id = id;
1356 usb_out_it_desc.iTerminal = id,
1357
1358 id = usb_string_id(cfg->cdev);
1359 if (id < 0)
1360 return id;
1361
1362 strings_fn[STR_IO_IT].id = id;
1363 io_in_it_desc.iTerminal = id;
1364
1365 id = usb_string_id(cfg->cdev);
1366 if (id < 0)
1367 return id;
1368
1369 strings_fn[STR_USB_OT].id = id;
1370 usb_in_ot_desc.iTerminal = id;
1371
1372 id = usb_string_id(cfg->cdev);
1373 if (id < 0)
1374 return id;
1375
1376 strings_fn[STR_IO_OT].id = id;
1377 io_out_ot_desc.iTerminal = id;
1378
1379 id = usb_string_id(cfg->cdev);
1380 if (id < 0)
1381 return id;
1382
1383 strings_fn[STR_AS_OUT_ALT0].id = id;
1384 std_as_out_if0_desc.iInterface = id;
1385
1386 id = usb_string_id(cfg->cdev);
1387 if (id < 0)
1388 return id;
1389
1390 strings_fn[STR_AS_OUT_ALT1].id = id;
1391 std_as_out_if1_desc.iInterface = id;
1392
1393 id = usb_string_id(cfg->cdev);
1394 if (id < 0)
1395 return id;
1396
1397 strings_fn[STR_AS_IN_ALT0].id = id;
1398 std_as_in_if0_desc.iInterface = id;
1399
1400 id = usb_string_id(cfg->cdev);
1401 if (id < 0)
1402 return id;
1403
1404 strings_fn[STR_AS_IN_ALT1].id = id;
1405 std_as_in_if1_desc.iInterface = id;
1406 1338
1407 agdev_g->func.name = "uac2_func"; 1339 agdev_g->func.name = "uac2_func";
1408 agdev_g->func.strings = fn_strings; 1340 agdev_g->func.strings = fn_strings;
diff --git a/drivers/usb/gadget/f_uvc.c b/drivers/usb/gadget/f_uvc.c
index 28ff2546a5b3..5b629876941b 100644
--- a/drivers/usb/gadget/f_uvc.c
+++ b/drivers/usb/gadget/f_uvc.c
@@ -580,6 +580,7 @@ uvc_function_unbind(struct usb_configuration *c, struct usb_function *f)
580 uvc->control_ep->driver_data = NULL; 580 uvc->control_ep->driver_data = NULL;
581 uvc->video.ep->driver_data = NULL; 581 uvc->video.ep->driver_data = NULL;
582 582
583 uvc_en_us_strings[UVC_STRING_ASSOCIATION_IDX].id = 0;
583 usb_ep_free_request(cdev->gadget->ep0, uvc->control_req); 584 usb_ep_free_request(cdev->gadget->ep0, uvc->control_req);
584 kfree(uvc->control_buf); 585 kfree(uvc->control_buf);
585 586
@@ -798,25 +799,16 @@ uvc_bind_config(struct usb_configuration *c,
798 uvc->desc.hs_streaming = hs_streaming; 799 uvc->desc.hs_streaming = hs_streaming;
799 uvc->desc.ss_streaming = ss_streaming; 800 uvc->desc.ss_streaming = ss_streaming;
800 801
801 /* maybe allocate device-global string IDs, and patch descriptors */ 802 /* Allocate string descriptor numbers. */
802 if (uvc_en_us_strings[UVC_STRING_ASSOCIATION_IDX].id == 0) { 803 if (uvc_en_us_strings[UVC_STRING_ASSOCIATION_IDX].id == 0) {
803 /* Allocate string descriptor numbers. */ 804 ret = usb_string_ids_tab(c->cdev, uvc_en_us_strings);
804 ret = usb_string_id(c->cdev); 805 if (ret)
805 if (ret < 0)
806 goto error; 806 goto error;
807 uvc_en_us_strings[UVC_STRING_ASSOCIATION_IDX].id = ret; 807 uvc_iad.iFunction =
808 uvc_iad.iFunction = ret; 808 uvc_en_us_strings[UVC_STRING_ASSOCIATION_IDX].id;
809 809 uvc_control_intf.iInterface =
810 ret = usb_string_id(c->cdev); 810 uvc_en_us_strings[UVC_STRING_CONTROL_IDX].id;
811 if (ret < 0) 811 ret = uvc_en_us_strings[UVC_STRING_STREAMING_IDX].id;
812 goto error;
813 uvc_en_us_strings[UVC_STRING_CONTROL_IDX].id = ret;
814 uvc_control_intf.iInterface = ret;
815
816 ret = usb_string_id(c->cdev);
817 if (ret < 0)
818 goto error;
819 uvc_en_us_strings[UVC_STRING_STREAMING_IDX].id = ret;
820 uvc_streaming_intf_alt0.iInterface = ret; 812 uvc_streaming_intf_alt0.iInterface = ret;
821 uvc_streaming_intf_alt1.iInterface = ret; 813 uvc_streaming_intf_alt1.iInterface = ret;
822 } 814 }