{
struct ohci_hcd *ohci = hcd_to_ohci (hcd);
- return ohci_init (ohci);
+ ohci->regs = hcd->regs;
+ ohci->next_statechange = jiffies;
+ return hc_reset (ohci);
}
static int __devinit
struct ohci_hcd *ohci = hcd_to_ohci (hcd);
int ret;
+ ohci->hcca = dma_alloc_coherent (hcd->self.controller,
+ sizeof *ohci->hcca, &ohci->hcca_dma, 0);
+ if (!ohci->hcca)
+ return -ENOMEM;
+
if(hcd->self.controller && hcd->self.controller->bus == &pci_bus_type) {
struct pci_dev *pdev = to_pci_dev(hcd->self.controller);
&& pdev->device == 0x740c) {
ohci->flags = OHCI_QUIRK_AMD756;
ohci_info (ohci, "AMD756 erratum 4 workaround\n");
- // also somewhat erratum 10 (suspend/resume issues)
}
/* FIXME for some of the early AMD 760 southbridges, OHCI
ohci_info (ohci, "Using NSC SuperIO setup\n");
}
}
+
}
- /* NOTE: there may have already been a first reset, to
- * keep bios/smm irqs from making trouble
- */
- if ((ret = ohci_run (ohci)) < 0) {
- ohci_err (ohci, "can't start\n");
+ memset (ohci->hcca, 0, sizeof (struct ohci_hcca));
+ if ((ret = ohci_mem_init (ohci)) < 0) {
ohci_stop (hcd);
return ret;
}
+
+ if (hc_start (ohci) < 0) {
+ ohci_err (ohci, "can't start\n");
+ ohci_stop (hcd);
+ return -EBUSY;
+ }
+ create_debug_files (ohci);
+
+#ifdef DEBUG
+ ohci_dump (ohci, 1);
+#endif
return 0;
}
struct ohci_hcd *ohci = hcd_to_ohci (hcd);
/* suspend root hub, hoping it keeps power during suspend */
- if (time_before (jiffies, ohci->next_statechange))
+ while (time_before (jiffies, ohci->next_statechange))
msleep (100);
#ifdef CONFIG_USB_SUSPEND
(void) usb_suspend_device (hcd->self.root_hub, state);
#else
- usb_lock_device (hcd->self.root_hub);
+ down (&hcd->self.root_hub->serialize);
(void) ohci_hub_suspend (hcd);
- usb_unlock_device (hcd->self.root_hub);
+ up (&hcd->self.root_hub->serialize);
#endif
/* let things settle down a bit */
msleep (100);
#ifdef CONFIG_PMAC_PBOOK
- if (_machine == _MACH_Pmac) {
+ if (_machine == _MACH_Pmac)
+ disable_irq ((to_pci_dev(hcd->self.controller))->irq);
+
+ {
struct device_node *of_node;
/* Disable USB PAD & cell clock */
if (of_node)
pmac_call_feature(PMAC_FTR_USB_ENABLE, of_node, 0, 0);
}
-#endif /* CONFIG_PMAC_PBOOK */
+#endif
return 0;
}
int retval = 0;
#ifdef CONFIG_PMAC_PBOOK
- if (_machine == _MACH_Pmac) {
+ {
struct device_node *of_node;
/* Re-enable USB PAD & cell clock */
if (of_node)
pmac_call_feature (PMAC_FTR_USB_ENABLE, of_node, 0, 1);
}
-#endif /* CONFIG_PMAC_PBOOK */
+#endif
/* resume root hub */
- if (time_before (jiffies, ohci->next_statechange))
+ while (time_before (jiffies, ohci->next_statechange))
msleep (100);
#ifdef CONFIG_USB_SUSPEND
/* get extra cleanup even if remote wakeup isn't in use */
retval = usb_resume_device (hcd->self.root_hub);
#else
- usb_lock_device (hcd->self.root_hub);
+ down (&hcd->self.root_hub->serialize);
retval = ohci_hub_resume (hcd);
- usb_unlock_device (hcd->self.root_hub);
+ up (&hcd->self.root_hub->serialize);
#endif
+ if (retval == 0) {
+ hcd->self.controller->power.power_state = 0;
+#ifdef CONFIG_PMAC_PBOOK
+ if (_machine == _MACH_Pmac)
+ enable_irq (to_pci_dev(hcd->self.controller)->irq);
+#endif
+ }
return retval;
}
* memory lifecycle (except per-request)
*/
.hcd_alloc = ohci_hcd_alloc,
+ .hcd_free = ohci_hcd_free,
/*
* managing i/o requests and associated device resources
pr_debug ("%s: block sizes: ed %Zd td %Zd\n", hcd_name,
sizeof (struct ed), sizeof (struct td));
- return pci_register_driver (&ohci_pci_driver);
+ return pci_module_init (&ohci_pci_driver);
}
module_init (ohci_hcd_pci_init);