This patch does two things actually:
- It removes the conditional allocation of string ids. This check is not
  required because bind is called only once at modprobe time. So we
  never can optimize this one away.
- Instead of calling usb_string_id() multiple times I replace it with
  one usb_string_ids_tab(). The NULL pointer in struct usb_string with
  "" and are not overwritten in fail or unbind case.

Signed-off-by: Sebastian Andrzej Siewior <bige...@linutronix.de>
---
 drivers/usb/gadget/f_acm.c          |   29 +++-------
 drivers/usb/gadget/f_ecm.c          |   47 ++++------------
 drivers/usb/gadget/f_eem.c          |   16 +++---
 drivers/usb/gadget/f_hid.c          |   12 ++---
 drivers/usb/gadget/f_mass_storage.c |   12 ++---
 drivers/usb/gadget/f_midi.c         |   10 ++--
 drivers/usb/gadget/f_ncm.c          |   52 +++++-------------
 drivers/usb/gadget/f_obex.c         |   25 +++------
 drivers/usb/gadget/f_rndis.c        |   42 +++++----------
 drivers/usb/gadget/f_serial.c       |   10 ++--
 drivers/usb/gadget/f_subset.c       |   29 +++-------
 drivers/usb/gadget/f_uac2.c         |  100 ++++++-----------------------------
 drivers/usb/gadget/f_uvc.c          |   30 +++--------
 13 files changed, 106 insertions(+), 308 deletions(-)

diff --git a/drivers/usb/gadget/f_acm.c b/drivers/usb/gadget/f_acm.c
index 308242b..38ec5c7 100644
--- a/drivers/usb/gadget/f_acm.c
+++ b/drivers/usb/gadget/f_acm.c
@@ -742,28 +742,13 @@ int acm_bind_config(struct usb_configuration *c, u8 
port_num)
         */
 
        /* maybe allocate device-global string IDs, and patch descriptors */
-       if (acm_string_defs[ACM_CTRL_IDX].id == 0) {
-               status = usb_string_id(c->cdev);
-               if (status < 0)
-                       return status;
-               acm_string_defs[ACM_CTRL_IDX].id = status;
-
-               acm_control_interface_desc.iInterface = status;
-
-               status = usb_string_id(c->cdev);
-               if (status < 0)
-                       return status;
-               acm_string_defs[ACM_DATA_IDX].id = status;
-
-               acm_data_interface_desc.iInterface = status;
-
-               status = usb_string_id(c->cdev);
-               if (status < 0)
-                       return status;
-               acm_string_defs[ACM_IAD_IDX].id = status;
-
-               acm_iad_descriptor.iFunction = status;
-       }
+       status = usb_string_ids_tab(c->cdev, acm_string_defs);
+       if (status < 0)
+               return status;
+       acm_control_interface_desc.iInterface =
+               acm_string_defs[ACM_CTRL_IDX].id;
+       acm_data_interface_desc.iInterface = acm_string_defs[ACM_DATA_IDX].id;
+       acm_iad_descriptor.iFunction = acm_string_defs[ACM_IAD_IDX].id;
 
        /* allocate and initialize one new instance */
        acm = kzalloc(sizeof *acm, GFP_KERNEL);
