Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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