Esempio n. 1
0
int max14526_muic_init(TYPE_RESET reset)
{
    int ret;

    /* clear default switch position */ 
    // COMP2 to H-Z /COMN1 to H-Z (0x03=0x24)    
    ret=  MUIC_Reg_Write(&s_hMuicHandle, SW_CTRL_REG, COMP2_TO_HZ|COMN1_TO_HZ);
    // Enable 200K, ADC (0x01=0x12)
    ret=  MUIC_Reg_Write(&s_hMuicHandle, CTRL1_REG, ID_200_M|ADC_EN_M);
    // Enable Interrupts (0x02 = 0x40)
    ret=  MUIC_Reg_Write(&s_hMuicHandle, CTRL2_REG, INT_EN_M);
   
    DP3T_Switch_ctrl(DP3T_NC);
    USIF_ctrl(USIF_IPC);
    
    //20100526, [email protected], Charging IC Reset [START]
#if defined(CONFIG_STAR_BATTERY_CHARGER)
    if ( !reset )
    {
        lprintk(D_MUIC, "%s: charging_ic_deactive call \n", __func__ );
        charging_ic_deactive();
    }
#endif /* CONFIG_STAR_BATTERY_CHARGER */
    //20100526, [email protected], Charging IC Reset [END]

    wake_unlock(&s_hMuicHandle.wlock);
    current_device = DEVICE_NONE;
    return ret;
}
Esempio n. 2
0
// TA connection, ISET mode
void charging_ic_set_ta_mode(void)
{

    if(charging_ic_status == POWER_SUPPLY_TYPE_MAINS)
    {
        printk("[charger_rt9536] :: it's already %s mode!! : \n", __func__);
        return;
    }

    if(charging_ic_status != POWER_SUPPLY_TYPE_BATTERY)
    {
        charging_ic_deactive();
    }

    mutex_lock(&charging_lock);

    mt_set_gpio_out(CHG_EN_SET_N, GPIO_OUT_ZERO);
    udelay(400);
    mt_set_gpio_out(CHG_EN_SET_N, GPIO_OUT_ONE);
    udelay(400);  // about 400 us
    mt_set_gpio_out(CHG_EN_SET_N, GPIO_OUT_ZERO);
    udelay(1500);

    charging_ic_status = POWER_SUPPLY_TYPE_MAINS;

    mutex_unlock(&charging_lock);

    printk("[charger_rt9536] :: %s : \n", __func__);
}
static ssize_t fuel_cal_show(struct device *dev,
			     struct device_attribute *attr,
			     char *buf)
{
#if 0
	int val, gauge_diff;
	static int gauge_cal_check = 1;
	TYPE_MUIC_MODE muic_mode = MUIC_NONE;

	muic_mode = get_muic_mode();
	gauge_diff = refer_di->battery_capacity -(refer_di->voltage_uV-3300) *100 /900;

	if (((gauge_diff > 30) || (gauge_diff < -40)) && (muic_mode != MUIC_NONE)) {
		printk("[BATTERY] error in gauge IC value, difference value is %d \n",gauge_diff);
		gauge_cal_check = 0;
	}
	printk("[BATTERY] success to access fuel_cal_show \n"); 
	if (gauge_cal_check == 0) 
	{
		val = 1;
		printk("[BATTERY] Gauge Calibration started in fuel_cal_show\n");
		if (refer_di->battery_present == 1) charging_ic_deactive();
		//refer_di->gauge_error = 1;
		gauge_cal_check = 1;
	}
	else
	{
		//refer_di->gauge_error = 0;
		val = 0;
	}
#endif
	return sprintf(buf, "0\n");
}
Esempio n. 4
0
// USB500 mode charging
void charging_ic_active_default(void)
{
    u32 wait;

    if(charging_ic_status == POWER_SUPPLY_TYPE_USB)
    {
		battery_log(BAT_LOG_CRTI,  "[charger_rt9536] :: it's already %s mode!!\n", __func__);
        return;
    }

    if(charging_ic_status != POWER_SUPPLY_TYPE_BATTERY)
    {
        charging_ic_deactive();
    }

    mutex_lock(&charging_lock);

    // USB500 mode
#if (1)
    charging_ic_set_chargingmode(CHR_USB_500_MODE);
#else
    mt_set_gpio_out(CHG_EN_SET_N, GPIO_OUT_ZERO);
    udelay(1500);
#endif /* 1 */

    charging_ic_status = POWER_SUPPLY_TYPE_USB;

    mutex_unlock(&charging_lock);

	battery_log(BAT_LOG_CRTI,  "[charger_rt9536] :: %s :\n", __func__);

}
Esempio n. 5
0
// USB500 mode charging
void charging_ic_active_default(void)
{
    
    if(charging_ic_status == POWER_SUPPLY_TYPE_USB)
    {
        printk("[charger_rt9536] :: it's already %s mode!!\n", __func__);
        return;
    }

    if(charging_ic_status != POWER_SUPPLY_TYPE_BATTERY)
    {
        charging_ic_deactive();
    }

    mutex_lock(&charging_lock);

    // USB500 mode
    mt_set_gpio_out(CHG_EN_SET_N, GPIO_OUT_ZERO);
    udelay(1500);

    charging_ic_status = POWER_SUPPLY_TYPE_USB;

    mutex_unlock(&charging_lock);

    printk("[charger_rt9536] :: %s : \n", __func__);

}
static int check_battery_changed(struct twl4030_bci_device_info *di)
{
	static int battery_calibration_enabled = 0;
	int need_recalibration = 0;
	int upper_limit, lower_limit;
	
	if(battery_calibration_enabled) {	// Voltage Calibration Complete
		start_monitor = 0;
		set_end_of_charge(0);
		set_charging_timer(0);
		di->charge_status = POWER_SUPPLY_STATUS_CHARGING;
		battery_calibration_enabled = 0;
		printk(KERN_INFO "[BATTERY] ReCalibration Done!\n");
		return 2;
	}

	if(di->charge_rsoc == POWER_SUPPLY_TYPE_BATTERY)
		return 0;
	if(di->battery_present == 0)			// Cannot do anything without battery
		return 0;
	if((di->temp_C < 0 || di->temp_C > 60) && di->temp_control != UNLIMITED_TEMP_VAL){ // 20120725, [email protected], Enable charging by fake mode.
		// Ignore when low or high temperature
		return 0;
	}

	// Set Voltage Limit
	// TODO : 300 and -250 is tuning value. must be verified.
	upper_limit = 300;
	lower_limit = -250;

	// Check battery changed while phone turned on
	if(di->battery_present  == 1 &&
	   di->previous_battery_present == 0) {		// Battery Inserted
		need_recalibration = 1;
	} else {
		int voltage_diff;
		voltage_diff = di->voltage_uV - di->previous_voltage_uV;
		if(voltage_diff > upper_limit) {			// too much voltage increase
			if(di->previous_charge_rsoc != POWER_SUPPLY_TYPE_BATTERY) {
			   	need_recalibration = 1;
			}
		} else if(voltage_diff < lower_limit) {	// too much voltage drop
			need_recalibration = 1;
		}
	}

	if(need_recalibration) {
		charging_ic_deactive();
		battery_calibration_enabled = 1;
		di->charge_status = POWER_SUPPLY_STATUS_UNKNOWN;
		printk(KERN_INFO "[BATTERY] Need To Calibration!\n");
		printk(KERN_INFO "[BATTERY] %dmV -> %dmV\n", di->previous_voltage_uV, di->voltage_uV);
		mdelay(50);						// wait for voltage drop - charging ic deactived.

		max17043_do_calibrate();		// Fuel Gauge Recalibration takes 1~3 sec.

	}
	return need_recalibration;
}
Esempio n. 7
0
// TA connection, ISET mode
void charging_ic_set_ta_mode()
{
    u32 wait;

    if(charging_ic_status == POWER_SUPPLY_TYPE_MAINS)
    {
        xlog_printk(ANDROID_LOG_INFO, "Power/Charger", "[charger_rt9536] :: it's already %s mode!! : \n", __func__);
        return;
    }

    if(charging_ic_status != POWER_SUPPLY_TYPE_BATTERY)
    {
        charging_ic_deactive();
    }
/*                                                                                                              */
#ifdef SINGLE_CHARGER_CONTOL_USING_GPT_TIMER
    mutex_lock(&charging_lock);
    wait = 0;
    while (wait < 10)
    {
        if (Set_Charging_Commmand(CHARGING_SET_TA_MODE_COMMAND) == KAL_TRUE)
        {
            break;
        }
        wait++;
        mdelay(10);
    }
    charging_ic_status = POWER_SUPPLY_TYPE_MAINS;
    mutex_unlock(&charging_lock);
#else

    mutex_lock(&charging_lock);

//                                                                                    
#if defined(SINGLE_CHARGER_CONTROL_USING_SPIN_LOCK)
    charging_ic_set_chargingmode(CHR_ISET_MODE);
#else
    mt_set_gpio_out(CHG_EN_SET_N, GPIO_OUT_ZERO);
    udelay(400);
    mt_set_gpio_out(CHG_EN_SET_N, GPIO_OUT_ONE);
    udelay(400);  // about 400 us
    mt_set_gpio_out(CHG_EN_SET_N, GPIO_OUT_ZERO);
    udelay(1800);

    /*                                                                                       */
    high_volt_setting();
    /*                                                                                       */
#endif
//                                                                                    

    charging_ic_status = POWER_SUPPLY_TYPE_MAINS;

    mutex_unlock(&charging_lock);
#endif
/*                                                                                                              */

    xlog_printk(ANDROID_LOG_INFO, "Power/Charger", "[charger_rt9536] :: %s : \n", __func__);
}
Esempio n. 8
0
static int charging_ic_remove(struct platform_device *dev)
{
	charging_ic_deactive();

	free_irq(CHG_STATUS_N_OMAP, NULL);

	gpio_free(CHG_EN_SET_N_OMAP);
	gpio_free(CHG_STATUS_N_OMAP);

	return 0;
}
Esempio n. 9
0
ssize_t charging_ic_store_status(struct device *dev,
			  struct device_attribute *attr,
			  const char *buf,
			  size_t count)
{
	if(buf[0] == '0') {
		charging_ic_deactive();
	} else if(buf[0] == '1') {
		charging_ic_set_ta_mode();
	}
	return count;
}
Esempio n. 10
0
void charging_ic_set_factory_mode(void)
{
    u32 wait;

#if 0
    if(charging_ic_status == POWER_SUPPLY_TYPE_FACTORY)
    {
		battery_log(BAT_LOG_CRTI,  "[charger_rt9536] :: it's already %s mode!! :\n", __func__);
        return;
    }
#endif /* 0 */

	battery_log(BAT_LOG_CRTI,  "[charger_rt9536] :: charging_ic_set_factory_mode\n");

    if(charging_ic_status != POWER_SUPPLY_TYPE_BATTERY)
    {
        charging_ic_deactive();
    }

    mutex_lock(&charging_lock);

#if (1)
    charging_ic_set_chargingmode(CHR_PTM_MODE);
#else
    mt_set_gpio_out(CHG_EN_SET_N, GPIO_OUT_ZERO);
    udelay(400);
    mt_set_gpio_out(CHG_EN_SET_N, GPIO_OUT_ONE);
    udelay(400);
    mt_set_gpio_out(CHG_EN_SET_N, GPIO_OUT_ZERO);
    udelay(400);
    mt_set_gpio_out(CHG_EN_SET_N, GPIO_OUT_ONE);
    udelay(400);
    mt_set_gpio_out(CHG_EN_SET_N, GPIO_OUT_ZERO);
    udelay(400);
    mt_set_gpio_out(CHG_EN_SET_N, GPIO_OUT_ONE);
    udelay(400);
    mt_set_gpio_out(CHG_EN_SET_N, GPIO_OUT_ZERO);
    udelay(1500);
#endif /* 0 */

#if 0
    charging_ic_status = POWER_SUPPLY_TYPE_FACTORY;
#endif /* 0 */

    mutex_unlock(&charging_lock);

	battery_log(BAT_LOG_CRTI,  "[charger_rt9536] :: %s :\n", __func__);
}
Esempio n. 11
0
void rt9536_charging_enable(unsigned int set_current, unsigned int enable)
{
    if (enable)
    {
        if ( set_current == AC_CHARGER_CURRENT )
            charging_ic_set_ta_mode();
        else if ( set_current == USB_CHARGER_CURRENT )
            charging_ic_set_usb_mode();
        else
            charging_ic_active_default();

        printk("[charger_rt9536] :: %s, current(%d), enable(%d)\n", __func__, set_current, enable);
    }
    else
    {
        charging_ic_deactive();
        printk("[charger_rt9536] :: %s, enable(%d)\n", __func__, enable);        
    }
    
}
Esempio n. 12
0
void charging_ic_set_factory_mode(void)
{

#if 0
    if(charging_ic_status == POWER_SUPPLY_TYPE_FACTORY)
    {
        printk("Power/Charger", "[charger_rt9536] :: it's already %s mode!! : \n", __func__);
        return;
    }
#endif /* 0 */

    if(charging_ic_status != POWER_SUPPLY_TYPE_BATTERY)
    {
        charging_ic_deactive();
    }

    mutex_lock(&charging_lock);

    mt_set_gpio_out(CHG_EN_SET_N, GPIO_OUT_ZERO);
    udelay(400);
    mt_set_gpio_out(CHG_EN_SET_N, GPIO_OUT_ONE);
    udelay(400);
    mt_set_gpio_out(CHG_EN_SET_N, GPIO_OUT_ZERO);
    udelay(400);
    mt_set_gpio_out(CHG_EN_SET_N, GPIO_OUT_ONE);
    udelay(400);
    mt_set_gpio_out(CHG_EN_SET_N, GPIO_OUT_ZERO);
    udelay(400);
    mt_set_gpio_out(CHG_EN_SET_N, GPIO_OUT_ONE);
    udelay(400);
    mt_set_gpio_out(CHG_EN_SET_N, GPIO_OUT_ZERO);
    udelay(1500);

#if 0
    charging_ic_status = POWER_SUPPLY_TYPE_FACTORY;
#endif /* 0 */

    mutex_unlock(&charging_lock);

    printk("[charger_rt9536] :: %s : \n", __func__);
}
Esempio n. 13
0
void muic_initialize_max(TYPE_RESET reset)
{    
#if defined(CONFIG_MACH_STAR_REV_D) || defined(CONFIG_MACH_STAR_REV_E) || defined(CONFIG_MACH_STAR_REV_F)
    NvOdmGpioSetState(s_hMuicHandle.hGpio, s_hMuicHandle.h_USB_VBUS_EN, DISABLE);
#endif
    // Enable 200K, ADC (0x01=0x12)
    Set_MAX14526_ADDR(CTRL1_REG, ID_200_M| ADC_EN_M);
    // Enable Interrupts (0x02 = 0x40)
    Set_MAX14526_ADDR(CTRL2_REG, INT_EN_M);
    
    //20100526, [email protected], Charging IC Reset [START]
#if defined(CONFIG_STAR_BATTERY_CHARGER)
    if ( !reset )
    {
        lprintk(D_MUIC, "%s: charging_ic_deactive call \n", __func__ );
        charging_ic_deactive();
    }
#endif /* CONFIG_STAR_BATTERY_CHARGER */
    //20100526, [email protected], Charging IC Reset [END]
    wake_unlock(&s_hMuicHandle.wlock);
}
Esempio n. 14
0
// TA connection, ISET mode
void charging_ic_set_ta_mode(void)
{
    u32 wait;

	battery_log(BAT_LOG_CRTI,  "[charger_rt9536] :: charging_ic_set_ta_mode\n");

    if(charging_ic_status == POWER_SUPPLY_TYPE_MAINS)
    {
		battery_log(BAT_LOG_CRTI,  "[charger_rt9536] :: it's already %s mode!! :\n", __func__);
        return;
    }

    if(charging_ic_status != POWER_SUPPLY_TYPE_BATTERY)
    {
        charging_ic_deactive();
    }

    mutex_lock(&charging_lock);

#if (1)
    charging_ic_set_chargingmode(CHR_ISET_MODE);
#else
    mt_set_gpio_out(CHG_EN_SET_N, GPIO_OUT_ZERO);
    udelay(400);
    mt_set_gpio_out(CHG_EN_SET_N, GPIO_OUT_ONE);
    udelay(400);  // about 400 us
    mt_set_gpio_out(CHG_EN_SET_N, GPIO_OUT_ZERO);
    udelay(1500);
#endif /* 1 */

    charging_ic_status = POWER_SUPPLY_TYPE_MAINS;

    mutex_unlock(&charging_lock);

	battery_log(BAT_LOG_CRTI,  "[charger_rt9536] :: %s :\n", __func__);
}
Esempio n. 15
0
s32 muic_device_detection(s32 upon_irq)
{
/* LGE_CHANGE_START 2011-03-16 [email protected] patch for Adb offline set and Mass Storage Driver detecting fail */    
	/* 20110113 [email protected] check muic driver init. state [START] */
	if(!muic_init_done){

		printk(KERN_WARNING "[MUIC] MUIC has not been initialized! Nothing will be done!!!.\n");
		return 0;
	}	
    /* 20110113 [email protected] check muic driver init. state [END] */
/* LGE_CHANGE_END 2011-03-16 [email protected] */
	// Read INT_STAT_REG (0x04)
	muic_i2c_read_byte(INT_STAT, &int_stat_val);
	printk(KERN_INFO "[MUIC] INT_STAT = %x\n", int_stat_val);

	switch (muic_mode)
	{
	case MUIC_NONE:
	case MUIC_UNKNOWN:
		muic_device_none_detect();
		break;

	// CP UART Mode
	case MUIC_CP_UART:
	case MUIC_AP_UART:
		if ((int_stat_val & MIDNO) == 0x0b) {
			muic_mode = MUIC_NONE;
		}
		else {
			muic_device_none_detect();
		}
		break;

	// TA Mode
	case MUIC_NA_TA:
	case MUIC_LG_TA:
	case MUIC_HCHH:
	case MUIC_INVALID_CHG:
		if ((int_stat_val & MVBUS) == 0) {
			// Exit Charger Mode
			muic_mode = MUIC_NONE;
		}
		else {
			// Bug fix: charger detect interrupt 2 times
			set_wakelock(0);
		}
		break;

	// USB Mode
	case MUIC_AP_USB:
	case MUIC_CP_USB:
		if ((int_stat_val & MVBUS) == 0){
			// Exit USB Mode
			muic_mode = MUIC_NONE;
		}
		else {
			muic_device_none_detect();
		}
		break;

	default:
		muic_mode = MUIC_NONE;
		break;
	}

	if (muic_mode == MUIC_NONE) {
		muic_initialize(DEFAULT);
		printk(KERN_INFO "[MUIC] muic none\n");
		charging_ic_deactive();
		printk(KERN_INFO "[MUIC] charging_ic_deactive()\n");
	}

	charger_state_update_by_other();

	return 0;
}
Esempio n. 16
0
/* LGE_UPDATE_S [[email protected]] 2010-12-01, modify detection scheme */
static void muic_device_none_detect(void)
{
	u8 reg_value;
	u8 status_value;
	s32 ret;
	
	if ((key_col == 3) && (key_row == 0)) // Volume up
		key_was_pressed = 1;
	else if ((key_col == 3) && (key_row == 1)) // Volume down
		key_was_pressed = 2;

	printk(KERN_WARNING "[MUIC] Device_None_Detect int_stat_val = 0x%x\n",int_stat_val);

/* LGE_CHANGE_S [[email protected]] 2010-12-14, CP retain mode */
#ifdef CP_RETAIN	
	if (is_cp_retained)
	{
		//muic_CP_USB_set();
		muic_set_mode(MUIC_CP_USB);
	}
	// IDNO=0100? 130Kohm :: CP UART MODE
	else if(((int_stat_val & MIDNO) == 0x04)
			|| (hidden_menu_switching == 7)) {
/* LGE_CHANGE_E [[email protected]] 2011-01-06, CP retain mode */
#elif defined(USB_RETAIN) /* 2012.05.15, [email protected], USB retain mode. */
	ret = muic_i2c_read_byte_local(INT_STAT, &status_value);
	if(ret < 0)
		printk("[MUIC] [%s-%d] muic_i2c_read_byte_local Fail [ret = %d]\n", __func__, __LINE__, ret);
	else
		printk("[MUIC] [%s-%d] INT_STAT Value is 0x%x / MVBUS bit is %d\n", __func__, __LINE__, 
																	status_value, ((status_value & MVBUS) >> 4));
	if (usb_retained == CP_RETAINED)
	{
		//muic_CP_USB_set();
		if((status_value & MVBUS)) {
			printk("[MUIC] [%s-%d] muic_set_mode(MUIC_CP_USB)\n", __func__, __LINE__);
			muic_set_mode(MUIC_CP_USB);
		}
	}
	else if (usb_retained == AP_RETAINED)
	{
		//muic_AP_USB_set();
		if((status_value & MVBUS)) {
			printk("[MUIC] [%s-%d] muic_set_mode(MUIC_AP_USB)\n", __func__, __LINE__);
            muic_set_mode(MUIC_AP_USB);
		}
	}
    // IDNO=0100? 130Kohm :: CP UART MODE
    else if(((int_stat_val & MIDNO) == 0x04)
            || (hidden_menu_switching == 7)) {

#else		
	if(((int_stat_val & MIDNO) == 0x04)
			|| (hidden_menu_switching == 7)) {
#endif	
		//muic_CP_UART_set();
		muic_set_mode(MUIC_CP_UART);	// [email protected]
	}
	// IDNO=0010? 56Kohm  :: CP USB MODE
	else if (((int_stat_val & MIDNO ) == 0x02) || (hidden_menu_switching == 9)){
		if (key_was_pressed == 2)
			//muic_AP_UART_set();
			muic_set_mode(MUIC_AP_UART);	// [email protected]
		else
			//muic_CP_USB_set();
			muic_set_mode(MUIC_CP_USB);	// [email protected]
	}
	// LGE_UPDATE_S [[email protected]] 2010-12-12, for 910K factory download
	// IDNO=1010? 910Kohm :: CP USB MODE
#ifdef 	CABLE_DETECT_910K	
	else if ((int_stat_val & MIDNO ) == 0x0a) {
		//muic_CP_USB_set();
		muic_set_mode(MUIC_CP_USB);	// [email protected]
	}
	else if ((int_stat_val & MIDNO ) == 0x09) {
		//muic_CP_USB_set();
		muic_set_mode(MUIC_CP_USB);	// [email protected]
	}
#endif
#if 0
	// CHGDET=1?  :: HIGH CURRENT USB or TA?
	else if (int_stat_val & MCHGDET) {
		muic_distinguish_charger();
	}
#endif
	// VBUS=1?  :: TA or AP USB?
	else if (int_stat_val & MVBUS) {
		if (muic_device == MAX14526) {
			// COMP2 to H-Z / COMN1 to C1COMP (0x03=0x23)
			muic_i2c_write_byte_local(SW_CONTROL, 0x23);

			msleep(3);

			// Read STATUS_REG (0x05)
			muic_i2c_read_byte_local(STATUS, &reg_value);

			if (reg_value & 0x01 ) {
				// Dedicated Charger(TA) Detected
				// COMP2 to H-Z / COMN1 to H-Z (0x03=0x24)
				muic_i2c_write_byte_local(SW_CONTROL, DP_OPEN | DM_OPEN);

				charging_ic_set_ta_mode();

				muic_mode = MUIC_NA_TA;
				muic_set_mode(MUIC_NA_TA);		// [email protected] 20120502 MUIC re-work
				printk(KERN_WARNING "[MUIC] Charger detected\n");
			}
			else if (reg_value & 0x80 ) {
				// Dedicated Charger(TA) Detected
				muic_i2c_write_byte_local(SW_CONTROL, DP_OPEN | DM_OPEN);

				charging_ic_set_ta_mode();

				muic_mode = MUIC_NA_TA;
				muic_set_mode(MUIC_NA_TA);
				printk(KERN_WARNING "[MUIC] NA_TA Charger detected\n");
			}
			else if (reg_value & 0x40 ) {
				// Dedicated Charger(TA) Detected
				muic_i2c_write_byte_local(SW_CONTROL, DP_OPEN | DM_OPEN);

				charging_ic_set_ta_mode();

				muic_mode = MUIC_LG_TA;
				muic_set_mode(MUIC_LG_TA);
				printk(KERN_WARNING "[MUIC] LG_TA Charger detected\n");
			}
			else {	// USB Detected
// LGE_UPDATE_S 20110521 [[email protected]] block CP usb for commercial version
#if 0
				if (key_was_pressed == 2)
					//muic_CP_USB_set();
					muic_set_mode(MUIC_CP_USB);	// [email protected]
				else
#endif /* #if 0 */
// LGE_UPDATE_S 20110521 [[email protected]] block CP usb for commercial version
					//muic_AP_USB_set();
					muic_set_mode(MUIC_AP_USB);	// [email protected]
			}
		}
		else { 	// USB Detected
// LGE_UPDATE_S 20110521 [[email protected]] block CP usb for commercial version
#if 0
			if (key_was_pressed == 2)
				//muic_CP_USB_set();
				muic_set_mode(MUIC_CP_USB);	// [email protected]	
			else
#endif /* #if 0 */
// LGE_UPDATE_S 20110521 [[email protected]] block CP usb for commercial version
				//muic_AP_USB_set();
				muic_set_mode(MUIC_AP_USB);	// [email protected]
		}
	}
	else {
		// Accessory Not Supported
		muic_mode = MUIC_NONE;
	}

	key_was_pressed = 0;
}

s32 muic_device_detection(s32 upon_irq)
{
/* LGE_CHANGE_START 2011-03-16 [email protected] patch for Adb offline set and Mass Storage Driver detecting fail */    
	/* 20110113 [email protected] check muic driver init. state [START] */
	if(!muic_init_done){

		printk(KERN_WARNING "[MUIC] MUIC has not been initialized! Nothing will be done!!!.\n");
		return 0;
	}	
    /* 20110113 [email protected] check muic driver init. state [END] */
/* LGE_CHANGE_END 2011-03-16 [email protected] */
	// Read INT_STAT_REG (0x04)
	muic_i2c_read_byte_local(INT_STAT, &int_stat_val);
	printk(KERN_INFO "[MUIC] INT_STAT = %x\n", int_stat_val);

	switch (muic_mode)
	{
	case MUIC_NONE:
	case MUIC_UNKNOWN:
		muic_device_none_detect();
		break;

	// CP UART Mode
	case MUIC_CP_UART:
	case MUIC_AP_UART:
		if ((int_stat_val & MIDNO) == 0x0b) {
			muic_mode = MUIC_NONE;
		}
		else {
			muic_device_none_detect();
		}
		break;

	// TA Mode
	case MUIC_NA_TA:
	case MUIC_LG_TA:
	case MUIC_TA_1A:
	case MUIC_INVALID_CHG:
		if ((int_stat_val & MVBUS) == 0) {
			// Exit Charger Mode
			muic_mode = MUIC_NONE;
		}
		else {
			// Bug fix: charger detect interrupt 2 times
			set_wakelock(0);
		}
		break;

	// USB Mode
	case MUIC_AP_USB:
			android_USB_disconnect(); // for usb disconnect event
	case MUIC_CP_USB:
		if ((int_stat_val & MVBUS) == 0){
			// Exit USB Mode
			muic_mode = MUIC_NONE;
		}
		else {
			muic_device_none_detect();
		}
		break;

	default:
		muic_mode = MUIC_NONE;
		break;
	}

	if (muic_mode == MUIC_NONE) {
		muic_initialize(DEFAULT);
		printk(KERN_INFO "[MUIC] muic none\n");
		charging_ic_deactive();
		printk(KERN_INFO "[MUIC] charging_ic_deactive()\n");
		muic_set_mode(MUIC_NONE);		// [email protected] 20120502 MUIC re-work
	}

	charger_state_update_by_other();

	return 0;
}
EXPORT_SYMBOL(muic_device_detection);
/* LGE_UPDATE_E [[email protected]] 2010-12-01, modify detection scheme */

static void muic_wq_func(struct work_struct *muic_wq){
	s32 ret = 0;
	printk(KERN_INFO "[MUIC] muic_wq_func()\n");
	ret = muic_device_detection(UPON_IRQ);
}
static int set_battery_charging(struct twl4030_bci_device_info *di)
{
	int trickle_chg_max, trickle_chg_min, trickle_chg_timer_start;
	max8922_status chr_ic_status = get_charging_ic_status();
	
	if(di->battery_present == 0 || 						// No Battery State
		di->charge_rsoc == POWER_SUPPLY_TYPE_BATTERY) {	// No Charging Source
		start_monitor = 0;
		set_end_of_charge(0);
		set_charging_timer(0);
		return 0;
	}
	
	/*
	 * Recharging algorithm
     *  - High Temperature : up to 4.0V
     *  - Normal : up to 4.2V
     */
    // Set maximum charging voltage
    if((di->temp_C < TEMP_CRITICAL_LOWER ||
	   di->temp_C > TEMP_CRITICAL_UPPER) && // Critical Temperature! Must stop charging
	   di->temp_control != UNLIMITED_TEMP_VAL){ // 20120725, [email protected], Enable charging by fake mode.
		start_monitor = 0;
		set_end_of_charge(0);
		set_charging_timer(0);
		if (di->battery_present == 1)
        	charging_ic_deactive();
        return 0;
    } else if(di->temp_C < TEMP_LIMIT_LOWER ||
              di->temp_C > TEMP_LIMIT_UPPER) {	// Charging Limit
		trickle_chg_max = 4000;
		trickle_chg_timer_start = 3950;
		trickle_chg_min = 3900;
	} else {									// Normal Charging
		trickle_chg_max = 4220;					// to unintentional charging stop
		trickle_chg_timer_start = 4197;
		trickle_chg_min = 4140;
		if((di->previous_temp_C < TEMP_LIMIT_LOWER ||
		   di->previous_temp_C > TEMP_LIMIT_UPPER) &&
		   di->temp_control != UNLIMITED_TEMP_VAL) { // 20120725, [email protected], Enable charging by fake mode.
			start_monitor = 0;
			set_end_of_charge(0);
			set_charging_timer(0);
		}
	}

	// Deactive charger for protect overcharge & monitoring
	if(chr_ic_status != CHARGING_IC_DEACTIVE) {
		if(/*di->voltage_uV >= trickle_chg_max ||*/ charging_timeout() || end_of_charge) {
			// Battery Full Charged Once. Entering Trickle Charging Mode
			if(!charging_timeout())		// Do not stop charging when timeout occured
				charging_ic_deactive();	// It's not actually charged full.
			set_charging_timer(0);
			set_end_of_charge(0);
			if(start_monitor == 0) {
				printk(KERN_DEBUG "[Battery] Trickle Charging Start!\n");
				start_monitor = 1;
			}
		} else if(di->voltage_uV >= trickle_chg_timer_start) {
			set_charging_timer(1);
		}
	} else if(di->voltage_uV < trickle_chg_min) {	// active charger for recharging
		switch(di->charge_rsoc) {
			case POWER_SUPPLY_TYPE_MAINS:
				charging_ic_set_ta_mode();
				break;
			case POWER_SUPPLY_TYPE_USB:
				charging_ic_set_usb_mode();
				break;
			case POWER_SUPPLY_TYPE_UPS:
				charging_ic_set_factory_mode();
				break;
			default:
				break;
		}
	}
	return 0;
}
Esempio n. 18
0
static int charging_ic_remove(struct platform_device *dev)
{
    charging_ic_deactive();

    return 0;
}