Merge tag 'lsk-v3.10-15.04-android'
[firefly-linux-kernel-4.4.55.git] / drivers / usb / gadget / android.c
old mode 100644 (file)
new mode 100755 (executable)
index 61c5e58..f126474
@@ -49,8 +49,8 @@ MODULE_VERSION("1.0");
 static const char longname[] = "Gadget Android";
 
 /* Default vendor and product IDs, overridden by userspace */
-#define VENDOR_ID              0x18D1
-#define PRODUCT_ID             0x0001
+#define VENDOR_ID              0x2207
+#define PRODUCT_ID             0x2910
 
 /* f_midi configuration */
 #define MIDI_INPUT_PORTS    1
@@ -357,6 +357,9 @@ static void functionfs_closed_callback(struct ffs_data *ffs)
        config->opened = false;
        config->data = NULL;
 
+       if (!WARN_ON(!ffs->gadget)) {
+               dev->cdev->next_string_id -= ffs->strings_count;
+       }
        functionfs_unbind(ffs);
 
        mutex_unlock(&dev->mutex);
@@ -766,15 +769,21 @@ static int mass_storage_function_init(struct android_usb_function *f,
 {
        struct mass_storage_function_config *config;
        struct fsg_common *common;
-       int err;
+       int err, i;
+       const char *name[2];
 
        config = kzalloc(sizeof(struct mass_storage_function_config),
                                                                GFP_KERNEL);
        if (!config)
                return -ENOMEM;
 
-       config->fsg.nluns = 1;
-       config->fsg.luns[0].removable = 1;
+       config->fsg.nluns = 2;
+       name[0] = "lun";
+       name[1] = "lun1";
+       for (i = 0; i < config->fsg.nluns; i++) {
+               config->fsg.luns[i].removable = 1;
+               config->fsg.luns[i].nofua = 1;
+       }
 
        common = fsg_common_init(NULL, cdev, &config->fsg);
        if (IS_ERR(common)) {
@@ -782,17 +791,23 @@ static int mass_storage_function_init(struct android_usb_function *f,
                return PTR_ERR(common);
        }
 
-       err = sysfs_create_link(&f->dev->kobj,
-                               &common->luns[0].dev.kobj,
-                               "lun");
-       if (err) {
-               kfree(config);
-               return err;
+       for (i = 0; i < config->fsg.nluns; i++) {
+               err = sysfs_create_link(&f->dev->kobj,
+                                       &common->luns[i].dev.kobj,
+                                       name[i]);
+               if (err)
+                       goto error;
        }
 
        config->common = common;
        f->config = config;
        return 0;
+error:
+       for (; i > 0 ; i--)
+               sysfs_remove_link(&f->dev->kobj, name[i-1]);
+       fsg_common_release(&common->ref);
+       kfree(config);
+       return err;
 }
 
 static void mass_storage_function_cleanup(struct android_usb_function *f)
@@ -1414,6 +1429,7 @@ static int android_bind(struct usb_composite_dev *cdev)
                return id;
        strings_dev[STRING_SERIAL_IDX].id = id;
        device_desc.iSerialNumber = id;
+       device_desc.bcdDevice = cpu_to_le16(get_default_bcdDevice());
 
        usb_gadget_set_selfpowered(gadget);
        dev->cdev = cdev;