Refactoring usb function variable in usb gadget 42/229142/5
authorINSUN PYO <insun.pyo@samsung.com>
Mon, 30 Mar 2020 05:05:19 +0000 (14:05 +0900)
committerINSUN PYO <insun.pyo@samsung.com>
Mon, 6 Apr 2020 11:52:34 +0000 (20:52 +0900)
Change-Id: I494c5dbb285870f226fe64392b6b880797309761

hw/usb_cfs_client_common.c
hw/usb_client_common.c
hw/usb_gadget.h
hw/usb_gadget_common.c

index 1e30ab5..f0cbd7d 100644 (file)
@@ -119,7 +119,7 @@ static bool cfs_is_gadget_supported(struct usb_gadget *gadget)
        int i, j;
        struct usb_configuration *config;
 
-       if (!gadget || !gadget->configs || !gadget->configs[0] || !gadget->funcs)
+       if (!gadget || !gadget->configs || !gadget->configs[0] || !gadget->configs[0]->funcs[0])
                return false;
 
        if (!gadget->attrs.idVendor || !gadget->attrs.idProduct || !gadget->attrs.bcdDevice)
index 87a418d..e8f8473 100644 (file)
@@ -75,7 +75,7 @@ static bool legacy_is_gadget_supported(struct usb_gadget *gadget)
        int i, j;
        struct usb_configuration *config;
 
-       if (!gadget || !gadget->configs || !gadget->configs[0] || !gadget->funcs)
+       if (!gadget || !gadget->configs || !gadget->configs[0] || !gadget->configs[0]->funcs[0])
                return false;
 
        if (!gadget->attrs.idVendor || !gadget->attrs.idProduct || !gadget->attrs.bcdDevice)
index 4dd3be9..c0ac3dc 100644 (file)
@@ -126,7 +126,6 @@ struct usb_gadget_strings {
 struct usb_gadget {
        struct usb_gadget_attrs attrs;
        struct usb_gadget_strings strs;
-       struct usb_function **funcs;
        struct usb_configuration **configs;
 };
 
@@ -144,6 +143,7 @@ struct usb_gadget_translator {
 int simple_translator_open(struct hw_info *info, const char *id, struct hw_common **common);
 int simple_translator_close(struct hw_common *common);
 
+struct usb_function *find_usb_function_by_id(int id);
 struct usb_function *find_usb_function_by_name(const char *name);
 struct usb_function *find_usb_function_by_name_instance(const char *name, const char *instance);
 
index 270d72b..d0de9fd 100644 (file)
@@ -63,9 +63,6 @@ static void cleanup_gadget(struct usb_gadget *gadget)
                free(gadget->configs);
        }
 
-       if (gadget->funcs)
-               free(gadget->funcs);
-
        free(gadget);
 }
 
@@ -146,25 +143,12 @@ out:
        return -ENOMEM;
 }
 
-static inline struct usb_function *find_func(struct usb_gadget *gadget,
-                                           int func_id)
-{
-       int i;
-
-       for (i = 0; gadget->funcs[i] && gadget->funcs[i]->id != func_id; ++i);
-
-       return gadget->funcs[i];
-}
-
-static int id_to_gadget(struct usb_gadget_id *gadget_id,
-                              struct usb_gadget **_gadget)
+static int id_to_gadget(struct usb_gadget_id *gadget_id, struct usb_gadget **_gadget)
 {
        int ret;
-       int idx, i, j;
-       int n_functions;
-       int n_configs = 0;
+       int i, j;
+       int n_configs;
        struct usb_gadget *gadget;
-       struct usb_function **funcs;
        int functions[2][sizeof(gadget_id->function_mask)*8]; /* zero terminates */
 
        if (!gadget_id || !_gadget)
@@ -260,30 +244,9 @@ static int id_to_gadget(struct usb_gadget_id *gadget_id,
                goto free_gadget;
        };
 
-       n_functions = __builtin_popcount(gadget_id->function_mask);
-
-       funcs = calloc(n_functions + 1, sizeof(*funcs));
-       if (!funcs) {
-               ret = -ENOMEM;
-               goto free_gadget;
-       }
-
-       gadget->funcs = funcs;
-
-       idx = 0;
-       for (i = 0; _available_funcs[i]; ++i) {
-               int func_id = 1 << i;
-
-               if (!(gadget_id->function_mask & func_id))
-                       continue;
-
-               gadget->funcs[idx] = _available_funcs[i];
-               ++idx;
-       }
-
        for (j = 0; j < n_configs; ++j) {
-               struct usb_configuration *config;
                int n_funcs_in_config;
+               struct usb_configuration *config;
 
                for (i = 0; functions[j][i]; ++i);
                n_funcs_in_config = i;
@@ -293,16 +256,19 @@ static int id_to_gadget(struct usb_gadget_id *gadget_id,
                        goto free_configs;
 
                gadget->configs[j] = config;
-               config->funcs = calloc(n_funcs_in_config + 1,
-                                                      sizeof(void *));
+               config->funcs = calloc(n_funcs_in_config + 1, sizeof(void *));
                if (!config->funcs)
                        goto free_configs;
 
-               for (i = 0; functions[j][i]; ++i)
-                       config->funcs[i] = find_func(gadget, functions[j][i]);
+               for (i = 0; functions[j][i]; ++i) {
+                       config->funcs[i] = find_usb_function_by_id(functions[j][i]);
+                       if (!config->funcs[i])
+                               goto free_configs;
+               }
        }
 
        *_gadget = gadget;
+
        return 0;
 
 free_configs:
@@ -341,7 +307,7 @@ DEFINE_USB_FUNCTION(USB_FUNCTION_RMNET,       rmnet,       0, NULL,            N
 
 #undef DEFINE_USB_FUNCTION
 
-/* Caution: index order of arrary is important, because id_to_gadget() uses it. */
+/* Caution: index order of arrary is important, because simple_translator_open() uses it. */
 static struct usb_function *_available_funcs[] = {
        [USB_FUNCTION_IDX_MTP]         = &_mtp_function,
        [USB_FUNCTION_IDX_ACM]         = &_acm_function,
@@ -354,6 +320,17 @@ static struct usb_function *_available_funcs[] = {
        [USB_FUNCTION_IDX_MAX]         = NULL /* An indicator to end the array */
 };
 
+struct usb_function *find_usb_function_by_id(int id)
+{
+       int i;
+
+       for (i = 0; _available_funcs[i]; i++)
+               if (_available_funcs[i]->id == id)
+                       return _available_funcs[i];
+
+       return NULL;
+}
+
 struct usb_function *find_usb_function_by_name(const char *name)
 {
        int i;