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;
		}
	}
}