1/* $FreeBSD: stable/9/sys/dev/usb/controller/usb_controller.c 247090 2013-02-21 07:48:07Z hselasky $ */ |
2/*- 3 * Copyright (c) 2008 Hans Petter Selasky. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. --- 392 unchanged lines hidden (view full) --- 402 * This function is used to suspend the USB contoller. 403 *------------------------------------------------------------------------*/ 404static void 405usb_bus_suspend(struct usb_proc_msg *pm) 406{ 407 struct usb_bus *bus; 408 struct usb_device *udev; 409 usb_error_t err; |
410 uint8_t do_unlock; |
411 412 bus = ((struct usb_bus_msg *)pm)->bus; 413 udev = bus->devices[USB_ROOT_HUB_ADDR]; 414 415 if (udev == NULL || bus->bdev == NULL) 416 return; 417 418 USB_BUS_UNLOCK(bus); --- 4 unchanged lines hidden (view full) --- 423 * resume. The USB system suspend is implemented like full 424 * shutdown and all connected USB devices will be disconnected 425 * subsequently. At resume all USB devices will be 426 * re-connected again. 427 */ 428 429 bus_generic_shutdown(bus->bdev); 430 |
431 do_unlock = usbd_enum_lock(udev); |
432 433 err = usbd_set_config_index(udev, USB_UNCONFIG_INDEX); 434 if (err) 435 device_printf(bus->bdev, "Could not unconfigure root HUB\n"); 436 437 USB_BUS_LOCK(bus); 438 bus->hw_power_state = 0; 439 bus->no_explore = 1; 440 USB_BUS_UNLOCK(bus); 441 442 if (bus->methods->set_hw_power != NULL) 443 (bus->methods->set_hw_power) (bus); 444 445 if (bus->methods->set_hw_power_sleep != NULL) 446 (bus->methods->set_hw_power_sleep) (bus, USB_HW_POWER_SUSPEND); 447 |
448 if (do_unlock) 449 usbd_enum_unlock(udev); |
450 451 USB_BUS_LOCK(bus); 452} 453 454/*------------------------------------------------------------------------* 455 * usb_bus_resume 456 * 457 * This function is used to resume the USB contoller. 458 *------------------------------------------------------------------------*/ 459static void 460usb_bus_resume(struct usb_proc_msg *pm) 461{ 462 struct usb_bus *bus; 463 struct usb_device *udev; 464 usb_error_t err; |
465 uint8_t do_unlock; |
466 467 bus = ((struct usb_bus_msg *)pm)->bus; 468 udev = bus->devices[USB_ROOT_HUB_ADDR]; 469 470 if (udev == NULL || bus->bdev == NULL) 471 return; 472 473 USB_BUS_UNLOCK(bus); 474 |
475 do_unlock = usbd_enum_lock(udev); |
476#if 0 477 DEVMETHOD(usb_take_controller, NULL); /* dummy */ 478#endif 479 USB_TAKE_CONTROLLER(device_get_parent(bus->bdev)); 480 481 USB_BUS_LOCK(bus); 482 bus->hw_power_state = 483 USB_HW_POWER_CONTROL | --- 17 unchanged lines hidden (view full) --- 501 502 /* probe and attach */ 503 err = usb_probe_and_attach(udev, USB_IFACE_INDEX_ANY); 504 if (err) { 505 device_printf(bus->bdev, "Could not probe and " 506 "attach root HUB\n"); 507 } 508 |
509 if (do_unlock) 510 usbd_enum_unlock(udev); |
511 512 USB_BUS_LOCK(bus); 513} 514 515/*------------------------------------------------------------------------* 516 * usb_bus_shutdown 517 * 518 * This function is used to shutdown the USB contoller. 519 *------------------------------------------------------------------------*/ 520static void 521usb_bus_shutdown(struct usb_proc_msg *pm) 522{ 523 struct usb_bus *bus; 524 struct usb_device *udev; 525 usb_error_t err; |
526 uint8_t do_unlock; |
527 528 bus = ((struct usb_bus_msg *)pm)->bus; 529 udev = bus->devices[USB_ROOT_HUB_ADDR]; 530 531 if (udev == NULL || bus->bdev == NULL) 532 return; 533 534 USB_BUS_UNLOCK(bus); 535 536 bus_generic_shutdown(bus->bdev); 537 |
538 do_unlock = usbd_enum_lock(udev); |
539 540 err = usbd_set_config_index(udev, USB_UNCONFIG_INDEX); 541 if (err) 542 device_printf(bus->bdev, "Could not unconfigure root HUB\n"); 543 544 USB_BUS_LOCK(bus); 545 bus->hw_power_state = 0; 546 bus->no_explore = 1; 547 USB_BUS_UNLOCK(bus); 548 549 if (bus->methods->set_hw_power != NULL) 550 (bus->methods->set_hw_power) (bus); 551 552 if (bus->methods->set_hw_power_sleep != NULL) 553 (bus->methods->set_hw_power_sleep) (bus, USB_HW_POWER_SHUTDOWN); 554 |
555 if (do_unlock) 556 usbd_enum_unlock(udev); |
557 558 USB_BUS_LOCK(bus); 559} 560 561static void 562usb_power_wdog(void *arg) 563{ 564 struct usb_bus *bus = arg; --- 315 unchanged lines hidden --- |