diff --git a/drivers/usb/gadget/f_ecm.c b/drivers/usb/gadget/f_ecm.c
index 2d3c5a4..1e6ad86 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[] = {
 
 static struct usb_string ecm_string_defs[] = {
        [0].s = "CDC Ethernet Control Model (ECM)",
-       [1].s = NULL /* DYNAMIC */,
+       [1].s = "",
        [2].s = "CDC Ethernet Data",
        [3].s = "CDC ECM",
        {  } /* end of list */
@@ -807,8 +807,6 @@ ecm_unbind(struct usb_configuration *c, struct usb_function 
*f)
 
        kfree(ecm->notify_req->buf);
        usb_ep_free_request(ecm->notify, ecm->notify_req);
-
-       ecm_string_defs[1].s = NULL;
        kfree(ecm);
 }
 
@@ -833,37 +831,14 @@ ecm_bind_config(struct usb_configuration *c, u8 
ethaddr[ETH_ALEN])
        if (!can_support_ecm(c->cdev->gadget) || !ethaddr)
                return -EINVAL;
 
-       /* maybe allocate device-global string IDs */
-       if (ecm_string_defs[0].id == 0) {
-
-               /* control interface label */
-               status = usb_string_id(c->cdev);
-               if (status < 0)
-                       return status;
-               ecm_string_defs[0].id = status;
-               ecm_control_intf.iInterface = status;
-
-               /* data interface label */
-               status = usb_string_id(c->cdev);
-               if (status < 0)
-                       return status;
-               ecm_string_defs[2].id = status;
-               ecm_data_intf.iInterface = status;
-
-               /* MAC address */
-               status = usb_string_id(c->cdev);
-               if (status < 0)
-                       return status;
-               ecm_string_defs[1].id = status;
-               ecm_desc.iMACAddress = status;
-
-               /* IAD label */
-               status = usb_string_id(c->cdev);
-               if (status < 0)
-                       return status;
-               ecm_string_defs[3].id = status;
-               ecm_iad_descriptor.iFunction = status;
-       }
+       status = usb_string_ids_tab(c->cdev, ecm_string_defs);
+       if (status)
+               return status;
+
+       ecm_control_intf.iInterface = ecm_string_defs[0].id;
+       ecm_data_intf.iInterface = ecm_string_defs[2].id;
+       ecm_desc.iMACAddress = ecm_string_defs[1].id;
+       ecm_iad_descriptor.iFunction = ecm_string_defs[3].id;
 
        /* allocate and initialize one new instance */
        ecm = kzalloc(sizeof *ecm, GFP_KERNEL);
@@ -887,9 +862,7 @@ ecm_bind_config(struct usb_configuration *c, u8 
ethaddr[ETH_ALEN])
        ecm->port.func.disable = ecm_disable;
 
        status = usb_add_function(c, &ecm->port.func);
-       if (status) {
-               ecm_string_defs[1].s = NULL;
+       if (status)
                kfree(ecm);
-       }
        return status;
 }
diff --git a/drivers/usb/gadget/f_eem.c b/drivers/usb/gadget/f_eem.c
index cf0ebee..9f296a2 100644
--- a/drivers/usb/gadget/f_eem.c
+++ b/drivers/usb/gadget/f_eem.c
@@ -533,16 +533,12 @@ int __init eem_bind_config(struct usb_configuration *c)
        struct f_eem    *eem;
        int             status;
 
-       /* maybe allocate device-global string IDs */
-       if (eem_string_defs[0].id == 0) {
-
-               /* control interface label */
-               status = usb_string_id(c->cdev);
-               if (status < 0)
-                       return status;
-               eem_string_defs[0].id = status;
-               eem_intf.iInterface = status;
-       }
+       /* control interface label */
+       status = usb_string_id(c->cdev);
+       if (status < 0)
+               return status;
+       eem_string_defs[0].id = status;
+       eem_intf.iInterface = status;
 
        /* allocate and initialize one new instance */
        eem = kzalloc(sizeof *eem, GFP_KERNEL);
