diff options
author | Andrzej Pietrasiewicz <andrzej.p@samsung.com> | 2013-10-09 10:05:54 +0200 |
---|---|---|
committer | Felipe Balbi <balbi@ti.com> | 2013-10-10 10:21:47 -0500 |
commit | b24650df9521f1845571568684621cefb0ba4e3b (patch) | |
tree | 86cd086dc67b41ebb420ea041ede38f98961bb90 /drivers/usb/gadget/f_mass_storage.c | |
parent | bd528d4e699b212a763eecda9cacffb4b85a5fe6 (diff) | |
download | op-kernel-dev-b24650df9521f1845571568684621cefb0ba4e3b.zip op-kernel-dev-b24650df9521f1845571568684621cefb0ba4e3b.tar.gz |
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/f_mass_storage.c')
-rw-r--r-- | drivers/usb/gadget/f_mass_storage.c | 40 |
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 7034d9c..da87ffe 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"); |