bool sec_bat_check_jig_status(void) { #if defined(CONFIG_SM5502_MUIC) return check_sm5502_jig_state(); #elif defined(CONFIG_SM5504_MUIC) return check_sm5504_jig_state(); #else return false; #endif }
bool sec_bat_check_jig_status(void) { #if defined(CONFIG_SM5502_MUIC) return check_sm5502_jig_state(); #elif defined(CONFIG_SM5504_MUIC) return check_sm5504_jig_state(); #elif defined(CONFIG_SM5703_MUIC) return check_sm5703_muic_jig_state(); #elif defined(CONFIG_EXTCON_MAX77849) return get_jig_state(); #else return false; #endif }
void sm5502_callback(enum cable_type_t cable_type, int attached) { union power_supply_propval value; struct power_supply *psy = power_supply_get_by_name("battery"); struct power_supply *psy_ps = power_supply_get_by_name("ps"); static enum cable_type_t previous_cable_type = CABLE_TYPE_NONE; #if defined(CONFIG_USB_NOTIFY_LAYER) struct otg_notify *n = get_otg_notify(); #endif pr_info("%s, called : cable_type :%d \n",__func__, cable_type); set_cable_status = attached ? cable_type : CABLE_TYPE_NONE; switch (cable_type) { case CABLE_TYPE_USB: #if defined(USE_TSP_TA_CALLBACKS) if (charger_callbacks && charger_callbacks->inform_charger) charger_callbacks->inform_charger(charger_callbacks, attached); #endif #if defined(DEBUG_STATUS) if (attached) { status_count = status_count+1; pr_err("%s USB Cable status attached (%d)\n", __func__, status_count); } else { status_count = status_count-1; pr_err("%s USB Cable Status detached (%d)\n", __func__, status_count); } #endif #if defined(CONFIG_USB_NOTIFY_LAYER) send_otg_notify(n, NOTIFY_EVENT_VBUS, attached); #else sec_otg_set_vbus_state(attached); #endif break; case CABLE_TYPE_AC: #if defined(USE_TSP_TA_CALLBACKS) if (charger_callbacks && charger_callbacks->inform_charger) charger_callbacks->inform_charger(charger_callbacks, attached); #endif #if defined(DEBUG_STATUS) if (attached) { status_count = status_count+1; pr_err("%s Charger status attached (%d)\n", __func__, status_count); } else { status_count = status_count-1; pr_err("%s charger status detached (%d)\n", __func__, status_count); } #endif break; case CABLE_TYPE_UARTOFF: #if defined(DEBUG_STATUS) if (attached) { status_count = status_count+1; pr_err("%s UART Status attached (%d)\n", __func__, status_count); } else { status_count = status_count-1; pr_err("%s UART status detached (%d)\n", __func__, status_count); } #endif switch_set_state(&switch_uart3, attached); break; case CABLE_TYPE_JIG_UART_OFF_VB: #if defined(DEBUG_STATUS) if (attached) { status_count = status_count+1; pr_err("%s UART OFF VBUS Status attached (%d)\n", __func__, status_count); } else { status_count = status_count-1; pr_err("%s UART OFF VBUS status detached (%d)\n", __func__, status_count); } #endif switch_set_state(&switch_uart3, attached); break; case CABLE_TYPE_JIG: #if defined(DEBUG_STATUS) if (attached) { status_count = status_count+1; pr_err("%s JIG cable status attached (%d)\n", __func__, status_count); } else { status_count = status_count-1; pr_err("%s JIG cable status detached (%d)\n", __func__, status_count); } #endif return; case CABLE_TYPE_CDP: #if defined(USE_TSP_TA_CALLBACKS) if (charger_callbacks && charger_callbacks->inform_charger) charger_callbacks->inform_charger(charger_callbacks, attached); #endif #if defined(DEBUG_STATUS) if (attached) { status_count = status_count+1; pr_err("%s CDP status attached (%d)\n", __func__, status_count); } else { status_count = status_count-1; pr_err("%s CDP Status detached (%d)\n", __func__, status_count); } #endif #if defined(CONFIG_USB_NOTIFY_LAYER) send_otg_notify(n, NOTIFY_EVENT_VBUS, attached); #else sec_otg_set_vbus_state(attached); #endif break; case CABLE_TYPE_OTG: #if defined(DEBUG_STATUS) if (attached) { status_count = status_count+1; pr_err("%s OTG status attached (%d)\n", __func__, status_count); } else { status_count = status_count-1; pr_err("%s OTG status detached (%d)\n", __func__, status_count); } #endif #if defined(CONFIG_USB_HOST_NOTIFY) if (attached) { send_otg_notify(n, NOTIFY_EVENT_DRIVE_VBUS, 1); msleep(100); send_otg_notify(n, NOTIFY_EVENT_HOST, 1); } else { send_otg_notify(n, NOTIFY_EVENT_HOST, 0); msleep(100); send_otg_notify(n, NOTIFY_EVENT_DRIVE_VBUS, 0); } #endif return; case CABLE_TYPE_AUDIO_DOCK: #if defined(DEBUG_STATUS) if (attached) { status_count = status_count+1; pr_err("%s Audiodock status attached (%d)\n", __func__, status_count); } else { status_count = status_count-1; pr_err("%s Audiodock status detached (%d)\n", __func__, status_count); } #endif #if defined(CONFIG_USB_HOST_NOTIFY) if (attached) { send_otg_notify(n, NOTIFY_EVENT_AUDIODOCK, 1); } else { send_otg_notify(n, NOTIFY_EVENT_AUDIODOCK, 0); } #endif break; case CABLE_TYPE_CARDOCK: #if defined(DEBUG_STATUS) if (attached) { status_count = status_count+1; pr_err("%s Cardock status attached (%d)\n", __func__, status_count); } else { status_count = status_count-1; pr_err("%s Cardock status detached (%d)\n", __func__, status_count); } #endif switch_set_state(&switch_dock, attached ? 2 : 0); switch_set_state(&switch_uart3, attached); break; case CABLE_TYPE_UARTON: #if defined(DEBUG_STATUS) if (attached) { status_count = status_count+1; pr_err("%s Uart On status attached (%d)\n", __func__, status_count); } else { status_count = status_count-1; pr_err("%s Uart On status detached (%d)\n", __func__, status_count); } #endif switch_set_state(&switch_uart3, attached); break; case CABLE_TYPE_DESK_DOCK: case CABLE_TYPE_DESK_DOCK_NO_VB: #if defined(DEBUG_STATUS) if (attached) { status_count = status_count+1; pr_err("%s Deskdock %s status attached (%d)\n", __func__, ((cable_type == CABLE_TYPE_DESK_DOCK) ? "VBUS" : "NOVBUS"), status_count); } else { status_count = status_count-1; pr_err("%s Deskdock %s status detached (%d)\n", __func__, ((cable_type == CABLE_TYPE_DESK_DOCK) ? "VBUS" : "NOVBUS"), status_count); } #endif switch_set_state(&switch_dock, attached); break; case CABLE_TYPE_SMART_DOCK: case CABLE_TYPE_SMART_DOCK_NO_VB: #if defined(DEBUG_STATUS) if (attached) { status_count = status_count+1; pr_err("%s Smartdock %s status attached (%d)\n", __func__, ((cable_type == CABLE_TYPE_SMART_DOCK) ? "VBUS" : "NOVBUS"), status_count); } else { status_count = status_count-1; pr_err("%s Smartdock %s status detached (%d)\n", __func__, ((cable_type == CABLE_TYPE_SMART_DOCK) ? "VBUS" : "NOVBUS"), status_count); } #endif switch_set_state(&switch_dock, attached ? 5 : 0); break; case CABLE_TYPE_219KUSB: #if defined(DEBUG_STATUS) if (attached) { status_count = status_count+1; pr_err("%s 219K USB status attached (%d)\n", __func__, status_count); } else { status_count = status_count-1; pr_err("%s 219K USB status detached (%d)\n", __func__, status_count); } #endif #if defined(CONFIG_USB_NOTIFY_LAYER) send_otg_notify(n, NOTIFY_EVENT_VBUS, attached); #else sec_otg_set_vbus_state(attached); #endif break; case CABLE_TYPE_INCOMPATIBLE: #if defined(DEBUG_STATUS) if (attached) { status_count = status_count+1; pr_err("%s Incompatible Charger status attached (%d)\n", __func__, status_count); } else { status_count = status_count-1; pr_err("%s Incomabtible Charger status detached (%d)\n", __func__, status_count); } #endif break; #if defined(CONFIG_MUIC_SUPPORT_CHARGING_CABLE) case CABLE_TYPE_CHARGING_CABLE: if (attached) value.intval = POWER_SUPPLY_TYPE_POWER_SHARING; else value.intval = POWER_SUPPLY_TYPE_BATTERY; #if defined(DEBUG_STATUS) if (attached) { status_count = status_count+1; pr_err("%s Charging Cable status attached (%d)\n", __func__, status_count); } else { status_count = status_count-1; pr_err("%s Charging Cable status detached (%d)\n", __func__, status_count); } #endif break; #endif default: break; } if (previous_cable_type == set_cable_status) { pr_info("%s: SKIP cable setting\n", __func__); return; } #if defined(CONFIG_FUELGAUGE_MAX17050) if (check_sm5502_jig_state()) { struct power_supply *fuel_psy = power_supply_get_by_name("sec-fuelgauge"); if (!fuel_psy || !fuel_psy->set_property) pr_err("%s: fail to get sec-fuelgauge psy\n", __func__); else fuel_psy->set_property(fuel_psy, POWER_SUPPLY_PROP_CHARGE_TYPE, &value); } #endif #if defined(CONFIG_QPNP_BMS) if (check_sm5502_jig_state()) { struct power_supply *fuel_psy = power_supply_get_by_name("bms"); if (!fuel_psy || !fuel_psy->set_property) pr_err("%s: fail to get BMS psy\n", __func__); else fuel_psy->set_property(fuel_psy, POWER_SUPPLY_PROP_CHARGE_TYPE, &value); } #endif #if defined(CONFIG_FUELGAUGE_RT5033) if (check_sm5502_jig_state()) { struct power_supply *fuel_psy = power_supply_get_by_name("rt5033-fuelgauge"); if (!fuel_psy || !fuel_psy->set_property) pr_err("%s: fail to get rt5033-fuelgauge psy\n", __func__); else fuel_psy->set_property(fuel_psy, POWER_SUPPLY_PROP_CHARGE_TYPE, &value); } #endif switch (set_cable_status) { case CABLE_TYPE_MISC: //value.intval = POWER_SUPPLY_TYPE_MISC; break; case CABLE_TYPE_USB: value.intval = POWER_SUPPLY_TYPE_USB; break; case CABLE_TYPE_219KUSB: case CABLE_TYPE_AC: case CABLE_TYPE_AUDIO_DOCK: case CABLE_TYPE_UNDEFINED: value.intval = POWER_SUPPLY_TYPE_MAINS; break; case CABLE_TYPE_CARDOCK: //value.intval = POWER_SUPPLY_TYPE_CARDOCK; break; case CABLE_TYPE_CDP: value.intval = POWER_SUPPLY_TYPE_USB_CDP; break; case CABLE_TYPE_INCOMPATIBLE: value.intval = POWER_SUPPLY_TYPE_UNKNOWN; break; case CABLE_TYPE_DESK_DOCK: case CABLE_TYPE_SMART_DOCK: value.intval = POWER_SUPPLY_TYPE_MAINS; break; case CABLE_TYPE_JIG_UART_OFF_VB: //value.intval = POWER_SUPPLY_TYPE_UARTOFF; break; case CABLE_TYPE_DESK_DOCK_NO_VB: case CABLE_TYPE_SMART_DOCK_NO_VB: case CABLE_TYPE_UARTOFF: case CABLE_TYPE_UARTON: case CABLE_TYPE_NONE: value.intval = POWER_SUPPLY_TYPE_BATTERY; break; case CABLE_TYPE_CHARGING_CABLE: value.intval = POWER_SUPPLY_TYPE_POWER_SHARING; break; default: pr_err("%s: invalid cable :%d\n", __func__, set_cable_status); return; } current_cable_type = value.intval; pr_info("%s:MUIC setting the cable type as (%d)\n", __func__, value.intval); if (!psy || !psy->set_property || !psy_ps->set_property) pr_err("%s: fail to get battery ps/psy\n", __func__); else { if (current_cable_type == POWER_SUPPLY_TYPE_POWER_SHARING) { value.intval = current_cable_type; psy_ps->set_property(psy_ps, POWER_SUPPLY_PROP_ONLINE, &value); } else { if (previous_cable_type == CABLE_TYPE_CHARGING_CABLE) { value.intval = current_cable_type; psy_ps->set_property(psy_ps, POWER_SUPPLY_PROP_ONLINE, &value); } else { value.intval = current_cable_type; psy->set_property(psy, POWER_SUPPLY_PROP_ONLINE, &value); } } } previous_cable_type = set_cable_status; }
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) {