static int ohci_da8xx_init(struct usb_hcd *hcd) { struct device *dev = hcd->self.controller; struct da8xx_ohci_root_hub *hub = dev->platform_data; struct ohci_hcd *ohci = hcd_to_ohci(hcd); int result; u32 rh_a; dev_dbg(dev, "starting USB controller\n"); ohci_da8xx_clock(1); ohci->num_ports = 1; result = ohci_init(ohci); if (result < 0) return result; rh_a = ohci_readl(ohci, &ohci->regs->roothub.a); if (hub->set_power) { rh_a &= ~RH_A_NPS; rh_a |= RH_A_PSM; } if (hub->get_oci) { rh_a &= ~RH_A_NOCP; rh_a |= RH_A_OCPM; } rh_a &= ~RH_A_POTPGT; rh_a |= hub->potpgt << 24; ohci_writel(ohci, rh_a, &ohci->regs->roothub.a); return result; }
static int ohci_da8xx_init(struct usb_hcd *hcd) { struct device *dev = hcd->self.controller; struct da8xx_ohci_root_hub *hub = dev->platform_data; struct ohci_hcd *ohci = hcd_to_ohci(hcd); int result; u32 rh_a; dev_dbg(dev, "starting USB controller\n"); ohci_da8xx_clock(1); /* * DA830 only has 1 port connected to the pins but its HC root hub * register A reports 2 ports, thus we'll have to override it... */ ohci->num_ports = 1; result = ohci_init(ohci); if (result < 0) return result; /* * Since we're providing a board-specific root hub port power control * and over-current reporting, we have to override the HC root hub A * register's default value, so that ohci_hub_control() could return * the correct hub descriptor... */ rh_a = ohci_readl(ohci, &ohci->regs->roothub.a); rh_a &= ~(RH_A_POTPGT | RH_A_NPS | RH_A_NOCP); rh_a |= (hub->potpgt << 24) | RH_A_PSM | RH_A_OCPM; ohci_writel(ohci, rh_a, &ohci->regs->roothub.a); return result; }
static int ohci_da8xx_resume(struct platform_device *dev) { struct usb_hcd *hcd = platform_get_drvdata(dev); struct ohci_hcd *ohci = hcd_to_ohci(hcd); if (time_before(jiffies, ohci->next_statechange)) msleep(5); ohci->next_statechange = jiffies; ohci_da8xx_clock(1); dev->dev.power.power_state = PMSG_ON; usb_hcd_resume_root_hub(hcd); return 0; }
static int ohci_da8xx_suspend(struct platform_device *dev, pm_message_t message) { struct usb_hcd *hcd = platform_get_drvdata(dev); struct ohci_hcd *ohci = hcd_to_ohci(hcd); if (time_before(jiffies, ohci->next_statechange)) msleep(5); ohci->next_statechange = jiffies; ohci_da8xx_clock(0); hcd->state = HC_STATE_SUSPENDED; dev->dev.power.power_state = PMSG_SUSPEND; return 0; }
static int ohci_da8xx_suspend(struct platform_device *pdev, pm_message_t message) { struct usb_hcd *hcd = platform_get_drvdata(pdev); struct ohci_hcd *ohci = hcd_to_ohci(hcd); bool do_wakeup = device_may_wakeup(&pdev->dev); int ret; if (time_before(jiffies, ohci->next_statechange)) msleep(5); ohci->next_statechange = jiffies; ret = ohci_suspend(hcd, do_wakeup); if (ret) return ret; ohci_da8xx_clock(0); hcd->state = HC_STATE_SUSPENDED; return ret; }
static void ohci_da8xx_stop(struct usb_hcd *hcd) { ohci_stop(hcd); ohci_da8xx_clock(0); }