提交 b24650df 编写于 作者: A Andrzej Pietrasiewicz 提交者: Felipe Balbi

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: NAndrzej Pietrasiewicz <andrzej.p@samsung.com>
Signed-off-by: NKyungmin Park <kyungmin.park@samsung.com>
Acked-by: NMichal Nazarewicz <mina86@mina86.com>
Signed-off-by: NFelipe Balbi <balbi@ti.com>
上级 bd528d4e
......@@ -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 @@ struct fsg_common *fsg_common_init(struct fsg_common *common,
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 @@ struct fsg_common *fsg_common_init(struct fsg_common *common,
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");
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册