int __init musb_platform_init(struct musb *musb) { int err; #ifndef CONFIG_MT6575T_FPGA if (is_host_enabled(musb)) { #ifdef CONFIG_USB_MTK_HDRC_HCD musb->board_set_vbus = mtk_set_vbus; mt_set_gpio_mode(GPIO_OTG_DRVVBUS_PIN,GPIO_OTG_DRVVBUS_PIN_M_GPIO);//should set GPIO2 as gpio mode. mt_set_gpio_dir(GPIO_OTG_DRVVBUS_PIN,GPIO_DIR_OUT); mt_get_gpio_pull_enable(GPIO_OTG_DRVVBUS_PIN); mt_set_gpio_pull_select(GPIO_OTG_DRVVBUS_PIN,GPIO_PULL_UP); #endif } #endif musb->nIrq = MT_USB0_IRQ_ID; musb->dma_irq= (int)SHARE_IRQ; musb->fifo_cfg = fifo_cfg; musb->fifo_cfg_size = ARRAY_SIZE(fifo_cfg); musb->fifo_cfg_host = fifo_cfg_host; musb->fifo_cfg_host_size = ARRAY_SIZE(fifo_cfg_host); mtk_musb->power = FALSE; mtk_musb->is_host = FALSE; mtk_musb->fifo_size = 8*1024; musb_platform_enable(musb); musb->isr = mt_usb_interrupt; musb_writel(musb->mregs,MUSB_HSDMA_INTR,0xff | (0xff << DMA_INTR_UNMASK_SET_OFFSET)); DBG(2,"musb platform init %x\n",musb_readl(musb->mregs,MUSB_HSDMA_INTR)); musb_writel(musb->mregs,USB_L1INTM,TX_INT_STATUS | RX_INT_STATUS | USBCOM_INT_STATUS | DMA_INT_STATUS); err = device_create_file(musb->controller,&dev_attr_cmode); return 0; }
bool musb_is_host(void) { u8 devctl = 0; DBG(0,"will mask PMIC charger detection\n"); upmu_interrupt_chrdet_int_en(0); musb_platform_enable(mtk_musb); //musb_set_vbus(mtk_musb,FALSE); //mt65xx_eint_mask(EINT_CHR_DET_NUM); devctl = musb_readb(mtk_musb->mregs,MUSB_DEVCTL); DBG(0, "devctl = %x before end session\n", devctl); devctl &= ~MUSB_DEVCTL_SESSION; // this will cause A-device change back to B-device after A-cable plug out musb_writeb(mtk_musb->mregs, MUSB_DEVCTL, devctl); msleep(delay_time); devctl = musb_readb(mtk_musb->mregs, MUSB_DEVCTL); DBG(0,"devctl = %x before set session\n",devctl); devctl |= MUSB_DEVCTL_SESSION; //musb_set_vbus(mtk_musb,TRUE); musb_writeb(mtk_musb->mregs, MUSB_DEVCTL, devctl); msleep(delay_time1); devctl = musb_readb(mtk_musb->mregs, MUSB_DEVCTL); DBG(0, "devclt = %x\n", devctl); if (devctl & MUSB_DEVCTL_BDEVICE) { usb_is_host = FALSE; DBG(0,"will unmask PMIC charger detection\n"); upmu_interrupt_chrdet_int_en(1); return FALSE; } else { usb_is_host = TRUE; return TRUE; } }
int musb_otg_env_init(void){ u8 power; //u8 intrusb; //step1: mask the PMU/PMIC EINT mtk_musb->usb_if = true; mtk_musb->is_host = true;//workaround for PMIC charger detection //mt65xx_eint_mask(EINT_CHR_DET_NUM); upmu_interrupt_chrdet_int_en(0); #ifndef MTK_FAN5405_SUPPORT #ifndef MTK_NCP1851_SUPPORT #ifndef MTK_BQ24196_SUPPORT #ifndef MTK_BQ24158_SUPPORT //set the drvvbus mode as drvvbus(mode 6) #if !(defined(CONFIG_MT6585_FPGA) || defined(CONFIG_MT6577_FPGA) || defined(CONFIG_MT6589_FPGA) || defined(CONFIG_MT6582_FPGA)) mt_set_gpio_mode(GPIO_OTG_DRVVBUS_PIN,6); #endif #endif #endif #endif #endif //step5: make sure to power on the USB module if(mtk_musb->power) mtk_musb->power = FALSE; musb_platform_enable(mtk_musb); //step6: clear session bit musb_writeb(mtk_musb->mregs,MUSB_DEVCTL,0); //step7: disable and enable usb interrupt usb_l1intm_store = musb_readl(mtk_musb->mregs,USB_L1INTM); usb_intrrxe_store = musb_readw(mtk_musb->mregs,MUSB_INTRRXE); usb_intrtxe_store = musb_readw(mtk_musb->mregs,MUSB_INTRTXE); usb_intrusbe_store = musb_readb(mtk_musb->mregs,MUSB_INTRUSBE); musb_writel(mtk_musb->mregs,USB_L1INTM,0); musb_writew(mtk_musb->mregs,MUSB_INTRRXE,0); musb_writew(mtk_musb->mregs,MUSB_INTRTXE,0); musb_writeb(mtk_musb->mregs,MUSB_INTRUSBE,0); musb_writew(mtk_musb->mregs,MUSB_INTRRX,0xffff); musb_writew(mtk_musb->mregs,MUSB_INTRTX,0xffff); musb_writeb(mtk_musb->mregs,MUSB_INTRUSB,0xff); free_irq (mtk_musb->nIrq, mtk_musb); musb_writel(mtk_musb->mregs,USB_L1INTM,0x105); musb_writew(mtk_musb->mregs,MUSB_INTRTXE,1); musb_writeb(mtk_musb->mregs,MUSB_INTRUSBE,0xf7); //setp8: set the index to 0 for ep0, maybe no need. Designers said it is better not to use the index register. musb_writeb(mtk_musb->mregs, MUSB_INDEX, 0); //setp9: init message g_otg_message.msg = 0; spin_lock_init(&g_otg_message.lock); init_completion(&stop_event); #ifdef DX_DBG power = musb_readb(mtk_musb->mregs,MUSB_POWER); DBG(0,"start the USB-IF test in EM,power=0x%x!\n",power); #endif return 0; }
static bool musb_is_host(void) { u8 devctl = 0; int iddig_state = 1; bool usb_is_host = 0; DBG(0, "will mask PMIC charger detection\n"); #ifndef FPGA_PLATFORM pmic_chrdet_int_en(0); #endif musb_platform_enable(mtk_musb); #ifdef ID_PIN_USE_EX_EINT #ifndef CONFIG_MTK_FPGA #ifdef CONFIG_OF #if defined(CONFIG_MTK_LEGACY) iddig_state = mt_get_gpio_in(iddig_pin); #else iddig_state = __gpio_get_value(iddig_pin); #endif #else iddig_state = mt_get_gpio_in(GPIO_OTG_IDDIG_EINT_PIN); #endif DBG(0, "iddig_state = %d\n", iddig_state); #endif #else iddig_state = 0; devctl = musb_readb(mtk_musb->mregs, MUSB_DEVCTL); DBG(0, "devctl = %x before end session\n", devctl); devctl &= ~MUSB_DEVCTL_SESSION; /* this will cause A-device change back to B-device after A-cable plug out */ musb_writeb(mtk_musb->mregs, MUSB_DEVCTL, devctl); msleep(delay_time); devctl = musb_readb(mtk_musb->mregs, MUSB_DEVCTL); DBG(0, "devctl = %x before set session\n", devctl); devctl |= MUSB_DEVCTL_SESSION; musb_writeb(mtk_musb->mregs, MUSB_DEVCTL, devctl); msleep(delay_time1); devctl = musb_readb(mtk_musb->mregs, MUSB_DEVCTL); DBG(0, "devclt = %x\n", devctl); #endif if (devctl & MUSB_DEVCTL_BDEVICE || iddig_state) { DBG(0, "will unmask PMIC charger detection\n"); #ifndef FPGA_PLATFORM pmic_chrdet_int_en(1); #endif usb_is_host = false; } else { usb_is_host = true; } DBG(0, "usb_is_host = %d\n", usb_is_host); return usb_is_host; }
int musb_otg_env_init(void){ u8 power; //u8 intrusb; //step1: mask the PMU/PMIC EINT mtk_musb->usb_if = true; mtk_musb->is_host = true;//workaround for PMIC charger detection //mt65xx_eint_mask(EINT_CHR_DET_NUM); pmic_chrdet_int_en(0); mt_usb_init_drvvbus(); //step5: make sure to power on the USB module if(mtk_musb->power) mtk_musb->power = FALSE; musb_platform_enable(mtk_musb); //step6: clear session bit musb_writeb(mtk_musb->mregs,MUSB_DEVCTL,0); //step7: disable and enable usb interrupt usb_l1intm_store = musb_readl(mtk_musb->mregs,USB_L1INTM); usb_intrrxe_store = musb_readw(mtk_musb->mregs,MUSB_INTRRXE); usb_intrtxe_store = musb_readw(mtk_musb->mregs,MUSB_INTRTXE); usb_intrusbe_store = musb_readb(mtk_musb->mregs,MUSB_INTRUSBE); musb_writel(mtk_musb->mregs,USB_L1INTM,0); musb_writew(mtk_musb->mregs,MUSB_INTRRXE,0); musb_writew(mtk_musb->mregs,MUSB_INTRTXE,0); musb_writeb(mtk_musb->mregs,MUSB_INTRUSBE,0); musb_writew(mtk_musb->mregs,MUSB_INTRRX,0xffff); musb_writew(mtk_musb->mregs,MUSB_INTRTX,0xffff); musb_writeb(mtk_musb->mregs,MUSB_INTRUSB,0xff); free_irq (mtk_musb->nIrq, mtk_musb); musb_writel(mtk_musb->mregs,USB_L1INTM,0x105); musb_writew(mtk_musb->mregs,MUSB_INTRTXE,1); musb_writeb(mtk_musb->mregs,MUSB_INTRUSBE,0xf7); //setp8: set the index to 0 for ep0, maybe no need. Designers said it is better not to use the index register. musb_writeb(mtk_musb->mregs, MUSB_INDEX, 0); //setp9: init message g_otg_message.msg = 0; spin_lock_init(&g_otg_message.lock); init_completion(&stop_event); #ifdef DX_DBG power = musb_readb(mtk_musb->mregs,MUSB_POWER); DBG(0,"start the USB-IF test in EM,power=0x%x!\n",power); #endif return 0; }
int __init musb_platform_init(struct musb *musb) { int err; #ifdef CONFIG_USB_MTK_HDRC_HCD if (is_host_enabled(musb)) { musb->board_set_vbus = mtk_set_vbus; //<2013/03/27-23263-stevenchen, Correct GPIO12 & GPIO38 configuration to low down standby current. #ifndef CONFIG_MT6589_FPGA #ifndef MTK_BQ24196_SUPPORT #ifndef MTK_BQ24157_SUPPORT mt_set_gpio_mode(GPIO_OTG_DRVVBUS_PIN,GPIO_OTG_DRVVBUS_PIN_M_GPIO);//should set GPIO2 as gpio mode. mt_set_gpio_dir(GPIO_OTG_DRVVBUS_PIN,GPIO_DIR_OUT); mt_get_gpio_pull_enable(GPIO_OTG_DRVVBUS_PIN); mt_set_gpio_pull_select(GPIO_OTG_DRVVBUS_PIN,GPIO_PULL_UP); #endif #endif #endif //>2013/03/27-23263-stevenchen } #endif musb->nIrq = MT6589_USB0_IRQ_ID; musb->dma_irq= (int)SHARE_IRQ; musb->fifo_cfg = fifo_cfg; musb->fifo_cfg_size = ARRAY_SIZE(fifo_cfg); musb->fifo_cfg_host = fifo_cfg_host; musb->fifo_cfg_host_size = ARRAY_SIZE(fifo_cfg_host); mtk_musb->power = FALSE; mtk_musb->is_host = FALSE; mtk_musb->fifo_size = 8*1024; #ifndef CONFIG_MT6589_FPGA hwPowerOn(MT65XX_POWER_LDO_VUSB, VOL_3300, "VUSB_LDO"); printk("%s, enable VBUS_LDO \n", __func__); #endif musb_platform_enable(musb); emi_mpu_notifier_register(MST_ID_MMPERI_1, musb_check_mpu_violation); musb->isr = mt_usb_interrupt; musb_writel(musb->mregs,MUSB_HSDMA_INTR,0xff | (0xff << DMA_INTR_UNMASK_SET_OFFSET)); DBG(2,"musb platform init %x\n",musb_readl(musb->mregs,MUSB_HSDMA_INTR)); musb_writel(musb->mregs,USB_L1INTM,TX_INT_STATUS | RX_INT_STATUS | USBCOM_INT_STATUS | DMA_INT_STATUS); err = device_create_file(musb->controller,&dev_attr_cmode); return 0; }
/* * Program the HDRC to start (enable interrupts, dma, etc.). */ static void musb_start(struct musb *musb) { void __iomem *regs = musb->mregs; u8 devctl = musb_readb(regs, MUSB_DEVCTL); dev_dbg(musb->controller, "<== devctl %02x\n", devctl); /* Set INT enable registers, enable interrupts */ musb->intrtxe = musb->epmask; musb_writew(regs, MUSB_INTRTXE, musb->intrtxe); musb->intrrxe = musb->epmask & 0xfffe; musb_writew(regs, MUSB_INTRRXE, musb->intrrxe); musb_writeb(regs, MUSB_INTRUSBE, 0xf7); musb_writeb(regs, MUSB_TESTMODE, 0); /* put into basic highspeed mode and start session */ musb_writeb(regs, MUSB_POWER, MUSB_POWER_ISOUPDATE | MUSB_POWER_HSENAB /* ENSUSPEND wedges tusb */ /* | MUSB_POWER_ENSUSPEND */ ); musb->is_active = 0; devctl = musb_readb(regs, MUSB_DEVCTL); devctl &= ~MUSB_DEVCTL_SESSION; /* session started after: * (a) ID-grounded irq, host mode; * (b) vbus present/connect IRQ, peripheral mode; * (c) peripheral initiates, using SRP */ if (musb->port_mode != MUSB_PORT_MODE_HOST && (devctl & MUSB_DEVCTL_VBUS) == MUSB_DEVCTL_VBUS) { musb->is_active = 1; } else { devctl |= MUSB_DEVCTL_SESSION; } musb_platform_enable(musb); musb_writeb(regs, MUSB_DEVCTL, devctl); }