diff --git a/drivers/usb/gadget/f_hid.c b/drivers/usb/gadget/f_hid.c
index 6e69a8e..edafe5f 100644
--- a/drivers/usb/gadget/f_hid.c
+++ b/drivers/usb/gadget/f_hid.c
@@ -699,13 +699,11 @@ int __init hidg_bind_config(struct usb_configuration *c,
                return -ENOENT;
 
        /* maybe allocate device-global string IDs, and patch descriptors */
-       if (ct_func_string_defs[CT_FUNC_HID_IDX].id == 0) {
-               status = usb_string_id(c->cdev);
-               if (status < 0)
-                       return status;
-               ct_func_string_defs[CT_FUNC_HID_IDX].id = status;
-               hidg_interface_desc.iInterface = status;
-       }
+       status = usb_string_id(c->cdev);
+       if (status < 0)
+               return status;
+       ct_func_string_defs[CT_FUNC_HID_IDX].id = status;
+       hidg_interface_desc.iInterface = status;
 
        /* allocate and initialize one new instance */
        hidg = kzalloc(sizeof *hidg, GFP_KERNEL);
diff --git a/drivers/usb/gadget/f_mass_storage.c 
b/drivers/usb/gadget/f_mass_storage.c
index 3433e43..79bf45a 100644
--- a/drivers/usb/gadget/f_mass_storage.c
+++ b/drivers/usb/gadget/f_mass_storage.c
@@ -2686,13 +2686,11 @@ static struct fsg_common *fsg_common_init(struct 
fsg_common *common,
        common->cdev = cdev;
 
        /* Maybe allocate device-global string IDs, and patch descriptors */
-       if (fsg_strings[FSG_STRING_INTERFACE].id == 0) {
-               rc = usb_string_id(cdev);
-               if (unlikely(rc < 0))
-                       goto error_release;
-               fsg_strings[FSG_STRING_INTERFACE].id = rc;
-               fsg_intf_desc.iInterface = rc;
-       }
+       rc = usb_string_id(cdev);
+       if (unlikely(rc < 0))
+               goto error_release;
+       fsg_strings[FSG_STRING_INTERFACE].id = rc;
+       fsg_intf_desc.iInterface = rc;
 
        /*
         * Create the LUNs, open their backing files, and register the
diff --git a/drivers/usb/gadget/f_midi.c b/drivers/usb/gadget/f_midi.c
index 263e721..20a22f0 100644
--- a/drivers/usb/gadget/f_midi.c
+++ b/drivers/usb/gadget/f_midi.c
@@ -746,12 +746,10 @@ f_midi_bind(struct usb_configuration *c, struct 
usb_function *f)
        int status, n, jack = 1, i = 0;
 
        /* maybe allocate device-global string ID */
-       if (midi_string_defs[0].id == 0) {
-               status = usb_string_id(c->cdev);
-               if (status < 0)
-                       goto fail;
-               midi_string_defs[0].id = status;
-       }
+       status = usb_string_id(c->cdev);
+       if (status < 0)
+               goto fail;
+       midi_string_defs[0].id = status;
 
        /* We have two interfaces, AudioControl and MIDIStreaming */
        status = usb_interface_id(c, f);
diff --git a/drivers/usb/gadget/f_ncm.c b/drivers/usb/gadget/f_ncm.c
index 326d7e6..239213d 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 = {
 
 static struct usb_string ncm_string_defs[] = {
        [STRING_CTRL_IDX].s = "CDC Network Control Model (NCM)",
-       [STRING_MAC_IDX].s = NULL /* DYNAMIC */,
+       [STRING_MAC_IDX].s = "",
        [STRING_DATA_IDX].s = "CDC Network Data",
        [STRING_IAD_IDX].s = "CDC NCM",
        {  } /* end of list */
@@ -1267,7 +1267,6 @@ ncm_unbind(struct usb_configuration *c, struct 
usb_function *f)
        kfree(ncm->notify_req->buf);
        usb_ep_free_request(ncm->notify, ncm->notify_req);
 
-       ncm_string_defs[1].s = NULL;
        kfree(ncm);
 }
 
@@ -1291,38 +1290,17 @@ int __init ncm_bind_config(struct usb_configuration *c, 
u8 ethaddr[ETH_ALEN])
        if (!can_support_ecm(c->cdev->gadget) || !ethaddr)
                return -EINVAL;
 
-       /* maybe allocate device-global string IDs */
-       if (ncm_string_defs[0].id == 0) {
-
-               /* control interface label */
-               status = usb_string_id(c->cdev);
-               if (status < 0)
-                       return status;
-               ncm_string_defs[STRING_CTRL_IDX].id = status;
-               ncm_control_intf.iInterface = status;
-
-               /* data interface label */
-               status = usb_string_id(c->cdev);
-               if (status < 0)
-                       return status;
-               ncm_string_defs[STRING_DATA_IDX].id = status;
-               ncm_data_nop_intf.iInterface = status;
-               ncm_data_intf.iInterface = status;
-
-               /* MAC address */
-               status = usb_string_id(c->cdev);
-               if (status < 0)
-                       return status;
-               ncm_string_defs[STRING_MAC_IDX].id = status;
-               ecm_desc.iMACAddress = status;
-
-               /* IAD */
-               status = usb_string_id(c->cdev);
-               if (status < 0)
-                       return status;
-               ncm_string_defs[STRING_IAD_IDX].id = status;
-               ncm_iad_desc.iFunction = status;
-       }
+       status = usb_string_ids_tab(c->cdev, ncm_string_defs);
+       if (status < 0)
+               return status;
+       ncm_control_intf.iInterface = ncm_string_defs[STRING_CTRL_IDX].id;
+
+       status = ncm_string_defs[STRING_DATA_IDX].id;
+       ncm_data_nop_intf.iInterface = status;
+       ncm_data_intf.iInterface = status;
+
+       ecm_desc.iMACAddress = ncm_string_defs[STRING_MAC_IDX].id;
+       ncm_iad_desc.iFunction = ncm_string_defs[STRING_IAD_IDX].id;
 
        /* allocate and initialize one new instance */
        ncm = kzalloc(sizeof *ncm, GFP_KERNEL);
@@ -1331,7 +1309,7 @@ int __init ncm_bind_config(struct usb_configuration *c, 
u8 ethaddr[ETH_ALEN])
 
        /* export host's Ethernet address in CDC format */
        snprintf(ncm->ethaddr, sizeof ncm->ethaddr, "%pm", ethaddr);
-       ncm_string_defs[1].s = ncm->ethaddr;
+       ncm_string_defs[STRING_MAC_IDX].s = ncm->ethaddr;
 
        spin_lock_init(&ncm->lock);
        ncm_reset_values(ncm);
@@ -1351,9 +1329,7 @@ int __init ncm_bind_config(struct usb_configuration *c, 
u8 ethaddr[ETH_ALEN])
        ncm->port.unwrap = ncm_unwrap_ntb;
 
        status = usb_add_function(c, &ncm->port.func);
-       if (status) {
-               ncm_string_defs[1].s = NULL;
+       if (status)
                kfree(ncm);
-       }
        return status;
 }
diff --git a/drivers/usb/gadget/f_obex.c b/drivers/usb/gadget/f_obex.c
index d74491a..9778847 100644
--- a/drivers/usb/gadget/f_obex.c
+++ b/drivers/usb/gadget/f_obex.c
@@ -418,23 +418,14 @@ int __init obex_bind_config(struct usb_configuration *c, 
u8 port_num)
        if (!can_support_obex(c))
                return -EINVAL;
 
-       /* maybe allocate device-global string IDs, and patch descriptors */
-       if (obex_string_defs[OBEX_CTRL_IDX].id == 0) {
-               status = usb_string_id(c->cdev);
-               if (status < 0)
-                       return status;
-               obex_string_defs[OBEX_CTRL_IDX].id = status;
-
-               obex_control_intf.iInterface = status;
-
-               status = usb_string_id(c->cdev);
-               if (status < 0)
-                       return status;
-               obex_string_defs[OBEX_DATA_IDX].id = status;
-
-               obex_data_nop_intf.iInterface =
-                       obex_data_intf.iInterface = status;
-       }
+       status = usb_string_ids_tab(c->cdev, obex_string_defs);
+       if (status < 0)
+               return status;
+       obex_control_intf.iInterface = obex_string_defs[OBEX_CTRL_IDX].id;
+
+       status = obex_string_defs[OBEX_DATA_IDX].id;
+       obex_data_nop_intf.iInterface = status;
+       obex_data_intf.iInterface = status;
 
        /* allocate and initialize one new instance */
        obex = kzalloc(sizeof *obex, GFP_KERNEL);
diff --git a/drivers/usb/gadget/f_rndis.c b/drivers/usb/gadget/f_rndis.c
index e7c2510..ef89e20 100644
--- a/drivers/usb/gadget/f_rndis.c
+++ b/drivers/usb/gadget/f_rndis.c
@@ -795,7 +795,6 @@ rndis_unbind(struct usb_configuration *c, struct 
usb_function *f)
 
        rndis_deregister(rndis->config);
        rndis_exit();
-       rndis_string_defs[0].id = 0;
 
        usb_free_all_descriptors(f);
 
@@ -822,35 +821,18 @@ rndis_bind_config_vendor(struct usb_configuration *c, u8 
ethaddr[ETH_ALEN],
        if (!can_support_rndis(c) || !ethaddr)
                return -EINVAL;
 
-       /* maybe allocate device-global string IDs */
-       if (rndis_string_defs[0].id == 0) {
-
-               /* ... and setup RNDIS itself */
-               status = rndis_init();
-               if (status < 0)
-                       return status;
-
-               /* control interface label */
-               status = usb_string_id(c->cdev);
-               if (status < 0)
-                       return status;
-               rndis_string_defs[0].id = status;
-               rndis_control_intf.iInterface = status;
-
-               /* data interface label */
-               status = usb_string_id(c->cdev);
-               if (status < 0)
-                       return status;
-               rndis_string_defs[1].id = status;
-               rndis_data_intf.iInterface = status;
-
-               /* IAD iFunction label */
-               status = usb_string_id(c->cdev);
-               if (status < 0)
-                       return status;
-               rndis_string_defs[2].id = status;
-               rndis_iad_descriptor.iFunction = status;
-       }
+       /* ... and setup RNDIS itself */
+       status = rndis_init();
+       if (status < 0)
+               return status;
+
+       status = usb_string_ids_tab(c->cdev, rndis_string_defs);
+       if (status)
+               return status;
+
+       rndis_control_intf.iInterface = rndis_string_defs[0].id;
+       rndis_data_intf.iInterface = rndis_string_defs[1].id;
+       rndis_iad_descriptor.iFunction = rndis_string_defs[2].id;
 
        /* allocate and initialize one new instance */
        status = -ENOMEM;
diff --git a/drivers/usb/gadget/f_serial.c b/drivers/usb/gadget/f_serial.c
index 98fa779..a701bb9 100644
--- a/drivers/usb/gadget/f_serial.c
+++ b/drivers/usb/gadget/f_serial.c
@@ -275,12 +275,10 @@ int __init gser_bind_config(struct usb_configuration *c, 
u8 port_num)
         */
 
        /* maybe allocate device-global string ID */
-       if (gser_string_defs[0].id == 0) {
-               status = usb_string_id(c->cdev);
-               if (status < 0)
-                       return status;
-               gser_string_defs[0].id = status;
-       }
+       status = usb_string_id(c->cdev);
+       if (status < 0)
+               return status;
+       gser_string_defs[0].id = status;
 
        /* allocate and initialize one new instance */
        gser = kzalloc(sizeof *gser, GFP_KERNEL);
diff --git a/drivers/usb/gadget/f_subset.c b/drivers/usb/gadget/f_subset.c
index 856dbae..f6cd93c 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[] = {
 
 static struct usb_string geth_string_defs[] = {
        [0].s = "CDC Ethernet Subset/SAFE",
-       [1].s = NULL /* DYNAMIC */,
+       [1].s = "",
        {  } /* end of list */
 };
 
@@ -364,7 +364,6 @@ static void
 geth_unbind(struct usb_configuration *c, struct usb_function *f)
 {
        usb_free_all_descriptors(f);
-       geth_string_defs[1].s = NULL;
        kfree(func_to_geth(f));
 }
 
@@ -388,23 +387,11 @@ int geth_bind_config(struct usb_configuration *c, u8 
ethaddr[ETH_ALEN])
        if (!ethaddr)
                return -EINVAL;
 
-       /* maybe allocate device-global string IDs */
-       if (geth_string_defs[0].id == 0) {
-
-               /* interface label */
-               status = usb_string_id(c->cdev);
-               if (status < 0)
-                       return status;
-               geth_string_defs[0].id = status;
-               subset_data_intf.iInterface = status;
-
-               /* MAC address */
-               status = usb_string_id(c->cdev);
-               if (status < 0)
-                       return status;
-               geth_string_defs[1].id = status;
-               ether_desc.iMACAddress = status;
-       }
+       status = usb_string_ids_tab(c->cdev, geth_string_defs);
+       if (status < 0)
+               return status;
+       subset_data_intf.iInterface = geth_string_defs[0].id;
+       ether_desc.iMACAddress = geth_string_defs[1].id;
 
        /* allocate and initialize one new instance */
        geth = kzalloc(sizeof *geth, GFP_KERNEL);
@@ -425,9 +412,7 @@ int geth_bind_config(struct usb_configuration *c, u8 
ethaddr[ETH_ALEN])
        geth->port.func.disable = geth_disable;
 
        status = usb_add_function(c, &geth->port.func);
-       if (status) {
-               geth_string_defs[1].s = NULL;
+       if (status)
                kfree(geth);
-       }
        return status;
 }
diff --git a/drivers/usb/gadget/f_uac2.c b/drivers/usb/gadget/f_uac2.c
index 2840f18..91396a1 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)
 
 static int audio_bind_config(struct usb_configuration *cfg)
 {
-       int id, res;
+       int res;
 
        agdev_g = kzalloc(sizeof *agdev_g, GFP_KERNEL);
        if (agdev_g == NULL) {
@@ -1320,89 +1320,21 @@ static int audio_bind_config(struct usb_configuration 
*cfg)
                return -ENOMEM;
        }
 
-       id = usb_string_id(cfg->cdev);
-       if (id < 0)
-               return id;
-
-       strings_fn[STR_ASSOC].id = id;
-       iad_desc.iFunction = id,
-
-       id = usb_string_id(cfg->cdev);
-       if (id < 0)
-               return id;
-
-       strings_fn[STR_IF_CTRL].id = id;
-       std_ac_if_desc.iInterface = id,
-
-       id = usb_string_id(cfg->cdev);
-       if (id < 0)
-               return id;
-
-       strings_fn[STR_CLKSRC_IN].id = id;
-       in_clk_src_desc.iClockSource = id,
-
-       id = usb_string_id(cfg->cdev);
-       if (id < 0)
-               return id;
-
-       strings_fn[STR_CLKSRC_OUT].id = id;
-       out_clk_src_desc.iClockSource = id,
-
-       id = usb_string_id(cfg->cdev);
-       if (id < 0)
-               return id;
-
-       strings_fn[STR_USB_IT].id = id;
-       usb_out_it_desc.iTerminal = id,
-
-       id = usb_string_id(cfg->cdev);
-       if (id < 0)
-               return id;
-
-       strings_fn[STR_IO_IT].id = id;
-       io_in_it_desc.iTerminal = id;
-
-       id = usb_string_id(cfg->cdev);
-       if (id < 0)
-               return id;
-
-       strings_fn[STR_USB_OT].id = id;
-       usb_in_ot_desc.iTerminal = id;
-
-       id = usb_string_id(cfg->cdev);
-       if (id < 0)
-               return id;
-
-       strings_fn[STR_IO_OT].id = id;
-       io_out_ot_desc.iTerminal = id;
-
-       id = usb_string_id(cfg->cdev);
-       if (id < 0)
-               return id;
-
-       strings_fn[STR_AS_OUT_ALT0].id = id;
-       std_as_out_if0_desc.iInterface = id;
-
-       id = usb_string_id(cfg->cdev);
-       if (id < 0)
-               return id;
-
-       strings_fn[STR_AS_OUT_ALT1].id = id;
-       std_as_out_if1_desc.iInterface = id;
-
-       id = usb_string_id(cfg->cdev);
-       if (id < 0)
-               return id;
-
-       strings_fn[STR_AS_IN_ALT0].id = id;
-       std_as_in_if0_desc.iInterface = id;
-
-       id = usb_string_id(cfg->cdev);
-       if (id < 0)
-               return id;
-
-       strings_fn[STR_AS_IN_ALT1].id = id;
-       std_as_in_if1_desc.iInterface = id;
+       res = usb_string_ids_tab(cfg->cdev, strings_fn);
+       if (res)
+               return res;
+       iad_desc.iFunction = strings_fn[STR_ASSOC].id;
+       std_ac_if_desc.iInterface = strings_fn[STR_IF_CTRL].id;
+       in_clk_src_desc.iClockSource = strings_fn[STR_CLKSRC_IN].id;
+       out_clk_src_desc.iClockSource = strings_fn[STR_CLKSRC_OUT].id;
+       usb_out_it_desc.iTerminal = strings_fn[STR_USB_IT].id;
+       io_in_it_desc.iTerminal = strings_fn[STR_IO_IT].id;
+       usb_in_ot_desc.iTerminal = strings_fn[STR_USB_OT].id;
+       io_out_ot_desc.iTerminal = strings_fn[STR_IO_OT].id;
+       std_as_out_if0_desc.iInterface = strings_fn[STR_AS_OUT_ALT0].id;
+       std_as_out_if1_desc.iInterface = strings_fn[STR_AS_OUT_ALT1].id;
+       std_as_in_if0_desc.iInterface = strings_fn[STR_AS_IN_ALT0].id;
+       std_as_in_if1_desc.iInterface = strings_fn[STR_AS_IN_ALT1].id;
 
        agdev_g->func.name = "uac2_func";
        agdev_g->func.strings = fn_strings;
diff --git a/drivers/usb/gadget/f_uvc.c b/drivers/usb/gadget/f_uvc.c
index 28ff254..93827ef 100644
--- a/drivers/usb/gadget/f_uvc.c
+++ b/drivers/usb/gadget/f_uvc.c
@@ -798,28 +798,14 @@ uvc_bind_config(struct usb_configuration *c,
        uvc->desc.hs_streaming = hs_streaming;
        uvc->desc.ss_streaming = ss_streaming;
 
-       /* maybe allocate device-global string IDs, and patch descriptors */
-       if (uvc_en_us_strings[UVC_STRING_ASSOCIATION_IDX].id == 0) {
-               /* Allocate string descriptor numbers. */
-               ret = usb_string_id(c->cdev);
-               if (ret < 0)
-                       goto error;
-               uvc_en_us_strings[UVC_STRING_ASSOCIATION_IDX].id = ret;
-               uvc_iad.iFunction = ret;
-
-               ret = usb_string_id(c->cdev);
-               if (ret < 0)
-                       goto error;
-               uvc_en_us_strings[UVC_STRING_CONTROL_IDX].id = ret;
-               uvc_control_intf.iInterface = ret;
-
-               ret = usb_string_id(c->cdev);
-               if (ret < 0)
-                       goto error;
-               uvc_en_us_strings[UVC_STRING_STREAMING_IDX].id = ret;
-               uvc_streaming_intf_alt0.iInterface = ret;
-               uvc_streaming_intf_alt1.iInterface = ret;
-       }
+       /* Allocate string descriptor numbers. */
+       ret = usb_string_ids_tab(c->cdev, uvc_en_us_strings);
+       uvc_iad.iFunction = uvc_en_us_strings[UVC_STRING_ASSOCIATION_IDX].id;
+       uvc_control_intf.iInterface =
+               uvc_en_us_strings[UVC_STRING_CONTROL_IDX].id;
+       ret = uvc_en_us_strings[UVC_STRING_STREAMING_IDX].id;
+       uvc_streaming_intf_alt0.iInterface = ret;
+       uvc_streaming_intf_alt1.iInterface = ret;
 
        /* Register the function. */
        uvc->func.name = "uvc";
-- 
1.7.10.4

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to