board: am335x: Introduce scale_vcores

Update voltages before programming plls.

Reviewed-by: Tom Rini <trini@konsulko.com>
Signed-off-by: Lokesh Vutla <lokeshvutla@ti.com>
This commit is contained in:
Lokesh Vutla 2017-05-05 12:59:09 +05:30 committed by Tom Rini
parent 59041a5084
commit 0650798824

View file

@ -264,16 +264,21 @@ const struct dpll_params dpll_ddr_evm_sk = {
const struct dpll_params dpll_ddr_bone_black = { const struct dpll_params dpll_ddr_bone_black = {
400, OSC-1, 1, -1, -1, -1, -1}; 400, OSC-1, 1, -1, -1, -1, -1};
void am33xx_spl_board_init(void) const struct dpll_params *get_dpll_ddr_params(void)
{ {
int mpu_vdd; if (board_is_evm_sk())
return &dpll_ddr_evm_sk;
else if (board_is_bone_lt() || board_is_icev2())
return &dpll_ddr_bone_black;
else if (board_is_evm_15_or_later())
return &dpll_ddr_evm_sk;
else
return &dpll_ddr;
}
/* Get the frequency */ static void scale_vcores_bone(int freq)
dpll_mpu_opp100.m = am335x_get_efuse_mpu_max_freq(cdev); {
int usb_cur_lim, mpu_vdd;
if (board_is_bone() || board_is_bone_lt()) {
/* BeagleBone PMIC Code */
int usb_cur_lim;
/* /*
* Only perform PMIC configurations if board rev > A1 * Only perform PMIC configurations if board rev > A1
@ -295,8 +300,8 @@ void am33xx_spl_board_init(void)
&pmic_status_reg)) &pmic_status_reg))
return; return;
if (!(pmic_status_reg & TPS65217_PWR_SRC_AC_BITMASK)) { if (!(pmic_status_reg & TPS65217_PWR_SRC_AC_BITMASK)) {
puts("No AC power, disabling frequency switch\n"); puts("No AC power, switching to default OPP\n");
return; freq = MPUPLL_M_600;
} }
} }
@ -305,13 +310,9 @@ void am33xx_spl_board_init(void)
* a Beaglebone Black it supports 1GHz. * a Beaglebone Black it supports 1GHz.
*/ */
if (board_is_bone_lt()) if (board_is_bone_lt())
dpll_mpu_opp100.m = MPUPLL_M_1000; freq = MPUPLL_M_1000;
/* if (freq == MPUPLL_M_1000) {
* Increase USB current limit to 1300mA or 1800mA and set
* the MPU voltage controller as needed.
*/
if (dpll_mpu_opp100.m == MPUPLL_M_1000) {
usb_cur_lim = TPS65217_USB_INPUT_CUR_LIMIT_1800MA; usb_cur_lim = TPS65217_USB_INPUT_CUR_LIMIT_1800MA;
mpu_vdd = TPS65217_DCDC_VOLT_SEL_1325MV; mpu_vdd = TPS65217_DCDC_VOLT_SEL_1325MV;
} else { } else {
@ -319,22 +320,40 @@ void am33xx_spl_board_init(void)
mpu_vdd = TPS65217_DCDC_VOLT_SEL_1275MV; mpu_vdd = TPS65217_DCDC_VOLT_SEL_1275MV;
} }
switch (freq) {
case MPUPLL_M_1000:
mpu_vdd = TPS65217_DCDC_VOLT_SEL_1325MV;
usb_cur_lim = TPS65217_USB_INPUT_CUR_LIMIT_1800MA;
break;
case MPUPLL_M_800:
mpu_vdd = TPS65217_DCDC_VOLT_SEL_1275MV;
usb_cur_lim = TPS65217_USB_INPUT_CUR_LIMIT_1800MA;
break;
case MPUPLL_M_720:
mpu_vdd = TPS65217_DCDC_VOLT_SEL_1200MV;
usb_cur_lim = TPS65217_USB_INPUT_CUR_LIMIT_1800MA;
break;
case MPUPLL_M_600:
case MPUPLL_M_500:
case MPUPLL_M_300:
mpu_vdd = TPS65217_DCDC_VOLT_SEL_1100MV;
usb_cur_lim = TPS65217_USB_INPUT_CUR_LIMIT_1300MA;
break;
}
if (tps65217_reg_write(TPS65217_PROT_LEVEL_NONE, if (tps65217_reg_write(TPS65217_PROT_LEVEL_NONE,
TPS65217_POWER_PATH, TPS65217_POWER_PATH,
usb_cur_lim, usb_cur_lim,
TPS65217_USB_INPUT_CUR_LIMIT_MASK)) TPS65217_USB_INPUT_CUR_LIMIT_MASK))
puts("tps65217_reg_write failure\n"); puts("tps65217_reg_write failure\n");
/* Set DCDC3 (CORE) voltage to 1.125V */ /* Set DCDC3 (CORE) voltage to 1.10V */
if (tps65217_voltage_update(TPS65217_DEFDCDC3, if (tps65217_voltage_update(TPS65217_DEFDCDC3,
TPS65217_DCDC_VOLT_SEL_1125MV)) { TPS65217_DCDC_VOLT_SEL_1100MV)) {
puts("tps65217_voltage_update failure\n"); puts("tps65217_voltage_update failure\n");
return; return;
} }
/* Set CORE Frequencies to OPP100 */
do_setup_dpll(&dpll_core_regs, &dpll_core_opp100);
/* Set DCDC2 (MPU) voltage */ /* Set DCDC2 (MPU) voltage */
if (tps65217_voltage_update(TPS65217_DEFDCDC2, mpu_vdd)) { if (tps65217_voltage_update(TPS65217_DEFDCDC2, mpu_vdd)) {
puts("tps65217_voltage_update failure\n"); puts("tps65217_voltage_update failure\n");
@ -364,13 +383,16 @@ void am33xx_spl_board_init(void)
TPS65217_LDO_VOLTAGE_OUT_3_3, TPS65217_LDO_VOLTAGE_OUT_3_3,
TPS65217_LDO_MASK)) TPS65217_LDO_MASK))
puts("tps65217_reg_write failure\n"); puts("tps65217_reg_write failure\n");
} else { }
int sil_rev;
void scale_vcores_generic(int freq)
{
int sil_rev, mpu_vdd;
/* /*
* The GP EVM, IDK and EVM SK use a TPS65910 PMIC. For all * The GP EVM, IDK and EVM SK use a TPS65910 PMIC. For all
* MPU frequencies we support we use a CORE voltage of * MPU frequencies we support we use a CORE voltage of
* 1.1375V. For MPU voltage we need to switch based on * 1.10V. For MPU voltage we need to switch based on
* the frequency we are running at. * the frequency we are running at.
*/ */
if (i2c_probe(TPS65910_CTRL_I2C_ADDR)) if (i2c_probe(TPS65910_CTRL_I2C_ADDR))
@ -381,8 +403,7 @@ void am33xx_spl_board_init(void)
* VDD to drive at that speed. * VDD to drive at that speed.
*/ */
sil_rev = readl(&cdev->deviceid) >> 28; sil_rev = readl(&cdev->deviceid) >> 28;
mpu_vdd = am335x_get_tps65910_mpu_vdd(sil_rev, mpu_vdd = am335x_get_tps65910_mpu_vdd(sil_rev, freq);
dpll_mpu_opp100.m);
/* Tell the TPS65910 to use i2c */ /* Tell the TPS65910 to use i2c */
tps65910_set_i2c_control(); tps65910_set_i2c_control();
@ -392,27 +413,35 @@ void am33xx_spl_board_init(void)
return; return;
/* Second, update the CORE voltage. */ /* Second, update the CORE voltage. */
if (tps65910_voltage_update(CORE, TPS65910_OP_REG_SEL_1_1_3)) if (tps65910_voltage_update(CORE, TPS65910_OP_REG_SEL_1_1_0))
return; return;
/* Set CORE Frequencies to OPP100 */
do_setup_dpll(&dpll_core_regs, &dpll_core_opp100);
} }
/* Set MPU Frequency to what we detected now that voltages are set */ void gpi2c_init(void)
do_setup_dpll(&dpll_mpu_regs, &dpll_mpu_opp100);
}
const struct dpll_params *get_dpll_ddr_params(void)
{ {
if (board_is_evm_sk()) /* When needed to be invoked prior to BSS initialization */
return &dpll_ddr_evm_sk; static bool first_time = true;
else if (board_is_bone_lt() || board_is_icev2())
return &dpll_ddr_bone_black; if (first_time) {
else if (board_is_evm_15_or_later()) enable_i2c0_pin_mux();
return &dpll_ddr_evm_sk; i2c_init(CONFIG_SYS_OMAP24_I2C_SPEED,
CONFIG_SYS_OMAP24_I2C_SLAVE);
first_time = false;
}
}
void scale_vcores(void)
{
int freq;
gpi2c_init();
freq = am335x_get_efuse_mpu_max_freq(cdev);
if (board_is_bone())
scale_vcores_bone(freq);
else else
return &dpll_ddr; scale_vcores_generic(freq);
} }
void set_uart_mux_conf(void) void set_uart_mux_conf(void)