diff options
Diffstat (limited to 'drivers/usb/gadget/f_acm.c')
-rw-r--r-- | drivers/usb/gadget/f_acm.c | 52 |
1 files changed, 51 insertions, 1 deletions
diff --git a/drivers/usb/gadget/f_acm.c b/drivers/usb/gadget/f_acm.c index 3f8849339ade..d672250a61fa 100644 --- a/drivers/usb/gadget/f_acm.c +++ b/drivers/usb/gadget/f_acm.c | |||
@@ -5,7 +5,7 @@ | |||
5 | * Copyright (C) 2008 by David Brownell | 5 | * Copyright (C) 2008 by David Brownell |
6 | * Copyright (C) 2008 by Nokia Corporation | 6 | * Copyright (C) 2008 by Nokia Corporation |
7 | * Copyright (C) 2009 by Samsung Electronics | 7 | * Copyright (C) 2009 by Samsung Electronics |
8 | * Author: Michal Nazarewicz (m.nazarewicz@samsung.com) | 8 | * Author: Michal Nazarewicz (mina86@mina86.com) |
9 | * | 9 | * |
10 | * This software is distributed under the terms of the GNU General | 10 | * This software is distributed under the terms of the GNU General |
11 | * Public License ("GPL") as published by the Free Software Foundation, | 11 | * Public License ("GPL") as published by the Free Software Foundation, |
@@ -237,6 +237,42 @@ static struct usb_descriptor_header *acm_hs_function[] = { | |||
237 | NULL, | 237 | NULL, |
238 | }; | 238 | }; |
239 | 239 | ||
240 | static struct usb_endpoint_descriptor acm_ss_in_desc = { | ||
241 | .bLength = USB_DT_ENDPOINT_SIZE, | ||
242 | .bDescriptorType = USB_DT_ENDPOINT, | ||
243 | .bmAttributes = USB_ENDPOINT_XFER_BULK, | ||
244 | .wMaxPacketSize = cpu_to_le16(1024), | ||
245 | }; | ||
246 | |||
247 | static struct usb_endpoint_descriptor acm_ss_out_desc = { | ||
248 | .bLength = USB_DT_ENDPOINT_SIZE, | ||
249 | .bDescriptorType = USB_DT_ENDPOINT, | ||
250 | .bmAttributes = USB_ENDPOINT_XFER_BULK, | ||
251 | .wMaxPacketSize = cpu_to_le16(1024), | ||
252 | }; | ||
253 | |||
254 | static struct usb_ss_ep_comp_descriptor acm_ss_bulk_comp_desc = { | ||
255 | .bLength = sizeof acm_ss_bulk_comp_desc, | ||
256 | .bDescriptorType = USB_DT_SS_ENDPOINT_COMP, | ||
257 | }; | ||
258 | |||
259 | static struct usb_descriptor_header *acm_ss_function[] = { | ||
260 | (struct usb_descriptor_header *) &acm_iad_descriptor, | ||
261 | (struct usb_descriptor_header *) &acm_control_interface_desc, | ||
262 | (struct usb_descriptor_header *) &acm_header_desc, | ||
263 | (struct usb_descriptor_header *) &acm_call_mgmt_descriptor, | ||
264 | (struct usb_descriptor_header *) &acm_descriptor, | ||
265 | (struct usb_descriptor_header *) &acm_union_desc, | ||
266 | (struct usb_descriptor_header *) &acm_hs_notify_desc, | ||
267 | (struct usb_descriptor_header *) &acm_ss_bulk_comp_desc, | ||
268 | (struct usb_descriptor_header *) &acm_data_interface_desc, | ||
269 | (struct usb_descriptor_header *) &acm_ss_in_desc, | ||
270 | (struct usb_descriptor_header *) &acm_ss_bulk_comp_desc, | ||
271 | (struct usb_descriptor_header *) &acm_ss_out_desc, | ||
272 | (struct usb_descriptor_header *) &acm_ss_bulk_comp_desc, | ||
273 | NULL, | ||
274 | }; | ||
275 | |||
240 | /* string descriptors: */ | 276 | /* string descriptors: */ |
241 | 277 | ||
242 | #define ACM_CTRL_IDX 0 | 278 | #define ACM_CTRL_IDX 0 |
@@ -643,9 +679,21 @@ acm_bind(struct usb_configuration *c, struct usb_function *f) | |||
643 | /* copy descriptors */ | 679 | /* copy descriptors */ |
644 | f->hs_descriptors = usb_copy_descriptors(acm_hs_function); | 680 | f->hs_descriptors = usb_copy_descriptors(acm_hs_function); |
645 | } | 681 | } |
682 | if (gadget_is_superspeed(c->cdev->gadget)) { | ||
683 | acm_ss_in_desc.bEndpointAddress = | ||
684 | acm_fs_in_desc.bEndpointAddress; | ||
685 | acm_ss_out_desc.bEndpointAddress = | ||
686 | acm_fs_out_desc.bEndpointAddress; | ||
687 | |||
688 | /* copy descriptors, and track endpoint copies */ | ||
689 | f->ss_descriptors = usb_copy_descriptors(acm_ss_function); | ||
690 | if (!f->ss_descriptors) | ||
691 | goto fail; | ||
692 | } | ||
646 | 693 | ||
647 | DBG(cdev, "acm ttyGS%d: %s speed IN/%s OUT/%s NOTIFY/%s\n", | 694 | DBG(cdev, "acm ttyGS%d: %s speed IN/%s OUT/%s NOTIFY/%s\n", |
648 | acm->port_num, | 695 | acm->port_num, |
696 | gadget_is_superspeed(c->cdev->gadget) ? "super" : | ||
649 | gadget_is_dualspeed(c->cdev->gadget) ? "dual" : "full", | 697 | gadget_is_dualspeed(c->cdev->gadget) ? "dual" : "full", |
650 | acm->port.in->name, acm->port.out->name, | 698 | acm->port.in->name, acm->port.out->name, |
651 | acm->notify->name); | 699 | acm->notify->name); |
@@ -675,6 +723,8 @@ acm_unbind(struct usb_configuration *c, struct usb_function *f) | |||
675 | 723 | ||
676 | if (gadget_is_dualspeed(c->cdev->gadget)) | 724 | if (gadget_is_dualspeed(c->cdev->gadget)) |
677 | usb_free_descriptors(f->hs_descriptors); | 725 | usb_free_descriptors(f->hs_descriptors); |
726 | if (gadget_is_superspeed(c->cdev->gadget)) | ||
727 | usb_free_descriptors(f->ss_descriptors); | ||
678 | usb_free_descriptors(f->descriptors); | 728 | usb_free_descriptors(f->descriptors); |
679 | gs_free_req(acm->notify, acm->notify_req); | 729 | gs_free_req(acm->notify, acm->notify_req); |
680 | kfree(acm); | 730 | kfree(acm); |