static void tsu8111_check_ovp() { struct i2c_client *client = chip->client; u8 val1,chg_status; msleep(300); fsa9480_read_reg(client, FSA9480_REG_DEV_T1, &val1); fsa9480_read_reg(client, FSA9480_REG_CHG_STATUS, &chg_status); printk("check ovp: dev1: 0x%x, chg_status: 0x%x\n",val1, chg_status); if( (val1 & DEV_VBUS) && (chg_status & (CH_FAULT|CH_IDLE)) ){ ovp_status = 1; #if defined(CONFIG_BATTERY_D2083) if(spa_external_event) spa_external_event(D2083_CATEGORY_BATTERY, D2083_EVENT_OVP_CHARGE_STOP); #endif pr_info("%s: OVP Chg Stop\n",__func__); } else if( ovp_status==1 ){ if( chg_status & (CH_FC|CH_CV) ){ ovp_status = 0; #if defined(CONFIG_BATTERY_D2083) if(spa_external_event) spa_external_event(D2083_CATEGORY_BATTERY, D2083_EVENT_OVP_CHARGE_RESTART); #endif pr_info("%s: OVP Chg Restart\n",__func__); } } }
static void fsa880_detect_dev(struct fsa880_usbsw *usbsw, u8 intr) { u8 val1, val2; struct fsa880_platform_data *pdata = usbsw->pdata; struct i2c_client *client = usbsw->client; fsa880_read_reg(client, FSA880_REG_DEV_T1, &val1); fsa880_read_reg(client, FSA880_REG_DEV_T2, &val2); printk("%s val1=0x%x val2=0x%x\n",__func__,val1,val2); if((intr==0x01) &&(val1==0x00) && (val2==0x00) && (isProbe == 0)) { fsa880_read_adc_value(); msleep(50); fsa880_read_reg(client, FSA880_REG_DEV_T1, &val1); fsa880_read_reg(client, FSA880_REG_DEV_T2, &val2); } /* Attached */ if (intr & (1 << 0)) { if (val1 & FSA880_DEV_T1_USB_MASK ||val2 & FSA880_DEV_T2_USB_MASK) { printk("[FSA880] FSA880_USB ATTACHED*****\n"); #if defined(CONFIG_SPA) if(spa_external_event) { spa_external_event(SPA_CATEGORY_DEVICE, SPA_DEVICE_EVENT_USB_ATTACHED); } #endif #if defined(CONFIG_SEC_CHARGING_FEATURE) sprd_update_charger_type(POWER_SUPPLY_TYPE_USB); spa_event_handler(SPA_EVT_CHARGER, POWER_SUPPLY_TYPE_USB); #endif } if (val1 & FSA880_DEV_T1_UART_MASK ||val2 & FSA880_DEV_T2_UART_MASK) { //if (pdata->uart_cb) // pdata->uart_cb(FSA9480_ATTACHED); } if (val1 & FSA880_DEV_T1_CHARGER_MASK) { printk("[FSA880] Charger ATTACHED*****\n"); #if defined(CONFIG_SPA) if(spa_external_event) { spa_external_event(SPA_CATEGORY_DEVICE, SPA_DEVICE_EVENT_TA_ATTACHED); } #endif #if defined(CONFIG_SEC_CHARGING_FEATURE) sprd_update_charger_type(POWER_SUPPLY_TYPE_USB_DCP); spa_event_handler(SPA_EVT_CHARGER, POWER_SUPPLY_TYPE_USB_DCP); #endif } if (val2 & FSA880_DEV_T2_JIG_MASK) { printk("[FSA880] JIG ATTACHED*****\n"); wake_lock(&JIGConnect_idle_wake); wake_lock(&JIGConnect_suspend_wake); #if defined(CONFIG_SPA) if(spa_external_event) { spa_external_event(SPA_CATEGORY_DEVICE, SPA_DEVICE_EVENT_JIG_ATTACHED); } #endif } } else if (intr & (1 << 1)) { /* DETACH */ if (usbsw->dev1 & FSA880_DEV_T1_USB_MASK ||usbsw->dev2 & FSA880_DEV_T2_USB_MASK) { printk("[FSA880] FSA880_USB Detached*****\n"); #if defined(CONFIG_SPA) if(spa_external_event) { spa_external_event(SPA_CATEGORY_DEVICE, SPA_DEVICE_EVENT_USB_DETACHED); } #endif #if defined(CONFIG_SEC_CHARGING_FEATURE) sprd_update_charger_type(POWER_SUPPLY_TYPE_BATTERY); spa_event_handler(SPA_EVT_CHARGER, POWER_SUPPLY_TYPE_BATTERY); #endif } if (usbsw->dev1 & FSA880_DEV_T1_UART_MASK ||usbsw->dev2 & FSA880_DEV_T2_UART_MASK) { //if (pdata->uart_cb) // pdata->uart_cb(FSA9480_DETACHED); } if (usbsw->dev1 & FSA880_DEV_T1_CHARGER_MASK) { printk("[FSA880] Charger Detached*****\n"); #if defined(CONFIG_SPA) if(spa_external_event) { spa_external_event(SPA_CATEGORY_DEVICE, SPA_DEVICE_EVENT_TA_DETACHED); } #endif #if defined(CONFIG_SEC_CHARGING_FEATURE) sprd_update_charger_type(POWER_SUPPLY_TYPE_BATTERY); spa_event_handler(SPA_EVT_CHARGER, POWER_SUPPLY_TYPE_BATTERY); #endif } if (usbsw->dev2 & FSA880_DEV_T2_JIG_MASK) { printk("[FSA880] JIG Detached*****\n"); wake_unlock(&JIGConnect_idle_wake); wake_unlock(&JIGConnect_suspend_wake); #if defined(CONFIG_SPA) if(spa_external_event) { spa_external_event(SPA_CATEGORY_DEVICE, SPA_DEVICE_EVENT_JIG_DETACHED); } #endif } } usbsw->dev1 = val1; usbsw->dev2 = val2; chip->dev1 = val1; chip->dev2 = val2; }
static void fsa9480_work_cb(struct work_struct *work) { u8 intr, intr2, intr3; struct fsa9480_usbsw *usbsw = container_of(work, struct fsa9480_usbsw, work); struct i2c_client *client = usbsw->client; wake_lock_timeout(&mUSB_suspend_wake,1*HZ); /* clear interrupt */ if(muic_type==muicTypeTI6111) { msleep(200); fsa9480_read_reg(client, FSA9480_REG_INT1, &intr); fsa9480_read_reg(client, FSA9480_REG_INT2, &intr2); fsa9480_read_reg(client, FSA9480_REG_CHG_INT, &intr3); printk("[FSA9480] %s: intr=0x%x, intr2 = 0x%X, chg_intr=0x%x \n",__func__,intr,intr2, intr3); } else { fsa9480_read_reg(client, FSA9480_REG_INT1, &intr); fsa9480_read_reg(client, FSA9480_REG_INT2, &intr2); printk("[FSA9480] %s: intr=0x%x, intr2=0x%x \n",__func__,intr,intr2); } if(intr3 & CH_DONE) //EOC disable charger // Luke { //msleep(500); // Test only //fsa9480_read_reg(client, FSA9480_REG_DEV_T1, &val1); //if(val1&=DEV_VBUS) // Check if VBUS is valid //Luke //{ #if defined(CONFIG_BATTERY_D2083) if(spa_external_event) { pr_info("%s. Send D2083_EVENT_CHARGE_FULL event\n", __func__); spa_external_event(D2083_CATEGORY_BATTERY, D2083_EVENT_CHARGE_FULL); } //} #endif } intr &= 0xffff; /* device detection */ fsa9480_detect_dev(usbsw, intr); if((intr== 0x00) && (intr3 == 0)) { printk("[FSA9480] (intr== 0x00) in work_cb !!!!!\n"); fsa9480_read_adc_value(); #if 0 // TODO: if(muic_type==muicTypeTI6111) TI_SWreset(usbsw); #endif return; } if(!(intr3 & CH_DONE)) tsu8111_check_ovp(); if( intr==0x03) // INT error case fsa9480_reset_ic(); }
//extern void mv_usb_connect_change(int status); // khMa static void fsa9480_detect_dev(struct fsa9480_usbsw *usbsw, u8 intr) { u8 val1, val2;// , ctrl,temp; //struct fsa9480_platform_data *pdata = usbsw->pdata; struct i2c_client *client = usbsw->client; printk("[FSA9480] fsa9480_detect_dev !!!!!\n"); #if 0 // Not for TI /*reset except CP USB and AV dock*/ if ((usbsw->mansw != AUDIO) && (usbsw->mansw != AUDIO_9485) && (usbsw->mansw != VAUDIO) && (usbsw->mansw != VAUDIO_9485)) { /*reset UIC when mansw is not set*/ printk("[FSA9480] %s: reset UIC mansw is 0x%x\n",__func__,usbsw->mansw); fsa9480_write_reg(client, FSA9480_REG_CTRL, 0x1E); usbsw->mansw = AUTO; } #endif fsa9480_read_reg(client, FSA9480_REG_DEV_T1, &val1); fsa9480_read_reg(client, FSA9480_REG_DEV_T2, &val2); printk("intr: 0x%x, dev1: 0x%x, dev2: 0x%x\n",intr, val1, val2); #if 0//Not for TI fsa9480_read_reg(client, FSA9480_REG_CTRL, &ctrl); dev_info(&client->dev, "intr: 0x%x, dev1: 0x%x, dev2: 0x%x, ctrl: 0x%x\n", intr, val1, val2,ctrl); #endif if((intr==0x01) &&(val1==0x00) && (val2==0x00) && (isProbe == 0)) { printk("[FSA9480] (intr==0x01) &&(val1==0x00) && (val2==0x00) !!!!!\n"); fsa9480_read_adc_value(); if(muic_type==muicTypeTI6111) { msleep(50); fsa9480_read_reg(client, FSA9480_REG_DEV_T1, &val1); fsa9480_read_reg(client, FSA9480_REG_DEV_T2, &val2); //TI_SWreset(usbsw); //return; } } else if(intr==0x03) { printk("[FSA9480] error read INT register !!!!!\n"); intr = (1 << 1); // change to DETACH } /* Attached */ if (intr & (1 << 0)) { if (val1 & FSA9480_DEV_T1_USB_MASK ) { printk("[FSA9480] FSA9480_USB ATTACHED*****\n"); #if defined (VBUS_DETECT) /* Enable clock to AP USB block */ pxa_vbus_handler(VBUS_HIGH); #endif #if defined(CONFIG_SPA) if(spa_external_event) { spa_external_event(SPA_CATEGORY_DEVICE, SPA_DEVICE_EVENT_USB_ATTACHED); } #elif defined(CONFIG_BATTERY_D2083) if(spa_external_event) { spa_external_event(D2083_CATEGORY_DEVICE, D2083_EVENT_USB_ATTACHED); } #endif send_usb_attach_event(); } if (val1 & FSA9480_DEV_T1_UART_MASK || val2 & FSA9480_DEV_T2_UART_MASK) { //if (pdata->uart_cb) // pdata->uart_cb(FSA9480_ATTACHED); } if (val1 & FSA9480_DEV_T1_CHARGER_MASK || val1==DEV_VBUS || val2 & DEV_JIG_USB_OFF) { printk("[FSA9480] Charger ATTACHED*****\n"); #if defined(CONFIG_SPA) if(spa_external_event) { spa_external_event(SPA_CATEGORY_DEVICE, SPA_DEVICE_EVENT_TA_ATTACHED); } #elif defined(CONFIG_BATTERY_D2083) if(spa_external_event) { spa_external_event(D2083_CATEGORY_DEVICE, D2083_EVENT_TA_ATTACHED); } #endif } if (val2 & FSA9480_DEV_T2_JIG_MASK) { printk("[FSA9480] JIG ATTACHED*****\n"); //wake_lock(&JIGConnect_idle_wake); wake_lock(&JIGConnect_suspend_wake); #ifdef CONFIG_KONA_PI_MGR pi_mgr_qos_request_update(&qos_node, 0); #endif #if defined(CONFIG_SPA) if(spa_external_event) { spa_external_event(SPA_CATEGORY_DEVICE, SPA_DEVICE_EVENT_JIG_ATTACHED); } #elif defined(CONFIG_BATTERY_D2083) if(spa_external_event) { spa_external_event(D2083_CATEGORY_DEVICE, D2083_EVENT_JIG_ATTACHED); } #endif } } else if (intr & (1 << 1)) { /* DETACH */ if(usbsw->dev1 & FSA9480_DEV_T1_USB_MASK) { printk("[FSA9480] FSA9480_USB Detached*****\n"); #if defined (VBUS_DETECT) /* Disable clock to AP USB block */ pxa_vbus_handler(VBUS_LOW); #endif #if defined(CONFIG_SPA) if(spa_external_event) { spa_external_event(SPA_CATEGORY_DEVICE, SPA_DEVICE_EVENT_USB_DETACHED); } #elif defined(CONFIG_BATTERY_D2083) if(spa_external_event) { spa_external_event(D2083_CATEGORY_DEVICE, D2083_EVENT_USB_DETACHED); } #endif send_usb_detach_event(); } if (usbsw->dev1 & FSA9480_DEV_T1_UART_MASK || usbsw->dev2 & FSA9480_DEV_T2_UART_MASK) { //if (pdata->uart_cb) // pdata->uart_cb(FSA9480_DETACHED); } if (usbsw->dev1 & FSA9480_DEV_T1_CHARGER_MASK || usbsw->dev1==DEV_VBUS || usbsw->dev2 & DEV_JIG_USB_OFF) { printk("[FSA9480] Charger Detached*****\n"); #if defined(CONFIG_SPA) if(spa_external_event) { spa_external_event(SPA_CATEGORY_DEVICE, SPA_DEVICE_EVENT_TA_DETACHED); } #elif defined(CONFIG_BATTERY_D2083) if(spa_external_event) { spa_external_event(D2083_CATEGORY_DEVICE, D2083_EVENT_TA_DETACHED); } #endif } if (usbsw->dev2 & FSA9480_DEV_T2_JIG_MASK) { printk("[FSA9480] JIG Detached*****\n"); //wake_unlock(&JIGConnect_idle_wake); wake_unlock(&JIGConnect_suspend_wake); #ifdef CONFIG_KONA_PI_MGR pi_mgr_qos_request_update(&qos_node, PI_MGR_QOS_DEFAULT_VALUE); #endif #if defined(CONFIG_SPA) if(spa_external_event) { spa_external_event(SPA_CATEGORY_DEVICE, SPA_DEVICE_EVENT_JIG_DETACHED); } #elif defined(CONFIG_BATTERY_D2083) if(spa_external_event) { spa_external_event(D2083_CATEGORY_DEVICE, D2083_EVENT_JIG_DETACHED); } #endif if(muic_type==muicTypeTI6111) { /*SW RESET for TI USB:To fix no USB recog problem after jig attach&detach*/ //TI_SWreset(usbsw); } } } if( intr ){ usbsw->dev1 = val1; usbsw->dev2 = val2; chip->dev1 = val1; chip->dev2 = val2; } #if 0 // Not for TI fsa9480_read_reg(client, FSA9480_REG_CTRL, &ctrl); ctrl &= ~INT_MASK; fsa9480_write_reg(client, FSA9480_REG_CTRL, ctrl); fsa9480_read_reg(client, FSA9480_REG_MANSW1, &temp); //khMa #endif }
static void bq24157_stat_irq_work(struct work_struct *work) { struct bq24157_platform_data *pdata = container_of(work, struct bq24157_platform_data, stat_irq_work.work); unsigned char data = 0; int ret = 0; int stat = gpio_get_value(GPIO_IRQ(bq24157_client->irq))? 1 : 0; printk("%s \n", __func__); if((bq24157_is_ovp==1) && (stat == 0)) { bq24157_is_ovp = 0; #if defined(CONFIG_SPA) if(spa_external_event) { spa_external_event(SPA_CATEGORY_BATTERY, SPA_BATTERY_EVENT_OVP_CHARGE_RESTART); } #endif goto ovp_restart; } ret = bq24157_i2c_read(1, BQ24157_STATUS_CONTROL, &data); if(ret < 0) { printk("%s bq24157_i2c_read failed %d\n", __func__, ret); goto err_read_status_control; } printk("%s 0x%x stat : %d\n", __func__, data, stat); switch(data & STAT) { case STAT_READY: break; case STAT_INPROGRESS: break; case STAT_CHARGE_DONE: #if defined(CONFIG_SPA) if(spa_external_event) { spa_external_event(SPA_CATEGORY_BATTERY, SPA_BATTERY_EVENT_CHARGE_FULL); } #endif break; case STAT_FAULT: switch(data & FAULT) { case FAULT_NORMAL: break; case FAULT_VBUS_OVP: #if defined(CONFIG_SPA) if(spa_external_event) { spa_external_event(SPA_CATEGORY_BATTERY, SPA_BATTERY_EVENT_OVP_CHARGE_STOP); } #endif break; case FAULT_SLEEP_MODE: break; case FAULT_BAD_ADAPTOR: break; case FAULT_OUTPUT_OVP: break; case FAULT_THEMAL_SHUTDOWN: break; case FAULT_TIMER_FAULT: break; case FAULT_NO_BATTERY: break; default: break; } break; default: break; } ovp_restart: err_read_status_control: wake_unlock(&pdata->stat_irq_wakelock); }