@ -20,6 +20,15 @@ static struct twl6030_data twl6030_info = {
. vbat_shift = TWL6030_VBAT_SHIFT ,
} ;
static struct twl6030_data twl6032_info = {
. chip_type = chip_TWL6032 ,
. adc_rbase = TWL6032_GPCH0_LSB ,
. adc_ctrl = TWL6032_CTRL_P1 ,
. adc_enable = CTRL_P1_SP1 ,
. vbat_mult = TWL6032_VBAT_MULT ,
. vbat_shift = TWL6032_VBAT_SHIFT ,
} ;
static int twl6030_gpadc_read_channel ( u8 channel_no )
{
u8 lsb = 0 ;
@ -115,6 +124,18 @@ int twl6030_get_battery_voltage(void)
{
int battery_volt = 0 ;
int ret = 0 ;
u8 vbatch ;
if ( twl - > chip_type = = chip_TWL6030 ) {
vbatch = TWL6030_GPADC_VBAT_CHNL ;
} else {
ret = twl6030_i2c_write_u8 ( TWL6030_CHIP_ADC ,
TWL6032_GPSELECT_ISB ,
TWL6032_GPADC_VBAT_CHNL ) ;
if ( ret )
return ret ;
vbatch = 0 ;
}
/* Start GPADC SW conversion */
ret = twl6030_gpadc_sw2_trigger ( ) ;
@ -124,7 +145,7 @@ int twl6030_get_battery_voltage(void)
}
/* measure Vbat voltage */
battery_volt = twl6030_gpadc_read_channel ( 7 ) ;
battery_volt = twl6030_gpadc_read_channel ( vbatch ) ;
if ( battery_volt < 0 ) {
printf ( " Failed to read battery voltage \n " ) ;
return ret ;
@ -137,14 +158,35 @@ int twl6030_get_battery_voltage(void)
void twl6030_init_battery_charging ( void )
{
u8 stat1 = 0 ;
u8 val = 0 ;
int battery_volt = 0 ;
int ret = 0 ;
twl = & twl6030_info ;
ret = twl6030_i2c_read_u8 ( TWL6030_CHIP_USB , USB_PRODUCT_ID_LSB , & val ) ;
if ( ret ) {
puts ( " twl6030_init_battery_charging(): could not determine chip! \n " ) ;
return ;
}
if ( val = = 0x30 ) {
twl = & twl6030_info ;
} else if ( val = = 0x32 ) {
twl = & twl6032_info ;
} else {
puts ( " twl6030_init_battery_charging(): unsupported chip type \n " ) ;
return ;
}
/* Enable VBAT measurement */
twl6030_i2c_write_u8 ( TWL6030_CHIP_PM , MISC1 , VBAT_MEAS ) ;
if ( twl - > chip_type = = chip_TWL6030 ) {
twl6030_i2c_write_u8 ( TWL6030_CHIP_PM , MISC1 , VBAT_MEAS ) ;
twl6030_i2c_write_u8 ( TWL6030_CHIP_ADC ,
TWL6030_GPADC_CTRL ,
GPADC_CTRL_SCALER_DIV4 ) ;
} else {
twl6030_i2c_write_u8 ( TWL6030_CHIP_ADC ,
TWL6032_GPADC_CTRL2 ,
GPADC_CTRL2_CH18_SCALER_EN ) ;
}
/* Enable GPADC module */
ret = twl6030_i2c_write_u8 ( TWL6030_CHIP_CHARGER , TOGGLE1 , FGS | GPADCS ) ;
@ -161,10 +203,10 @@ void twl6030_init_battery_charging(void)
printf ( " Main battery voltage too low! \n " ) ;
/* Check for the presence of USB charger */
twl6030_i2c_read_u8 ( TWL6030_CHIP_CHARGER , CONTROLLER_STAT1 , & stat1 ) ;
twl6030_i2c_read_u8 ( TWL6030_CHIP_CHARGER , CONTROLLER_STAT1 , & val ) ;
/* check for battery presence indirectly via Fuel gauge */
if ( ( stat1 & VBUS_DET ) & & ( battery_volt < 3300 ) )
if ( ( val & VBUS_DET ) & & ( battery_volt < 3300 ) )
twl6030_start_usb_charging ( ) ;
return ;