diff options
author | Jorge Ramirez-Ortiz <jorge.ramirez-ortiz@linaro.org> | 2014-11-18 15:11:54 -0500 |
---|---|---|
committer | Felipe Balbi <balbi@ti.com> | 2014-11-20 14:47:08 -0500 |
commit | 74df41b40ab0222903dcc9681e9076c2604741d8 (patch) | |
tree | fb8b3f5fc17530cd218746c82c5333f46e1b2ae8 /drivers/usb/gadget | |
parent | 1290a958d48e30d60262a33acb5f068e87834ce4 (diff) |
usb: gadget: add USB3 support to the printer driver
Add SS descriptors to support the capabilities provided by USB3 controller
drivers; unit tests run using a PLX 3380 [max transfer speed measured of 1Gbps]
This driver shall fallback to lower operating modes when the higher ones are
not available.
Signed-off-by: Jorge Ramirez-Ortiz <jorge.ramirez-ortiz@linaro.org>
Signed-off-by: Felipe Balbi <balbi@ti.com>
Diffstat (limited to 'drivers/usb/gadget')
-rw-r--r-- | drivers/usb/gadget/legacy/printer.c | 65 |
1 files changed, 59 insertions, 6 deletions
diff --git a/drivers/usb/gadget/legacy/printer.c b/drivers/usb/gadget/legacy/printer.c index 6474081dcbaf..e0cf1b0d471d 100644 --- a/drivers/usb/gadget/legacy/printer.c +++ b/drivers/usb/gadget/legacy/printer.c | |||
@@ -208,6 +208,43 @@ static struct usb_descriptor_header *hs_printer_function[] = { | |||
208 | NULL | 208 | NULL |
209 | }; | 209 | }; |
210 | 210 | ||
211 | /* | ||
212 | * Added endpoint descriptors for 3.0 devices | ||
213 | */ | ||
214 | |||
215 | static struct usb_endpoint_descriptor ss_ep_in_desc = { | ||
216 | .bLength = USB_DT_ENDPOINT_SIZE, | ||
217 | .bDescriptorType = USB_DT_ENDPOINT, | ||
218 | .bmAttributes = USB_ENDPOINT_XFER_BULK, | ||
219 | .wMaxPacketSize = cpu_to_le16(1024), | ||
220 | }; | ||
221 | |||
222 | struct usb_ss_ep_comp_descriptor ss_ep_in_comp_desc = { | ||
223 | .bLength = sizeof(ss_ep_in_comp_desc), | ||
224 | .bDescriptorType = USB_DT_SS_ENDPOINT_COMP, | ||
225 | }; | ||
226 | |||
227 | static struct usb_endpoint_descriptor ss_ep_out_desc = { | ||
228 | .bLength = USB_DT_ENDPOINT_SIZE, | ||
229 | .bDescriptorType = USB_DT_ENDPOINT, | ||
230 | .bmAttributes = USB_ENDPOINT_XFER_BULK, | ||
231 | .wMaxPacketSize = cpu_to_le16(1024), | ||
232 | }; | ||
233 | |||
234 | struct usb_ss_ep_comp_descriptor ss_ep_out_comp_desc = { | ||
235 | .bLength = sizeof(ss_ep_out_comp_desc), | ||
236 | .bDescriptorType = USB_DT_SS_ENDPOINT_COMP, | ||
237 | }; | ||
238 | |||
239 | static struct usb_descriptor_header *ss_printer_function[] = { | ||
240 | (struct usb_descriptor_header *) &intf_desc, | ||
241 | (struct usb_descriptor_header *) &ss_ep_in_desc, | ||
242 | (struct usb_descriptor_header *) &ss_ep_in_comp_desc, | ||
243 | (struct usb_descriptor_header *) &ss_ep_out_desc, | ||
244 | (struct usb_descriptor_header *) &ss_ep_out_comp_desc, | ||
245 | NULL | ||
246 | }; | ||
247 | |||
211 | static struct usb_otg_descriptor otg_descriptor = { | 248 | static struct usb_otg_descriptor otg_descriptor = { |
212 | .bLength = sizeof otg_descriptor, | 249 | .bLength = sizeof otg_descriptor, |
213 | .bDescriptorType = USB_DT_OTG, | 250 | .bDescriptorType = USB_DT_OTG, |
@@ -220,7 +257,20 @@ static const struct usb_descriptor_header *otg_desc[] = { | |||
220 | }; | 257 | }; |
221 | 258 | ||
222 | /* maxpacket and other transfer characteristics vary by speed. */ | 259 | /* maxpacket and other transfer characteristics vary by speed. */ |
223 | #define ep_desc(g, hs, fs) (((g)->speed == USB_SPEED_HIGH)?(hs):(fs)) | 260 | static inline struct usb_endpoint_descriptor *ep_desc(struct usb_gadget *gadget, |
261 | struct usb_endpoint_descriptor *fs, | ||
262 | struct usb_endpoint_descriptor *hs, | ||
263 | struct usb_endpoint_descriptor *ss) | ||
264 | { | ||
265 | switch (gadget->speed) { | ||
266 | case USB_SPEED_SUPER: | ||
267 | return ss; | ||
268 | case USB_SPEED_HIGH: | ||
269 | return hs; | ||
270 | default: | ||
271 | return fs; | ||
272 | } | ||
273 | } | ||
224 | 274 | ||
225 | /*-------------------------------------------------------------------------*/ | 275 | /*-------------------------------------------------------------------------*/ |
226 | 276 | ||
@@ -793,11 +843,12 @@ set_printer_interface(struct printer_dev *dev) | |||
793 | { | 843 | { |
794 | int result = 0; | 844 | int result = 0; |
795 | 845 | ||
796 | dev->in_ep->desc = ep_desc(dev->gadget, &hs_ep_in_desc, &fs_ep_in_desc); | 846 | dev->in_ep->desc = ep_desc(dev->gadget, &fs_ep_in_desc, &hs_ep_in_desc, |
847 | &ss_ep_in_desc); | ||
797 | dev->in_ep->driver_data = dev; | 848 | dev->in_ep->driver_data = dev; |
798 | 849 | ||
799 | dev->out_ep->desc = ep_desc(dev->gadget, &hs_ep_out_desc, | 850 | dev->out_ep->desc = ep_desc(dev->gadget, &fs_ep_out_desc, |
800 | &fs_ep_out_desc); | 851 | &hs_ep_out_desc, &ss_ep_out_desc); |
801 | dev->out_ep->driver_data = dev; | 852 | dev->out_ep->driver_data = dev; |
802 | 853 | ||
803 | result = usb_ep_enable(dev->in_ep); | 854 | result = usb_ep_enable(dev->in_ep); |
@@ -1016,9 +1067,11 @@ autoconf_fail: | |||
1016 | /* assumes that all endpoints are dual-speed */ | 1067 | /* assumes that all endpoints are dual-speed */ |
1017 | hs_ep_in_desc.bEndpointAddress = fs_ep_in_desc.bEndpointAddress; | 1068 | hs_ep_in_desc.bEndpointAddress = fs_ep_in_desc.bEndpointAddress; |
1018 | hs_ep_out_desc.bEndpointAddress = fs_ep_out_desc.bEndpointAddress; | 1069 | hs_ep_out_desc.bEndpointAddress = fs_ep_out_desc.bEndpointAddress; |
1070 | ss_ep_in_desc.bEndpointAddress = fs_ep_in_desc.bEndpointAddress; | ||
1071 | ss_ep_out_desc.bEndpointAddress = fs_ep_out_desc.bEndpointAddress; | ||
1019 | 1072 | ||
1020 | ret = usb_assign_descriptors(f, fs_printer_function, | 1073 | ret = usb_assign_descriptors(f, fs_printer_function, |
1021 | hs_printer_function, NULL); | 1074 | hs_printer_function, ss_printer_function); |
1022 | if (ret) | 1075 | if (ret) |
1023 | return ret; | 1076 | return ret; |
1024 | 1077 | ||
@@ -1253,7 +1306,7 @@ static __refdata struct usb_composite_driver printer_driver = { | |||
1253 | .name = shortname, | 1306 | .name = shortname, |
1254 | .dev = &device_desc, | 1307 | .dev = &device_desc, |
1255 | .strings = dev_strings, | 1308 | .strings = dev_strings, |
1256 | .max_speed = USB_SPEED_HIGH, | 1309 | .max_speed = USB_SPEED_SUPER, |
1257 | .bind = printer_bind, | 1310 | .bind = printer_bind, |
1258 | .unbind = printer_unbind, | 1311 | .unbind = printer_unbind, |
1259 | }; | 1312 | }; |