diff options
Diffstat (limited to 'drivers/usb/gadget/f_hid.c')
| -rw-r--r-- | drivers/usb/gadget/f_hid.c | 30 |
1 files changed, 10 insertions, 20 deletions
diff --git a/drivers/usb/gadget/f_hid.c b/drivers/usb/gadget/f_hid.c index 511e527178e2..6e69a8e8d22a 100644 --- a/drivers/usb/gadget/f_hid.c +++ b/drivers/usb/gadget/f_hid.c | |||
| @@ -573,7 +573,6 @@ static int __init hidg_bind(struct usb_configuration *c, struct usb_function *f) | |||
| 573 | goto fail; | 573 | goto fail; |
| 574 | hidg_interface_desc.bInterfaceNumber = status; | 574 | hidg_interface_desc.bInterfaceNumber = status; |
| 575 | 575 | ||
| 576 | |||
| 577 | /* allocate instance-specific endpoints */ | 576 | /* allocate instance-specific endpoints */ |
| 578 | status = -ENODEV; | 577 | status = -ENODEV; |
| 579 | ep = usb_ep_autoconfig(c->cdev->gadget, &hidg_fs_in_ep_desc); | 578 | ep = usb_ep_autoconfig(c->cdev->gadget, &hidg_fs_in_ep_desc); |
| @@ -609,20 +608,15 @@ static int __init hidg_bind(struct usb_configuration *c, struct usb_function *f) | |||
| 609 | hidg_desc.desc[0].wDescriptorLength = | 608 | hidg_desc.desc[0].wDescriptorLength = |
| 610 | cpu_to_le16(hidg->report_desc_length); | 609 | cpu_to_le16(hidg->report_desc_length); |
| 611 | 610 | ||
| 612 | /* copy descriptors */ | 611 | hidg_hs_in_ep_desc.bEndpointAddress = |
| 613 | f->descriptors = usb_copy_descriptors(hidg_fs_descriptors); | 612 | hidg_fs_in_ep_desc.bEndpointAddress; |
| 614 | if (!f->descriptors) | 613 | hidg_hs_out_ep_desc.bEndpointAddress = |
| 615 | goto fail; | 614 | hidg_fs_out_ep_desc.bEndpointAddress; |
| 616 | 615 | ||
| 617 | if (gadget_is_dualspeed(c->cdev->gadget)) { | 616 | status = usb_assign_descriptors(f, hidg_fs_descriptors, |
| 618 | hidg_hs_in_ep_desc.bEndpointAddress = | 617 | hidg_hs_descriptors, NULL); |
| 619 | hidg_fs_in_ep_desc.bEndpointAddress; | 618 | if (status) |
| 620 | hidg_hs_out_ep_desc.bEndpointAddress = | 619 | goto fail; |
| 621 | hidg_fs_out_ep_desc.bEndpointAddress; | ||
| 622 | f->hs_descriptors = usb_copy_descriptors(hidg_hs_descriptors); | ||
| 623 | if (!f->hs_descriptors) | ||
| 624 | goto fail; | ||
| 625 | } | ||
| 626 | 620 | ||
| 627 | mutex_init(&hidg->lock); | 621 | mutex_init(&hidg->lock); |
| 628 | spin_lock_init(&hidg->spinlock); | 622 | spin_lock_init(&hidg->spinlock); |
| @@ -649,9 +643,7 @@ fail: | |||
| 649 | usb_ep_free_request(hidg->in_ep, hidg->req); | 643 | usb_ep_free_request(hidg->in_ep, hidg->req); |
| 650 | } | 644 | } |
| 651 | 645 | ||
| 652 | usb_free_descriptors(f->hs_descriptors); | 646 | usb_free_all_descriptors(f); |
| 653 | usb_free_descriptors(f->descriptors); | ||
| 654 | |||
| 655 | return status; | 647 | return status; |
| 656 | } | 648 | } |
| 657 | 649 | ||
| @@ -668,9 +660,7 @@ static void hidg_unbind(struct usb_configuration *c, struct usb_function *f) | |||
| 668 | kfree(hidg->req->buf); | 660 | kfree(hidg->req->buf); |
| 669 | usb_ep_free_request(hidg->in_ep, hidg->req); | 661 | usb_ep_free_request(hidg->in_ep, hidg->req); |
| 670 | 662 | ||
| 671 | /* free descriptors copies */ | 663 | usb_free_all_descriptors(f); |
| 672 | usb_free_descriptors(f->hs_descriptors); | ||
| 673 | usb_free_descriptors(f->descriptors); | ||
| 674 | 664 | ||
| 675 | kfree(hidg->report_desc); | 665 | kfree(hidg->report_desc); |
| 676 | kfree(hidg); | 666 | kfree(hidg); |
