Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 247f3105 authored by Alan Stern's avatar Alan Stern Committed by Greg Kroah-Hartman
Browse files

[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: default avatarAlan Stern <stern@rowland.harvard.edu>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 8ec8d20b
Loading
Loading
Loading
Loading
+2 −22
Original line number Diff line number Diff line
@@ -1625,7 +1625,6 @@ static DEVICE_ATTR (urbs, S_IRUGO, show_urbs, NULL);
static int dummy_start (struct usb_hcd *hcd)
{
	struct dummy		*dum;
	struct usb_device	*root;
	int			retval;

	dum = hcd_to_dummy (hcd);
@@ -1642,35 +1641,16 @@ static int dummy_start (struct usb_hcd *hcd)

	INIT_LIST_HEAD (&dum->urbp_list);

	root = usb_alloc_dev (NULL, &hcd->self, 0);
	if (!root)
		return -ENOMEM;
	if ((retval = dummy_register_udc (dum)) != 0)
		return retval;

	/* only show a low-power port: just 8mA */
	hcd->power_budget = 8;

	/* root hub enters addressed state... */
	hcd->state = HC_STATE_RUNNING;
	root->speed = USB_SPEED_HIGH;

	/* ...then configured, so khubd sees us. */
	if ((retval = usb_hcd_register_root_hub (root, hcd)) != 0) {
		goto err1;
	}

	if ((retval = dummy_register_udc (dum)) != 0)
		goto err2;

	/* FIXME 'urbs' should be a per-device thing, maybe in usbcore */
	device_create_file (dummy_dev(dum), &dev_attr_urbs);
	return 0;

 err2:
	usb_disconnect (&hcd->self.root_hub);
 err1:
	usb_put_dev (root);
	hcd->state = HC_STATE_QUIESCING;
	return retval;
}

static void dummy_stop (struct usb_hcd *hcd)
+0 −31
Original line number Diff line number Diff line
@@ -492,8 +492,6 @@ static int ehci_start (struct usb_hcd *hcd)
{
	struct ehci_hcd		*ehci = hcd_to_ehci (hcd);
	u32			temp;
	struct usb_device	*udev;
	struct usb_bus		*bus;
	int			retval;
	u32			hcc_params;
	u8                      sbrn = 0;
@@ -631,17 +629,6 @@ static int ehci_start (struct usb_hcd *hcd)

	/* set async sleep time = 10 us ... ? */

	/* wire up the root hub */
	bus = hcd_to_bus (hcd);
	udev = first ? usb_alloc_dev (NULL, bus, 0) : bus->root_hub;
	if (!udev) {
done2:
		ehci_mem_cleanup (ehci);
		return -ENOMEM;
	}
	udev->speed = USB_SPEED_HIGH;
	udev->state = first ? USB_STATE_ATTACHED : USB_STATE_CONFIGURED;

	/*
	 * Start, enabling full USB 2.0 functionality ... usb 1.1 devices
	 * are explicitly handed to companion controller(s), so no TT is
@@ -664,24 +651,6 @@ static int ehci_start (struct usb_hcd *hcd)
		first ? "initialized" : "restarted",
		temp >> 8, temp & 0xff, DRIVER_VERSION);

	/*
	 * From here on, khubd concurrently accesses the root
	 * hub; drivers will be talking to enumerated devices.
	 * (On restart paths, khubd already knows about the root
	 * hub and could find work as soon as we wrote FLAG_CF.)
	 *
	 * Before this point the HC was idle/ready.  After, khubd
	 * and device drivers may start it running.
	 */
	if (first && usb_hcd_register_root_hub (udev, hcd) != 0) {
		if (hcd->state == HC_STATE_RUNNING)
			ehci_quiesce (ehci);
		ehci_reset (ehci);
		usb_put_dev (udev); 
		retval = -ENODEV;
		goto done2;
	}

	writel (INTR_MASK, &ehci->regs->intr_enable); /* Turn On Interrupts */

	if (first)
+0 −16
Original line number Diff line number Diff line
@@ -1547,7 +1547,6 @@ static int isp116x_start(struct usb_hcd *hcd)
{
	struct isp116x *isp116x = hcd_to_isp116x(hcd);
	struct isp116x_platform_data *board = isp116x->board;
	struct usb_device *udev;
	u32 val;
	unsigned long flags;

@@ -1609,24 +1608,9 @@ static int isp116x_start(struct usb_hcd *hcd)
	isp116x->rhstatus = isp116x_read_reg32(isp116x, HCRHSTATUS);

	isp116x_write_reg32(isp116x, HCFMINTVL, 0x27782edf);
	spin_unlock_irqrestore(&isp116x->lock, flags);

	udev = usb_alloc_dev(NULL, &hcd->self, 0);
	if (!udev) {
		isp116x_stop(hcd);
		return -ENOMEM;
	}

	udev->speed = USB_SPEED_FULL;
	hcd->state = HC_STATE_RUNNING;

	if (usb_hcd_register_root_hub(udev, hcd) != 0) {
		isp116x_stop(hcd);
		usb_put_dev(udev);
		return -ENODEV;
	}

	spin_lock_irqsave(&isp116x->lock, flags);
	/* Set up interrupts */
	isp116x->intenb = HCINT_MIE | HCINT_RHSC | HCINT_UE;
	if (board->remote_wakeup_enable)
+2 −28
Original line number Diff line number Diff line
@@ -505,13 +505,10 @@ static int ohci_init (struct ohci_hcd *ohci)
/* Start an OHCI controller, set the BUS operational
 * resets USB and controller
 * enable interrupts 
 * connect the virtual root hub
 */
static int ohci_run (struct ohci_hcd *ohci)
{
  	u32			mask, temp;
  	struct usb_device	*udev;
  	struct usb_bus		*bus;
	int			first = ohci->fminterval == 0;

	disable (ohci);
@@ -672,36 +669,13 @@ static int ohci_run (struct ohci_hcd *ohci)

	// POTPGT delay is bits 24-31, in 2 ms units.
	mdelay ((temp >> 23) & 0x1fe);
	bus = &ohci_to_hcd(ohci)->self;
	ohci_to_hcd(ohci)->state = HC_STATE_RUNNING;

	ohci_dump (ohci, 1);

	udev = bus->root_hub;
	if (udev) {
		return 0;
	}
 
	/* connect the virtual root hub */
	udev = usb_alloc_dev (NULL, bus, 0);
	if (!udev) {
		disable (ohci);
		ohci->hc_control &= ~OHCI_CTRL_HCFS;
		ohci_writel (ohci, ohci->hc_control, &ohci->regs->control);
		return -ENOMEM;
	}

	udev->speed = USB_SPEED_FULL;
	if (usb_hcd_register_root_hub (udev, ohci_to_hcd(ohci)) != 0) {
		usb_put_dev (udev);
		disable (ohci);
		ohci->hc_control &= ~OHCI_CTRL_HCFS;
		ohci_writel (ohci, ohci->hc_control, &ohci->regs->control);
		return -ENODEV;
	}

	register_reboot_notifier (&ohci->reboot_notifier);
	if (ohci_to_hcd(ohci)->self.root_hub == NULL)
		create_debug_files (ohci);

	return 0;
}

+0 −13
Original line number Diff line number Diff line
@@ -1563,15 +1563,8 @@ static int
sl811h_start(struct usb_hcd *hcd)
{
	struct sl811		*sl811 = hcd_to_sl811(hcd);
	struct usb_device	*udev;

	/* chip has been reset, VBUS power is off */

	udev = usb_alloc_dev(NULL, &hcd->self, 0);
	if (!udev)
		return -ENOMEM;

	udev->speed = USB_SPEED_FULL;
	hcd->state = HC_STATE_RUNNING;

	if (sl811->board) {
@@ -1579,12 +1572,6 @@ sl811h_start(struct usb_hcd *hcd)
		hcd->power_budget = sl811->board->power * 2;
	}

	if (usb_hcd_register_root_hub(udev, hcd) != 0) {
		usb_put_dev(udev);
		sl811h_stop(hcd);
		return -ENODEV;
	}

	/* enable power and interupts */
	port_power(sl811, 1);

Loading