omap4: support TPS programming
TPS62361 is the new power supply used in OMAP4460 that supplies vdd_mpu. VCORE1 from Phoenix supplies vdd_core and VCORE2 supplies vdd_iva. VCORE3 is not used in OMAP4460. Signed-off-by: Aneesh V <aneesh@ti.com> Signed-off-by: Sandeep Paulraj <s-paulraj@ti.com>
This commit is contained in:
		
							parent
							
								
									25223a68e5
								
							
						
					
					
						commit
						d506719f7f
					
				| 
						 | 
					@ -90,6 +90,10 @@ static void set_muxconf_regs_essential(void)
 | 
				
			||||||
	do_set_mux(CONTROL_PADCONF_WKUP, wkup_padconf_array_essential,
 | 
						do_set_mux(CONTROL_PADCONF_WKUP, wkup_padconf_array_essential,
 | 
				
			||||||
		   sizeof(wkup_padconf_array_essential) /
 | 
							   sizeof(wkup_padconf_array_essential) /
 | 
				
			||||||
		   sizeof(struct pad_conf_entry));
 | 
							   sizeof(struct pad_conf_entry));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* gpio_wk7 is used for controlling TPS on 4460 */
 | 
				
			||||||
 | 
						if (omap_revision() >= OMAP4460_ES1_0)
 | 
				
			||||||
 | 
							writew(M3, CONTROL_WKUP_PAD1_FREF_CLK4_REQ);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void set_mux_conf_regs(void)
 | 
					static void set_mux_conf_regs(void)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -34,6 +34,7 @@
 | 
				
			||||||
#include <asm/arch/clocks.h>
 | 
					#include <asm/arch/clocks.h>
 | 
				
			||||||
#include <asm/arch/sys_proto.h>
 | 
					#include <asm/arch/sys_proto.h>
 | 
				
			||||||
