OSDN Git Service

USB: gadget: android: android USB gadget improvements:
[android-x86/kernel.git] / drivers / usb / gadget / f_acm.c
index bd6226c..ddbb988 100644 (file)
@@ -17,6 +17,7 @@
 #include <linux/slab.h>
 #include <linux/kernel.h>
 #include <linux/device.h>
+#include <linux/usb/android_composite.h>
 
 #include "u_serial.h"
 #include "gadget_chips.h"
@@ -405,10 +406,10 @@ static int acm_set_alt(struct usb_function *f, unsigned intf, unsigned alt)
                        usb_ep_disable(acm->notify);
                } else {
                        VDBG(cdev, "init acm ctrl interface %d\n", intf);
-                       acm->notify_desc = ep_choose(cdev->gadget,
-                                       acm->hs.notify,
-                                       acm->fs.notify);
                }
+               acm->notify_desc = ep_choose(cdev->gadget,
+                               acm->hs.notify,
+                               acm->fs.notify);
                usb_ep_enable(acm->notify, acm->notify_desc);
                acm->notify->driver_data = acm;
 
@@ -418,11 +419,11 @@ static int acm_set_alt(struct usb_function *f, unsigned intf, unsigned alt)
                        gserial_disconnect(&acm->port);
                } else {
                        DBG(cdev, "activate acm ttyGS%d\n", acm->port_num);
-                       acm->port.in_desc = ep_choose(cdev->gadget,
-                                       acm->hs.in, acm->fs.in);
-                       acm->port.out_desc = ep_choose(cdev->gadget,
-                                       acm->hs.out, acm->fs.out);
                }
+               acm->port.in_desc = ep_choose(cdev->gadget,
+                               acm->hs.in, acm->fs.in);
+               acm->port.out_desc = ep_choose(cdev->gadget,
+                               acm->hs.out, acm->fs.out);
                gserial_connect(&acm->port, acm->port_num);
 
        } else
@@ -782,3 +783,28 @@ int acm_bind_config(struct usb_configuration *c, u8 port_num)
                kfree(acm);
        return status;
 }
+
+#ifdef CONFIG_USB_ANDROID_ACM
+
+int acm_function_bind_config(struct usb_configuration *c)
+{
+       int ret = acm_bind_config(c, 0);
+       if (ret == 0)
+               gserial_setup(c->cdev->gadget, 1);
+       return ret;
+}
+
+static struct android_usb_function acm_function = {
+       .name = "acm",
+       .bind_config = acm_function_bind_config,
+};
+
+static int __init init(void)
+{
+       printk(KERN_INFO "f_acm init\n");
+       android_register_function(&acm_function);
+       return 0;
+}
+module_init(init);
+
+#endif /* CONFIG_USB_ANDROID_ACM */