diff options
Diffstat (limited to 'arch/arm/cpu/armv7')
| -rw-r--r-- | arch/arm/cpu/armv7/omap3/clock.c | 6 | ||||
| -rw-r--r-- | arch/arm/cpu/armv7/omap3/lowlevel_init.S | 8 | ||||
| -rw-r--r-- | arch/arm/cpu/armv7/omap4/hw_data.c | 36 | ||||
| -rw-r--r-- | arch/arm/cpu/armv7/omap4/hwinit.c | 3 | ||||
| -rw-r--r-- | arch/arm/cpu/armv7/omap4/sdram_elpida.c | 41 | 
5 files changed, 78 insertions, 16 deletions
| diff --git a/arch/arm/cpu/armv7/omap3/clock.c b/arch/arm/cpu/armv7/omap3/clock.c index e903ed9ac..9f989ff86 100644 --- a/arch/arm/cpu/armv7/omap3/clock.c +++ b/arch/arm/cpu/armv7/omap3/clock.c @@ -183,8 +183,7 @@ static void dpll3_init_34xx(u32 sil_index, u32 clk_index)  		 * if running from flash, jump to small relocated code  		 * area in SRAM.  		 */ -		f_lock_pll = (void *) ((u32) &_end_vect - (u32) &_start + -				SRAM_VECT_CODE); +		f_lock_pll = (void *) (SRAM_CLK_CODE);  		p0 = readl(&prcm_base->clken_pll);  		sr32(&p0, 0, 3, PLL_FAST_RELOCK_BYPASS); @@ -401,8 +400,7 @@ static void dpll3_init_36xx(u32 sil_index, u32 clk_index)  		 * if running from flash, jump to small relocated code  		 * area in SRAM.  		 */ -		f_lock_pll = (void *) ((u32) &_end_vect - (u32) &_start + -				SRAM_VECT_CODE); +		f_lock_pll = (void *) (SRAM_CLK_CODE);  		p0 = readl(&prcm_base->clken_pll);  		sr32(&p0, 0, 3, PLL_FAST_RELOCK_BYPASS); diff --git a/arch/arm/cpu/armv7/omap3/lowlevel_init.S b/arch/arm/cpu/armv7/omap3/lowlevel_init.S index 98c3c03a0..6f7261b7b 100644 --- a/arch/arm/cpu/armv7/omap3/lowlevel_init.S +++ b/arch/arm/cpu/armv7/omap3/lowlevel_init.S @@ -69,15 +69,13 @@ ENDPROC(do_omap3_emu_romcode_call)   *************************************************************************/  ENTRY(cpy_clk_code)  	/* Copy DPLL code into SRAM */ -	adr	r0, go_to_speed		/* get addr of clock setting code */ -	mov	r2, #384		/* r2 size to copy (div by 32 bytes) */ -	mov	r1, r1			/* r1 <- dest address (passed in) */ -	add	r2, r2, r0		/* r2 <- source end address */ +	adr	r0, go_to_speed		/* copy from start of go_to_speed... */ +	adr	r2, lowlevel_init	/* ... up to start of low_level_init */  next2:  	ldmia	r0!, {r3 - r10}		/* copy from source address [r0] */  	stmia	r1!, {r3 - r10}		/* copy to   target address [r1] */  	cmp	r0, r2			/* until source end address [r2] */ -	bne	next2 +	blo	next2  	mov	pc, lr			/* back to caller */  ENDPROC(cpy_clk_code) diff --git a/arch/arm/cpu/armv7/omap4/hw_data.c b/arch/arm/cpu/armv7/omap4/hw_data.c index 310df5a6e..6a225c8cb 100644 --- a/arch/arm/cpu/armv7/omap4/hw_data.c +++ b/arch/arm/cpu/armv7/omap4/hw_data.c @@ -50,6 +50,7 @@ static const struct dpll_params mpu_dpll_params_1400mhz[NUM_SYS_CLKS] = {  /*   * dpll locked at 1600 MHz - MPU clk at 800 MHz(OPP Turbo 4430)   * OMAP4430 OPP_TURBO frequency + * OMAP4470 OPP_NOM frequency   */  static const struct dpll_params mpu_dpll_params_1600mhz[NUM_SYS_CLKS] = {  	{200, 2, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1},	/* 12 MHz   */ @@ -76,6 +77,7 @@ static const struct dpll_params mpu_dpll_params_1200mhz[NUM_SYS_CLKS] = {  };  /* OMAP4460 OPP_NOM frequency */ +/* OMAP4470 OPP_NOM (Low Power) frequency */  static const struct dpll_params core_dpll_params_1600mhz[NUM_SYS_CLKS] = {  	{200, 2, 1, 5, 8, 4, 6, 5, -1, -1, -1, -1},	/* 12 MHz   */  	{800, 12, 1, 5, 8, 4, 6, 5, -1, -1, -1, -1},	/* 13 MHz   */ @@ -198,6 +200,20 @@ struct dplls omap4460_dplls = {  	.ddr = NULL  }; +struct dplls omap4470_dplls = { +	.mpu = mpu_dpll_params_1600mhz, +	.core = core_dpll_params_1600mhz, +	.per = per_dpll_params_1536mhz, +	.iva = iva_dpll_params_1862mhz, +#ifdef CONFIG_SYS_OMAP_ABE_SYSCK +	.abe = abe_dpll_params_sysclk_196608khz, +#else +	.abe = &abe_dpll_params_32k_196608khz, +#endif +	.usb = usb_dpll_params_1920mhz, +	.ddr = NULL +}; +  struct pmic_data twl6030_4430es1 = {  	.base_offset = PHOENIX_SMPS_BASE_VOLT_STD_MODE_UV,  	.step = 12660, /* 12.66 mV represented in uV */ @@ -208,6 +224,7 @@ struct pmic_data twl6030_4430es1 = {  	.pmic_write	= omap_vc_bypass_send_value,  }; +/* twl6030 struct is used for TWL6030 and TWL6032 PMIC */  struct pmic_data twl6030 = {  	.base_offset = PHOENIX_SMPS_BASE_VOLT_STD_MODE_WITH_OFFSET_UV,  	.step = 12660, /* 12.66 mV represented in uV */ @@ -271,6 +288,20 @@ struct vcores_data omap4460_volts = {  	.mm.pmic = &twl6030,  }; +struct vcores_data omap4470_volts = { +	.mpu.value = 1200, +	.mpu.addr = SMPS_REG_ADDR_SMPS1, +	.mpu.pmic = &twl6030, + +	.core.value = 1126, +	.core.addr = SMPS_REG_ADDR_SMPS1, +	.core.pmic = &twl6030, + +	.mm.value = 1137, +	.mm.addr = SMPS_REG_ADDR_SMPS1, +	.mm.pmic = &twl6030, +}; +  /*   * Enable essential clock domains, modules and   * do some additional special settings needed @@ -476,6 +507,11 @@ void hw_data_init(void)  	*omap_vcores = &omap4460_volts;  	break; +	case OMAP4470_ES1_0: +	*dplls_data = &omap4470_dplls; +	*omap_vcores = &omap4470_volts; +	break; +  	default:  		printf("\n INVALID OMAP REVISION ");  	} diff --git a/arch/arm/cpu/armv7/omap4/hwinit.c b/arch/arm/cpu/armv7/omap4/hwinit.c index 4da0fc0ad..b0598a077 100644 --- a/arch/arm/cpu/armv7/omap4/hwinit.c +++ b/arch/arm/cpu/armv7/omap4/hwinit.c @@ -138,6 +138,9 @@ void init_omap_revision(void)  		break;  	case MIDR_CORTEX_A9_R2P10:  		switch (readl(CONTROL_ID_CODE)) { +		case OMAP4470_CONTROL_ID_CODE_ES1_0: +			*omap_si_rev = OMAP4470_ES1_0; +			break;  		case OMAP4460_CONTROL_ID_CODE_ES1_1:  			*omap_si_rev = OMAP4460_ES1_1;  			break; diff --git a/arch/arm/cpu/armv7/omap4/sdram_elpida.c b/arch/arm/cpu/armv7/omap4/sdram_elpida.c index d76dde719..67a79261f 100644 --- a/arch/arm/cpu/armv7/omap4/sdram_elpida.c +++ b/arch/arm/cpu/armv7/omap4/sdram_elpida.c @@ -60,6 +60,20 @@ static const struct emif_regs emif_regs_elpida_380_mhz_1cs = {  	.emif_ddr_phy_ctlr_1		= 0x049ff418  }; +const struct emif_regs emif_regs_elpida_400_mhz_1cs = { +	.sdram_config_init		= 0x80800eb2, +	.sdram_config			= 0x80801ab2, +	.ref_ctrl			= 0x00000618, +	.sdram_tim1			= 0x10eb0662, +	.sdram_tim2			= 0x20370dd2, +	.sdram_tim3			= 0x00b1c33f, +	.read_idle_ctrl			= 0x000501ff, +	.zq_config			= 0x500b3215, +	.temp_alert_config		= 0x58016893, +	.emif_ddr_phy_ctlr_1_init	= 0x049ffff5, +	.emif_ddr_phy_ctlr_1		= 0x049ff418 +}; +  const struct emif_regs emif_regs_elpida_400_mhz_2cs = {  	.sdram_config_init		= 0x80000eb9,  	.sdram_config			= 0x80001ab9, @@ -107,8 +121,10 @@ static void emif_get_reg_dump_sdp(u32 emif_nr, const struct emif_regs **regs)  		*regs = &emif_regs_elpida_380_mhz_1cs;  	else if (omap4_rev == OMAP4430_ES2_0)  		*regs = &emif_regs_elpida_200_mhz_2cs; -	else +	else if (omap4_rev < OMAP4470_ES1_0)  		*regs = &emif_regs_elpida_400_mhz_2cs; +	else +		*regs = &emif_regs_elpida_400_mhz_1cs;  }  void emif_get_reg_dump(u32 emif_nr, const struct emif_regs **regs)  	__attribute__((weak, alias("emif_get_reg_dump_sdp"))); @@ -138,20 +154,31 @@ static const struct lpddr2_device_details elpida_2G_S4_details = {  	.manufacturer	= LPDDR2_MANUFACTURER_ELPIDA  }; +static const struct lpddr2_device_details elpida_4G_S4_details = { +	.type		= LPDDR2_TYPE_S4, +	.density	= LPDDR2_DENSITY_4Gb, +	.io_width	= LPDDR2_IO_WIDTH_32, +	.manufacturer	= LPDDR2_MANUFACTURER_ELPIDA +}; +  struct lpddr2_device_details *emif_get_device_details_sdp(u32 emif_nr, u8 cs,  			struct lpddr2_device_details *lpddr2_dev_details)  {  	u32 omap_rev = omap_revision();  	/* EMIF1 & EMIF2 have identical configuration */ -	if ((omap_rev == OMAP4430_ES1_0) && (cs == CS1)) { -		/* Nothing connected on CS1 for ES1.0 */ +	if (((omap_rev == OMAP4430_ES1_0) || (omap_rev == OMAP4470_ES1_0)) +		&& (cs == CS1)) { +		/* Nothing connected on CS1 for 4430/4470 ES1.0 */  		return NULL; -	} else { -		/* In all other cases Elpida 2G device */ +	} else if (omap_rev < OMAP4470_ES1_0) { +		/* In all other 4430/4460 cases Elpida 2G device */  		*lpddr2_dev_details = elpida_2G_S4_details; -		return lpddr2_dev_details; +	} else { +		/* 4470: 4G device */ +		*lpddr2_dev_details = elpida_4G_S4_details;  	} +	return lpddr2_dev_details;  }  struct lpddr2_device_details *emif_get_device_details(u32 emif_nr, u8 cs, @@ -265,7 +292,7 @@ void emif_get_device_timings_sdp(u32 emif_nr,  	/* Identical devices on EMIF1 & EMIF2 */  	*cs0_device_timings = &elpida_2G_S4_timings; -	if (omap_rev == OMAP4430_ES1_0) +	if ((omap_rev == OMAP4430_ES1_0) || (omap_rev == OMAP4470_ES1_0))  		*cs1_device_timings = NULL;  	else  		*cs1_device_timings = &elpida_2G_S4_timings; |