📄 usb-ohci-omap1510.c
字号:
(unsigned short *) 0xfffec238; int tlb; unsigned long lbaddr, physaddr;#endif int ret;#ifndef CONFIG_ARCH_OMAP1610 /* * Request memory resources. */// if (!request_mem_region(_USB_OHCI_OP_BASE, _USB_EXTENT, "usb-ohci"))// return -EBUSY;#define APLL_CTRL_REG_APLL_NDPLL_SWITCH 0x0001#define DPLL_CTRL_REG_PLL_ENABLE 0x0010#define DPLL_CTRL_REG_LOCK 0x0001#define SOFT_REQ_REG_DPLL_REQ 0x0001#define CLOCK_CTRL_REG_USB_MCLK_EN 0x0010#define MOD_CONF_CTRL_0_USB_HOST_HHC_UHOST_EN 0x00000200 *apll_ctrl_reg &= ~APLL_CTRL_REG_APLL_NDPLL_SWITCH; *dpll_ctrl_reg |= DPLL_CTRL_REG_PLL_ENABLE; *soft_req_reg |= SOFT_REQ_REG_DPLL_REQ; while (!(*dpll_ctrl_reg & DPLL_CTRL_REG_LOCK)) ; *clock_ctrl_reg |= CLOCK_CTRL_REG_USB_MCLK_EN; *ARM_IDLECT2 |= (1 << EN_LBFREECK) | (1 << EN_LBCK); *mod_conf_ctrl_0 |= MOD_CONF_CTRL_0_USB_HOST_HHC_UHOST_EN;#ifdef CONFIG_OMAP_INNOVATOR *fpga_usb_host_ctrl |= 0x20;#endif *lb_clock_div = (*lb_clock_div & 0xfffffff8) | 0x4; *lb_mmu_cntl_reg = 0x3; udelay(200); for (tlb = 0; tlb < 32; tlb++) { lbaddr = tlb * 0x00100000 + OMAP1510_LB_OFFSET; physaddr = tlb * 0x00100000 + PHYS_OFFSET; *lb_mmu_cam_h_reg = (lbaddr & 0x0fffffff) >> 22; *lb_mmu_cam_l_reg = ((lbaddr & 0x003ffc00) >> 6) | 0xc; *lb_mmu_ram_h_reg = physaddr >> 16; *lb_mmu_ram_l_reg = (physaddr & 0x0000fc00) | 0x300; *lb_mmu_lock_reg = tlb << 4; *lb_mmu_ld_tlb_reg = 0x1; } *lb_mmu_cntl_reg = 0x7; udelay(200);#else#define MOD_CONF_CTRL_0_USB_HOST_HHC_UHOST_EN 0x00000200/*set up pinout*//*USB pin group 1 configuration*/#if 1 OMAP1610_SET_FUNC_MUX_CTRL(1, FUNC_MUX_CTRL_9, 24); /*USB1.TXD W14 */ open_drain(4, PULL_DWN_CTRL_2); OMAP1610_SET_FUNC_MUX_CTRL(2, FUNC_MUX_CTRL_9, 3); /*USB1.TXEN W16 */ open_drain(29, PULL_DWN_CTRL_1);#ifndef CONFIG_OMAP_H2 OMAP1610_SET_FUNC_MUX_CTRL(2, FUNC_MUX_CTRL_A, 3); /*USB1.VP AA17 */ open_drain(7, PULL_DWN_CTRL_2);#endif OMAP1610_SET_FUNC_MUX_CTRL(4, FUNC_MUX_CTRL_9, 0); /*USB1.SEO W13 */ open_drain(28, PULL_DWN_CTRL_1); OMAP1610_SET_FUNC_MUX_CTRL(1, FUNC_MUX_CTRL_A, 9); /*USB1.RCV V15 */ open_drain(9, PULL_DWN_CTRL_2); //OMAP1610_SET_FUNC_MUX_CTRL(2,FUNC_MUX_CTRL_8,27); /*USB1.SUSP J20*/ /*not used on OMAP1610 INNOVATOR*/ //open_drain(27,PULL_DWN_CTRL_1);#ifndef CONFIG_OMAP_H2 OMAP1610_SET_FUNC_MUX_CTRL(2, FUNC_MUX_CTRL_A, 6); /*USB1.VM P14 */ open_drain(8, PULL_DWN_CTRL_2);#endif#ifdef CONFIG_OMAP_H2 OMAP1610_SET_FUNC_MUX_CTRL(5, FUNC_MUX_CTRL_A, 12); /*USB1.SPEED R13 *//*connected on OMAP1610 H2, not INNOVATOR */ open_drain(10, PULL_DWN_CTRL_2);#endif#endif#ifndef CONFIG_OMAP_H2#if 1 /*USB pin group 2 configuration */ OMAP1610_SET_FUNC_MUX_CTRL(1, FUNC_MUX_CTRL_B, 9); /*USB2.TXEN W9 */ open_drain(19, PULL_DWN_CTRL_2); OMAP1610_SET_FUNC_MUX_CTRL(1, FUNC_MUX_CTRL_B, 6); /*USB2.VP AA9 */ open_drain(18, PULL_DWN_CTRL_2); OMAP1610_SET_FUNC_MUX_CTRL(1, FUNC_MUX_CTRL_B, 3); /*USB2.SUSP Y10 */ open_drain(17, PULL_DWN_CTRL_2); OMAP1610_SET_FUNC_MUX_CTRL(1, FUNC_MUX_CTRL_C, 21); /*USB2.RCV Y5 */ open_drain(1, PULL_DWN_CTRL_3); OMAP1610_SET_FUNC_MUX_CTRL(1, FUNC_MUX_CTRL_C, 18); /*USB2.VM R9 */ open_drain(0, PULL_DWN_CTRL_3); OMAP1610_SET_FUNC_MUX_CTRL(2, FUNC_MUX_CTRL_C, 27); /*USB2.TXD V6 */ open_drain(3, PULL_DWN_CTRL_3); OMAP1610_SET_FUNC_MUX_CTRL(2, FUNC_MUX_CTRL_C, 24); /*USB2.SE0 W5 */ open_drain(2, PULL_DWN_CTRL_3); //OMAP1610_SET_FUNC_MUX_CTRL(2,FUNC_MUX_CTRL_B,12); /*USB2.SPEED V9*/ /*not used on OMAP1610 INNOVATOR*/ //open_drain(20,PULL_DWN_CTRL_2);#else /*USB pin group 2 alternate configuration */ OMAP1610_SET_FUNC_MUX_CTRL(5, FUNC_MUX_CTRL_B, 9); /*USB0.TXEN W9 */ open_drain(19, PULL_DWN_CTRL_2); OMAP1610_SET_FUNC_MUX_CTRL(5, FUNC_MUX_CTRL_B, 6); /*USB0.VP AA9 */ open_drain(18, PULL_DWN_CTRL_2); OMAP1610_SET_FUNC_MUX_CTRL(5, FUNC_MUX_CTRL_B, 3); /*USB0.SUSP Y10 */ open_drain(17, PULL_DWN_CTRL_2); OMAP1610_SET_FUNC_MUX_CTRL(5, FUNC_MUX_CTRL_C, 21); /*USB0.RCV Y5 */ open_drain(1, PULL_DWN_CTRL_3); OMAP1610_SET_FUNC_MUX_CTRL(5, FUNC_MUX_CTRL_C, 18); /*USB0.VM R9 */ open_drain(0, PULL_DWN_CTRL_3); OMAP1610_SET_FUNC_MUX_CTRL(5, FUNC_MUX_CTRL_C, 27); /*USB0.TXD V6 */ open_drain(3, PULL_DWN_CTRL_3); OMAP1610_SET_FUNC_MUX_CTRL(5, FUNC_MUX_CTRL_C, 24); /*USB0.SE0 W5 */ open_drain(2, PULL_DWN_CTRL_3); //OMAP1610_SET_FUNC_MUX_CTRL(5,FUNC_MUX_CTRL_B,12); /*USB0.SPEED V9*/ /*not used on OMAP1610 INNOVATOR*/ //open_drain(20,PULL_DWN_CTRL_2);#endif#endif OMAP1610_CONFIRM_MUX_SETUP();#ifdef CONFIG_OMAP_H2 //USB_TRANSCEIVER_CTRL.7 = 0 (CONF_USB1_UNI_R) //unidirectional vs bidirectional, set to 1 if trx mode 0 outl((inl(USB_TRANSCEIVER_CTRL) & ~(1 << 7)), USB_TRANSCEIVER_CTRL);#else //USB_TRANSCEIVER_CTRL.7 = 1 (CONF_USB1_UNI_R) //unidirectional vs bidirectional, set to 1 if trx mode 0 //USB_TRANSCEIVER_CTRL.8 = 1 (CONF_USB2_UNI_R) //unidirectional vs bidirectional, set to 1 if trx mode 0 outl((inl(USB_TRANSCEIVER_CTRL) | (1 << 7)), USB_TRANSCEIVER_CTRL); outl((inl(USB_TRANSCEIVER_CTRL) | (1 << 8)), USB_TRANSCEIVER_CTRL);#endif /*set up USB Host without OTG function. OTG registers still must be configured */ //RESET_CONTROL.0 = 1 (CONF_OCP_RESET_R) //page oct03.448 //RESET_CONTROL.2 = 1 (CONF_ARMIO_RESET_R) outl(inl(RESET_CONTROL) | 5, RESET_CONTROL); //ARM_RSTCT2.0 = 1(PER_EN) outl(inl(ARM_RSTCT2) | 1, ARM_RSTCT2); //ARM_IDLECT3.0 = 1 (EN_OCPI_CK) //ARM_IDLECT3.1 = 0 (IDLOCPI_ARM) //make OCPI idle when MPU is idle outl(inl(ARM_IDLECT3) | 1, ARM_IDLECT3); outl(inl(ARM_IDLECT3) & ~(1 << 1), ARM_IDLECT3); // Enable everything in OCPI. Seems like everything must be enabled outl(inl(OCPI_PROT) & ~0xff, OCPI_PROT); outl(inl(OCPI_SEC) & ~0x7f, OCPI_SEC); //CLOCK_CTRL_REG.5 = 0 (DIS_USB_PVCI_CLK) //CLOCK_CTRL_REG.4 = 1 (USB_MCLK_EN) outl((inl(CLOCK_CTRL_REG) & ~(1 << 5)), CLOCK_CTRL_REG); outl((inl(CLOCK_CTRL_REG) | (1 << 4)), CLOCK_CTRL_REG); //MOD_CONF_CTRL_0.9 = 1 (CONF_MOD_USB_HOST_HHC_UHOST_EN_R) //enable 48 and 12 MHz clocks //MOD_CONF_CTRL_0.11 = 0 (CONF_MOD_USB_HOST_UART_SELECT_R) //enable uart on USB port 1 outl((inl(MOD_CONF_CTRL_0) | (1 << 9)), MOD_CONF_CTRL_0); outl((inl(MOD_CONF_CTRL_0) & ~(1 << 11)), MOD_CONF_CTRL_0); //SOFT_REQ_REG.8 = 1 (SOFT_USB_OTG_DPLL_REQ) //SOFT_REQ_REG.4 = x (USB_REQ_EN) //USB Client HW DPLL req //SOFT_REQ_REG.3 = 1 (SOFT_USB_REQ) //SOFT_REQ_REG.0 = 1 (SOFT_DPLL_REQ) //ULPD_PLL clock req outl((inl(SOFT_REQ_REG) | (1 << 0) | (1 << 3) | (1 << 8)), SOFT_REQ_REG); //SOFT_DISABLE_REQ_REG.6 = 0 (DIS_USB_HOST_DPLL_REQ) //USB Host clock HW //SOFT_DISABLE_REQ_REG.3 = 0 (DIS_PERIPH_REQ) outl((inl(SOFT_DISABLE_REQ_REG) & ~((1 << 6) | (1 << 3))), SOFT_DISABLE_REQ_REG); //? OTG_SYSCON_1.1 = 1 (SOFT_RST) //? OTG_SYSCON_1.2 == 1 ? (RESET_DONE) //OTG_SYSCON_1.15 = 0 (OTG_IDLE_EN) //OTG_SYSCON_1.13 = 0 (DEV_IDLE_EN) //user choice //OTG_SYSCON_1.1 = 0 (SOFT_RST) //OTG_SYSCON_1.26-24 = 3(USB2_TRXMODE) //user choice //OTG_SYSCON_1.22-20 = 3(USB1_TRXMODE) //user choice //OTG_SYSCON_1.18-16 = x (USB0_TRXMODE) //user choice#ifdef CONFIG_OMAP_H2 outl((2 << 20), OTG_SYSCON_1);#else outl((inl(OTG_SYSCON_1) & (7 << 16)), OTG_SYSCON_1); outl((inl(OTG_SYSCON_1) | (3 << 20) | (3 << 24)), OTG_SYSCON_1);#endif //OTG_SYSCON_2.31 = 0 (OTG_EN) //OTG_SYSCON_2.30 = 1 (USBx_SYNCHRO) //OTG_SYSCON_2.29 = 0 (OTG_MST16) //OTG_SYSCON_2.28 = 0 (SRP_GPDATA) //OTG_SYSCON_2.27 = 0 (SRP_GPDVBUS) //OTG_SYSCON_2.26-24 = 0 (SRP_GPUVBUS) //OTG_SYSCON_2.22-20 = 0 (A_WAIT_RISE) //OTG_SYSCON_2.18-16 = 4 (B_ASE0_BRST) //OTG_SYSCON_2.14 = 0 (SRP_DPW) //OTG_SYSCON_2.13 = 0 (SRP_DATA) //OTG_SYSCON_2.12 = 0 (SRP_VBUS) //OTG_SYSCON_2.10 = 0 (OTG_PADEN) //OTG_SYSCON_2.9 = 0 (HMC_PADEN) //OTG_SYSCON_2.8 = 1 (UHOST_EN) //user choice //OTG_SYSCON_2.7 = 0 (HMC_TTLSPEED) //user choice //OTG_SYSCON_2.6 = 0 (HMC_TTLATTACH) //user choice //OTG_SYSCON_2.5-0 = 4 (HMC_MODE) //user choice outl((1 << 30) | (4 << 16) | (1 << 8) | 4, OTG_SYSCON_2); //OTG_CTRL.18 = x (BSESSVLD) //1 = host attached (VBUS present) //other bits must be 0 outl((inl(OTG_CTRL) & (1 << 18)), OTG_CTRL); //OTG_IRQ_EN = 0 outl(0, OTG_IRQ_EN); //OTG_SYSCON_1.15 = 1 (OTG_IDLE_EN) //to reduce power consumption //outl(inl(OTG_SYSCON_1)|(1<<15),OTG_SYSCON_1); //if enabled, usbserial looses some incoming data#endif /* * Fill in some fields of the bogus pci_dev. */ memset(&bogus_pcidev, 0, sizeof (struct pci_dev)); strcpy(bogus_pcidev.name, "OMAP1510 OHCI"); strcpy(bogus_pcidev.slot_name, "builtin"); bogus_pcidev.resource[0].name = "OHCI Operational Registers"; bogus_pcidev.resource[0].start = 0xfffba000; bogus_pcidev.resource[0].end = 0xfffba000 + 4096; /* REVISIT */ bogus_pcidev.resource[0].flags = 0; bogus_pcidev.irq = IH2_BASE + 6; /* * Initialise the generic OHCI driver. */ ret = hc_add_ohci(&bogus_pcidev, bogus_pcidev.irq, (void *) bogus_pcidev.resource[0].start, 0, &omap1510_ohci, "usb-ohci", "omap1510");// if (ret)// release_mem_region(_USB_OHCI_OP_BASE, _USB_EXTENT); return ret;}static voidomap1510_ohci_release(void){ /* REVISIT: Need to properly shut off clocks here. */ volatile unsigned long *mod_conf_ctrl_0 = (unsigned long *) 0xfffe1080; hc_remove_ohci(omap1510_ohci); *mod_conf_ctrl_0 &= ~MOD_CONF_CTRL_0_USB_HOST_HHC_UHOST_EN;#ifdef CONFIG_ARCH_OMAP1610 outl(inl(OTG_SYSCON_2) & ~(1 << 8), OTG_SYSCON_2);#endif /* * Release memory resources. */// release_mem_region(_USB_OHCI_OP_BASE, _USB_EXTENT);}#ifdef CONFIG_OMAP_H2/* Release IO region */static voidomap_h2_release_io(void){ i2c_close(); if (initstate_region) { release_region(OTG_BASE, OTG_IOSIZE); initstate_region = 0; }}#endifstatic int __initomap1510_ohci_init(void){ int ret = 0;#ifdef CONFIG_OMAP_H2 int tmp = (int) request_region(OTG_BASE, OTG_IOSIZE, "OMAP H2 USB OHCI"); if (!tmp) { err("OTG is already in use"); omap_h2_release_io(); return -ENODEV; } initstate_region = 1; tmp = i2c_configure(); if (tmp < 0) { omap_h2_release_io(); return tmp; } isp1301_configure(); i2c_close(); /*i2c is no longer needed here */#endif#if defined(CONFIG_OMAP_INNOVATOR) /* MVL-CEE */ init_waitqueue_head(&kusbdpmd_wait); init_completion(&kusbdpmd); omap1510_usbpmd_req = SIGHUP; if ((omap1510_ohci_pid = kernel_thread(omap1510_ohci_thread, (void *) NULL, CLONE_FS | CLONE_FILES | CLONE_SIGHAND)) <= 0) {#ifdef CONFIG_OMAP_H2 omap_h2_release_io();#endif return -1; } wait_for_completion(&kusbdpmd); omap1510_ohci_ldm_driver_register(); omap1510_ohci_ldm_device_register();#else /* MVL-CEE */ ret = omap1510_ohci_configure();#endif /* MVL-CEE */ return 0;}static void __exitomap1510_ohci_exit(void){ int ret;#if defined(CONFIG_OMAP_INNOVATOR) /* MVL-CEE */ omap1510_ohci_ldm_device_unregister(); omap1510_ohci_ldm_driver_unregister(); /* Kill the thread */ init_completion(&kusbdpmd); omap1510_usbpmd_req = SIGTERM; wake_up(&kusbdpmd_wait); wait_for_completion(&kusbdpmd);#endif /* MVL-CEE */ omap1510_ohci_release();#ifdef CONFIG_OMAP_H2 omap_h2_release_io();#endif}module_init(omap1510_ohci_init);module_exit(omap1510_ohci_exit);MODULE_LICENSE("GPL");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -