示例#1
0
int _cable_status_now_(void)
{
	int ret = 0;

	ret = get_real_usbic_state();

	return ret;
}
示例#2
0
static ssize_t usb_state_show(struct device *dev, struct device_attribute *attr, char *buf)
{
#ifdef CONFIG_FSA9480_MICROUSB
	int cable_state = get_real_usbic_state();
	//  int cable_state = get_usbic_state();
#endif

	sprintf(buf, "%s\n", (cable_state == MICROUSBIC_USB_CABLE)?"USB_STATE_CONFIGURED":"USB_STATE_NOTCONFIGURED");

	return sprintf(buf, "%s\n", buf);
} 
示例#3
0
int _cable_status_now_( void )
{
	int ret = 0;

	if ( sec_bci->charger.use_ta_nconnected_irq )
	{
		ret = gpio_get_value( KTA_NCONN_GPIO ) ? 0 : 1;
	}
#ifndef CONFIG_USB_SWITCH_FSA9480
	else
	{
		ret = get_real_usbic_state();
	}
#endif

	return ret;
}
示例#4
0
static void twl6030charger_ctrl_work_handler(struct work_struct *work)
{
	struct charger_device_info *di = container_of(work,
						      struct charger_device_info,
						      twl6030charger_ctrl_work.work);
	
	int ret;
	int n_usbic_state;
	
	int charger_fault = 0;
	long int events;
	u8 stat_toggle, stat_reset, stat_set = 0;
	u8 charge_state = 0;
	u8 present_charge_state = 0;
	u8 ac_or_vbus, no_ac_and_vbus = 0;
	u8 hw_state = 0, temp = 0;

	dev_dbg(di->dev, "[TA] %s start\n",__func__);

	clear_charge_start_time();
	
	/* read charger controller_stat1 */
	ret = twl_i2c_read_u8(TWL6030_MODULE_CHARGER, &present_charge_state,
		CONTROLLER_STAT1);
	if (ret)
		return 0;

	twl_i2c_read_u8(TWL6030_MODULE_ID0, &hw_state, STS_HW_CONDITIONS);

	charge_state = di->stat1;

	stat_toggle = charge_state ^ present_charge_state;
	stat_set = stat_toggle & present_charge_state;
	stat_reset = stat_toggle & charge_state;

	no_ac_and_vbus = !((present_charge_state) & (VBUS_DET | VAC_DET));
	ac_or_vbus = charge_state & (VBUS_DET | VAC_DET);
	if (no_ac_and_vbus && ac_or_vbus) {
		dev_dbg(di->dev, "[TA] No Charging source\n");
		/* disable charging when no source present */
	}

	charge_state = present_charge_state;
	di->stat1 = present_charge_state;

	if (stat_reset & VBUS_DET) {
		/* On a USB detach, UNMASK VBUS OVP if masked*/
		twl_i2c_read_u8(TWL6030_MODULE_CHARGER, &temp,
			CHARGERUSB_INT_MASK);
		if (temp & MASK_MCHARGERUSB_FAULT)
			twl_i2c_write_u8(TWL6030_MODULE_CHARGER,
				(temp & ~MASK_MCHARGERUSB_FAULT),
					CHARGERUSB_INT_MASK);
		dev_dbg(di->dev, "[TA] Charging source removed\n");
		change_cable_status(POWER_SUPPLY_TYPE_BATTERY, di);
#ifdef CONFIG_DYNAMIC_TSP_SETTINGS_FOR_CHARGER_STATE
		set_tsp_for_ta_detect(0);
#endif

	}

	if (stat_set & VBUS_DET) {
		/* In HOST mode (ID GROUND) when a device is connected, Mask
		 * VBUS OVP interrupt and do no enable usb charging
		 */
		if (hw_state & STS_USB_ID) {
			twl_i2c_read_u8(TWL6030_MODULE_CHARGER, &temp,
				CHARGERUSB_INT_MASK);
			if (!(temp & MASK_MCHARGERUSB_FAULT))
				twl_i2c_write_u8(TWL6030_MODULE_CHARGER,
					(temp | MASK_MCHARGERUSB_FAULT),
						CHARGERUSB_INT_MASK);
		} else {
			n_usbic_state = get_real_usbic_state();
			dev_dbg(di->dev,
				"[TA] cable_detection_isr handler. usbic_state: %d\n",
				n_usbic_state);

			switch (n_usbic_state) {
			case MICROUSBIC_5W_CHARGER:
			case MICROUSBIC_TA_CHARGER:
			case MICROUSBIC_USB_CHARGER:
			case MICROUSBIC_PHONE_USB:
			case MICROUSBIC_USB_CABLE:
			case MICROUSBIC_MHL_CHARGER:
			case MICROUSBIC_JIG_USB_ON:
				if (sec_bci->charger.cable_status == POWER_SUPPLY_TYPE_USB
				    || sec_bci->charger.cable_status == POWER_SUPPLY_TYPE_MAINS ){
					dev_dbg(di->dev,
						"[TA] Already Plugged\n");
					break;
				}

				/*Check VF */
				sec_bci->battery.battery_vf_ok = check_battery_vf();

				/*TA or USB or MHL is inserted */
				if (n_usbic_state == MICROUSBIC_USB_CABLE) {
					//current : 395mA
					dev_dbg(di->dev,"[TA] USB CABLE PLUGGED\n");
					change_cable_status(POWER_SUPPLY_TYPE_USB, di);
#ifdef CONFIG_DYNAMIC_TSP_SETTINGS_FOR_CHARGER_STATE
					set_tsp_for_ta_detect(1);
#endif
				} else if (n_usbic_state == MICROUSBIC_MHL_CHARGER) {
					//current : 395mA
					dev_dbg(di->dev,"[TA] MHL CABLE PLUGGED\n");
					change_cable_status(POWER_SUPPLY_TYPE_USB, di);
#ifdef CONFIG_DYNAMIC_TSP_SETTINGS_FOR_CHARGER_STATE
					set_tsp_for_ta_detect(1);
#endif
				} else if (n_usbic_state == MICROUSBIC_JIG_USB_ON) {
					//current : 1000mA
					dev_dbg(di->dev,"[TA] JIG_USB_ON CABLE PLUGGED\n");
					change_cable_status(POWER_SUPPLY_TYPE_MAINS, di);
#ifdef CONFIG_DYNAMIC_TSP_SETTINGS_FOR_CHARGER_STATE
					set_tsp_for_ta_detect(1);
#endif
				} else {
					//current : 1000mA
					dev_dbg(di->dev,"[TA] CHARGER CABLE PLUGGED\n");
					change_cable_status(POWER_SUPPLY_TYPE_MAINS, di);
#ifdef CONFIG_DYNAMIC_TSP_SETTINGS_FOR_CHARGER_STATE
					set_tsp_for_ta_detect(1);
#endif
				}

				break;

			default:
				;
				
			}
		}
	}
	
	
	if (sec_bci->charger.prev_cable_status == -1
		&& sec_bci->charger.cable_status == -1) {
		dev_dbg(di->dev,"[TA] Fisrt time after bootig.\n");
		change_cable_status(POWER_SUPPLY_TYPE_BATTERY, di);
#ifdef CONFIG_DYNAMIC_TSP_SETTINGS_FOR_CHARGER_STATE
		set_tsp_for_ta_detect(0);
#endif
	}
	

	if (stat_set & CONTROLLER_STAT1_FAULT_WDG) {
//		charger_fault = 1;
		dev_dbg(di->dev, "Fault watchdog fired\n");
	}
	if (stat_reset & CONTROLLER_STAT1_FAULT_WDG)
		dev_dbg(di->dev, "Fault watchdog recovered\n");
	if (stat_set & CONTROLLER_STAT1_BAT_REMOVED)
		dev_dbg(di->dev, "Battery removed\n");
	if (stat_reset & CONTROLLER_STAT1_BAT_REMOVED)
		dev_dbg(di->dev, "Battery inserted\n");
	if (stat_set & CONTROLLER_STAT1_BAT_TEMP_OVRANGE)
		dev_dbg(di->dev, "Battery temperature overrange\n");
	if (stat_reset & CONTROLLER_STAT1_BAT_TEMP_OVRANGE)
		dev_dbg(di->dev, "Battery temperature within range\n");

	if (charger_fault) {
		change_charge_status(POWER_SUPPLY_STATUS_NOT_CHARGING);
		dev_err(di->dev, "Charger Fault stop charging\n");
	}

}
示例#5
0
static void full_charge_work_handler( struct work_struct *work )
// ----------------------------------------------------------------------------
// Description    : 
// Input Argument :  
// Return Value   : None
{
	struct charger_driver_info *di;
	int count;
	int n_usbic_state;

	if ( !sec_bci->charger.is_charging )
		goto Enable_IRQ_Full_Det;

#ifndef CONFIG_USB_SWITCH_FSA9480
	n_usbic_state = get_real_usbic_state();

	switch ( n_usbic_state )
	{
	case MICROUSBIC_5W_CHARGER :
	case MICROUSBIC_TA_CHARGER :
	case MICROUSBIC_USB_CHARGER :
	case MICROUSBIC_USB_CABLE :
	case MICROUSBIC_PHONE_USB : 
		break;

	default :
		//not conn
		goto Enable_IRQ_Full_Det;		
	}
#endif

	count = 0;
	while ( count < 10 )
	{
		if ( !gpio_get_value( KCHG_ING_GPIO ) )
		{
			goto Enable_IRQ_Full_Det;
			break;
		}
		msleep( 10 );
		count++;
	}

	di  = container_of( work, struct charger_driver_info, full_charge_work.work );

	// check VF INVALID
	sec_bci->battery.battery_vf_ok = check_battery_vf();

	if ( sec_bci->battery.battery_vf_ok )
	{
		if ( device_config->SUPPORT_CHG_ING_IRQ )
		{
			if ( gpio_get_value( KCHG_ING_GPIO ) && sec_bci->charger.is_charging )
			{
				printk( "[TA] Charge FULL!\n" );
				change_charge_status( POWER_SUPPLY_STATUS_FULL, CHARGE_DUR_ACTIVE );
			}
		}
	}
	else
	{
		// VF OPEN
		printk( "[TA] VF OPEN !!\n     Stop charging !!\n" );
		sec_bci->battery.battery_health = POWER_SUPPLY_HEALTH_DEAD;
		change_charge_status( POWER_SUPPLY_STATUS_NOT_CHARGING, CHARGE_DUR_ACTIVE );
	}

//	int n_usbic_state;

//	n_usbic_state = get_real_usbic_state();

//	switch ( n_usbic_state )
//	{
//	case MICROUSBIC_5W_CHARGER :
//	case MICROUSBIC_TA_CHARGER :
//	case MICROUSBIC_USB_CHARGER :
//	case MICROUSBIC_USB_CABLE :

//		if ( gpio_get_value( KCHG_ING_GPIO ) && sec_bci->charger.is_charging )
//		{
//			printk( "[TA] Charge FULL!\n" );
//			change_charge_status( POWER_SUPPLY_STATUS_FULL, CHARGE_DUR_ACTIVE );
//		}

//		break;
		
//	default :
//		;
//	}

Enable_IRQ_Full_Det :
	enable_irq( KCHG_ING_IRQ );

}
示例#6
0
static void cable_detection_work_handler( struct work_struct * work )
// ----------------------------------------------------------------------------
// Description    : 
// Input Argument :  
// Return Value   : None
{
printk( "cable_detection_work_handler :----------------------------- \n");
	struct charger_driver_info *di = container_of( work,
							struct charger_driver_info,
							cable_detection_work.work );

	int n_usbic_state;
	int count;
	int ret;

	if ( !sec_bci->ready )
	{
		queue_delayed_work( sec_bci->sec_battery_workq, &di->cable_detection_work, HZ );
		return;
	}

	clear_charge_start_time();

#ifdef CONFIG_USB_SWITCH_FSA9480
	n_usbic_state = di->cable_status;
#else
	n_usbic_state = get_real_usbic_state();
#endif
	printk( "[TA] cable_detection_isr handler. usbic_state: %d\n", n_usbic_state );

	if ( sec_bci->charger.use_ta_nconnected_irq )
	{
		if ( gpio_get_value( KTA_NCONN_GPIO ) )
		{
			count = 0;
			while ( count < 10 )
			{
				if ( gpio_get_value( KTA_NCONN_GPIO ) )
				{
					count++;
					msleep( 1 );
					if ( count == 10 )
					{
						n_usbic_state = -10;
						printk( "[TA] CABLE UNPLUGGED.\n" );
					}
				}
				else
					break;

			}
		}
	}

	// Workaround for Archer [
	if ( !n_usbic_state && sec_bci->charger.use_ta_nconnected_irq )
	{
		if ( !gpio_get_value( KTA_NCONN_GPIO ) )
			n_usbic_state = MICROUSBIC_5W_CHARGER;
	}
	// ]

	switch ( n_usbic_state )
	{
#ifdef CONFIG_USB_SWITCH_FSA9480
	case CABLE_TYPE_USB :
	case CABLE_TYPE_AC :
#else
	case MICROUSBIC_5W_CHARGER :
	case MICROUSBIC_TA_CHARGER :
	case MICROUSBIC_USB_CHARGER :
	case MICROUSBIC_PHONE_USB : 
	case MICROUSBIC_USB_CABLE :
#endif

		if ( sec_bci->charger.cable_status == POWER_SUPPLY_TYPE_USB
			|| sec_bci->charger.cable_status == POWER_SUPPLY_TYPE_MAINS )
		{
			printk( "[TA] already Plugged.\n" );
			goto Out_IRQ_Cable_Det;
		}


#ifdef WR_ADC
		/* Workaround to get proper adc value */
#ifdef CONFIG_USB_SWITCH_FSA9480
		if(n_usbic_state != CABLE_TYPE_USB)
#else
		if(n_usbic_state != MICROUSBIC_USB_CABLE)
#endif
		{
			if ( !di->usb3v1_is_enabled )
			{
				ret = regulator_enable( di->usb3v1 );
				if ( ret )
					printk("Regulator 3v1 error!!\n");
				else
					di->usb3v1_is_enabled = true;
			}
		}

		twl_i2c_write_u8( TWL4030_MODULE_PM_RECEIVER, REMAP_ACTIVE, TWL4030_VUSB3V1_REMAP );
		twl_i2c_write_u8( TWL4030_MODULE_PM_RECEIVER, REMAP_ACTIVE, TWL4030_VINTANA2_REMAP );

		msleep( 100 );
#endif

		/*Check VF*/
		sec_bci->battery.battery_vf_ok = check_battery_vf();


		/*TA or USB is inserted*/
#ifdef CONFIG_USB_SWITCH_FSA9480
		if ( n_usbic_state == CABLE_TYPE_USB )
#else
		if ( n_usbic_state == MICROUSBIC_USB_CABLE )
#endif
		{
			//current : 482mA
			printk( "[TA] USB CABLE PLUGGED\n" );
			change_cable_status( POWER_SUPPLY_TYPE_USB, di, CHARGE_DUR_ACTIVE );
		}
		else
		{
			//current : 636mA
			printk( "[TA] CHARGER CABLE PLUGGED\n" );
			change_cable_status( POWER_SUPPLY_TYPE_MAINS, di, CHARGE_DUR_ACTIVE );
		}
		
		if ( device_config->SUPPORT_CHG_ING_IRQ )
			enable_irq( KCHG_ING_IRQ );

		break;

	default:
		if ( sec_bci->charger.prev_cable_status != POWER_SUPPLY_TYPE_BATTERY
			&& sec_bci->charger.cable_status == POWER_SUPPLY_TYPE_BATTERY )
		{
			printk( "[TA] already Unplugged.\n" );
			goto Out_IRQ_Cable_Det;
		}
		else if ( sec_bci->charger.prev_cable_status == -1
			&& sec_bci->charger.cable_status == -1 )
		{
			// first time after booting.
			printk( "[TA] Fisrt time after bootig.\n" );
			goto FirstTime_Boot;
		}


		disable_irq( KCHG_ING_IRQ );

#ifdef WR_ADC
		/* Workaround to get proper adc value */
		if ( di->usb3v1_is_enabled )
			regulator_disable( di->usb3v1 );

		di->usb3v1_is_enabled = false;

		twl_i2c_write_u8( TWL4030_MODULE_PM_RECEIVER, REMAP_OFF, TWL4030_VUSB3V1_REMAP );
		twl_i2c_write_u8( TWL4030_MODULE_PM_RECEIVER, REMAP_OFF, TWL4030_VINTANA2_REMAP );
#endif

FirstTime_Boot:
		/*TA or USB is ejected*/
		printk( "[TA] CABLE UNPLUGGED\n" );
		change_cable_status( POWER_SUPPLY_TYPE_BATTERY, di, CHARGE_DUR_ACTIVE );

		break;
	}

Out_IRQ_Cable_Det:
	;
#ifdef USE_DISABLE_CONN_IRQ
#ifdef MANAGE_CONN_IRQ
	enable_irq_conn( true );
#else
	if ( !sec_bci->charger.use_ta_nconnected_irq )
		enable_irq( KUSB_CONN_IRQ );

	enable_irq( KTA_NCONN_IRQ );
#endif
#endif
}