From f11de4e5ba5579bde417e4ae29f734640b386475 Mon Sep 17 00:00:00 2001 From: Li Jun Date: Tue, 21 Jul 2015 07:59:15 +0800 Subject: 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 Signed-off-by: Li Jun (cherry picked from commit 31221e4a4e26c461de77148088ef6d809fd398ac) --- drivers/usb/gadget/hid.c | 35 +++++++++++++++++++---------------- 1 file 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; } -- cgit v1.2.3