summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLi Jun <jun.li@freescale.com>2015-07-21 08:08:25 +0800
committerLi Jun <jun.li@freescale.com>2015-07-22 10:22:20 +0800
commitd0da03af87a33caa5edd05ecf6ac69183d1a8788 (patch)
treea2bb356dbeeea46e5f67e86cf7a09c355760d371
parent8ceb723575a9020b995ecec207389d74d9b516f4 (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.c32
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;
}