@ -26,6 +26,8 @@
# include <i2c.h>
# include <miiphy.h>
# include <cpsw.h>
# include <power/tps65217.h>
# include <power/tps65910.h>
# include "board.h"
DECLARE_GLOBAL_DATA_PTR ;
@ -244,6 +246,138 @@ const struct dpll_params dpll_ddr_evm_sk = {
const struct dpll_params dpll_ddr_bone_black = {
400 , OSC - 1 , 1 , - 1 , - 1 , - 1 , - 1 } ;
void am33xx_spl_board_init ( void )
{
struct am335x_baseboard_id header ;
struct dpll_params dpll_mpu = { 0 , OSC - 1 , 1 , - 1 , - 1 , - 1 , - 1 } ;
int mpu_vdd ;
if ( read_eeprom ( & header ) < 0 )
puts ( " Could not get board ID. \n " ) ;
/* Get the frequency */
dpll_mpu . m = am335x_get_efuse_mpu_max_freq ( cdev ) ;
if ( board_is_bone ( & header ) | | board_is_bone_lt ( & header ) ) {
/* BeagleBone PMIC Code */
int usb_cur_lim ;
/*
* Only perform PMIC configurations if board rev > A1
* on Beaglebone White
*/
if ( board_is_bone ( & header ) & & ! strncmp ( header . version ,
" 00A1 " , 4 ) )
return ;
if ( i2c_probe ( TPS65217_CHIP_PM ) )
return ;
/*
* On Beaglebone White we need to ensure we have AC power
* before increasing the frequency .
*/
if ( board_is_bone ( & header ) ) {
uchar pmic_status_reg ;
if ( tps65217_reg_read ( TPS65217_STATUS ,
& pmic_status_reg ) )
return ;
if ( ! ( pmic_status_reg & TPS65217_PWR_SRC_AC_BITMASK ) ) {
puts ( " No AC power, disabling frequency switch \n " ) ;
return ;
}
}
/*
* Override what we have detected since we know if we have
* a Beaglebone Black it supports 1 GHz .
*/
if ( board_is_bone_lt ( & header ) )
dpll_mpu . m = MPUPLL_M_1000 ;
/*
* Increase USB current limit to 1300 mA or 1800 mA and set
* the MPU voltage controller as needed .
*/
if ( dpll_mpu . m = = MPUPLL_M_1000 ) {
usb_cur_lim = TPS65217_USB_INPUT_CUR_LIMIT_1800MA ;
mpu_vdd = TPS65217_DCDC_VOLT_SEL_1325MV ;
} else {
usb_cur_lim = TPS65217_USB_INPUT_CUR_LIMIT_1300MA ;
mpu_vdd = TPS65217_DCDC_VOLT_SEL_1275MV ;
}
if ( tps65217_reg_write ( TPS65217_PROT_LEVEL_NONE ,
TPS65217_POWER_PATH ,
usb_cur_lim ,
TPS65217_USB_INPUT_CUR_LIMIT_MASK ) )
puts ( " tps65217_reg_write failure \n " ) ;
/* Set DCDC2 (MPU) voltage */
if ( tps65217_voltage_update ( TPS65217_DEFDCDC2 , mpu_vdd ) ) {
puts ( " tps65217_voltage_update failure \n " ) ;
return ;
}
/*
* Set LDO3 , LDO4 output voltage to 3.3 V for Beaglebone .
* Set LDO3 to 1.8 V and LDO4 to 3.3 V for Beaglebone Black .
*/
if ( board_is_bone ( & header ) ) {
if ( tps65217_reg_write ( TPS65217_PROT_LEVEL_2 ,
TPS65217_DEFLS1 ,
TPS65217_LDO_VOLTAGE_OUT_3_3 ,
TPS65217_LDO_MASK ) )
puts ( " tps65217_reg_write failure \n " ) ;
} else {
if ( tps65217_reg_write ( TPS65217_PROT_LEVEL_2 ,
TPS65217_DEFLS1 ,
TPS65217_LDO_VOLTAGE_OUT_1_8 ,
TPS65217_LDO_MASK ) )
puts ( " tps65217_reg_write failure \n " ) ;
}
if ( tps65217_reg_write ( TPS65217_PROT_LEVEL_2 ,
TPS65217_DEFLS2 ,
TPS65217_LDO_VOLTAGE_OUT_3_3 ,
TPS65217_LDO_MASK ) )
puts ( " tps65217_reg_write failure \n " ) ;
} else {
int sil_rev ;
/*
* The GP EVM , IDK and EVM SK use a TPS65910 PMIC . For all
* MPU frequencies we support we use a CORE voltage of
* 1.1375 V . For MPU voltage we need to switch based on
* the frequency we are running at .
*/
if ( i2c_probe ( TPS65910_CTRL_I2C_ADDR ) )
return ;
/*
* Depending on MPU clock and PG we will need a different
* VDD to drive at that speed .
*/
sil_rev = readl ( & cdev - > deviceid ) > > 28 ;
mpu_vdd = am335x_get_tps65910_mpu_vdd ( sil_rev , dpll_mpu . m ) ;
/* Tell the TPS65910 to use i2c */
tps65910_set_i2c_control ( ) ;
/* First update MPU voltage. */
if ( tps65910_voltage_update ( MPU , mpu_vdd ) )
return ;
/* Second, update the CORE voltage. */
if ( tps65910_voltage_update ( CORE , TPS65910_OP_REG_SEL_1_1_3 ) )
return ;
}
/* Set MPU Frequency to what we detected now that voltages are set */
do_setup_dpll ( & dpll_mpu_regs , & dpll_mpu ) ;
}
const struct dpll_params * get_dpll_ddr_params ( void )
{
struct am335x_baseboard_id header ;