OSDN Git Service

usb: gadget: f_mass_storage: create fsg_common_setup for use in fsg_common_init
authorAndrzej Pietrasiewicz <andrzej.p@samsung.com>
Wed, 9 Oct 2013 08:05:54 +0000 (10:05 +0200)
committerFelipe Balbi <balbi@ti.com>
Thu, 10 Oct 2013 15:21:47 +0000 (10:21 -0500)
fsg_common_init is a lengthy function. Factor a portion of it out.

Signed-off-by: Andrzej Pietrasiewicz <andrzej.p@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
Acked-by: Michal Nazarewicz <mina86@mina86.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>
drivers/usb/gadget/f_mass_storage.c

index 7034d9c..da87ffe 100644 (file)
@@ -2643,6 +2643,27 @@ static inline int fsg_num_buffers_validate(unsigned int fsg_num_buffers)
        return -EINVAL;
 }
 
+static struct fsg_common *fsg_common_setup(struct fsg_common *common)
+{
+       if (!common) {
+               common = kzalloc(sizeof(*common), GFP_KERNEL);
+               if (!common)
+                       return ERR_PTR(-ENOMEM);
+               common->free_storage_on_release = 1;
+       } else {
+               memset(common, 0, sizeof(*common));
+               common->free_storage_on_release = 0;
+       }
+       init_rwsem(&common->filesem);
+       spin_lock_init(&common->lock);
+       kref_init(&common->ref);
+       init_completion(&common->thread_notifier);
+       init_waitqueue_head(&common->fsg_wait);
+       common->state = FSG_STATE_TERMINATED;
+
+       return common;
+}
+
 void fsg_common_set_sysfs(struct fsg_common *common, bool sysfs)
 {
        common->sysfs = sysfs;
@@ -2711,16 +2732,9 @@ struct fsg_common *fsg_common_init(struct fsg_common *common,
                return ERR_PTR(-EINVAL);
        }
 
-       /* Allocate? */
-       if (!common) {
-               common = kzalloc(sizeof *common, GFP_KERNEL);
-               if (!common)
-                       return ERR_PTR(-ENOMEM);
-               common->free_storage_on_release = 1;
-       } else {
-               memset(common, 0, sizeof *common);
-               common->free_storage_on_release = 0;
-       }
+       common = fsg_common_setup(common);
+       if (IS_ERR(common))
+               return common;
        fsg_common_set_sysfs(common, true);
        common->state = FSG_STATE_IDLE;
 
@@ -2760,8 +2774,6 @@ struct fsg_common *fsg_common_init(struct fsg_common *common,
        }
        common->luns = curlun_it;
 
-       init_rwsem(&common->filesem);
-
        for (i = 0, lcfg = cfg->luns; i < nluns; ++i, ++curlun_it, ++lcfg) {
                struct fsg_lun *curlun;
 
@@ -2855,8 +2867,6 @@ buffhds_first_it:
        common->can_stall = cfg->can_stall &&
                !(gadget_is_at91(common->gadget));
 
-       spin_lock_init(&common->lock);
-       kref_init(&common->ref);
 
        /* Tell the thread to start working */
        common->thread_task =
@@ -2865,8 +2875,6 @@ buffhds_first_it:
                rc = PTR_ERR(common->thread_task);
                goto error_release;
        }
-       init_completion(&common->thread_notifier);
-       init_waitqueue_head(&common->fsg_wait);
 
        /* Information */
        INFO(common, FSG_DRIVER_DESC ", version: " FSG_DRIVER_VERSION "\n");