#include <asm/utils.h>
 | 
					#include <asm/utils.h>
 | 
				
			||||||
 | 
					#include <asm/omap_gpio.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef CONFIG_SPL_BUILD
 | 
					#ifndef CONFIG_SPL_BUILD
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
| 
						 | 
					@ -421,6 +422,34 @@ static void setup_non_essential_dplls(void)
 | 
				
			||||||
	do_setup_dpll(&prcm->cm_clkmode_dpll_abe, params, DPLL_LOCK);
 | 
						do_setup_dpll(&prcm->cm_clkmode_dpll_abe, params, DPLL_LOCK);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void do_scale_tps62361(u32 reg, u32 volt_mv)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						u32 temp, step;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						step = volt_mv - TPS62361_BASE_VOLT_MV;
 | 
				
			||||||
 | 
						step /= 10;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
 | 
						 * Select SET1 in TPS62361:
 | 
				
			||||||
 | 
						 * VSEL1 is grounded on board. So the following selects
 | 
				
			||||||
 | 
						 * VSEL1 = 0 and VSEL0 = 1
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						omap_set_gpio_direction(TPS62361_VSEL0_GPIO, 0);
 | 
				
			||||||
 | 
						omap_set_gpio_dataout(TPS62361_VSEL0_GPIO, 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						temp = TPS62361_I2C_SLAVE_ADDR |
 | 
				
			||||||
 | 
						    (reg << PRM_VC_VAL_BYPASS_REGADDR_SHIFT) |
 | 
				
			||||||
 | 
						    (step << PRM_VC_VAL_BYPASS_DATA_SHIFT) |
 | 
				
			||||||
 | 
						    PRM_VC_VAL_BYPASS_VALID_BIT;
 | 
				
			||||||
 | 
						debug("do_scale_tps62361: volt - %d step - 0x%x\n", volt_mv, step);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						writel(temp, &prcm->prm_vc_val_bypass);
 | 
				
			||||||
 | 
						if (!wait_on_value(PRM_VC_VAL_BYPASS_VALID_BIT, 0,
 | 
				
			||||||
 | 
									&prcm->prm_vc_val_bypass, LDELAY)) {
 | 
				
			||||||
 | 
							puts("Scaling voltage failed for vdd_mpu from TPS\n");
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void do_scale_vcore(u32 vcore_reg, u32 volt_mv)
 | 
					static void do_scale_vcore(u32 vcore_reg, u32 volt_mv)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	u32 temp, offset_code;
 | 
						u32 temp, offset_code;
 | 
				
			||||||
| 
						 | 
					@ -461,7 +490,7 @@ static void do_scale_vcore(u32 vcore_reg, u32 volt_mv)
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
static void scale_vcores(void)
 | 
					static void scale_vcores(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	u32 volt, sys_clk_khz, cycles_hi, cycles_low, temp;
 | 
						u32 volt, sys_clk_khz, cycles_hi, cycles_low, temp, omap4_rev;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sys_clk_khz = get_sys_clk_freq() / 1000;
 | 
						sys_clk_khz = get_sys_clk_freq() / 1000;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -481,23 +510,45 @@ static void scale_vcores(void)
 | 
				
			||||||
	/* Disable high speed mode and all advanced features */
 | 
						/* Disable high speed mode and all advanced features */
 | 
				
			||||||
	writel(0x0, &prcm->prm_vc_cfg_i2c_mode);
 | 
						writel(0x0, &prcm->prm_vc_cfg_i2c_mode);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						omap4_rev = omap_revision();
 | 
				
			||||||
 | 
						/* TPS - supplies vdd_mpu on 4460 */
 | 
				
			||||||
 | 
						if (omap4_rev >= OMAP4460_ES1_0) {
 | 
				
			||||||
 | 
							volt = 1430;
 | 
				
			||||||
 | 
							do_scale_tps62361(TPS62361_REG_ADDR_SET1, volt);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * VCORE 1 - 4430 : supplies vdd_mpu
 | 
						 * VCORE 1
 | 
				
			||||||
 | 
						 *
 | 
				
			||||||
 | 
						 * 4430 : supplies vdd_mpu
 | 
				
			||||||
	 * Setting a high voltage for Nitro mode as smart reflex is not enabled.
 | 
						 * Setting a high voltage for Nitro mode as smart reflex is not enabled.
 | 
				
			||||||
	 * We use the maximum possible value in the AVS range because the next
 | 
						 * We use the maximum possible value in the AVS range because the next
 | 
				
			||||||
	 * higher voltage in the discrete range (code >= 0b111010) is way too
 | 
						 * higher voltage in the discrete range (code >= 0b111010) is way too
 | 
				
			||||||
	 * high
 | 
						 * high
 | 
				
			||||||
 | 
						 *
 | 
				
			||||||
 | 
						 * 4460 : supplies vdd_core
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	volt = 1417;
 | 
						if (omap4_rev < OMAP4460_ES1_0) {
 | 
				
			||||||
	do_scale_vcore(SMPS_REG_ADDR_VCORE1, volt);
 | 
							volt = 1417;
 | 
				
			||||||
 | 
							do_scale_vcore(SMPS_REG_ADDR_VCORE1, volt);
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							volt = 1200;
 | 
				
			||||||
 | 
							do_scale_vcore(SMPS_REG_ADDR_VCORE1, volt);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* VCORE 2 - supplies vdd_iva */
 | 
						/* VCORE 2 - supplies vdd_iva */
 | 
				
			||||||
	volt = 1200;
 | 
						volt = 1200;
 | 
				
			||||||
	do_scale_vcore(SMPS_REG_ADDR_VCORE2, volt);
 | 
						do_scale_vcore(SMPS_REG_ADDR_VCORE2, volt);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* VCORE 3 - supplies vdd_core */
 | 
						/*
 | 
				
			||||||
	volt = 1200;
 | 
						 * VCORE 3
 | 
				
			||||||
	do_scale_vcore(SMPS_REG_ADDR_VCORE3, volt);
 | 
						 * 4430 : supplies vdd_core
 | 
				
			||||||
 | 
						 * 4460 : not connected
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						if (omap4_rev < OMAP4460_ES1_0) {
 | 
				
			||||||
 | 
							volt = 1200;
 | 
				
			||||||
 | 
							do_scale_vcore(SMPS_REG_ADDR_VCORE3, volt);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline void enable_clock_domain(u32 *const clkctrl_reg, u32 enable_mode)
 | 
					static inline void enable_clock_domain(u32 *const clkctrl_reg, u32 enable_mode)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -618,6 +618,7 @@ struct omap4_prcm_regs {
 | 
				
			||||||
#define PRM_VC_VAL_BYPASS_DATA_SHIFT		16
 | 
					#define PRM_VC_VAL_BYPASS_DATA_SHIFT		16
 | 
				
			||||||
#define PRM_VC_VAL_BYPASS_DATA_MASK		0xFF
 | 
					#define PRM_VC_VAL_BYPASS_DATA_MASK		0xFF
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* SMPS */
 | 
				
			||||||
#define SMPS_I2C_SLAVE_ADDR	0x12
 | 
					#define SMPS_I2C_SLAVE_ADDR	0x12
 | 
				
			||||||
#define SMPS_REG_ADDR_VCORE1	0x55
 | 
					#define SMPS_REG_ADDR_VCORE1	0x55
 | 
				
			||||||
#define SMPS_REG_ADDR_VCORE2	0x5B
 | 
					#define SMPS_REG_ADDR_VCORE2	0x5B
 | 
				
			||||||
| 
						 | 
					@ -626,6 +627,21 @@ struct omap4_prcm_regs {
 | 
				
			||||||
#define PHOENIX_SMPS_BASE_VOLT_STD_MODE_UV		607700
 | 
					#define PHOENIX_SMPS_BASE_VOLT_STD_MODE_UV		607700
 | 
				
			||||||
#define PHOENIX_SMPS_BASE_VOLT_STD_MODE_WITH_OFFSET_UV	709000
 | 
					#define PHOENIX_SMPS_BASE_VOLT_STD_MODE_WITH_OFFSET_UV	709000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* TPS */
 | 
				
			||||||
 | 
					#define TPS62361_I2C_SLAVE_ADDR		0x60
 | 
				
			||||||
 | 
					#define TPS62361_REG_ADDR_SET0		0x0
 | 
				
			||||||
 | 
					#define TPS62361_REG_ADDR_SET1		0x1
 | 
				
			||||||
 | 
					#define TPS62361_REG_ADDR_SET2		0x2
 | 
				
			||||||
 | 
					#define TPS62361_REG_ADDR_SET3		0x3
 | 
				
			||||||
 | 
					#define TPS62361_REG_ADDR_CTRL		0x4
 | 
				
			||||||
 | 
					#define TPS62361_REG_ADDR_TEMP		0x5
 | 
				
			||||||
 | 
					#define TPS62361_REG_ADDR_RMP_CTRL	0x6
 | 
				
			||||||
 | 
					#define TPS62361_REG_ADDR_CHIP_ID	0x8
 | 
				
			||||||
 | 
					#define TPS62361_REG_ADDR_CHIP_ID_2	0x9
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define TPS62361_BASE_VOLT_MV	500
 | 
				
			||||||
 | 
					#define TPS62361_VSEL0_GPIO	7
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Defines for DPLL setup */
 | 
					/* Defines for DPLL setup */
 | 
				
			||||||
#define DPLL_LOCKED_FREQ_TOLERANCE_0		0
 | 
					#define DPLL_LOCKED_FREQ_TOLERANCE_0		0
 | 
				
			||||||
#define DPLL_LOCKED_FREQ_TOLERANCE_500_KHZ	500
 | 
					#define DPLL_LOCKED_FREQ_TOLERANCE_500_KHZ	500
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -341,4 +341,5 @@ struct pad_conf_entry {
 | 
				
			||||||
#define CONTROL_SPARE_R		0x0618
 | 
					#define CONTROL_SPARE_R		0x0618
 | 
				
			||||||
#define CONTROL_SPARE_R_C0		0x061C
 | 
					#define CONTROL_SPARE_R_C0		0x061C
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define CONTROL_WKUP_PAD1_FREF_CLK4_REQ	0x4A31E05A
 | 
				
			||||||
#endif /* _MUX_OMAP4_H_ */
 | 
					#endif /* _MUX_OMAP4_H_ */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue