1/** 2 * udc.c - Core UDC Framework 3 * 4 * Copyright (C) 2010 Texas Instruments 5 * Author: Felipe Balbi <balbi@ti.com> 6 * 7 * This program is free software: you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License version 2 of 9 * the License as published by the Free Software Foundation. 10 * 11 * This program is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License 17 * along with this program. If not, see <http://www.gnu.org/licenses/>. 18 */ 19 20#include <linux/kernel.h> 21#include <linux/module.h> 22#include <linux/device.h> 23#include <linux/list.h> 24#include <linux/err.h> 25#include <linux/dma-mapping.h> 26#include <linux/workqueue.h> 27 28#include <linux/usb/ch9.h> 29#include <linux/usb/gadget.h> 30#include <linux/usb.h> 31 32/** 33 * struct usb_udc - describes one usb device controller 34 * @driver - the gadget driver pointer. For use by the class code 35 * @dev - the child device to the actual controller 36 * @gadget - the gadget. For use by the class code 37 * @list - for use by the udc class driver 38 * @vbus - for udcs who care about vbus status, this value is real vbus status; 39 * for udcs who do not care about vbus status, this value is always true 40 * 41 * This represents the internal data structure which is used by the UDC-class 42 * to hold information about udc driver and gadget together. 43 */ 44struct usb_udc { 45 struct usb_gadget_driver *driver; 46 struct usb_gadget *gadget; 47 struct device dev; 48 struct list_head list; 49 bool vbus; 50}; 51 52static struct class *udc_class; 53static LIST_HEAD(udc_list); 54static DEFINE_MUTEX(udc_lock); 55 56/* ------------------------------------------------------------------------- */ 57 58#ifdef CONFIG_HAS_DMA 59 60int usb_gadget_map_request(struct usb_gadget *gadget, 61 struct usb_request *req, int is_in) 62{ 63 struct device *dev = gadget->dev.parent; 64 65 if (req->length == 0) 66 return 0; 67 68 if (req->num_sgs) { 69 int mapped; 70 71 mapped = dma_map_sg(dev, req->sg, req->num_sgs, 72 is_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE); 73 if (mapped == 0) { 74 dev_err(dev, "failed to map SGs\n"); 75 return -EFAULT; 76 } 77 78 req->num_mapped_sgs = mapped; 79 } else { 80 req->dma = dma_map_single(dev, req->buf, req->length, 81 is_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE); 82 83 if (dma_mapping_error(dev, req->dma)) { 84 dev_err(dev, "failed to map buffer\n"); 85 return -EFAULT; 86 } 87 } 88 89 return 0; 90} 91EXPORT_SYMBOL_GPL(usb_gadget_map_request); 92 93void usb_gadget_unmap_request(struct usb_gadget *gadget, 94 struct usb_request *req, int is_in) 95{ 96 if (req->length == 0) 97 return; 98 99 if (req->num_mapped_sgs) { 100 dma_unmap_sg(gadget->dev.parent, req->sg, req->num_mapped_sgs, 101 is_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE); 102 103 req->num_mapped_sgs = 0; 104 } else { 105 dma_unmap_single(gadget->dev.parent, req->dma, req->length, 106 is_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE); 107 } 108} 109EXPORT_SYMBOL_GPL(usb_gadget_unmap_request); 110 111#endif /* CONFIG_HAS_DMA */ 112 113/* ------------------------------------------------------------------------- */ 114 115/** 116 * usb_gadget_giveback_request - give the request back to the gadget layer 117 * Context: in_interrupt() 118 * 119 * This is called by device controller drivers in order to return the 120 * completed request back to the gadget layer. 121 */ 122void usb_gadget_giveback_request(struct usb_ep *ep, 123 struct usb_request *req) 124{ 125 if (likely(req->status == 0)) 126 usb_led_activity(USB_LED_EVENT_GADGET); 127 128 req->complete(ep, req); 129} 130EXPORT_SYMBOL_GPL(usb_gadget_giveback_request); 131 132/* ------------------------------------------------------------------------- */ 133 134/** 135 * gadget_find_ep_by_name - returns ep whose name is the same as sting passed 136 * in second parameter or NULL if searched endpoint not found 137 * @g: controller to check for quirk 138 * @name: name of searched endpoint 139 */ 140struct usb_ep *gadget_find_ep_by_name(struct usb_gadget *g, const char *name) 141{ 142 struct usb_ep *ep; 143 144 gadget_for_each_ep(ep, g) { 145 if (!strcmp(ep->name, name)) 146 return ep; 147 } 148 149 return NULL; 150} 151EXPORT_SYMBOL_GPL(gadget_find_ep_by_name); 152 153/* ------------------------------------------------------------------------- */ 154 155int usb_gadget_ep_match_desc(struct usb_gadget *gadget, 156 struct usb_ep *ep, struct usb_endpoint_descriptor *desc, 157 struct usb_ss_ep_comp_descriptor *ep_comp) 158{ 159 u8 type; 160 u16 max; 161 int num_req_streams = 0; 162 163 /* endpoint already claimed? */ 164 if (ep->claimed) 165 return 0; 166 167 type = usb_endpoint_type(desc); 168 max = 0x7ff & usb_endpoint_maxp(desc); 169 170 if (usb_endpoint_dir_in(desc) && !ep->caps.dir_in) 171 return 0; 172 if (usb_endpoint_dir_out(desc) && !ep->caps.dir_out) 173 return 0; 174 175 if (max > ep->maxpacket_limit) 176 return 0; 177 178 /* "high bandwidth" works only at high speed */ 179 if (!gadget_is_dualspeed(gadget) && usb_endpoint_maxp(desc) & (3<<11)) 180 return 0; 181 182 switch (type) { 183 case USB_ENDPOINT_XFER_CONTROL: 184 /* only support ep0 for portable CONTROL traffic */ 185 return 0; 186 case USB_ENDPOINT_XFER_ISOC: 187 if (!ep->caps.type_iso) 188 return 0; 189 /* ISO: limit 1023 bytes full speed, 1024 high/super speed */ 190 if (!gadget_is_dualspeed(gadget) && max > 1023) 191 return 0; 192 break; 193 case USB_ENDPOINT_XFER_BULK: 194 if (!ep->caps.type_bulk) 195 return 0; 196 if (ep_comp && gadget_is_superspeed(gadget)) { 197 /* Get the number of required streams from the 198 * EP companion descriptor and see if the EP 199 * matches it 200 */ 201 num_req_streams = ep_comp->bmAttributes & 0x1f; 202 if (num_req_streams > ep->max_streams) 203 return 0; 204 } 205 break; 206 case USB_ENDPOINT_XFER_INT: 207 /* Bulk endpoints handle interrupt transfers, 208 * except the toggle-quirky iso-synch kind 209 */ 210 if (!ep->caps.type_int && !ep->caps.type_bulk) 211 return 0; 212 /* INT: limit 64 bytes full speed, 1024 high/super speed */ 213 if (!gadget_is_dualspeed(gadget) && max > 64) 214 return 0; 215 break; 216 } 217 218 return 1; 219} 220EXPORT_SYMBOL_GPL(usb_gadget_ep_match_desc); 221 222/* ------------------------------------------------------------------------- */ 223 224static void usb_gadget_state_work(struct work_struct *work) 225{ 226 struct usb_gadget *gadget = work_to_gadget(work); 227 struct usb_udc *udc = gadget->udc; 228 229 if (udc) 230 sysfs_notify(&udc->dev.kobj, NULL, "state"); 231} 232 233void usb_gadget_set_state(struct usb_gadget *gadget, 234 enum usb_device_state state) 235{ 236 gadget->state = state; 237 schedule_work(&gadget->work); 238} 239EXPORT_SYMBOL_GPL(usb_gadget_set_state); 240 241/* ------------------------------------------------------------------------- */ 242 243static void usb_udc_connect_control(struct usb_udc *udc) 244{ 245 if (udc->vbus) 246 usb_gadget_connect(udc->gadget); 247 else 248 usb_gadget_disconnect(udc->gadget); 249} 250 251/** 252 * usb_udc_vbus_handler - updates the udc core vbus status, and try to 253 * connect or disconnect gadget 254 * @gadget: The gadget which vbus change occurs 255 * @status: The vbus status 256 * 257 * The udc driver calls it when it wants to connect or disconnect gadget 258 * according to vbus status. 259 */ 260void usb_udc_vbus_handler(struct usb_gadget *gadget, bool status) 261{ 262 struct usb_udc *udc = gadget->udc; 263 264 if (udc) { 265 udc->vbus = status; 266 usb_udc_connect_control(udc); 267 } 268} 269EXPORT_SYMBOL_GPL(usb_udc_vbus_handler); 270 271/** 272 * usb_gadget_udc_reset - notifies the udc core that bus reset occurs 273 * @gadget: The gadget which bus reset occurs 274 * @driver: The gadget driver we want to notify 275 * 276 * If the udc driver has bus reset handler, it needs to call this when the bus 277 * reset occurs, it notifies the gadget driver that the bus reset occurs as 278 * well as updates gadget state. 279 */ 280void usb_gadget_udc_reset(struct usb_gadget *gadget, 281 struct usb_gadget_driver *driver) 282{ 283 driver->reset(gadget); 284 usb_gadget_set_state(gadget, USB_STATE_DEFAULT); 285} 286EXPORT_SYMBOL_GPL(usb_gadget_udc_reset); 287 288/** 289 * usb_gadget_udc_start - tells usb device controller to start up 290 * @udc: The UDC to be started 291 * 292 * This call is issued by the UDC Class driver when it's about 293 * to register a gadget driver to the device controller, before 294 * calling gadget driver's bind() method. 295 * 296 * It allows the controller to be powered off until strictly 297 * necessary to have it powered on. 298 * 299 * Returns zero on success, else negative errno. 300 */ 301static inline int usb_gadget_udc_start(struct usb_udc *udc) 302{ 303 return udc->gadget->ops->udc_start(udc->gadget, udc->driver); 304} 305 306/** 307 * usb_gadget_udc_stop - tells usb device controller we don't need it anymore 308 * @gadget: The device we want to stop activity 309 * @driver: The driver to unbind from @gadget 310 * 311 * This call is issued by the UDC Class driver after calling 312 * gadget driver's unbind() method. 313 * 314 * The details are implementation specific, but it can go as 315 * far as powering off UDC completely and disable its data 316 * line pullups. 317 */ 318static inline void usb_gadget_udc_stop(struct usb_udc *udc) 319{ 320 udc->gadget->ops->udc_stop(udc->gadget); 321} 322 323/** 324 * usb_udc_release - release the usb_udc struct 325 * @dev: the dev member within usb_udc 326 * 327 * This is called by driver's core in order to free memory once the last 328 * reference is released. 329 */ 330static void usb_udc_release(struct device *dev) 331{ 332 struct usb_udc *udc; 333 334 udc = container_of(dev, struct usb_udc, dev); 335 dev_dbg(dev, "releasing '%s'\n", dev_name(dev)); 336 kfree(udc); 337} 338 339static const struct attribute_group *usb_udc_attr_groups[]; 340 341static void usb_udc_nop_release(struct device *dev) 342{ 343 dev_vdbg(dev, "%s\n", __func__); 344} 345 346/** 347 * usb_add_gadget_udc_release - adds a new gadget to the udc class driver list 348 * @parent: the parent device to this udc. Usually the controller driver's 349 * device. 350 * @gadget: the gadget to be added to the list. 351 * @release: a gadget release function. 352 * 353 * Returns zero on success, negative errno otherwise. 354 */ 355int usb_add_gadget_udc_release(struct device *parent, struct usb_gadget *gadget, 356 void (*release)(struct device *dev)) 357{ 358 struct usb_udc *udc; 359 int ret = -ENOMEM; 360 361 udc = kzalloc(sizeof(*udc), GFP_KERNEL); 362 if (!udc) 363 goto err1; 364 365 dev_set_name(&gadget->dev, "gadget"); 366 INIT_WORK(&gadget->work, usb_gadget_state_work); 367 gadget->dev.parent = parent; 368 369#ifdef CONFIG_HAS_DMA 370 dma_set_coherent_mask(&gadget->dev, parent->coherent_dma_mask); 371 gadget->dev.dma_parms = parent->dma_parms; 372 gadget->dev.dma_mask = parent->dma_mask; 373#endif 374 375 if (release) 376 gadget->dev.release = release; 377 else 378 gadget->dev.release = usb_udc_nop_release; 379 380 ret = device_register(&gadget->dev); 381 if (ret) 382 goto err2; 383 384 device_initialize(&udc->dev); 385 udc->dev.release = usb_udc_release; 386 udc->dev.class = udc_class; 387 udc->dev.groups = usb_udc_attr_groups; 388 udc->dev.parent = parent; 389 ret = dev_set_name(&udc->dev, "%s", kobject_name(&parent->kobj)); 390 if (ret) 391 goto err3; 392 393 udc->gadget = gadget; 394 gadget->udc = udc; 395 396 mutex_lock(&udc_lock); 397 list_add_tail(&udc->list, &udc_list); 398 399 ret = device_add(&udc->dev); 400 if (ret) 401 goto err4; 402 403 usb_gadget_set_state(gadget, USB_STATE_NOTATTACHED); 404 udc->vbus = true; 405 406 mutex_unlock(&udc_lock); 407 408 return 0; 409 410err4: 411 list_del(&udc->list); 412 mutex_unlock(&udc_lock); 413 414err3: 415 put_device(&udc->dev); 416 device_del(&gadget->dev); 417 418err2: 419 put_device(&gadget->dev); 420 kfree(udc); 421 422err1: 423 return ret; 424} 425EXPORT_SYMBOL_GPL(usb_add_gadget_udc_release); 426 427/** 428 * usb_add_gadget_udc - adds a new gadget to the udc class driver list 429 * @parent: the parent device to this udc. Usually the controller 430 * driver's device. 431 * @gadget: the gadget to be added to the list 432 * 433 * Returns zero on success, negative errno otherwise. 434 */ 435int usb_add_gadget_udc(struct device *parent, struct usb_gadget *gadget) 436{ 437 return usb_add_gadget_udc_release(parent, gadget, NULL); 438} 439EXPORT_SYMBOL_GPL(usb_add_gadget_udc); 440 441static void usb_gadget_remove_driver(struct usb_udc *udc) 442{ 443 dev_dbg(&udc->dev, "unregistering UDC driver [%s]\n", 444 udc->driver->function); 445 446 kobject_uevent(&udc->dev.kobj, KOBJ_CHANGE); 447 448 usb_gadget_disconnect(udc->gadget); 449 udc->driver->disconnect(udc->gadget); 450 udc->driver->unbind(udc->gadget); 451 usb_gadget_udc_stop(udc); 452 453 udc->driver = NULL; 454 udc->dev.driver = NULL; 455 udc->gadget->dev.driver = NULL; 456} 457 458/** 459 * usb_del_gadget_udc - deletes @udc from udc_list 460 * @gadget: the gadget to be removed. 461 * 462 * This, will call usb_gadget_unregister_driver() if 463 * the @udc is still busy. 464 */ 465void usb_del_gadget_udc(struct usb_gadget *gadget) 466{ 467 struct usb_udc *udc = gadget->udc; 468 469 if (!udc) 470 return; 471 472 dev_vdbg(gadget->dev.parent, "unregistering gadget\n"); 473 474 mutex_lock(&udc_lock); 475 list_del(&udc->list); 476 mutex_unlock(&udc_lock); 477 478 if (udc->driver) 479 usb_gadget_remove_driver(udc); 480 481 kobject_uevent(&udc->dev.kobj, KOBJ_REMOVE); 482 flush_work(&gadget->work); 483 device_unregister(&udc->dev); 484 device_unregister(&gadget->dev); 485} 486EXPORT_SYMBOL_GPL(usb_del_gadget_udc); 487 488/* ------------------------------------------------------------------------- */ 489 490static int udc_bind_to_driver(struct usb_udc *udc, struct usb_gadget_driver *driver) 491{ 492 int ret; 493 494 dev_dbg(&udc->dev, "registering UDC driver [%s]\n", 495 driver->function); 496 497 udc->driver = driver; 498 udc->dev.driver = &driver->driver; 499 udc->gadget->dev.driver = &driver->driver; 500 501 ret = driver->bind(udc->gadget, driver); 502 if (ret) 503 goto err1; 504 ret = usb_gadget_udc_start(udc); 505 if (ret) { 506 driver->unbind(udc->gadget); 507 goto err1; 508 } 509 usb_udc_connect_control(udc); 510 511 kobject_uevent(&udc->dev.kobj, KOBJ_CHANGE); 512 return 0; 513err1: 514 if (ret != -EISNAM) 515 dev_err(&udc->dev, "failed to start %s: %d\n", 516 udc->driver->function, ret); 517 udc->driver = NULL; 518 udc->dev.driver = NULL; 519 udc->gadget->dev.driver = NULL; 520 return ret; 521} 522 523int usb_udc_attach_driver(const char *name, struct usb_gadget_driver *driver) 524{ 525 struct usb_udc *udc = NULL; 526 int ret = -ENODEV; 527 528 mutex_lock(&udc_lock); 529 list_for_each_entry(udc, &udc_list, list) { 530 ret = strcmp(name, dev_name(&udc->dev)); 531 if (!ret) 532 break; 533 } 534 if (ret) { 535 ret = -ENODEV; 536 goto out; 537 } 538 if (udc->driver) { 539 ret = -EBUSY; 540 goto out; 541 } 542 ret = udc_bind_to_driver(udc, driver); 543out: 544 mutex_unlock(&udc_lock); 545 return ret; 546} 547EXPORT_SYMBOL_GPL(usb_udc_attach_driver); 548 549int usb_gadget_probe_driver(struct usb_gadget_driver *driver) 550{ 551 struct usb_udc *udc = NULL; 552 int ret; 553 554 if (!driver || !driver->bind || !driver->setup) 555 return -EINVAL; 556 557 mutex_lock(&udc_lock); 558 list_for_each_entry(udc, &udc_list, list) { 559 /* For now we take the first one */ 560 if (!udc->driver) 561 goto found; 562 } 563 564 pr_debug("couldn't find an available UDC\n"); 565 mutex_unlock(&udc_lock); 566 return -ENODEV; 567found: 568 ret = udc_bind_to_driver(udc, driver); 569 mutex_unlock(&udc_lock); 570 return ret; 571} 572EXPORT_SYMBOL_GPL(usb_gadget_probe_driver); 573 574int usb_gadget_unregister_driver(struct usb_gadget_driver *driver) 575{ 576 struct usb_udc *udc = NULL; 577 int ret = -ENODEV; 578 579 if (!driver || !driver->unbind) 580 return -EINVAL; 581 582 mutex_lock(&udc_lock); 583 list_for_each_entry(udc, &udc_list, list) 584 if (udc->driver == driver) { 585 usb_gadget_remove_driver(udc); 586 usb_gadget_set_state(udc->gadget, 587 USB_STATE_NOTATTACHED); 588 ret = 0; 589 break; 590 } 591 592 mutex_unlock(&udc_lock); 593 return ret; 594} 595EXPORT_SYMBOL_GPL(usb_gadget_unregister_driver); 596 597/* ------------------------------------------------------------------------- */ 598 599static ssize_t usb_udc_srp_store(struct device *dev, 600 struct device_attribute *attr, const char *buf, size_t n) 601{ 602 struct usb_udc *udc = container_of(dev, struct usb_udc, dev); 603 604 if (sysfs_streq(buf, "1")) 605 usb_gadget_wakeup(udc->gadget); 606 607 return n; 608} 609static DEVICE_ATTR(srp, S_IWUSR, NULL, usb_udc_srp_store); 610 611static ssize_t usb_udc_softconn_store(struct device *dev, 612 struct device_attribute *attr, const char *buf, size_t n) 613{ 614 struct usb_udc *udc = container_of(dev, struct usb_udc, dev); 615 616 if (!udc->driver) { 617 dev_err(dev, "soft-connect without a gadget driver\n"); 618 return -EOPNOTSUPP; 619 } 620 621 if (sysfs_streq(buf, "connect")) { 622 usb_gadget_udc_start(udc); 623 usb_gadget_connect(udc->gadget); 624 } else if (sysfs_streq(buf, "disconnect")) { 625 usb_gadget_disconnect(udc->gadget); 626 udc->driver->disconnect(udc->gadget); 627 usb_gadget_udc_stop(udc); 628 } else { 629 dev_err(dev, "unsupported command '%s'\n", buf); 630 return -EINVAL; 631 } 632 633 return n; 634} 635static DEVICE_ATTR(soft_connect, S_IWUSR, NULL, usb_udc_softconn_store); 636 637static ssize_t state_show(struct device *dev, struct device_attribute *attr, 638 char *buf) 639{ 640 struct usb_udc *udc = container_of(dev, struct usb_udc, dev); 641 struct usb_gadget *gadget = udc->gadget; 642 643 return sprintf(buf, "%s\n", usb_state_string(gadget->state)); 644} 645static DEVICE_ATTR_RO(state); 646 647#define USB_UDC_SPEED_ATTR(name, param) \ 648ssize_t name##_show(struct device *dev, \ 649 struct device_attribute *attr, char *buf) \ 650{ \ 651 struct usb_udc *udc = container_of(dev, struct usb_udc, dev); \ 652 return snprintf(buf, PAGE_SIZE, "%s\n", \ 653 usb_speed_string(udc->gadget->param)); \ 654} \ 655static DEVICE_ATTR_RO(name) 656 657static USB_UDC_SPEED_ATTR(current_speed, speed); 658static USB_UDC_SPEED_ATTR(maximum_speed, max_speed); 659 660#define USB_UDC_ATTR(name) \ 661ssize_t name##_show(struct device *dev, \ 662 struct device_attribute *attr, char *buf) \ 663{ \ 664 struct usb_udc *udc = container_of(dev, struct usb_udc, dev); \ 665 struct usb_gadget *gadget = udc->gadget; \ 666 \ 667 return snprintf(buf, PAGE_SIZE, "%d\n", gadget->name); \ 668} \ 669static DEVICE_ATTR_RO(name) 670 671static USB_UDC_ATTR(is_otg); 672static USB_UDC_ATTR(is_a_peripheral); 673static USB_UDC_ATTR(b_hnp_enable); 674static USB_UDC_ATTR(a_hnp_support); 675static USB_UDC_ATTR(a_alt_hnp_support); 676static USB_UDC_ATTR(is_selfpowered); 677 678static struct attribute *usb_udc_attrs[] = { 679 &dev_attr_srp.attr, 680 &dev_attr_soft_connect.attr, 681 &dev_attr_state.attr, 682 &dev_attr_current_speed.attr, 683 &dev_attr_maximum_speed.attr, 684 685 &dev_attr_is_otg.attr, 686 &dev_attr_is_a_peripheral.attr, 687 &dev_attr_b_hnp_enable.attr, 688 &dev_attr_a_hnp_support.attr, 689 &dev_attr_a_alt_hnp_support.attr, 690 &dev_attr_is_selfpowered.attr, 691 NULL, 692}; 693 694static const struct attribute_group usb_udc_attr_group = { 695 .attrs = usb_udc_attrs, 696}; 697 698static const struct attribute_group *usb_udc_attr_groups[] = { 699 &usb_udc_attr_group, 700 NULL, 701}; 702 703static int usb_udc_uevent(struct device *dev, struct kobj_uevent_env *env) 704{ 705 struct usb_udc *udc = container_of(dev, struct usb_udc, dev); 706 int ret; 707 708 ret = add_uevent_var(env, "USB_UDC_NAME=%s", udc->gadget->name); 709 if (ret) { 710 dev_err(dev, "failed to add uevent USB_UDC_NAME\n"); 711 return ret; 712 } 713 714 if (udc->driver) { 715 ret = add_uevent_var(env, "USB_UDC_DRIVER=%s", 716 udc->driver->function); 717 if (ret) { 718 dev_err(dev, "failed to add uevent USB_UDC_DRIVER\n"); 719 return ret; 720 } 721 } 722 723 return 0; 724} 725 726static int __init usb_udc_init(void) 727{ 728 udc_class = class_create(THIS_MODULE, "udc"); 729 if (IS_ERR(udc_class)) { 730 pr_err("failed to create udc class --> %ld\n", 731 PTR_ERR(udc_class)); 732 return PTR_ERR(udc_class); 733 } 734 735 udc_class->dev_uevent = usb_udc_uevent; 736 return 0; 737} 738subsys_initcall(usb_udc_init); 739 740static void __exit usb_udc_exit(void) 741{ 742 class_destroy(udc_class); 743} 744module_exit(usb_udc_exit); 745 746MODULE_DESCRIPTION("UDC Framework"); 747MODULE_AUTHOR("Felipe Balbi <balbi@ti.com>"); 748MODULE_LICENSE("GPL v2"); 749