usb: gadget: composite: add USB_DT_OTG request handling
authorMacpaul Lin <macpaul@gmail.com>
Thu, 9 Jul 2015 07:18:42 +0000 (15:18 +0800)
committerFelipe Balbi <balbi@ti.com>
Wed, 29 Jul 2015 14:59:20 +0000 (09:59 -0500)
Copy usb_otg_descriptor from config's descriptor if host requests
USB_DT_OTG.

Signed-off-by: Macpaul Lin <macpaul@gmail.com>
Signed-off-by: Li Jun <jun.li@freescale.com>
Reviewed-by: Roger Quadros <rogerq@ti.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>
drivers/usb/gadget/composite.c

index 36c6f47..b474499 100644 (file)
@@ -19,6 +19,7 @@
 #include <linux/utsname.h>
 
 #include <linux/usb/composite.h>
+#include <linux/usb/otg.h>
 #include <asm/unaligned.h>
 
 #include "u_os_desc.h"
@@ -1540,6 +1541,32 @@ composite_setup(struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl)
                                value = min(w_length, (u16) value);
                        }
                        break;
+               case USB_DT_OTG:
+                       if (gadget_is_otg(gadget)) {
+                               struct usb_configuration *config;
+                               int otg_desc_len = 0;
+
+                               if (cdev->config)
+                                       config = cdev->config;
+                               else
+                                       config = list_first_entry(
+                                                       &cdev->configs,
+                                               struct usb_configuration, list);
+                               if (!config)
+                                       goto done;
+
+                               if (gadget->otg_caps &&
+                                       (gadget->otg_caps->otg_rev >= 0x0200))
+                                       otg_desc_len += sizeof(
+                                               struct usb_otg20_descriptor);
+                               else
+                                       otg_desc_len += sizeof(
+                                               struct usb_otg_descriptor);
+
+                               value = min_t(int, w_length, otg_desc_len);
+                               memcpy(req->buf, config->descriptors[0], value);
+                       }
+                       break;
                }
                break;