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:
		
							parent
							
								
									59041a5084
								
							
						
					
					
						commit
						0650798824
					
				| 
						 | 
				
			
			@ -264,145 +264,6 @@ 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)
 | 
			
		||||
{
 | 
			
		||||
	int mpu_vdd;
 | 
			
		||||
 | 
			
		||||
	/* Get the frequency */
 | 
			
		||||
	dpll_mpu_opp100.m = am335x_get_efuse_mpu_max_freq(cdev);
 | 
			
		||||
 | 
			
		||||
	if (board_is_bone() || board_is_bone_lt()) {
 | 
			
		||||
		/* BeagleBone PMIC Code */
 | 
			
		||||
		int usb_cur_lim;
 | 
			
		||||
 | 
			
		||||
		/*
 | 
			
		||||
		 * Only perform PMIC configurations if board rev > A1
 | 
			
		||||
		 * on Beaglebone White
 | 
			
		||||
		 */
 | 
			
		||||
		if (board_is_bone() && !strncmp(board_ti_get_rev(), "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()) {
 | 
			
		||||
			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 1GHz.
 | 
			
		||||
		 */
 | 
			
		||||
		if (board_is_bone_lt())
 | 
			
		||||
			dpll_mpu_opp100.m = 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,
 | 
			
		||||
				       TPS65217_POWER_PATH,
 | 
			
		||||
				       usb_cur_lim,
 | 
			
		||||
				       TPS65217_USB_INPUT_CUR_LIMIT_MASK))
 | 
			
		||||
			puts("tps65217_reg_write failure\n");
 | 
			
		||||
 | 
			
		||||
		/* Set DCDC3 (CORE) voltage to 1.125V */
 | 
			
		||||
		if (tps65217_voltage_update(TPS65217_DEFDCDC3,
 | 
			
		||||
					    TPS65217_DCDC_VOLT_SEL_1125MV)) {
 | 
			
		||||
			puts("tps65217_voltage_update failure\n");
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/* Set CORE Frequencies to OPP100 */
 | 
			
		||||
		do_setup_dpll(&dpll_core_regs, &dpll_core_opp100);
 | 
			
		||||
 | 
			
		||||
		/* 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.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,
 | 
			
		||||
					       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.1375V.  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_opp100.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 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 */
 | 
			
		||||
	do_setup_dpll(&dpll_mpu_regs, &dpll_mpu_opp100);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const struct dpll_params *get_dpll_ddr_params(void)
 | 
			
		||||
{
 | 
			
		||||
	if (board_is_evm_sk())
 | 
			
		||||
| 
						 | 
				
			
			@ -415,6 +276,174 @@ const struct dpll_params *get_dpll_ddr_params(void)
 | 
			
		|||
		return &dpll_ddr;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void scale_vcores_bone(int freq)
 | 
			
		||||
{
 | 
			
		||||
	int usb_cur_lim, mpu_vdd;
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Only perform PMIC configurations if board rev > A1
 | 
			
		||||
	 * on Beaglebone White
 | 
			
		||||
	 */
 | 
			
		||||
	if (board_is_bone() && !strncmp(board_ti_get_rev(), "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()) {
 | 
			
		||||
		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, switching to default OPP\n");
 | 
			
		||||
			freq = MPUPLL_M_600;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Override what we have detected since we know if we have
 | 
			
		||||
	 * a Beaglebone Black it supports 1GHz.
 | 
			
		||||
	 */
 | 
			
		||||
	if (board_is_bone_lt())
 | 
			
		||||
		freq = MPUPLL_M_1000;
 | 
			
		||||
 | 
			
		||||
	if (freq == 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;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	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,
 | 
			
		||||
			       TPS65217_POWER_PATH,
 | 
			
		||||
			       usb_cur_lim,
 | 
			
		||||
			       TPS65217_USB_INPUT_CUR_LIMIT_MASK))
 | 
			
		||||
		puts("tps65217_reg_write failure\n");
 | 
			
		||||
 | 
			
		||||
	/* Set DCDC3 (CORE) voltage to 1.10V */
 | 
			
		||||
	if (tps65217_voltage_update(TPS65217_DEFDCDC3,
 | 
			
		||||
				    TPS65217_DCDC_VOLT_SEL_1100MV)) {
 | 
			
		||||
		puts("tps65217_voltage_update failure\n");
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* 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.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,
 | 
			
		||||
				       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");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void scale_vcores_generic(int freq)
 | 
			
		||||
{
 | 
			
		||||
	int sil_rev, mpu_vdd;
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * 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;
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * 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, freq);
 | 
			
		||||
 | 
			
		||||
	/* 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_0))
 | 
			
		||||
		return;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void gpi2c_init(void)
 | 
			
		||||
{
 | 
			
		||||
	/* When needed to be invoked prior to BSS initialization */
 | 
			
		||||
	static bool first_time = true;
 | 
			
		||||
 | 
			
		||||
	if (first_time) {
 | 
			
		||||
		enable_i2c0_pin_mux();
 | 
			
		||||
		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
 | 
			
		||||
		scale_vcores_generic(freq);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void set_uart_mux_conf(void)
 | 
			
		||||
{
 | 
			
		||||
#if CONFIG_CONS_INDEX == 1
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue