// ============================================================ //
static kal_uint32 charging_hw_init_bq24196(void *data)
{
	kal_uint32 status = STATUS_OK;

	upmu_set_rg_bc11_bb_ctrl(1);    //BC11_BB_CTRL
	upmu_set_rg_bc11_rst(1);        //BC11_RST

	bq24196_set_en_hiz(0x0);
	bq24196_set_vindpm(0xA); //VIN DPM check 4.68V
	bq24196_set_reg_rst(0x0);
	bq24196_set_wdt_rst(0x1); //Kick watchdog
	bq24196_set_sys_min(0x5); //Minimum system voltage 3.5V
	bq24196_set_iprechg(0x3); //Precharge current 512mA
	bq24196_set_iterm(0x0); //Termination current 128mA

	bq24196_set_vreg(0x2C); //VREG 4.208V

	bq24196_set_batlowv(0x1); //BATLOWV 3.0V
	bq24196_set_vrechg(0x0); //VRECHG 0.1V (4.108V)
	bq24196_set_en_term(0x1); //Enable termination
	bq24196_set_term_stat(0x0); //Match ITERM
	bq24196_set_watchdog(0x1); //WDT 40s
	bq24196_set_en_timer(0x0); //Disable charge timer
	bq24196_set_int_mask(0x0); //Disable fault interrupt

	return status;
}
static kal_uint32 charging_hw_init(void *data)
{
	kal_uint32 status = STATUS_OK;

    bq24196_set_en_hiz(0x0);
	bq24196_set_vindpm(0xA); //VIN DPM check 4.68V
	bq24196_set_reg_rst(0x0);
	bq24196_set_wdt_rst(0x1); //Kick watchdog	
	bq24196_set_sys_min(0x5); //Minimum system voltage 3.5V	
	bq24196_set_iprechg(0x3); //Precharge current 512mA
	bq24196_set_iterm(0x0); //Termination current 128mA

	#if defined(HIGH_BATTERY_VOLTAGE_SUPPORT)
	bq24196_set_vreg(0x32); //VREG 4.304V
	#else
	bq24196_set_vreg(0x2C); //VREG 4.208V
	#endif    

	bq24196_set_batlowv(0x1); //BATLOWV 3.0V
	bq24196_set_vrechg(0x0); //VRECHG 0.1V (4.108V)
	bq24196_set_en_term(0x1); //Enable termination
	bq24196_set_term_stat(0x0); //Match ITERM
	bq24196_set_watchdog(0x1); //WDT 40s
	bq24196_set_en_timer(0x0); //Disable charge timer
	bq24196_set_int_mask(0x0); //Disable fault interrupt

	#if defined(MTK_WIRELESS_CHARGER_SUPPORT)
	if(wireless_charger_gpio_number!=0)
	{
		mt_set_gpio_mode(wireless_charger_gpio_number,0); // 0:GPIO mode
		mt_set_gpio_dir(wireless_charger_gpio_number,0); // 0: input, 1: output
	}
	#endif

	#ifdef CONFIG_MTK_DUAL_INPUT_CHARGER_SUPPORT
	mt_set_gpio_mode(vin_sel_gpio_number,0); // 0:GPIO mode
	mt_set_gpio_dir(vin_sel_gpio_number,0); // 0: input, 1: output
	#endif
	return status;
}
static kal_uint32 charging_set_cv_voltage_bq24196(void *data)
{
	kal_uint32 status = STATUS_OK;
	kal_uint16 register_value;
	kal_uint32 cv_value = *(kal_uint32 *)(data);

	if(cv_value == BATTERY_VOLT_04_200000_V)
	{
		//use nearest value
		cv_value = 4208000;
	}
	register_value = charging_parameter_to_value(VBAT_CV_VTH_BQ24196, GETARRAYNUM(VBAT_CV_VTH_BQ24196), cv_value);
	bq24196_set_vreg(register_value);

	return status;
}
 static kal_uint32 charging_hw_init(void *data)
 {
 	kal_uint32 status = STATUS_OK;
	
	upmu_set_rg_bc11_bb_ctrl(1);    //BC11_BB_CTRL    
    upmu_set_rg_bc11_rst(1);        //BC11_RST
	
#if 0 //no use
    //pull PSEL low
    mt_set_gpio_mode(GPIO_CHR_PSEL_PIN,GPIO_MODE_GPIO);  
    mt_set_gpio_dir(GPIO_CHR_PSEL_PIN,GPIO_DIR_OUT);
    mt_set_gpio_out(GPIO_CHR_PSEL_PIN,GPIO_OUT_ZERO);
#endif    
    
    //pull CE low
#if 0 //no use
    mt_set_gpio_mode(GPIO_CHR_CE_PIN,GPIO_MODE_GPIO);  
    mt_set_gpio_dir(GPIO_CHR_CE_PIN,GPIO_DIR_OUT);
    mt_set_gpio_out(GPIO_CHR_CE_PIN,GPIO_OUT_ZERO);    
#endif

    //battery_xlog_printk(BAT_LOG_FULL, "gpio_number=0x%x,gpio_on_mode=%d,gpio_off_mode=%d\n", gpio_number, gpio_on_mode, gpio_off_mode);	

    bq24196_set_en_hiz(0x0);
    bq24196_set_vindpm(0xA); //VIN DPM check 4.68V
    bq24196_set_reg_rst(0x0);
	bq24196_set_wdt_rst(0x1); //Kick watchdog	
    bq24196_set_sys_min(0x5); //Minimum system voltage 3.5V	
	bq24196_set_iprechg(0x3); //Precharge current 512mA
	bq24196_set_iterm(0x0); //Termination current 128mA

    bq24196_set_vreg(0x2C); //VREG 4.208V
  
    bq24196_set_batlowv(0x1); //BATLOWV 3.0V
    bq24196_set_vrechg(0x0); //VRECHG 0.1V (4.108V)
    bq24196_set_en_term(0x1); //Enable termination
    bq24196_set_term_stat(0x0); //Match ITERM
    bq24196_set_watchdog(0x1); //WDT 40s
    bq24196_set_en_timer(0x0); //Disable charge timer
    bq24196_set_int_mask(0x0); //Disable fault interrupt
    
    return status;
 }
 static kal_uint32 charging_set_cv_voltage(void *data)
 {
 	kal_uint32 status = STATUS_OK;
	kal_uint16 register_value;
	kal_uint32 cv_value = *(kal_uint32 *)(data);	
	
	//if(cv_value == BATTERY_VOLT_04_200000_V)
	//{
#if defined(HIGH_BATTERY_VOLTAGE_SUPPORT)
        //highest of voltage will be 4.3V, because powerpath limitation
		cv_value = 4304000;		
#else
		//use nearest value
		cv_value = 4208000;
#endif	    
 	//}
	register_value = charging_parameter_to_value(VBAT_CV_VTH, GETARRAYNUM(VBAT_CV_VTH), cv_value);
	bq24196_set_vreg(register_value); 

	return status;
 } 	
