static void bcmpmu_spa_pb_work(struct work_struct *work) { u32 event, data; int spa_evt; struct bcmpmu_spa_pb *bcmpmu_spa_pb; bcmpmu_spa_pb = container_of(work, struct bcmpmu_spa_pb, spa_work.work); BUG_ON(bcmpmu_spa_pb == NULL); mutex_lock(&bcmpmu_spa_pb->lock); if (!__spa_fifo_get(&bcmpmu_spa_pb->spa_fifo, &event, &data)) { pr_pb(FLOW, "%s: event = %d\n", __func__, event); spa_evt = __map_to_spa_event(event); BUG_ON(spa_evt < 0 || spa_evt >= SPA_EVT_MAX); if (PMU_FG_EVT_CAPACITY == event) { bcmpmu_spa_pb->capacity = data; pr_pb(FLOW, "%s: capacity = %d\n", __func__, data); } spa_event_handler(spa_evt, (void *)data); } else pr_pb(ERROR, "%s: Q empty\n", __func__); mutex_unlock(&bcmpmu_spa_pb->lock); if (!SPA_FIFO_IS_EMPTY(bcmpmu_spa_pb->spa_fifo)) schedule_delayed_work(&bcmpmu_spa_pb->spa_work, SPA_WORK_SCHEDULE_DELAY); }
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; }
int bcmpmu_post_spa_event(struct bcmpmu59xxx *bcmpmu, u32 event, u32 param) { pr_pb(FLOW, "%s: event = %d\n", __func__, event); return spa_event_handler(event, (void *)param); }
static void rt9532_irq_work(struct work_struct *work) { int pgb = 0 , chgsb = 0; pgb = gpio_get_value(GPIO_EXT_CHARGER_DET)? 0 : 1; chgsb = gpio_get_value(GPIO_EXT_CHARGER_STATE) ? 0 : 1; pr_info("%s pgb : %d chgsb : %d\n", __func__, pgb, chgsb); if(chgsb) { if(pgb) { if(charger.ovp_flag) { pr_info("%s OVP/UVLO DISABLE\n", __func__); #if defined(CONFIG_SEC_CHARGING_FEATURE) spa_event_handler(SPA_EVT_OVP, 0); #endif charger.ovp_flag = 0; } charger.cc_cv_flag = 1; } } else { if(pgb) { if(charger.is_charge_enabled) { if(charger.cc_cv_flag) { #if !defined(CONFIG_SPA_SUPPLEMENTARY_CHARGING) pr_info("%s FULL CHARGING\n", __func__); #if defined(CONFIG_SEC_CHARGING_FEATURE) spa_event_handler(SPA_EVT_EOC, 0); #endif #endif } } else { if(charger.ovp_flag) { pr_info("%s OVP/UVLO DISABLE\n", __func__); #if defined(CONFIG_SEC_CHARGING_FEATURE) spa_event_handler(SPA_EVT_OVP, 0); #endif charger.ovp_flag = 0; } } charger.cc_cv_flag = 0; } else { if(charger.is_charge_enabled) { if(!charger.ovp_flag) { pr_info("%s OVP/UVLO ENABLE\n", __func__); charger.ovp_flag = 1; #if defined(CONFIG_SEC_CHARGING_FEATURE) spa_event_handler(SPA_EVT_OVP, 1); #endif } } else { if(charger.ovp_flag) { pr_info("%s OVP/UVLO DISABLE\n", __func__); #if defined(CONFIG_SEC_CHARGING_FEATURE) spa_event_handler(SPA_EVT_OVP, 0); #endif charger.ovp_flag = 0; } } charger.cc_cv_flag = 0; } } }