/* ******************************************************************************* * sw_usb_disable_hcd * * Description: * void * * Parameters: * void * * Return value: * void * * note: * void * ******************************************************************************* */ int sw_usb_disable_hcd(__u32 usbc_no) { if(usbc_no == 0){ #if defined(CONFIG_USB_SW_SUN4I_USB0_OTG) || defined(USB_SW_SUN4I_USB0_HOST_ONLY) sw_usb_disable_hcd0(); #endif }else if(usbc_no == 1){ #if defined(CONFIG_USB_SW_SUN4I_EHCI0) sw_usb_disable_ehci(usbc_no); #endif #if defined(CONFIG_USB_SW_SUN4I_OHCI0) sw_usb_disable_ohci(usbc_no); #endif }else if(usbc_no == 2){ #if defined(CONFIG_USB_SW_SUN4I_EHCI1) sw_usb_disable_ehci(usbc_no); #endif #if defined(CONFIG_USB_SW_SUN4I_OHCI1) sw_usb_disable_ohci(usbc_no); #endif }else{ DMSG_PANIC("ERR: unkown usbc_no(%d)\n", usbc_no); return -1; } return 0; }
static int sw_ohci_hcd_probe(struct platform_device *pdev) { int ret; int irq; struct resource *res; struct usb_hcd *hcd = NULL; struct sw_hci_hcd *sw_ohci = NULL; if (pdev == NULL) return -EINVAL; sw_ohci = pdev->dev.platform_data; if (!sw_ohci) return -ENODATA; sw_ohci->pdev = pdev; g_sw_ohci[sw_ohci->usbc_no] = sw_ohci; pr_debug("[%s%d]: probe, pdev->name: %s, pdev->id: %d, sw_ohci: 0x%p\n", SW_OHCI_NAME, sw_ohci->usbc_no, pdev->name, pdev->id, sw_ohci); /* get io resource */ res = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (!res) { pr_err("%s: failed to get io memory\n", __func__); ret = -ENOMEM; goto err_get_iomem; } /*creat a usb_hcd for the ohci controller */ hcd = usb_create_hcd(&sw_ohci_hc_driver, &pdev->dev, SW_OHCI_NAME); if (!hcd) { pr_err("%s: failed to create hcd\n", __func__); ret = -ENOMEM; goto err_create_hcd; } hcd->rsrc_start = res->start; hcd->rsrc_len = resource_size(res); hcd->regs = ioremap(res->start, resource_size(res)); if (!hcd->regs) { pr_err("%s: failed to ioremap\n", __func__); ret = -ENOMEM; goto err_ioremap; } sw_ohci->hcd = hcd; /* ochi start to work */ sw_start_ohc(sw_ohci); ohci_hcd_init(hcd_to_ohci(hcd)); irq = platform_get_irq(pdev, 0); if (!irq) { pr_err("%s: failed to get irq\n", __func__); ret = -ENODEV; goto err_get_irq; } ret = usb_add_hcd(hcd, irq, IRQF_DISABLED | IRQF_SHARED); if (ret != 0) { pr_err("%s: failed to add hcd, rc=%d\n", __func__, ret); goto err_add_hcd; } platform_set_drvdata(pdev, hcd); pr_debug("[%s]: probe, clock: SW_VA_CCM_AHBMOD_OFFSET(0x%x), SW_VA_CCM_USBCLK_OFFSET(0x%x);" " usb: SW_USB_PMU_IRQ_ENABLE(0x%x), dram:(0x%x, 0x%x)\n", sw_ohci->hci_name, (u32) readl(SW_VA_CCM_IO_BASE + SW_VA_CCM_AHBMOD_OFFSET), (u32) readl(SW_VA_CCM_IO_BASE + SW_VA_CCM_USBCLK_OFFSET), (u32) readl(sw_ohci->usb_vbase + SW_USB_PMU_IRQ_ENABLE), (u32) readl(SW_VA_DRAM_IO_BASE + SW_SDRAM_REG_HPCR_USB1), (u32) readl(SW_VA_DRAM_IO_BASE + SW_SDRAM_REG_HPCR_USB2)); sw_ohci->probe = 1; /* Disable ohci, when driver probe */ if (sw_ohci->host_init_state == 0) { if (ohci_first_probe[sw_ohci->usbc_no]) { sw_usb_disable_ohci(sw_ohci->usbc_no); ohci_first_probe[sw_ohci->usbc_no]--; } } return 0; err_add_hcd: err_get_irq: iounmap(hcd->regs); err_ioremap: usb_put_hcd(hcd); err_get_iomem: err_create_hcd: sw_ohci->hcd = NULL; g_sw_ohci[sw_ohci->usbc_no] = NULL; return ret; }
static int sw_ohci_hcd_probe(struct platform_device *pdev) { int ret; struct usb_hcd *hcd = NULL; struct sw_hci_hcd *sw_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; } sw_ohci = pdev->dev.platform_data; if(!sw_ohci){ DMSG_PANIC("ERR: sw_ohci is null\n"); ret = -ENOMEM; goto ERR1; } sw_ohci->pdev = pdev; g_sw_ohci[sw_ohci->usbc_no] = sw_ohci; DMSG_INFO("[%s%d]: probe, pdev->name: %s, pdev->id: %d, sw_ohci: 0x%p\n", ohci_name, sw_ohci->usbc_no, pdev->name, pdev->id, sw_ohci); /* get io resource */ sw_get_io_resource(pdev, sw_ohci); sw_ohci->ohci_base = sw_ohci->usb_vbase + SW_USB_OHCI_BASE_OFFSET; sw_ohci->ohci_reg_length = SW_USB_OHCI_LEN; /*creat a usb_hcd for the ohci controller*/ hcd = usb_create_hcd(&sw_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)sw_ohci->ohci_base; hcd->rsrc_len = sw_ohci->ohci_reg_length; hcd->regs = sw_ohci->ohci_base; sw_ohci->hcd = hcd; /* ochi start to work */ sw_start_ohc(sw_ohci); ohci_hcd_init(hcd_to_ohci(hcd)); ret = usb_add_hcd(hcd, sw_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); #ifdef SW_USB_OHCI_DEBUG DMSG_INFO("[%s]: probe, clock: 0x60(0x%x), 0xcc(0x%x); usb: 0x800(0x%x), dram:(0x%x, 0x%x)\n", sw_ohci->hci_name, (u32)USBC_Readl(sw_ohci->clock_vbase + 0x60), (u32)USBC_Readl(sw_ohci->clock_vbase + 0xcc), (u32)USBC_Readl(sw_ohci->usb_vbase + 0x800), (u32)USBC_Readl(sw_ohci->sdram_vbase + SW_SDRAM_REG_HPCR_USB1), (u32)USBC_Readl(sw_ohci->sdram_vbase + SW_SDRAM_REG_HPCR_USB2)); #endif sw_ohci->probe = 1; /* Disable ohci, when driver probe */ if(sw_ohci->host_init_state == 0){ if(ohci_first_probe[sw_ohci->usbc_no]){ sw_usb_disable_ohci(sw_ohci->usbc_no); ohci_first_probe[sw_ohci->usbc_no]--; } } return 0; ERR3: usb_put_hcd(hcd); ERR2: sw_ohci->hcd = NULL; g_sw_ohci[sw_ohci->usbc_no] = NULL; ERR1: return ret; }
static int sw_ohci_hcd_probe(struct platform_device *pdev) { int ret; struct usb_hcd *hcd = NULL; struct sw_hci_hcd *sw_ohci = NULL; if (pdev == NULL) return -EINVAL; /* if usb is disabled, can not probe */ if (usb_disabled()) return -ENODEV; sw_ohci = pdev->dev.platform_data; if (!sw_ohci) return -ENODATA; sw_ohci->pdev = pdev; g_sw_ohci[sw_ohci->usbc_no] = sw_ohci; pr_debug("[%s%d]: probe, pdev->name: %s, pdev->id: %d, sw_ohci: 0x%p\n", SW_OHCI_NAME, sw_ohci->usbc_no, pdev->name, pdev->id, sw_ohci); /* get io resource */ sw_get_io_resource(pdev, sw_ohci); sw_ohci->ohci_base = sw_ohci->usb_vbase + SW_USB_OHCI_BASE_OFFSET; sw_ohci->ohci_reg_length = SW_USB_OHCI_LEN; /*creat a usb_hcd for the ohci controller */ hcd = usb_create_hcd(&sw_ohci_hc_driver, &pdev->dev, SW_OHCI_NAME); if (!hcd) { pr_err("%s: failed to create hcd\n", __func__); ret = -ENOMEM; goto err_create_hcd; } hcd->rsrc_start = (u32) sw_ohci->ohci_base; hcd->rsrc_len = sw_ohci->ohci_reg_length; hcd->regs = sw_ohci->ohci_base; sw_ohci->hcd = hcd; /* ochi start to work */ sw_start_ohc(sw_ohci); ohci_hcd_init(hcd_to_ohci(hcd)); ret = usb_add_hcd(hcd, sw_ohci->irq_no, IRQF_DISABLED | IRQF_SHARED); if (ret != 0) { pr_err("%s: failed to add hcd, rc=%d\n", __func__, ret); goto err_add_hcd; } platform_set_drvdata(pdev, hcd); pr_debug("[%s]: probe, clock: 0x60(0x%x), 0xcc(0x%x);" " usb: 0x800(0x%x), dram:(0x%x, 0x%x)\n", sw_ohci->hci_name, (u32) USBC_Readl(sw_ohci->clock_vbase + 0x60), (u32) USBC_Readl(sw_ohci->clock_vbase + 0xcc), (u32) USBC_Readl(sw_ohci->usb_vbase + 0x800), (u32) USBC_Readl(sw_ohci->sdram_vbase + SW_SDRAM_REG_HPCR_USB1), (u32) USBC_Readl(sw_ohci->sdram_vbase + SW_SDRAM_REG_HPCR_USB2)); sw_ohci->probe = 1; /* Disable ohci, when driver probe */ if (sw_ohci->host_init_state == 0) { if (ohci_first_probe[sw_ohci->usbc_no]) { sw_usb_disable_ohci(sw_ohci->usbc_no); ohci_first_probe[sw_ohci->usbc_no]--; } } return 0; err_add_hcd: usb_put_hcd(hcd); err_create_hcd: sw_ohci->hcd = NULL; g_sw_ohci[sw_ohci->usbc_no] = NULL; return ret; }