static int ohci_hcd_ppc_soc_drv_remove(struct platform_device *pdev) { struct usb_hcd *hcd = platform_get_drvdata(pdev); usb_hcd_ppc_soc_remove(hcd, pdev); return 0; }
static int ehci_hcd_ppc_soc_drv_remove(struct device *dev) { struct platform_device *pdev = to_platform_device(dev); usb_hcd_ppc_soc_remove(pdev); return 0; }
static int ohci_hcd_ppc_soc_drv_remove(struct device *dev) { struct platform_device *pdev = to_platform_device(dev); struct usb_hcd *hcd = dev_get_drvdata(dev); usb_hcd_ppc_soc_remove(hcd, pdev); dev_set_drvdata(dev, NULL); return 0; }
/** * usb_hcd_ppc_soc_probe - initialize On-Chip HCDs * Context: !in_interrupt() * * Allocates basic resources for this USB host controller. * * Store this function in the HCD's struct pci_driver as probe(). */ static int usb_hcd_ppc_soc_probe(struct hc_driver *driver, struct platform_device *pdev) { int retval; struct usb_hcd *hcd; struct ehci_hcd *ehci; struct resource *res; unsigned long res_len; int irq; pr_debug("Initializing PPC-SOC EHCI USB Controller\n"); res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); if (!res) { pr_debug(__FILE__ ": no irq\n"); return -ENODEV; } irq = res->start; res = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (!res) { pr_debug(__FILE__ ": no reg addr\n"); return -ENODEV; } hcd = driver->hcd_alloc(); if (!hcd) return -ENOMEM; ehci = hcd_to_ehci(hcd); ehci->big_endian = 1; res_len = res->end - res->start + 1; if (!request_mem_region(res->start, res_len, hcd_name)) { pr_debug(__FILE__ ": request_mem_region failed\n"); retval = -EBUSY; goto err1; } hcd->regs = ioremap64(res->start, res_len); if (!hcd->regs) { pr_debug(__FILE__ ": ioremap failed\n"); retval = -ENOMEM; goto err2; } dev_set_drvdata(&pdev->dev, hcd); hcd->driver = driver; hcd->description = driver->description; hcd->self.bus_name = pdev->dev.bus_id; hcd->product_desc = "PPC-SOC EHCI USB"; hcd->self.controller = &pdev->dev; if ((retval = hcd_buffer_create(hcd)) != 0) { pr_debug(__FILE__ ": hcd_buffer_create failed\n"); retval = -ENOMEM; goto err3; } hcd->state = USB_STATE_HALT; retval = request_irq(irq, usb_hcd_irq, SA_SHIRQ, hcd->description, hcd); if (retval != 0) { pr_debug(__FILE__ ": request_irq failed\n"); retval = -ENODEV; goto err4; } hcd->irq = irq; usb_bus_init(&hcd->self); hcd->self.op = &usb_hcd_operations; hcd->self.release = &usb_hcd_release; hcd->self.hcpriv = (void *) hcd; init_timer(&hcd->rh_timer); INIT_LIST_HEAD(&hcd->dev_list); usb_register_bus(&hcd->self); if ((retval = driver->start(hcd)) < 0) { dev_err(hcd->self.controller, "init error %d\n", retval); usb_hcd_ppc_soc_remove(pdev); } return retval; err4: hcd_buffer_destroy(hcd); err3: iounmap(hcd->regs); err2: release_mem_region(res->start, res_len); err1: kfree(hcd); return retval; }
/** * usb_hcd_ppc_soc_probe - initialize On-Chip HCDs * Context: !in_interrupt() * * Allocates basic resources for this USB host controller. * * Store this function in the HCD's struct pci_driver as probe(). */ static int usb_hcd_ppc_soc_probe(const struct hc_driver *driver, struct usb_hcd **hcd_out, struct platform_device *pdev) { int retval; struct usb_hcd *hcd = 0; struct ohci_hcd *ohci; struct resource *res; int irq; pr_debug("initializing PPC-SOC USB Controller\n"); res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); if (!res) { pr_debug(__FILE__ ": no irq\n"); return -ENODEV; } irq = res->start; res = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (!res) { pr_debug(__FILE__ ": no reg addr\n"); return -ENODEV; } if (!request_mem_region(res->start, res->end - res->start + 1, hcd_name)) { pr_debug(__FILE__ ": request_mem_region failed\n"); return -EBUSY; } hcd = driver->hcd_alloc (); if (!hcd){ pr_debug(__FILE__ ": hcd_alloc failed\n"); retval = -ENOMEM; goto err1; } ohci = hcd_to_ohci(hcd); ohci->flags |= OHCI_BIG_ENDIAN; hcd->driver = (struct hc_driver *) driver; hcd->description = driver->description; hcd->irq = irq; hcd->regs = (struct ohci_regs *) ioremap(res->start, res->end - res->start + 1); if (!hcd->regs) { pr_debug(__FILE__ ": ioremap failed\n"); retval = -ENOMEM; goto err2; } hcd->self.controller = &pdev->dev; retval = hcd_buffer_create(hcd); if (retval) { pr_debug(__FILE__ ": pool alloc fail\n"); goto err3; } retval = request_irq(hcd->irq, usb_hcd_irq, SA_INTERRUPT, hcd_name, hcd); if (retval) { pr_debug(__FILE__ ": request_irq failed, returned %d\n", retval); retval = -EBUSY; goto err4; } info("%s (PPC-SOC) at 0x%p, irq %d\n", hcd_name, hcd->regs, hcd->irq); usb_bus_init(&hcd->self); hcd->self.op = &usb_hcd_operations; hcd->self.release = & usb_hcd_release; hcd->self.hcpriv = (void *) hcd; hcd->self.bus_name = "PPC-SOC USB"; hcd->product_desc = "PPC-SOC OHCI"; INIT_LIST_HEAD(&hcd->dev_list); usb_register_bus(&hcd->self); if ((retval = driver->start(hcd)) < 0) { usb_hcd_ppc_soc_remove(hcd, pdev); return retval; } *hcd_out = hcd; return 0; err4: hcd_buffer_destroy(hcd); err3: iounmap(hcd->regs); err2: dev_set_drvdata(&pdev->dev, NULL); err1: pr_debug("Removing PPC-SOC USB Controller\n"); release_mem_region(res->start, res->end - res->start + 1); return retval; }