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