diff options
| author | Vaibhav Hiremath <hvaibhav@ti.com> | 2010-06-07 15:20:53 -0400 | 
|---|---|---|
| committer | Tom <Tom@bumblecow.com> | 2010-06-08 10:07:19 -0500 | 
| commit | 1a5038ca6831e31875cf67c46226f04743574032 (patch) | |
| tree | 78af8817b3df82e9f6946519c7989f198b139239 | |
| parent | ed01e45cfa20d60ee83a4ee0128d843730055294 (diff) | |
| download | olio-uboot-2014.01-1a5038ca6831e31875cf67c46226f04743574032.tar.xz olio-uboot-2014.01-1a5038ca6831e31875cf67c46226f04743574032.zip | |
AM35x: Add support for EMIF4
This patch adds support for the EMIF4 interface
available in the AM35x processors.
Signed-off-by: Vaibhav Hiremath <hvaibhav@ti.com>
Signed-off-by: Sanjeev Premi <premi@ti.com>
Signed-off-by: Sandeep Paulraj <s-paulraj@ti.com>
| -rw-r--r-- | arch/arm/cpu/arm_cortexa8/omap3/Makefile | 1 | ||||
| -rw-r--r-- | arch/arm/cpu/arm_cortexa8/omap3/emif4.c | 168 | ||||
| -rw-r--r-- | arch/arm/include/asm/arch-omap3/cpu.h | 24 | ||||
| -rw-r--r-- | arch/arm/include/asm/arch-omap3/emif4.h | 79 | ||||
| -rw-r--r-- | arch/arm/include/asm/arch-omap3/sys_proto.h | 1 | ||||
| -rw-r--r-- | include/configs/am3517_evm.h | 2 | 
6 files changed, 274 insertions, 1 deletions
| diff --git a/arch/arm/cpu/arm_cortexa8/omap3/Makefile b/arch/arm/cpu/arm_cortexa8/omap3/Makefile index 1e80eb3b7..7d63c6bec 100644 --- a/arch/arm/cpu/arm_cortexa8/omap3/Makefile +++ b/arch/arm/cpu/arm_cortexa8/omap3/Makefile @@ -37,6 +37,7 @@ COBJS	+= syslib.o  COBJS	+= sys_info.o  COBJS	+= timer.o +COBJS-$(CONFIG_EMIF4)	+= emif4.o  COBJS-$(CONFIG_SDRC)	+= sdrc.o  SRCS	:= $(SOBJS:.o=.S) $(COBJS:.o=.c) diff --git a/arch/arm/cpu/arm_cortexa8/omap3/emif4.c b/arch/arm/cpu/arm_cortexa8/omap3/emif4.c new file mode 100644 index 000000000..fae5b1161 --- /dev/null +++ b/arch/arm/cpu/arm_cortexa8/omap3/emif4.c @@ -0,0 +1,168 @@ +/* + * Author : + *     Vaibhav Hiremath <hvaibhav@ti.com> + * + * Based on mem.c and sdrc.c + * + * Copyright (C) 2010 + * Texas Instruments Incorporated - http://www.ti.com/ + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#include <common.h> +#include <asm/io.h> +#include <asm/arch/mem.h> +#include <asm/arch/sys_proto.h> +#include <asm/arch/emif4.h> + +extern omap3_sysinfo sysinfo; + +static emif4_t *emif4_base = (emif4_t *)OMAP34XX_SDRC_BASE; + +/* + * is_mem_sdr - + *  - Return 1 if mem type in use is SDR + */ +u32 is_mem_sdr(void) +{ +	return 0; +} + +/* + * get_sdr_cs_size - + *  - Get size of chip select 0/1 + */ +u32 get_sdr_cs_size(u32 cs) +{ +	u32 size; + +	/* TODO: Calculate the size based on EMIF4 configuration */ +	size = CONFIG_SYS_CS0_SIZE; + +	return size; +} + +/* + * get_sdr_cs_offset - + *  - Get offset of cs from cs0 start + */ +u32 get_sdr_cs_offset(u32 cs) +{ +	u32 offset = 0; + +	return offset; +} + +/* + * do_emif4_init - + *  - Init the emif4 module for DDR access + *  - Early init routines, called from flash or SRAM. + */ +void do_emif4_init(void) +{ +	unsigned int regval; +	/* Set the DDR PHY parameters in PHY ctrl registers */ +	regval = (EMIF4_DDR1_READ_LAT | EMIF4_DDR1_PWRDN_DIS | +		EMIF4_DDR1_EXT_STRB_DIS); +	writel(regval, &emif4_base->ddr_phyctrl1); +	writel(regval, &emif4_base->ddr_phyctrl1_shdw); +	writel(0, &emif4_base->ddr_phyctrl2); + +	/* Reset the DDR PHY and wait till completed */ +	regval = readl(&emif4_base->sdram_iodft_tlgc); +	regval |= (1<<10); +	writel(regval, &emif4_base->sdram_iodft_tlgc); +	/*Wait till that bit clears*/ +	while ((readl(&emif4_base->sdram_iodft_tlgc) & (1<<10)) == 0x1); +	/*Re-verify the DDR PHY status*/ +	while ((readl(&emif4_base->sdram_sts) & (1<<2)) == 0x0); + +	regval |= (1<<0); +	writel(regval, &emif4_base->sdram_iodft_tlgc); +	/* Set SDR timing registers */ +	regval = (EMIF4_TIM1_T_WTR | EMIF4_TIM1_T_RRD | +		EMIF4_TIM1_T_RC | EMIF4_TIM1_T_RAS | +		EMIF4_TIM1_T_WR | EMIF4_TIM1_T_RCD | +		EMIF4_TIM1_T_RP); +	writel(regval, &emif4_base->sdram_time1); +	writel(regval, &emif4_base->sdram_time1_shdw); + +	regval = (EMIF4_TIM2_T_CKE | EMIF4_TIM2_T_RTP | +		EMIF4_TIM2_T_XSRD | EMIF4_TIM2_T_XSNR | +		EMIF4_TIM2_T_ODT | EMIF4_TIM2_T_XP); +	writel(regval, &emif4_base->sdram_time2); +	writel(regval, &emif4_base->sdram_time2_shdw); + +	regval = (EMIF4_TIM3_T_RAS_MAX | EMIF4_TIM3_T_RFC); +	writel(regval, &emif4_base->sdram_time3); +	writel(regval, &emif4_base->sdram_time3_shdw); + +	/* Set the PWR control register */ +	regval = (EMIF4_PWR_PM_TIM | EMIF4_PWR_LP_MODE | +		EMIF4_PWR_DPD_DIS | EMIF4_PWR_IDLE_MODE); +	writel(regval, &emif4_base->sdram_pwr_mgmt); +	writel(regval, &emif4_base->sdram_pwr_mgmt_shdw); + +	/* Set the DDR refresh rate control register */ +	regval = (EMIF4_REFRESH_RATE | EMIF4_INITREF_DIS); +	writel(regval, &emif4_base->sdram_refresh_ctrl); +	writel(regval, &emif4_base->sdram_refresh_ctrl_shdw); + +	/* set the SDRAM configuration register */ +	regval = (EMIF4_CFG_PGSIZE | EMIF4_CFG_EBANK | +		EMIF4_CFG_IBANK | EMIF4_CFG_ROWSIZE | +		EMIF4_CFG_CL | EMIF4_CFG_NARROW_MD | +		EMIF4_CFG_SDR_DRV | EMIF4_CFG_DDR_DIS_DLL | +		EMIF4_CFG_DDR2_DDQS | EMIF4_CFG_DDR_TERM | +		EMIF4_CFG_IBANK_POS | EMIF4_CFG_SDRAM_TYP); +	writel(regval, &emif4_base->sdram_config); +} + +/* + * dram_init - + *  - Sets uboots idea of sdram size + */ +int dram_init(void) +{ +	DECLARE_GLOBAL_DATA_PTR; +	unsigned int size0 = 0, size1 = 0; + +	size0 = get_sdr_cs_size(CS0); +	/* +	 * If a second bank of DDR is attached to CS1 this is +	 * where it can be started.  Early init code will init +	 * memory on CS0. +	 */ +	if ((sysinfo.mtype == DDR_COMBO) || (sysinfo.mtype == DDR_STACKED)) +		size1 = get_sdr_cs_size(CS1); + +	gd->bd->bi_dram[0].start = PHYS_SDRAM_1; +	gd->bd->bi_dram[0].size = size0; +	gd->bd->bi_dram[1].start = PHYS_SDRAM_1 + get_sdr_cs_offset(CS1); +	gd->bd->bi_dram[1].size = size1; + +	return 0; +} + +/* + * mem_init() - + *  - Initialize memory subsystem + */ +void mem_init(void) +{ +	do_emif4_init(); +} diff --git a/arch/arm/include/asm/arch-omap3/cpu.h b/arch/arm/include/asm/arch-omap3/cpu.h index ce16da7f8..c072c27bb 100644 --- a/arch/arm/include/asm/arch-omap3/cpu.h +++ b/arch/arm/include/asm/arch-omap3/cpu.h @@ -216,6 +216,30 @@ struct sdrc {  	struct sdrc_cs cs[2];	/* 0x80 || 0xB0 */  }; +/* EMIF4 */ +typedef struct emif4 { +	unsigned int sdram_sts; +	unsigned int sdram_config; +	unsigned int res1; +	unsigned int sdram_refresh_ctrl; +	unsigned int sdram_refresh_ctrl_shdw; +	unsigned int sdram_time1; +	unsigned int sdram_time1_shdw; +	unsigned int sdram_time2; +	unsigned int sdram_time2_shdw; +	unsigned int sdram_time3; +	unsigned int sdram_time3_shdw; +	unsigned char res2[8]; +	unsigned int sdram_pwr_mgmt; +	unsigned int sdram_pwr_mgmt_shdw; +	unsigned char res3[32]; +	unsigned int sdram_iodft_tlgc; +	unsigned char res4[128]; +	unsigned int ddr_phyctrl1; +	unsigned int ddr_phyctrl1_shdw; +	unsigned int ddr_phyctrl2; +} emif4_t; +  #endif /* __ASSEMBLY__ */  #endif /* __KERNEL_STRICT_NAMES */ diff --git a/arch/arm/include/asm/arch-omap3/emif4.h b/arch/arm/include/asm/arch-omap3/emif4.h new file mode 100644 index 000000000..579da0ce5 --- /dev/null +++ b/arch/arm/include/asm/arch-omap3/emif4.h @@ -0,0 +1,79 @@ +/* + * Auther: + *       Vaibhav Hiremath <hvaibhav@ti.com> + * + * Copyright (C) 2010 + * Texas Instruments Incorporated - http://www.ti.com/ + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#ifndef _EMIF_H_ +#define _EMIF_H_ + +/* + * Configuration values + */ +#define EMIF4_TIM1_T_RP		(0x3 << 25) +#define EMIF4_TIM1_T_RCD	(0x3 << 21) +#define EMIF4_TIM1_T_WR		(0x3 << 17) +#define EMIF4_TIM1_T_RAS	(0x8 << 12) +#define EMIF4_TIM1_T_RC		(0xA << 6) +#define EMIF4_TIM1_T_RRD	(0x2 << 3) +#define EMIF4_TIM1_T_WTR	(0x2) + +#define EMIF4_TIM2_T_XP		(0x2 << 28) +#define EMIF4_TIM2_T_ODT	(0x0 << 25) +#define EMIF4_TIM2_T_XSNR	(0x1C << 16) +#define EMIF4_TIM2_T_XSRD	(0xC8 << 6) +#define EMIF4_TIM2_T_RTP	(0x1 << 3) +#define EMIF4_TIM2_T_CKE	(0x2) + +#define EMIF4_TIM3_T_RFC	(0x25 << 4) +#define EMIF4_TIM3_T_RAS_MAX	(0x7) + +#define EMIF4_PWR_IDLE_MODE	(0x2 << 30) +#define EMIF4_PWR_DPD_DIS	(0x0 << 10) +#define EMIF4_PWR_DPD_EN	(0x1 << 10) +#define EMIF4_PWR_LP_MODE	(0x0 << 8) +#define EMIF4_PWR_PM_TIM	(0x0) + +#define EMIF4_INITREF_DIS	(0x0 << 31) +#define EMIF4_REFRESH_RATE	(0x50F) + +#define EMIF4_CFG_SDRAM_TYP	(0x2 << 29) +#define EMIF4_CFG_IBANK_POS	(0x0 << 27) +#define EMIF4_CFG_DDR_TERM	(0x0 << 24) +#define EMIF4_CFG_DDR2_DDQS	(0x1 << 23) +#define EMIF4_CFG_DDR_DIS_DLL	(0x0 << 20) +#define EMIF4_CFG_SDR_DRV	(0x0 << 18) +#define EMIF4_CFG_NARROW_MD	(0x0 << 14) +#define EMIF4_CFG_CL		(0x5 << 10) +#define EMIF4_CFG_ROWSIZE	(0x0 << 7) +#define EMIF4_CFG_IBANK		(0x3 << 4) +#define EMIF4_CFG_EBANK		(0x0 << 3) +#define EMIF4_CFG_PGSIZE	(0x2) + +/* + * EMIF4 PHY Control 1 register configuration + */ +#define EMIF4_DDR1_EXT_STRB_EN	(0x1 << 7) +#define EMIF4_DDR1_EXT_STRB_DIS	(0x0 << 7) +#define EMIF4_DDR1_PWRDN_DIS	(0x0 << 6) +#define EMIF4_DDR1_PWRDN_EN	(0x1 << 6) +#define EMIF4_DDR1_READ_LAT	(0x6 << 0) + +#endif /* endif _EMIF_H_ */ diff --git a/arch/arm/include/asm/arch-omap3/sys_proto.h b/arch/arm/include/asm/arch-omap3/sys_proto.h index 4608f3063..db7b42aed 100644 --- a/arch/arm/include/asm/arch-omap3/sys_proto.h +++ b/arch/arm/include/asm/arch-omap3/sys_proto.h @@ -33,6 +33,7 @@ void per_clocks_enable(void);  void memif_init(void);  void sdrc_init(void);  void do_sdrc_init(u32, u32); +void emif4_init(void);  void gpmc_init(void);  void enable_gpmc_cs_config(const u32 *gpmc_config, struct gpmc_cs *cs, u32 base,  			u32 size); diff --git a/include/configs/am3517_evm.h b/include/configs/am3517_evm.h index 595b99ce1..513d005ee 100644 --- a/include/configs/am3517_evm.h +++ b/include/configs/am3517_evm.h @@ -33,7 +33,7 @@  #define CONFIG_OMAP34XX		1	/* which is a 34XX */  #define CONFIG_OMAP3_AM3517EVM	1	/* working with AM3517EVM */ -#define CONFIG_EMIF4		1	/* The chip has EMIF4 controller */ +#define CONFIG_EMIF4	/* The chip has EMIF4 controller */  #include <asm/arch/cpu.h>		/* get chip and board defs */  #include <asm/arch/omap3.h> |