summaryrefslogtreecommitdiff
path: root/drivers/usb/gadget
diff options
context:
space:
mode:
authorAndrzej Pietrasiewicz <andrzej.p@samsung.com>2013-10-09 10:05:54 +0200
committerFelipe Balbi <balbi@ti.com>2013-10-10 10:21:47 -0500
commitb24650df9521f1845571568684621cefb0ba4e3b (patch)
tree86cd086dc67b41ebb420ea041ede38f98961bb90 /drivers/usb/gadget
parentbd528d4e699b212a763eecda9cacffb4b85a5fe6 (diff)
usb: gadget: f_mass_storage: create fsg_common_setup for use in fsg_common_init
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>
Diffstat (limited to 'drivers/usb/gadget')
-rw-r--r--drivers/usb/gadget/f_mass_storage.c40
1 files changed, 24 insertions, 16 deletions
diff --git a/drivers/usb/gadget/f_mass_storage.c b/drivers/usb/gadget/f_mass_storage.c
index 7034d9c8363f..da87ffe34514 100644
--- a/drivers/usb/gadget/f_mass_storage.c
+++ b/drivers/usb/gadget/f_mass_storage.c
@@ -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");