/* ******************************************************************************* * sw_ehci_hcd_shutdown * * Description: * void * * Parameters: * void * * Return value: * void * * note: * void * ******************************************************************************* */ void sw_ehci_hcd_shutdown(struct platform_device* pdev) { struct sw_hci_hcd *sw_ehci = NULL; if(pdev == NULL){ DMSG_PANIC("ERR: Argment is invalid\n"); return; } sw_ehci = pdev->dev.platform_data; if(sw_ehci == NULL){ DMSG_PANIC("ERR: sw_ehci is null\n"); return; } if(sw_ehci->probe == 0){ DMSG_PANIC("ERR: sw_ehci is disable, need not shutdown\n"); return; } DMSG_INFO("[%s]: ehci shutdown start\n", sw_ehci->hci_name); usb_hcd_platform_shutdown(pdev); sw_stop_ehci(sw_ehci); DMSG_INFO("[%s]: ehci shutdown end\n", sw_ehci->hci_name); return ; }
/* ******************************************************************************* * sw_ehci_hcd_suspend * * Description: * void * * Parameters: * void * * Return value: * void * * note: * void * ******************************************************************************* */ static int sw_ehci_hcd_suspend(struct device *dev) { struct sw_hci_hcd *sw_ehci = NULL; struct usb_hcd *hcd = NULL; struct ehci_hcd *ehci = NULL; unsigned long flags = 0; if(dev == NULL){ DMSG_PANIC("ERR: Argment is invalid\n"); return 0; } hcd = dev_get_drvdata(dev); if(hcd == NULL){ DMSG_PANIC("ERR: hcd is null\n"); return 0; } sw_ehci = dev->platform_data; if(sw_ehci == NULL){ DMSG_PANIC("ERR: sw_ehci is null\n"); return 0; } if(sw_ehci->probe == 0){ DMSG_PANIC("ERR: sw_ehci is disable, can not suspend\n"); return 0; } ehci = hcd_to_ehci(hcd); if(ehci == NULL){ DMSG_PANIC("ERR: ehci is null\n"); return 0; } DMSG_INFO("[%s]: sw_ehci_hcd_suspend\n", sw_ehci->hci_name); spin_lock_irqsave(&ehci->lock, flags); ehci_prepare_ports_for_controller_suspend(ehci, device_may_wakeup(dev)); ehci_writel(ehci, 0, &ehci->regs->intr_enable); (void)ehci_readl(ehci, &ehci->regs->intr_enable); clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); spin_unlock_irqrestore(&ehci->lock, flags); sw_stop_ehci(sw_ehci); return 0; }
/* ******************************************************************************* * sw_ehci_hcd_remove * * Description: * void * * Parameters: * void * * Return value: * void * * note: * void * ******************************************************************************* */ static int sw_ehci_hcd_remove(struct platform_device *pdev) { struct usb_hcd *hcd = NULL; struct sw_hci_hcd *sw_ehci = NULL; if(pdev == NULL){ DMSG_PANIC("ERR: Argment is invalid\n"); return -1; } hcd = platform_get_drvdata(pdev); if(hcd == NULL){ DMSG_PANIC("ERR: hcd is null\n"); return -1; } sw_ehci = pdev->dev.platform_data; if(sw_ehci == NULL){ DMSG_PANIC("ERR: sw_ehci is null\n"); return -1; } DMSG_INFO("[%s%d]: remove, pdev->name: %s, pdev->id: %d, sw_ehci: 0x%p\n", ehci_name, sw_ehci->usbc_no, pdev->name, pdev->id, sw_ehci); usb_remove_hcd(hcd); sw_release_io_resource(pdev, sw_ehci); usb_put_hcd(hcd); sw_stop_ehci(sw_ehci); sw_ehci->probe = 0; sw_ehci->hcd = NULL; if(sw_ehci->host_init_state){ g_sw_ehci[sw_ehci->usbc_no] = NULL; } platform_set_drvdata(pdev, NULL); return 0; }
void sw_ehci_hcd_shutdown(struct platform_device *pdev) { struct sw_hci_hcd *sw_ehci = NULL; if (pdev == NULL) return; sw_ehci = pdev->dev.platform_data; if (sw_ehci == NULL) return; if (sw_ehci->probe == 0) return; pr_info("[%s]: shutdown start\n", sw_ehci->hci_name); usb_hcd_platform_shutdown(pdev); sw_stop_ehci(sw_ehci); pr_info("[%s]: shutdown end\n", sw_ehci->hci_name); return; }
static int sw_ehci_hcd_suspend(struct device *dev) { struct sw_hci_hcd *sw_ehci = NULL; struct usb_hcd *hcd = NULL; struct ehci_hcd *ehci = NULL; unsigned long flags = 0; if (dev == NULL) return 0; hcd = dev_get_drvdata(dev); if (hcd == NULL) return 0; sw_ehci = dev->platform_data; if (sw_ehci == NULL) return 0; if (sw_ehci->probe == 0) return 0; ehci = hcd_to_ehci(hcd); if (ehci == NULL) return 0; pr_info("[%s]: suspend\n", sw_ehci->hci_name); spin_lock_irqsave(&ehci->lock, flags); ehci_prepare_ports_for_controller_suspend(ehci, device_may_wakeup(dev)); ehci_writel(ehci, 0, &ehci->regs->intr_enable); (void)ehci_readl(ehci, &ehci->regs->intr_enable); clear_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); spin_unlock_irqrestore(&ehci->lock, flags); sw_stop_ehci(sw_ehci); return 0; }
static int sw_ehci_hcd_remove(struct platform_device *pdev) { struct usb_hcd *hcd = NULL; struct sw_hci_hcd *sw_ehci = NULL; if (pdev == NULL) return -EINVAL; hcd = platform_get_drvdata(pdev); if (hcd == NULL) return -ENODATA; sw_ehci = pdev->dev.platform_data; if (sw_ehci == NULL) return -ENODATA; pr_debug("[%s%d]: remove, pdev->name: %s, pdev->id: %d, sw_ehci:" " 0x%p\n", SW_EHCI_NAME, sw_ehci->usbc_no, pdev->name, pdev->id, sw_ehci); usb_remove_hcd(hcd); sw_release_io_resource(pdev, sw_ehci); usb_put_hcd(hcd); sw_stop_ehci(sw_ehci); sw_ehci->probe = 0; sw_ehci->hcd = NULL; if (sw_ehci->host_init_state) g_sw_ehci[sw_ehci->usbc_no] = NULL; platform_set_drvdata(pdev, NULL); return 0; }