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>
master
Lokesh Vutla 7 years ago committed by Tom Rini
parent 59041a5084
commit 0650798824
  1. 267
      board/ti/am335x/board.c

@ -264,155 +264,184 @@ 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 */ * Only perform PMIC configurations if board rev > A1
int usb_cur_lim; * on Beaglebone White
*/
if (board_is_bone() && !strncmp(board_ti_get_rev(), "00A1", 4))
return;
/* if (i2c_probe(TPS65217_CHIP_PM))
* Only perform PMIC configurations if board rev > A1 return;
* on Beaglebone White
*/
if (board_is_bone() && !strncmp(board_ti_get_rev(), "00A1", 4))
return;
if (i2c_probe(TPS65217_CHIP_PM)) /*
* On Beaglebone White we need to ensure we have AC power
* before increasing the frequency.
*/
if (board_is_bone()) {
uchar pmic_status_reg;
if (tps65217_reg_read(TPS65217_STATUS,
&pmic_status_reg))
return; return;
if (!(pmic_status_reg & TPS65217_PWR_SRC_AC_BITMASK)) {
/* puts("No AC power, switching to default OPP\n");
* On Beaglebone White we need to ensure we have AC power freq = MPUPLL_M_600;
* before increasing the frequency.
*/
if (board_is_bone()) {
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 * Override what we have detected since we know if we have
* 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;
/*
* 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;
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, if (freq == MPUPLL_M_1000) {
TPS65217_POWER_PATH, usb_cur_lim = TPS65217_USB_INPUT_CUR_LIMIT_1800MA;
usb_cur_lim, mpu_vdd = TPS65217_DCDC_VOLT_SEL_1325MV;
TPS65217_USB_INPUT_CUR_LIMIT_MASK)) } else {
puts("tps65217_reg_write failure\n"); usb_cur_lim = TPS65217_USB_INPUT_CUR_LIMIT_1300MA;
mpu_vdd = TPS65217_DCDC_VOLT_SEL_1275MV;
}
/* Set DCDC3 (CORE) voltage to 1.125V */ switch (freq) {
if (tps65217_voltage_update(TPS65217_DEFDCDC3, case MPUPLL_M_1000:
TPS65217_DCDC_VOLT_SEL_1125MV)) { mpu_vdd = TPS65217_DCDC_VOLT_SEL_1325MV;
puts("tps65217_voltage_update failure\n"); usb_cur_lim = TPS65217_USB_INPUT_CUR_LIMIT_1800MA;
return; 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;
}
/* Set CORE Frequencies to OPP100 */ if (tps65217_reg_write(TPS65217_PROT_LEVEL_NONE,
do_setup_dpll(&dpll_core_regs, &dpll_core_opp100); TPS65217_POWER_PATH,
usb_cur_lim,
TPS65217_USB_INPUT_CUR_LIMIT_MASK))
puts("tps65217_reg_write failure\n");
/* Set DCDC2 (MPU) voltage */ /* Set DCDC3 (CORE) voltage to 1.10V */
if (tps65217_voltage_update(TPS65217_DEFDCDC2, mpu_vdd)) { if (tps65217_voltage_update(TPS65217_DEFDCDC3,
puts("tps65217_voltage_update failure\n"); TPS65217_DCDC_VOLT_SEL_1100MV)) {
return; puts("tps65217_voltage_update failure\n");
} return;
}
/* /* Set DCDC2 (MPU) voltage */
* Set LDO3, LDO4 output voltage to 3.3V for Beaglebone. if (tps65217_voltage_update(TPS65217_DEFDCDC2, mpu_vdd)) {
* Set LDO3 to 1.8V and LDO4 to 3.3V for Beaglebone Black. puts("tps65217_voltage_update failure\n");
*/ return;
if (board_is_bone()) { }
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");
}
/*
* Set LDO3, LDO4 output voltage to 3.3V for Beaglebone.
* Set LDO3 to 1.8V and LDO4 to 3.3V for Beaglebone Black.
*/
if (board_is_bone()) {
if (tps65217_reg_write(TPS65217_PROT_LEVEL_2, if (tps65217_reg_write(TPS65217_PROT_LEVEL_2,
TPS65217_DEFLS2, TPS65217_DEFLS1,
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 { } else {
int sil_rev; 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,
* The GP EVM, IDK and EVM SK use a TPS65910 PMIC. For all TPS65217_DEFLS2,
* MPU frequencies we support we use a CORE voltage of TPS65217_LDO_VOLTAGE_OUT_3_3,
* 1.1375V. For MPU voltage we need to switch based on TPS65217_LDO_MASK))
* the frequency we are running at. puts("tps65217_reg_write failure\n");
*/ }
if (i2c_probe(TPS65910_CTRL_I2C_ADDR))
return;
/* void scale_vcores_generic(int freq)
* Depending on MPU clock and PG we will need a different {
* VDD to drive at that speed. int sil_rev, mpu_vdd;
*/
sil_rev = readl(&cdev->deviceid) >> 28;
mpu_vdd = am335x_get_tps65910_mpu_vdd(sil_rev,
dpll_mpu_opp100.m);
/* Tell the TPS65910 to use i2c */ /*
tps65910_set_i2c_control(); * The GP EVM, IDK and EVM SK use a TPS65910 PMIC. For all
* MPU frequencies we support we use a CORE voltage of
* 1.10V. For MPU voltage we need to switch based on
* the frequency we are running at.
*/
if (i2c_probe(TPS65910_CTRL_I2C_ADDR))
return;
/* First update MPU voltage. */ /*
if (tps65910_voltage_update(MPU, mpu_vdd)) * Depending on MPU clock and PG we will need a different
return; * VDD to drive at that speed.
*/
sil_rev = readl(&cdev->deviceid) >> 28;
mpu_vdd = am335x_get_tps65910_mpu_vdd(sil_rev, freq);
/* Second, update the CORE voltage. */ /* Tell the TPS65910 to use i2c */
if (tps65910_voltage_update(CORE, TPS65910_OP_REG_SEL_1_1_3)) tps65910_set_i2c_control();
return;
/* Set CORE Frequencies to OPP100 */ /* First update MPU voltage. */
do_setup_dpll(&dpll_core_regs, &dpll_core_opp100); if (tps65910_voltage_update(MPU, mpu_vdd))
} return;
/* Second, update the CORE voltage. */
if (tps65910_voltage_update(CORE, TPS65910_OP_REG_SEL_1_1_0))
return;
/* Set MPU Frequency to what we detected now that voltages are set */
do_setup_dpll(&dpll_mpu_regs, &dpll_mpu_opp100);
} }
const struct dpll_params *get_dpll_ddr_params(void) void gpi2c_init(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)

Loading…
Cancel
Save