static ssize_t mt_usb_store_cmode(struct device* dev, struct device_attribute *attr, const char *buf, size_t count) { unsigned int cmode; if (!dev) { DBG(0,"dev is null!!\n"); return count; } else if (1 == sscanf(buf, "%d", &cmode)) { DBG(0, "cmode=%d, cable_mode=%d\n", cmode, cable_mode); if (cmode >= CABLE_MODE_MAX) cmode = CABLE_MODE_NORMAL; if (cable_mode != cmode) { if(mtk_musb) { if(down_interruptible(&mtk_musb->musb_lock)) xlog_printk(ANDROID_LOG_ERROR, "USB20", "%s: busy, Couldn't get musb_lock\n", __func__); } if(cmode == CABLE_MODE_CHRG_ONLY) { // IPO shutdown, disable USB if(mtk_musb) { mtk_musb->in_ipo_off = true; } } else if(cmode == CABLE_MODE_NORMAL) { // IPO bootup, enable USB if(mtk_musb) { mtk_musb->in_ipo_off = false; } } mt_usb_disconnect(); cable_mode = cmode; msleep(10); //ALPS00114502 //check that "if USB cable connected and than call mt_usb_connect" //Then, the Bat_Thread won't be always wakeup while no USB/chatger cable and IPO mode //mt_usb_connect(); usb_check_connect(); //ALPS00114502 #ifdef CONFIG_USB_MTK_OTG if(cmode == CABLE_MODE_CHRG_ONLY) { if(mtk_musb && mtk_musb->is_host) { // shut down USB host for IPO musb_stop(mtk_musb); /* Think about IPO shutdown with A-cable, then switch to B-cable and IPO bootup. We need a point to clear session bit */ musb_writeb(mtk_musb->mregs, MUSB_DEVCTL, (~MUSB_DEVCTL_SESSION)&musb_readb(mtk_musb->mregs,MUSB_DEVCTL)); } else { switch_int_to_host_and_mask(); // mask ID pin interrupt even if A-cable is not plugged in } } else if(cmode == CABLE_MODE_NORMAL) { switch_int_to_host(); // resotre ID pin interrupt } #endif if(mtk_musb) { up(&mtk_musb->musb_lock); } } } return count; }
ssize_t musb_cmode_store(struct device* dev, struct device_attribute *attr, const char *buf, size_t count) { unsigned int cmode; struct musb *musb = dev_to_musb(dev); if (!dev) { os_printk(K_ERR, "dev is null!!\n"); return count; } else if (1 == sscanf(buf, "%d", &cmode)) { os_printk(K_INFO, "%s %s --> %s\n", __func__, usb_mode_str[cable_mode], usb_mode_str[cmode]); if (cmode >= CABLE_MODE_MAX) cmode = CABLE_MODE_NORMAL; if (cable_mode != cmode) { if (cmode == CABLE_MODE_CHRG_ONLY) { // IPO shutdown, disable USB if(musb) { musb->usb_mode = CABLE_MODE_CHRG_ONLY; mt_usb_disconnect(); } } else if (cmode == CABLE_MODE_HOST_ONLY) { if(musb) { musb->usb_mode = CABLE_MODE_HOST_ONLY; mt_usb_disconnect(); } } else { // IPO bootup, enable USB if(musb) { musb->usb_mode = CABLE_MODE_NORMAL; mt_usb_connect(); } } cable_mode = cmode; } } return count; }
void usb_phy_switch_to_uart(void) { int var; #if 0 /* SW disconnect */ var = USB_PHY_Read_Register8(0x68); DBG(0, "[MUSB]addr: 0x68, value: %x\n", var); USB_PHY_Write_Register8(0x15, 0x68); DBG(0, "[MUSB]addr: 0x68, value after: %x\n", USB_PHY_Read_Register8(0x68)); var = USB_PHY_Read_Register8(0x6A); DBG(0, "[MUSB]addr: 0x6A, value: %x\n", var); USB_PHY_Write_Register8(0x0, 0x6A); DBG(0, "[MUSB]addr: 0x6A, value after: %x\n", USB_PHY_Read_Register8(0x6A)); /* SW disconnect */ #endif /* Set ru_uart_mode to 2'b01 */ var = USB_PHY_Read_Register8(0x6B); DBG(0, "[MUSB]addr: 0x6B, value: %x\n", var); USB_PHY_Write_Register8(var | 0x7C, 0x6B); DBG(0, "[MUSB]addr: 0x6B, value after: %x\n", USB_PHY_Read_Register8(0x6B)); /* Set RG_UART_EN to 1 */ var = USB_PHY_Read_Register8(0x6E); DBG(0, "[MUSB]addr: 0x6E, value: %x\n", var); USB_PHY_Write_Register8(var | 0x07, 0x6E); DBG(0, "[MUSB]addr: 0x6E, value after: %x\n", USB_PHY_Read_Register8(0x6E)); /* Set RG_USB20_DM_100K_EN to 1 */ var = USB_PHY_Read_Register8(0x22); DBG(0, "[MUSB]addr: 0x22, value: %x\n", var); USB_PHY_Write_Register8(var | 0x02, 0x22); DBG(0, "[MUSB]addr: 0x22, value after: %x\n", USB_PHY_Read_Register8(0x22)); var = DRV_Reg8(UART1_BASE + 0x90); DBG(0, "[MUSB]addr: 0x11002090 (UART1), value: %x\n", var); DRV_WriteReg8(UART1_BASE + 0x90, var | 0x01); DBG(0, "[MUSB]addr: 0x11002090 (UART1), value after: %x\n\n", DRV_Reg8(UART1_BASE + 0x90)); /* SW disconnect */ mt_usb_disconnect(); }