static int sm5502_attach_dev(struct sm5502_usbsw *usbsw) { int adc; int val1, val2, val3 , vbus; struct sm5502_platform_data *pdata = usbsw->pdata; struct i2c_client *client = usbsw->client; #if defined(CONFIG_VIDEO_MHL_V2) /*u8 mhl_ret = 0;*/ #endif val1 = i2c_smbus_read_byte_data(client, REG_DEVICE_TYPE1); if (val1 < 0) { dev_err(&client->dev, "%s: err %d\n", __func__, val1); return val1; } val2 = i2c_smbus_read_byte_data(client, REG_DEVICE_TYPE2); if (val2 < 0) { dev_err(&client->dev, "%s: err %d\n", __func__, val2); return val2; } jig_state = (val2 & DEV_T2_JIG_ALL_MASK) ? 1 : 0; val3 = i2c_smbus_read_byte_data(client, REG_DEVICE_TYPE3); if (val3 < 0) { dev_err(&client->dev, "%s: err %d\n", __func__, val3); return val3; } // add start vbus = i2c_smbus_read_byte_data(client, REG_VBUSINVALID); if (vbus < 0) { dev_err(&client->dev, "%s: err %d\n", __func__, vbus); return vbus; } // add end adc = i2c_smbus_read_byte_data(client, REG_ADC); if (adc == ADC_SMART_DOCK) { val2 = DEV_SMARTDOCK; val1 = 0; } #if defined(CONFIG_USB_HOST_NOTIFY) if (adc == 0x11 || adc == ADC_AUDIO_DOCK) { val2 = DEV_AUDIO_DOCK; val1 = 0; } #endif dev_err(&client->dev, "dev1: 0x%x, dev2: 0x%x, dev3: 0x%x, ADC: 0x%x Jig:%s\n", val1, val2, val3, adc, (check_sm5502_jig_state() ? "ON" : "OFF")); /* USB */ if (val1 & DEV_USB || val2 & DEV_T2_USB_MASK) { pr_info("[MUIC] USB Connected\n"); pdata->callback(CABLE_TYPE_USB, SM5502_ATTACHED); /* USB_CDP */ } else if (val1 & DEV_USB_CHG) { pr_info("[MUIC] CDP Connected\n"); pdata->callback(CABLE_TYPE_CDP, SM5502_ATTACHED); /* UART */ } else if (val1 & DEV_T1_UART_MASK || val2 & DEV_T2_UART_MASK) { uart_sm5502_connecting = 1; pr_info("[MUIC] UART Connected\n"); pdata->callback(CABLE_TYPE_UARTOFF, SM5502_ATTACHED); #if (!defined(CONFIG_MACH_CT01) && !defined(CONFIG_MACH_CT01_CHN_CU)) flash_control(true); #endif /* CHARGER */ } else if ((val1 & DEV_T1_CHARGER_MASK) || (val3 & DEV_T3_CHARGER_MASK)) { pr_info("[MUIC] Charger Connected\n"); pdata->callback(CABLE_TYPE_AC, SM5502_ATTACHED); #if defined(CONFIG_USB_HOST_NOTIFY) /* for SAMSUNG OTG */ } else if (val1 & DEV_USB_OTG) { pr_info("[MUIC] OTG Connected\n"); sm5502_set_otg(usbsw, SM5502_ATTACHED); #endif /* JIG */ } else if (val2 & DEV_T2_JIG_MASK) { pr_info("[MUIC] JIG Connected\n"); pdata->callback(CABLE_TYPE_JIG, SM5502_ATTACHED); #if (!defined(CONFIG_MACH_CT01) && !defined(CONFIG_MACH_CT01_CHN_CU)) flash_control(true); #endif /* Desk Dock */ } else if ((val2 & DEV_AV) || (val3 & DEV_AV_VBUS)) { pr_info("[MUIC] Deskdock Connected\n"); local_usbsw->dock_attached = SM5502_ATTACHED; sm5502_dock_control(usbsw, CABLE_TYPE_DESK_DOCK, SM5502_ATTACHED, SW_AUDIO); #if defined(CONFIG_VIDEO_MHL_V2) /* MHL */ } else if (val3 & DEV_MHL) { pr_info("[MUIC] MHL Connected\n"); sm5502_disable_interrupt(); if (!poweroff_charging) /*mhl_ret = mhl_onoff_ex(1); support from sii8240*/ else pr_info("LPM mode, skip MHL sequence\n"); sm5502_enable_interrupt(); #endif /* Car Dock */ } else if (val2 & DEV_JIG_UART_ON) {
static int sm5502_detect_lanhub(struct sm5502_usbsw *usbsw) { unsigned int dev1, dev2, adc; struct sm5502_platform_data *pdata = usbsw->pdata; struct i2c_client *client = usbsw->client; pr_info("%s called\n",__func__); dev1 = i2c_smbus_read_byte_data(client, REG_DEVICE_TYPE1); if (dev1 < 0) { dev_err(&client->dev, "%s: err %d\n", __func__, dev1); return dev1; } dev2 = i2c_smbus_read_byte_data(client, REG_DEVICE_TYPE2); if (dev2 < 0) { dev_err(&client->dev, "%s: err %d\n", __func__, dev2); return dev2; } adc = i2c_smbus_read_byte_data(client, REG_ADC); dev_info(&client->dev, "dev1: 0x%02x, dev2: 0x%02x, adc: 0x%02x\n", dev1, dev2, adc); /* Attached + Detached*/ switch(adc){ case ADC_OTG: lanhub_ta_case = false; usbsw->adc = adc; sm5502_set_otg(usbsw, SM5502_ATTACHED); if(usbsw->previous_dock == SM5502_NONE) { dev_info(&client->dev, "%s:LANHUB Connected\n", __func__); pdata->callback(CABLE_TYPE_OTG, SM5502_ATTACHED); sm5502_set_otg(usbsw,SM5502_ATTACHED); } else if(usbsw->previous_dock == ADC_LANHUB) { dev_info(&client->dev, "%s:Switch LANHUB+TA to LANHUB\n", __func__); usbsw->lanhub_ta_status=0; pdata->lanhub_cb(CABLE_TYPE_LANHUB, SM5502_DETACHED, LANHUB_TA); } sm5502_mask_vbus_detect(usbsw,SM5502_DETACHED); usbsw->dock_attached = SM5502_ATTACHED; usbsw->previous_dock = ADC_OTG; break; case ADC_LANHUB: usbsw->adc = adc; lanhub_ta_case = true; usbsw->lanhub_ta_status = 1; sm5502_mask_vbus_detect(usbsw,SM5502_ATTACHED); usbsw->dock_attached = SM5502_ATTACHED; usbsw->mansw = SW_DHOST; if(usbsw->previous_dock == SM5502_NONE) { dev_info(&client->dev, "%s:LANHUB+TA Connected\n", __func__); pdata->lanhub_cb(CABLE_TYPE_LANHUB, SM5502_ATTACHED, LANHUB); sm5502_set_lanhub(usbsw,SM5502_ATTACHED); } else if (usbsw->previous_dock == ADC_OTG) { dev_info(&client->dev, "%s:Switch LANHUB to LANHUB+TA\n", __func__); pdata->lanhub_cb(CABLE_TYPE_LANHUB, SM5502_ATTACHED, LANHUB_TA); } usbsw->previous_dock = ADC_LANHUB; break; case ADC_OPEN: usbsw->adc = adc; dev_info(&client->dev, "%s:LANHUB + TA -> ADC_OPEN case\n", __func__); if (pdata->lanhub_cb && usbsw->lanhub_ta_status == 1) { if (usbsw->previous_dock == ADC_LANHUB) pdata->lanhub_cb(CABLE_TYPE_LANHUB,SM5502_DETACHED, LANHUB); sm5502_disable_rawdataInterrupts(usbsw); usbsw->lanhub_ta_status=0; sm5502_mask_vbus_detect(usbsw,SM5502_DETACHED); pdata->callback(CABLE_TYPE_OTG,SM5502_DETACHED); sm5502_set_otg(usbsw, SM5502_DETACHED); } else if (usbsw->previous_dock == ADC_OTG) { sm5502_disable_rawdataInterrupts(usbsw); pdata->callback(CABLE_TYPE_OTG,SM5502_DETACHED); sm5502_set_otg(usbsw, SM5502_DETACHED); }else { dev_info(&client->dev, "%s:ignore ADC_OPEN case\n", __func__); sm5502_mask_vbus_detect(usbsw,SM5502_DETACHED); } usbsw->previous_dock = SM5502_NONE; lanhub_ta_case = false; break; default: dev_info(&client->dev, "%s:Not reaching here(adc:0x%02x)\n", __func__, adc); lanhub_ta_case = false; break; } usbsw->dev1=dev1; usbsw->dev2=dev2; return adc; }