diff options
author | Li Jun <jun.li@freescale.com> | 2015-07-21 08:08:25 +0800 |
---|---|---|
committer | Li Jun <jun.li@freescale.com> | 2015-07-22 10:22:20 +0800 |
commit | d0da03af87a33caa5edd05ecf6ac69183d1a8788 (patch) | |
tree | a2bb356dbeeea46e5f67e86cf7a09c355760d371 | |
parent | 8ceb723575a9020b995ecec207389d74d9b516f4 (diff) |
MLK-11266-8 usb: gadget: printer: allocate and init otg descriptor by otg capabilities
Allocate and initialize usb otg descriptor according to gadget otg
capabilities, add it for each usb configurations. If otg capability
is not defined, keep its original otg descriptor unchanged.
Signed-off-by: Li Jun <jun.li@freescale.com>
(cherry picked from commit 2ae655dcc249dcd2606fe9392c4e8a986ea3d5ea)
-rw-r--r-- | drivers/usb/gadget/printer.c | 32 |
1 files changed, 20 insertions, 12 deletions
diff --git a/drivers/usb/gadget/printer.c b/drivers/usb/gadget/printer.c index fa34d67fc57e..d7f1207447b2 100644 --- a/drivers/usb/gadget/printer.c +++ b/drivers/usb/gadget/printer.c @@ -208,16 +208,7 @@ static struct usb_descriptor_header *hs_printer_function[] = { NULL }; -static struct usb_otg_descriptor otg_descriptor = { - .bLength = sizeof otg_descriptor, - .bDescriptorType = USB_DT_OTG, - .bmAttributes = USB_OTG_SRP, -}; - -static const struct usb_descriptor_header *otg_desc[] = { - (struct usb_descriptor_header *) &otg_descriptor, - NULL, -}; +static const struct usb_descriptor_header *otg_desc[2]; /* maxpacket and other transfer characteristics vary by speed. */ #define ep_desc(g, hs, fs) (((g)->speed == USB_SPEED_HIGH)?(hs):(fs)) @@ -1158,7 +1149,6 @@ static int __init printer_bind_config(struct usb_configuration *c) usb_gadget_set_selfpowered(gadget); if (gadget_is_otg(gadget)) { - otg_descriptor.bmAttributes |= USB_OTG_HNP; printer_cfg_driver.descriptors = otg_desc; printer_cfg_driver.bmAttributes |= USB_CONFIG_ATT_WAKEUP; } @@ -1222,6 +1212,9 @@ fail: static int printer_unbind(struct usb_composite_dev *cdev) { + kfree(otg_desc[0]); + otg_desc[0] = NULL; + return 0; } @@ -1236,9 +1229,24 @@ static int __init printer_bind(struct usb_composite_dev *cdev) device_desc.iProduct = strings[USB_GADGET_PRODUCT_IDX].id; device_desc.iSerialNumber = strings[USB_GADGET_SERIAL_IDX].id; + if (gadget_is_otg(cdev->gadget) && !otg_desc[0]) { + struct usb_descriptor_header *usb_desc; + + usb_desc = usb_otg_descriptor_alloc(cdev->gadget); + if (!usb_desc) + return -ENOMEM; + usb_otg_descriptor_init(cdev->gadget, usb_desc); + otg_desc[0] = usb_desc; + otg_desc[1] = NULL; + } + ret = usb_add_config(cdev, &printer_cfg_driver, printer_bind_config); - if (ret) + if (ret) { + kfree(otg_desc[0]); + otg_desc[0] = NULL; return ret; + } + usb_composite_overwrite_options(cdev, &coverwrite); return ret; } |