summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLi Jun <jun.li@freescale.com>2015-07-21 07:59:15 +0800
committerLi Jun <jun.li@freescale.com>2015-07-22 10:22:19 +0800
commitf11de4e5ba5579bde417e4ae29f734640b386475 (patch)
tree969a67c2e46bc8ad45ec28e3adf73b77ea13e00e
parent121d6150e6ae4d163199e12836b4f2ff88b932a6 (diff)
MLK-11266-5 usb: gadget: hid: 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. Reviewed-by: Roger Quadros <rogerq@ti.com> Signed-off-by: Li Jun <jun.li@freescale.com> (cherry picked from commit 31221e4a4e26c461de77148088ef6d809fd398ac)
-rw-r--r--drivers/usb/gadget/hid.c35
1 files changed, 19 insertions, 16 deletions
diff --git a/drivers/usb/gadget/hid.c b/drivers/usb/gadget/hid.c
index 42756a09411b..f863d746b4bb 100644
--- a/drivers/usb/gadget/hid.c
+++ b/drivers/usb/gadget/hid.c
@@ -73,21 +73,7 @@ static struct usb_device_descriptor device_desc = {
.bNumConfigurations = 1,
};
-static struct usb_otg_descriptor otg_descriptor = {
- .bLength = sizeof otg_descriptor,
- .bDescriptorType = USB_DT_OTG,
-
- /* REVISIT SRP-only hardware is possible, although
- * it would not be called "OTG" ...
- */
- .bmAttributes = USB_OTG_SRP | USB_OTG_HNP,
-};
-
-static const struct usb_descriptor_header *otg_desc[] = {
- (struct usb_descriptor_header *) &otg_descriptor,
- NULL,
-};
-
+static const struct usb_descriptor_header *otg_desc[2];
/* string IDs are assigned dynamically */
static struct usb_string strings_dev[] = {
@@ -166,10 +152,24 @@ static int __init hid_bind(struct usb_composite_dev *cdev)
device_desc.iManufacturer = strings_dev[USB_GADGET_MANUFACTURER_IDX].id;
device_desc.iProduct = strings_dev[USB_GADGET_PRODUCT_IDX].id;
+ if (gadget_is_otg(gadget) && !otg_desc[0]) {
+ struct usb_descriptor_header *usb_desc;
+
+ usb_desc = usb_otg_descriptor_alloc(gadget);
+ if (!usb_desc)
+ return -ENOMEM;
+ usb_otg_descriptor_init(gadget, usb_desc);
+ otg_desc[0] = usb_desc;
+ otg_desc[1] = NULL;
+ }
+
/* register our configuration */
status = usb_add_config(cdev, &config_driver, do_config);
- if (status < 0)
+ if (status < 0) {
+ kfree(otg_desc[0]);
+ otg_desc[0] = NULL;
return status;
+ }
usb_composite_overwrite_options(cdev, &coverwrite);
dev_info(&gadget->dev, DRIVER_DESC ", version: " DRIVER_VERSION "\n");
@@ -180,6 +180,9 @@ static int __init hid_bind(struct usb_composite_dev *cdev)
static int __exit hid_unbind(struct usb_composite_dev *cdev)
{
ghid_cleanup();
+ kfree(otg_desc[0]);
+ otg_desc[0] = NULL;
+
return 0;
}