]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/usb/gadget/f_serial.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/wfg/writeback
[karo-tx-linux.git] / drivers / usb / gadget / f_serial.c
index 490b00b01a7d68774263c4d84c89b7775eb4acad..91fdf790ed20b122bf0a13df0d3c8aed5285ac3c 100644 (file)
  * if you can arrange appropriate host side drivers.
  */
 
-struct gser_descs {
-       struct usb_endpoint_descriptor  *in;
-       struct usb_endpoint_descriptor  *out;
-};
-
 struct f_gser {
        struct gserial                  port;
        u8                              data_id;
        u8                              port_num;
-
-       struct gser_descs               fs;
-       struct gser_descs               hs;
 };
 
 static inline struct f_gser *func_to_gser(struct usb_function *f)
@@ -136,12 +128,15 @@ static int gser_set_alt(struct usb_function *f, unsigned intf, unsigned alt)
        if (gser->port.in->driver_data) {
                DBG(cdev, "reset generic ttyGS%d\n", gser->port_num);
                gserial_disconnect(&gser->port);
-       } else {
+       }
+       if (!gser->port.in->desc || !gser->port.out->desc) {
                DBG(cdev, "activate generic ttyGS%d\n", gser->port_num);
-               gser->port.in_desc = ep_choose(cdev->gadget,
-                               gser->hs.in, gser->fs.in);
-               gser->port.out_desc = ep_choose(cdev->gadget,
-                               gser->hs.out, gser->fs.out);
+               if (!config_ep_by_speed(cdev->gadget, f, gser->port.in) ||
+                   !config_ep_by_speed(cdev->gadget, f, gser->port.out)) {
+                       gser->port.in->desc = NULL;
+                       gser->port.out->desc = NULL;
+                       return -EINVAL;
+               }
        }
        gserial_connect(&gser->port, gser->port_num);
        return 0;
@@ -193,12 +188,6 @@ gser_bind(struct usb_configuration *c, struct usb_function *f)
        /* copy descriptors, and track endpoint copies */
        f->descriptors = usb_copy_descriptors(gser_fs_function);
 
-       gser->fs.in = usb_find_endpoint(gser_fs_function,
-                       f->descriptors, &gser_fs_in_desc);
-       gser->fs.out = usb_find_endpoint(gser_fs_function,
-                       f->descriptors, &gser_fs_out_desc);
-
-
        /* support all relevant hardware speeds... we expect that when
         * hardware is dual speed, all bulk-capable endpoints work at
         * both speeds
@@ -211,11 +200,6 @@ gser_bind(struct usb_configuration *c, struct usb_function *f)
 
                /* copy descriptors, and track endpoint copies */
                f->hs_descriptors = usb_copy_descriptors(gser_hs_function);
-
-               gser->hs.in = usb_find_endpoint(gser_hs_function,
-                               f->hs_descriptors, &gser_hs_in_desc);
-               gser->hs.out = usb_find_endpoint(gser_hs_function,
-                               f->hs_descriptors, &gser_hs_out_desc);
        }
 
        DBG(cdev, "generic ttyGS%d: %s speed IN/%s OUT/%s\n",