static int sunxi_ohci_hcd_resume(struct device *dev) { struct sunxi_hci_hcd *sunxi_ohci = NULL; struct usb_hcd *hcd = NULL; 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; } sunxi_ohci = dev->platform_data; if(sunxi_ohci == NULL){ DMSG_PANIC("ERR: sunxi_ohci is null\n"); return 0; } if(sunxi_ohci->probe == 0){ DMSG_PANIC("ERR: sunxi_ohci is disable, can not resume\n"); return 0; } if(sunxi_ohci->not_suspend){ DMSG_INFO("[%s]: controller not suspend, need not resume\n", sunxi_ohci->hci_name); #if defined (CONFIG_ARCH_SUN8IW6) || defined (CONFIG_ARCH_SUN9IW1) sunxi_ohci->hci_phy_ctrl(sunxi_ohci, 1); #endif scene_unlock(&ohci_standby_lock[sunxi_ohci->usbc_no]); disable_wakeup_src(CPUS_USBMOUSE_SRC, 0); #ifdef CONFIG_USB_HCD_ENHANCE if(sunxi_ohci->usbc_no == 1){ atomic_set(&hci1_thread_scan_flag, 1); } if(sunxi_ohci->usbc_no == 3){ atomic_set(&hci3_thread_scan_flag, 1); } #endif }else{ DMSG_INFO("[%s]: sunxi_ohci_hcd_resume\n", sunxi_ohci->hci_name); #ifndef CONFIG_ARCH_SUN9IW1 #ifdef SUNXI_USB_FPGA fpga_config_use_hci((__u32 __force)sunxi_ohci->sram_vbase); #endif #endif sunxi_start_ohci(sunxi_ohci); set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); ohci_finish_controller_resume(hcd); } return 0; }
static int sunxi_ohci_hcd_probe(struct platform_device *pdev) { int ret; struct usb_hcd *hcd = NULL; struct sunxi_hci_hcd *sunxi_ohci = NULL; if(pdev == NULL){ DMSG_PANIC("ERR: Argment is invaild\n"); return -1; } /* if usb is disabled, can not probe */ if (usb_disabled()){ DMSG_PANIC("ERR: usb hcd is disabled\n"); return -ENODEV; } sunxi_ohci = pdev->dev.platform_data; if(!sunxi_ohci){ DMSG_PANIC("ERR: sunxi_ohci is null\n"); ret = -ENOMEM; goto ERR1; } sunxi_ohci->pdev = pdev; g_sunxi_ohci[sunxi_ohci->usbc_no] = sunxi_ohci; DMSG_INFO("[%s%d]: probe, pdev->name: %s, pdev->id: %d, sunxi_ohci: 0x%p\n", ohci_name, sunxi_ohci->usbc_no, pdev->name, pdev->id, sunxi_ohci); /* get io resource */ sunxi_get_io_resource(pdev, sunxi_ohci); sunxi_ohci->ohci_base = sunxi_ohci->usb_vbase + SUNXI_USB_OHCI_BASE_OFFSET; sunxi_ohci->ohci_reg_length = SUNXI_USB_OHCI_LEN; /*creat a usb_hcd for the ohci controller*/ hcd = usb_create_hcd(&sunxi_ohci_hc_driver, &pdev->dev, ohci_name); if(!hcd){ DMSG_PANIC("ERR: usb_ohci_create_hcd failed\n"); ret = -ENOMEM; goto ERR2; } hcd->rsrc_start = (u32 __force)sunxi_ohci->ohci_base; hcd->rsrc_len = sunxi_ohci->ohci_reg_length; hcd->regs = sunxi_ohci->ohci_base; sunxi_ohci->hcd = hcd; /* ochi start to work */ sunxi_start_ohci(sunxi_ohci); ohci_hcd_init(hcd_to_ohci(hcd)); ret = usb_add_hcd(hcd, sunxi_ohci->irq_no, IRQF_DISABLED | IRQF_SHARED); if(ret != 0){ DMSG_PANIC("ERR: usb_add_hcd failed\n"); ret = -ENOMEM; goto ERR3; } platform_set_drvdata(pdev, hcd); device_enable_async_suspend(&pdev->dev); sunxi_ohci->probe = 1; /* Disable ohci, when driver probe */ if(sunxi_ohci->host_init_state == 0){ if(ohci_first_probe[sunxi_ohci->usbc_no]){ sunxi_usb_disable_ohci(sunxi_ohci->usbc_no); ohci_first_probe[sunxi_ohci->usbc_no]--; } } if(sunxi_ohci->not_suspend){ scene_lock_init(&ohci_standby_lock[sunxi_ohci->usbc_no], SCENE_USB_STANDBY, "ohci_standby"); } return 0; ERR3: usb_put_hcd(hcd); ERR2: sunxi_ohci->hcd = NULL; g_sunxi_ohci[sunxi_ohci->usbc_no] = NULL; ERR1: return ret; }