usb: gadget: add support for multiple LUNs
Change-Id: I9790007b65a749af2169f3858ffd32a1d616490f
diff --git a/drivers/usb/gadget/android.c b/drivers/usb/gadget/android.c
index 6fe4426..b3d0673 100644
--- a/drivers/usb/gadget/android.c
+++ b/drivers/usb/gadget/android.c
@@ -1562,25 +1562,40 @@
struct fsg_common *common;
int err;
int i;
- const char *name[2];
config = kzalloc(sizeof(struct mass_storage_function_config),
GFP_KERNEL);
if (!config)
return -ENOMEM;
- config->fsg.nluns = 1;
- name[0] = "lun";
- if (dev->pdata && dev->pdata->cdrom) {
- config->fsg.nluns = 2;
- config->fsg.luns[1].cdrom = 1;
- config->fsg.luns[1].ro = 1;
- config->fsg.luns[1].removable = 1;
- name[1] = "lun0";
+ if (dev->pdata && dev->pdata->nluns) {
+ config->fsg.nluns = dev->pdata->nluns;
+ if (config->fsg.nluns > FSG_MAX_LUNS)
+ config->fsg.nluns = FSG_MAX_LUNS;
+ for (i = 0; i < config->fsg.nluns; i++) {
+ config->fsg.luns[i].cdrom = 0;
+ config->fsg.luns[i].removable = 1;
+ config->fsg.luns[i].ro = 0;
+ }
+ if (dev->pdata->cdrom) {
+ config->fsg.nluns += 1;
+ config->fsg.luns[i+1].cdrom = 1;
+ config->fsg.luns[i+1].removable = 1;
+ config->fsg.luns[i+1].ro = 1;
+ }
+ } else {
+ config->fsg.nluns = 1;
+ config->fsg.luns[0].cdrom = 0;
+ config->fsg.luns[0].removable = 1;
+ config->fsg.luns[0].ro = 0;
+ if (dev->pdata && dev->pdata->cdrom) {
+ config->fsg.nluns = 2;
+ config->fsg.luns[1].cdrom = 1;
+ config->fsg.luns[1].removable = 1;
+ config->fsg.luns[1].ro = 1;
+ }
}
- config->fsg.luns[0].removable = 1;
-
common = fsg_common_init(NULL, cdev, &config->fsg);
if (IS_ERR(common)) {
kfree(config);
@@ -1590,7 +1605,7 @@
for (i = 0; i < config->fsg.nluns; i++) {
err = sysfs_create_link(&f->dev->kobj,
&common->luns[i].dev.kobj,
- name[i]);
+ common->luns[i].dev.kobj.name);
if (err)
goto error;
}
@@ -1600,7 +1615,7 @@
return 0;
error:
for (; i > 0 ; i--)
- sysfs_remove_link(&f->dev->kobj, name[i-1]);
+ sysfs_remove_link(&f->dev->kobj, common->luns[i-1].dev.kobj.name);
fsg_common_release(&common->ref);
kfree(config);
diff --git a/include/linux/usb/android.h b/include/linux/usb/android.h
index 0b11fdaf..e9971f8 100644
--- a/include/linux/usb/android.h
+++ b/include/linux/usb/android.h
@@ -24,6 +24,7 @@
u32 swfi_latency;
u8 usb_core_id;
bool cdrom;
+ int nluns;
};
#ifndef CONFIG_TARGET_CORE