diff options
| author | Alan Stern <stern@rowland.harvard.edu> | 2005-04-25 11:28:04 -0400 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@suse.de> | 2005-06-27 17:43:49 -0400 |
| commit | 247f3105636caa9d1d8a4c3dfb755de42633bc80 (patch) | |
| tree | f5fca7b566ee3304d661485a11dc4877652e7904 | |
| parent | 8ec8d20b21f00a36343ca0ebd6c6be9421724a1e (diff) | |
[PATCH] USB HCDs: no longer need to register root hub
This patch changes the host controller drivers; they no longer need to
register their root hubs because usbcore will take care of it for them.
Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
| -rw-r--r-- | drivers/usb/gadget/dummy_hcd.c | 24 | ||||
| -rw-r--r-- | drivers/usb/host/ehci-hcd.c | 31 | ||||
| -rw-r--r-- | drivers/usb/host/isp116x-hcd.c | 16 | ||||
| -rw-r--r-- | drivers/usb/host/ohci-hcd.c | 30 | ||||
| -rw-r--r-- | drivers/usb/host/sl811-hcd.c | 13 | ||||
| -rw-r--r-- | drivers/usb/host/uhci-hcd.c | 25 |
6 files changed, 4 insertions, 135 deletions
diff --git a/drivers/usb/gadget/dummy_hcd.c b/drivers/usb/gadget/dummy_hcd.c index 9d37fc771b..1918d10f75 100644 --- a/drivers/usb/gadget/dummy_hcd.c +++ b/drivers/usb/gadget/dummy_hcd.c | |||
| @@ -1625,7 +1625,6 @@ static DEVICE_ATTR (urbs, S_IRUGO, show_urbs, NULL); | |||
| 1625 | static int dummy_start (struct usb_hcd *hcd) | 1625 | static int dummy_start (struct usb_hcd *hcd) |
| 1626 | { | 1626 | { |
| 1627 | struct dummy *dum; | 1627 | struct dummy *dum; |
| 1628 | struct usb_device *root; | ||
| 1629 | int retval; | 1628 | int retval; |
| 1630 | 1629 | ||
| 1631 | dum = hcd_to_dummy (hcd); | 1630 | dum = hcd_to_dummy (hcd); |
| @@ -1642,35 +1641,16 @@ static int dummy_start (struct usb_hcd *hcd) | |||
| 1642 | 1641 | ||
| 1643 | INIT_LIST_HEAD (&dum->urbp_list); | 1642 | INIT_LIST_HEAD (&dum->urbp_list); |
| 1644 | 1643 | ||
| 1645 | root = usb_alloc_dev (NULL, &hcd->self, 0); | 1644 | if ((retval = dummy_register_udc (dum)) != 0) |
| 1646 | if (!root) | 1645 | return retval; |
| 1647 | return -ENOMEM; | ||
| 1648 | 1646 | ||
| 1649 | /* only show a low-power port: just 8mA */ | 1647 | /* only show a low-power port: just 8mA */ |
| 1650 | hcd->power_budget = 8; | 1648 | hcd->power_budget = 8; |
| 1651 | |||
| 1652 | /* root hub enters addressed state... */ | ||
| 1653 | hcd->state = HC_STATE_RUNNING; | 1649 | hcd->state = HC_STATE_RUNNING; |
| 1654 | root->speed = USB_SPEED_HIGH; | ||
| 1655 | |||
| 1656 | /* ...then configured, so khubd sees us. */ | ||
| 1657 | if ((retval = usb_hcd_register_root_hub (root, hcd)) != 0) { | ||
| 1658 | goto err1; | ||
| 1659 | } | ||
| 1660 | |||
| 1661 | if ((retval = dummy_register_udc (dum)) != 0) | ||
| 1662 | goto err2; | ||
| 1663 | 1650 | ||
| 1664 | /* FIXME 'urbs' should be a per-device thing, maybe in usbcore */ | 1651 | /* FIXME 'urbs' should be a per-device thing, maybe in usbcore */ |
| 1665 | device_create_file (dummy_dev(dum), &dev_attr_urbs); | 1652 | device_create_file (dummy_dev(dum), &dev_attr_urbs); |
| 1666 | return 0; | 1653 | return 0; |
| 1667 | |||
| 1668 | err2: | ||
| 1669 | usb_disconnect (&hcd->self.root_hub); | ||
| 1670 | err1: | ||
| 1671 | usb_put_dev (root); | ||
| 1672 | hcd->state = HC_STATE_QUIESCING; | ||
| 1673 | return retval; | ||
| 1674 | } | 1654 | } |
| 1675 | 1655 | ||
| 1676 | static void dummy_stop (struct usb_hcd *hcd) | 1656 | static void dummy_stop (struct usb_hcd *hcd) |
diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c index bc69bd7ace..527abc693b 100644 --- a/drivers/usb/host/ehci-hcd.c +++ b/drivers/usb/host/ehci-hcd.c | |||
| @@ -492,8 +492,6 @@ static int ehci_start (struct usb_hcd *hcd) | |||
| 492 | { | 492 | { |
| 493 | struct ehci_hcd *ehci = hcd_to_ehci (hcd); | 493 | struct ehci_hcd *ehci = hcd_to_ehci (hcd); |
| 494 | u32 temp; | 494 | u32 temp; |
| 495 | struct usb_device *udev; | ||
| 496 | struct usb_bus *bus; | ||
| 497 | int retval; | 495 | int retval; |
| 498 | u32 hcc_params; | 496 | u32 hcc_params; |
| 499 | u8 sbrn = 0; | 497 | u8 sbrn = 0; |
| @@ -631,17 +629,6 @@ static int ehci_start (struct usb_hcd *hcd) | |||
| 631 | 629 | ||
| 632 | /* set async sleep time = 10 us ... ? */ | 630 | /* set async sleep time = 10 us ... ? */ |
| 633 | 631 | ||
| 634 | /* wire up the root hub */ | ||
| 635 | bus = hcd_to_bus (hcd); | ||
| 636 | udev = first ? usb_alloc_dev (NULL, bus, 0) : bus->root_hub; | ||
| 637 | if (!udev) { | ||
| 638 | done2: | ||
| 639 | ehci_mem_cleanup (ehci); | ||
| 640 | return -ENOMEM; | ||
| 641 | } | ||
| 642 | udev->speed = USB_SPEED_HIGH; | ||
| 643 | udev->state = first ? USB_STATE_ATTACHED : USB_STATE_CONFIGURED; | ||
| 644 | |||
| 645 | /* | 632 | /* |
| 646 | * Start, enabling full USB 2.0 functionality ... usb 1.1 devices | 633 | * Start, enabling full USB 2.0 functionality ... usb 1.1 devices |
| 647 | * are explicitly handed to companion controller(s), so no TT is | 634 | * are explicitly handed to companion controller(s), so no TT is |
| @@ -664,24 +651,6 @@ done2: | |||
| 664 | first ? "initialized" : "restarted", | 651 | first ? "initialized" : "restarted", |
| 665 | temp >> 8, temp & 0xff, DRIVER_VERSION); | 652 | temp >> 8, temp & 0xff, DRIVER_VERSION); |
| 666 | 653 | ||
| 667 | /* | ||
| 668 | * From here on, khubd concurrently accesses the root | ||
| 669 | * hub; drivers will be talking to enumerated devices. | ||
| 670 | * (On restart paths, khubd already knows about the root | ||
| 671 | * hub and could find work as soon as we wrote FLAG_CF.) | ||
| 672 | * | ||
| 673 | * Before this point the HC was idle/ready. After, khubd | ||
| 674 | * and device drivers may start it running. | ||
| 675 | */ | ||
| 676 | if (first && usb_hcd_register_root_hub (udev, hcd) != 0) { | ||
| 677 | if (hcd->state == HC_STATE_RUNNING) | ||
| 678 | ehci_quiesce (ehci); | ||
| 679 | ehci_reset (ehci); | ||
| 680 | usb_put_dev (udev); | ||
| 681 | retval = -ENODEV; | ||
| 682 | goto done2; | ||
| 683 | } | ||
| 684 | |||
| 685 | writel (INTR_MASK, &ehci->regs->intr_enable); /* Turn On Interrupts */ | 654 | writel (INTR_MASK, &ehci->regs->intr_enable); /* Turn On Interrupts */ |
| 686 | 655 | ||
| 687 | if (first) | 656 | if (first) |
diff --git a/drivers/usb/host/isp116x-hcd.c b/drivers/usb/host/isp116x-hcd.c index 1183988fdf..ff0a168e8e 100644 --- a/drivers/usb/host/isp116x-hcd.c +++ b/drivers/usb/host/isp116x-hcd.c | |||
| @@ -1547,7 +1547,6 @@ static int isp116x_start(struct usb_hcd *hcd) | |||
| 1547 | { | 1547 | { |
| 1548 | struct isp116x *isp116x = hcd_to_isp116x(hcd); | 1548 | struct isp116x *isp116x = hcd_to_isp116x(hcd); |
| 1549 | struct isp116x_platform_data *board = isp116x->board; | 1549 | struct isp116x_platform_data *board = isp116x->board; |
| 1550 | struct usb_device *udev; | ||
| 1551 | u32 val; | 1550 | u32 val; |
| 1552 | unsigned long flags; | 1551 | unsigned long flags; |
| 1553 | 1552 | ||
| @@ -1609,24 +1608,9 @@ static int isp116x_start(struct usb_hcd *hcd) | |||
| 1609 | isp116x->rhstatus = isp116x_read_reg32(isp116x, HCRHSTATUS); | 1608 | isp116x->rhstatus = isp116x_read_reg32(isp116x, HCRHSTATUS); |
| 1610 | 1609 | ||
| 1611 | isp116x_write_reg32(isp116x, HCFMINTVL, 0x27782edf); | 1610 | isp116x_write_reg32(isp116x, HCFMINTVL, 0x27782edf); |
| 1612 | spin_unlock_irqrestore(&isp116x->lock, flags); | ||
| 1613 | |||
| 1614 | udev = usb_alloc_dev(NULL, &hcd->self, 0); | ||
| 1615 | if (!udev) { | ||
| 1616 | isp116x_stop(hcd); | ||
| 1617 | return -ENOMEM; | ||
| 1618 | } | ||
| 1619 | 1611 | ||
| 1620 | udev->speed = USB_SPEED_FULL; | ||
| 1621 | hcd->state = HC_STATE_RUNNING; | 1612 | hcd->state = HC_STATE_RUNNING; |
| 1622 | 1613 | ||
| 1623 | if (usb_hcd_register_root_hub(udev, hcd) != 0) { | ||
| 1624 | isp116x_stop(hcd); | ||
| 1625 | usb_put_dev(udev); | ||
| 1626 | return -ENODEV; | ||
| 1627 | } | ||
| 1628 | |||
| 1629 | spin_lock_irqsave(&isp116x->lock, flags); | ||
| 1630 | /* Set up interrupts */ | 1614 | /* Set up interrupts */ |
| 1631 | isp116x->intenb = HCINT_MIE | HCINT_RHSC | HCINT_UE; | 1615 | isp116x->intenb = HCINT_MIE | HCINT_RHSC | HCINT_UE; |
| 1632 | if (board->remote_wakeup_enable) | 1616 | if (board->remote_wakeup_enable) |
diff --git a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c index 0da9961912..13cd2177b5 100644 --- a/drivers/usb/host/ohci-hcd.c +++ b/drivers/usb/host/ohci-hcd.c | |||
| @@ -505,13 +505,10 @@ static int ohci_init (struct ohci_hcd *ohci) | |||
| 505 | /* Start an OHCI controller, set the BUS operational | 505 | /* Start an OHCI controller, set the BUS operational |
| 506 | * resets USB and controller | 506 | * resets USB and controller |
| 507 | * enable interrupts | 507 | * enable interrupts |
| 508 | * connect the virtual root hub | ||
| 509 | */ | 508 | */ |
| 510 | static int ohci_run (struct ohci_hcd *ohci) | 509 | static int ohci_run (struct ohci_hcd *ohci) |
| 511 | { | 510 | { |
| 512 | u32 mask, temp; | 511 | u32 mask, temp; |
| 513 | struct usb_device *udev; | ||
| 514 | struct usb_bus *bus; | ||
| 515 | int first = ohci->fminterval == 0; | 512 | int first = ohci->fminterval == 0; |
| 516 | 513 | ||
| 517 | disable (ohci); | 514 | disable (ohci); |
| @@ -672,36 +669,13 @@ retry: | |||
| 672 | 669 | ||
| 673 | // POTPGT delay is bits 24-31, in 2 ms units. | 670 | // POTPGT delay is bits 24-31, in 2 ms units. |
| 674 | mdelay ((temp >> 23) & 0x1fe); | 671 | mdelay ((temp >> 23) & 0x1fe); |
| 675 | bus = &ohci_to_hcd(ohci)->self; | ||
| 676 | ohci_to_hcd(ohci)->state = HC_STATE_RUNNING; | 672 | ohci_to_hcd(ohci)->state = HC_STATE_RUNNING; |
| 677 | 673 | ||
| 678 | ohci_dump (ohci, 1); | 674 | ohci_dump (ohci, 1); |
| 679 | 675 | ||
| 680 | udev = bus->root_hub; | 676 | if (ohci_to_hcd(ohci)->self.root_hub == NULL) |
| 681 | if (udev) { | 677 | create_debug_files (ohci); |
| 682 | return 0; | ||
| 683 | } | ||
| 684 | |||
| 685 | /* connect the virtual root hub */ | ||
| 686 | udev = usb_alloc_dev (NULL, bus, 0); | ||
| 687 | if (!udev) { | ||
| 688 | disable (ohci); | ||
| 689 | ohci->hc_control &= ~OHCI_CTRL_HCFS; | ||
| 690 | ohci_writel (ohci, ohci->hc_control, &ohci->regs->control); | ||
| 691 | return -ENOMEM; | ||
| 692 | } | ||
| 693 | |||
| 694 | udev->speed = USB_SPEED_FULL; | ||
| 695 | if (usb_hcd_register_root_hub (udev, ohci_to_hcd(ohci)) != 0) { | ||
| 696 | usb_put_dev (udev); | ||
| 697 | disable (ohci); | ||
| 698 | ohci->hc_control &= ~OHCI_CTRL_HCFS; | ||
| 699 | ohci_writel (ohci, ohci->hc_control, &ohci->regs->control); | ||
| 700 | return -ENODEV; | ||
| 701 | } | ||
| 702 | 678 | ||
| 703 | register_reboot_notifier (&ohci->reboot_notifier); | ||
| 704 | create_debug_files (ohci); | ||
| 705 | return 0; | 679 | return 0; |
| 706 | } | 680 | } |
| 707 | 681 | ||
diff --git a/drivers/usb/host/sl811-hcd.c b/drivers/usb/host/sl811-hcd.c index 1f2d00fe98..6c3f910bc3 100644 --- a/drivers/usb/host/sl811-hcd.c +++ b/drivers/usb/host/sl811-hcd.c | |||
| @@ -1563,15 +1563,8 @@ static int | |||
| 1563 | sl811h_start(struct usb_hcd *hcd) | 1563 | sl811h_start(struct usb_hcd *hcd) |
| 1564 | { | 1564 | { |
| 1565 | struct sl811 *sl811 = hcd_to_sl811(hcd); | 1565 | struct sl811 *sl811 = hcd_to_sl811(hcd); |
| 1566 | struct usb_device *udev; | ||
| 1567 | 1566 | ||
| 1568 | /* chip has been reset, VBUS power is off */ | 1567 | /* chip has been reset, VBUS power is off */ |
| 1569 | |||
| 1570 | udev = usb_alloc_dev(NULL, &hcd->self, 0); | ||
| 1571 | if (!udev) | ||
| 1572 | return -ENOMEM; | ||
| 1573 | |||
| 1574 | udev->speed = USB_SPEED_FULL; | ||
| 1575 | hcd->state = HC_STATE_RUNNING; | 1568 | hcd->state = HC_STATE_RUNNING; |
| 1576 | 1569 | ||
| 1577 | if (sl811->board) { | 1570 | if (sl811->board) { |
| @@ -1579,12 +1572,6 @@ sl811h_start(struct usb_hcd *hcd) | |||
| 1579 | hcd->power_budget = sl811->board->power * 2; | 1572 | hcd->power_budget = sl811->board->power * 2; |
| 1580 | } | 1573 | } |
| 1581 | 1574 | ||
| 1582 | if (usb_hcd_register_root_hub(udev, hcd) != 0) { | ||
| 1583 | usb_put_dev(udev); | ||
| 1584 | sl811h_stop(hcd); | ||
| 1585 | return -ENODEV; | ||
| 1586 | } | ||
| 1587 | |||
| 1588 | /* enable power and interupts */ | 1575 | /* enable power and interupts */ |
| 1589 | port_power(sl811, 1); | 1576 | port_power(sl811, 1); |
| 1590 | 1577 | ||
diff --git a/drivers/usb/host/uhci-hcd.c b/drivers/usb/host/uhci-hcd.c index 6b87bd74b0..fdf54295da 100644 --- a/drivers/usb/host/uhci-hcd.c +++ b/drivers/usb/host/uhci-hcd.c | |||
| @@ -562,7 +562,6 @@ static int uhci_start(struct usb_hcd *hcd) | |||
| 562 | int retval = -EBUSY; | 562 | int retval = -EBUSY; |
| 563 | int i; | 563 | int i; |
| 564 | dma_addr_t dma_handle; | 564 | dma_addr_t dma_handle; |
| 565 | struct usb_device *udev; | ||
| 566 | struct dentry *dentry; | 565 | struct dentry *dentry; |
| 567 | 566 | ||
| 568 | hcd->uses_new_polling = 1; | 567 | hcd->uses_new_polling = 1; |
| @@ -626,14 +625,6 @@ static int uhci_start(struct usb_hcd *hcd) | |||
| 626 | goto err_create_qh_pool; | 625 | goto err_create_qh_pool; |
| 627 | } | 626 | } |
| 628 | 627 | ||
| 629 | /* Initialize the root hub */ | ||
| 630 | |||
| 631 | udev = usb_alloc_dev(NULL, &hcd->self, 0); | ||
| 632 | if (!udev) { | ||
| 633 | dev_err(uhci_dev(uhci), "unable to allocate root hub\n"); | ||
| 634 | goto err_alloc_root_hub; | ||
| 635 | } | ||
| 636 | |||
| 637 | uhci->term_td = uhci_alloc_td(uhci); | 628 | uhci->term_td = uhci_alloc_td(uhci); |
| 638 | if (!uhci->term_td) { | 629 | if (!uhci->term_td) { |
| 639 | dev_err(uhci_dev(uhci), "unable to allocate terminating TD\n"); | 630 | dev_err(uhci_dev(uhci), "unable to allocate terminating TD\n"); |
| @@ -713,24 +704,11 @@ static int uhci_start(struct usb_hcd *hcd) | |||
| 713 | 704 | ||
| 714 | configure_hc(uhci); | 705 | configure_hc(uhci); |
| 715 | start_rh(uhci); | 706 | start_rh(uhci); |
| 716 | |||
| 717 | udev->speed = USB_SPEED_FULL; | ||
| 718 | |||
| 719 | if (usb_hcd_register_root_hub(udev, hcd) != 0) { | ||
| 720 | dev_err(uhci_dev(uhci), "unable to start root hub\n"); | ||
| 721 | retval = -ENOMEM; | ||
| 722 | goto err_start_root_hub; | ||
| 723 | } | ||
| 724 | |||
| 725 | return 0; | 707 | return 0; |
| 726 | 708 | ||
| 727 | /* | 709 | /* |
| 728 | * error exits: | 710 | * error exits: |
| 729 | */ | 711 | */ |
| 730 | err_start_root_hub: | ||
| 731 | reset_hc(uhci); | ||
| 732 | del_timer_sync(&uhci->stall_timer); | ||
| 733 | |||
| 734 | err_alloc_skelqh: | 712 | err_alloc_skelqh: |
| 735 | for (i = 0; i < UHCI_NUM_SKELQH; i++) | 713 | for (i = 0; i < UHCI_NUM_SKELQH; i++) |
| 736 | if (uhci->skelqh[i]) { | 714 | if (uhci->skelqh[i]) { |
| @@ -742,9 +720,6 @@ err_alloc_skelqh: | |||
| 742 | uhci->term_td = NULL; | 720 | uhci->term_td = NULL; |
| 743 | 721 | ||
| 744 | err_alloc_term_td: | 722 | err_alloc_term_td: |
| 745 | usb_put_dev(udev); | ||
| 746 | |||
| 747 | err_alloc_root_hub: | ||
| 748 | dma_pool_destroy(uhci->qh_pool); | 723 | dma_pool_destroy(uhci->qh_pool); |
| 749 | uhci->qh_pool = NULL; | 724 | uhci->qh_pool = NULL; |
| 750 | 725 | ||
