Esempio n. 1
0
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;

}
Esempio n. 3
0
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();
	
}
Esempio n. 4
0
 //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);
}