static kal_uint32 charging_set_cv_voltage(void *data)
{
	kal_uint32 status = STATUS_OK;
	kal_uint32 array_size;
	kal_uint32 set_cv_voltage;
	kal_uint16 register_value;
	kal_uint32 cv_value = *(kal_uint32 *)(data);	
	static kal_int16 pre_register_value = -1;

	#if defined(HIGH_BATTERY_VOLTAGE_SUPPORT)
	//highest of voltage will be 4.3V, because powerpath limitation
	if(cv_value >= BATTERY_VOLT_04_300000_V)
		cv_value = 4304000;
	#endif

	//use nearest value
	if(BATTERY_VOLT_04_200000_V == cv_value)
		cv_value = 4208000;

	array_size = GETARRAYNUM(VBAT_CV_VTH);
	set_cv_voltage = bmt_find_closest_level(VBAT_CV_VTH, array_size, cv_value);
	register_value = charging_parameter_to_value(VBAT_CV_VTH, array_size, set_cv_voltage);

	//PCB workaround
	if(mt6325_upmu_get_swcid() == PMIC6325_E1_CID_CODE)
	{
		#if defined(CV_E1_INTERNAL)
		bq24196_set_vreg(0x1F);//4.0v
		#else
		bq24196_set_vreg(0x14);//3.8v
		#endif
		battery_log(BAT_LOG_CRTI, "[charging_set_cv_voltage] set low CV by 6325 E1\n");
	}
	else
	{
		if(is_mt6311_exist())
		{
			if(mt6311_get_chip_id()==PMIC6311_E1_CID_CODE)
			{
				#if defined(CV_E1_INTERNAL)
				bq24196_set_vreg(0x1F);//4.0v
				#else
				bq24196_set_vreg(0x14);//3.8v
				#endif
				battery_log(BAT_LOG_CRTI, "[charging_set_cv_voltage] set low CV by 6311 E1\n");
			}
			else
			{
				if (pre_register_value != register_value) {
						battery_log(BAT_LOG_CRTI, "[charging_set_cv_voltage] disable charging\n");
						bq24196_set_chg_config(0);
				}

				bq24196_set_vreg(register_value);
				if (pre_register_value != register_value)
					bq24196_set_chg_config(1);

				pre_register_value = register_value;
			}
		}
		else
		{
			bq24196_set_vreg(register_value);
		}
	}

	return status;
}