diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2012-08-01 17:49:27 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2012-08-01 17:49:27 +0200 |
commit | 7db4b8a16a634ba1c225b918294305606f05f5e2 (patch) | |
tree | 35a78378375c1201863ede45ec93172e041cfd3d | |
parent | fd0543ca25e8987cde9bdfe41a65735faae2317a (diff) | |
parent | 35b5a49dd9be664a95764a72c5a72e0a1cdcb444 (diff) | |
download | barebox-7db4b8a16a634ba1c225b918294305606f05f5e2.tar.gz barebox-7db4b8a16a634ba1c225b918294305606f05f5e2.tar.xz |
Merge branch 'for-next/omap'
-rw-r--r-- | arch/arm/boards/phycard-a-l1/pca-a-l1.c | 181 | ||||
-rw-r--r-- | arch/arm/configs/phycard_a_l1_xload_defconfig | 43 | ||||
-rw-r--r-- | arch/arm/mach-omap/Kconfig | 1 | ||||
-rw-r--r-- | arch/arm/mach-omap/gpmc.c | 12 | ||||
-rw-r--r-- | arch/arm/mach-omap/include/mach/omap3-silicon.h | 1 |
5 files changed, 186 insertions, 52 deletions
diff --git a/arch/arm/boards/phycard-a-l1/pca-a-l1.c b/arch/arm/boards/phycard-a-l1/pca-a-l1.c index 1cc2815df9..1dc7678771 100644 --- a/arch/arm/boards/phycard-a-l1/pca-a-l1.c +++ b/arch/arm/boards/phycard-a-l1/pca-a-l1.c @@ -73,10 +73,82 @@ #define SMC911X_BASE 0x2c000000 +/* Slower full frequency range default timings for x32 operation */ +#define SDP_SDRC_SHARING 0x00000100 +/* Diabling power down mode using CKE pin */ +#define SDP_SDRC_POWER_POP 0x00000081 +/* rkw - need to find of 90/72 degree recommendation for speed like before. */ +#define SDP_SDRC_DLLAB_CTRL ((DLL_ENADLL << 3) | \ + (DLL_LOCKDLL << 2) | (DLL_DLLPHASE_90 << 1)) + +/* used to create an array of memory configuartions. */ +struct sdrc_config { + u32 cs_cfg; + u32 mcfg; + u32 mr; + u32 actim_ctrla; + u32 actim_ctrlb; + u32 rfr_ctrl; +} const sdrc_config[] = { +/* max cs_size for autodetection, common timing */ +/* 2x256MByte, 14 Rows, 10 Columns , RBC (BAL=2) */ +{ 0x00000004, 0x03590099, 0x00000032, 0x9A9DB4C6, 0x00011216, 0x0004e201}, +/* MT46H32M32LF 2x128MByte, 13 Rows, 10 Columns */ +{ 0x00000001, 0x02584099, 0x00000032, 0x9A9DB4C6, 0x00011216, 0x0004e201}, +/* MT46H64M32LF 1x256MByte, 14 Rows, 10 Columns */ +{ 0x00000002, 0x03588099, 0x00000032, 0x629DB4C6, 0x00011113, 0x0004e201}, +/* MT64H128M32L2 2x256MByte, 14 Rows, 10 Columns */ +{ 0x00000002, 0x03588099, 0x00000032, 0x629DB4C6, 0x00011113, 0x0004e201}, +}; + /* * Boot-time initialization(s) */ +/********************************************************************* + * init_sdram_ddr() - Init DDR controller. + *********************************************************************/ +void init_sdram_ddr(void) +{ + /* reset sdrc controller */ + writel(SOFTRESET, SDRC_REG(SYSCONFIG)); + wait_on_value(1<<0, 1<<0, SDRC_REG(STATUS), 12000000); + writel(0, SDRC_REG(SYSCONFIG)); + + /* setup sdrc to ball mux */ + writel(SDP_SDRC_SHARING, SDRC_REG(SHARING)); + writel(SDP_SDRC_POWER_POP, SDRC_REG(POWER)); + + /* set up dll */ + writel(SDP_SDRC_DLLAB_CTRL, SDRC_REG(DLLA_CTRL)); + sdelay(0x2000); /* give time to lock */ + +} +/********************************************************************* + * config_sdram_ddr() - Init DDR on dev board. + *********************************************************************/ +void config_sdram_ddr(u8 cs, u8 cfg) +{ + + writel(sdrc_config[cfg].mcfg, SDRC_REG(MCFG_0) + (0x30 * cs)); + writel(sdrc_config[cfg].actim_ctrla, SDRC_REG(ACTIM_CTRLA_0) + (0x28 * cs)); + writel(sdrc_config[cfg].actim_ctrlb, SDRC_REG(ACTIM_CTRLB_0) + (0x28 * cs)); + writel(sdrc_config[cfg].rfr_ctrl, SDRC_REG(RFR_CTRL_0) + (0x30 * cs)); + + writel(CMD_NOP, SDRC_REG(MANUAL_0) + (0x30 * cs)); + + sdelay(5000); + + writel(CMD_PRECHARGE, SDRC_REG(MANUAL_0) + (0x30 * cs)); + writel(CMD_AUTOREFRESH, SDRC_REG(MANUAL_0) + (0x30 * cs)); + writel(CMD_AUTOREFRESH, SDRC_REG(MANUAL_0) + (0x30 * cs)); + + /* set mr0 */ + writel(sdrc_config[cfg].mr, SDRC_REG(MR_0) + (0x30 * cs)); + + sdelay(2000); +} + /** * @brief Initialize the SDRC module * Initialisation for 1x256MByte but normally @@ -85,49 +157,55 @@ */ static void pcaal1_sdrc_init(void) { - /* SDRAM software reset */ - /* No idle ack and RESET enable */ - writel(0x1A, SDRC_REG(SYSCONFIG)); - sdelay(100); - /* No idle ack and RESET disable */ - writel(0x18, SDRC_REG(SYSCONFIG)); - - /* SDRC Sharing register */ - /* 32-bit SDRAM on data lane [31:0] - CS0 */ - /* pin tri-stated = 1 */ - writel(0x00000100, SDRC_REG(SHARING)); - - /* ----- SDRC Registers Configuration --------- */ - /* SDRC_MCFG0 register */ - writel(0x03588099, SDRC_REG(MCFG_0)); - - /* SDRC_RFR_CTRL0 register */ - writel(0x0004e201, SDRC_REG(RFR_CTRL_0)); - - /* SDRC_ACTIM_CTRLA0 register */ - writel(0x629DB4C6, SDRC_REG(ACTIM_CTRLA_0)); - - /* SDRC_ACTIM_CTRLB0 register */ - writel(0x00011113, SDRC_REG(ACTIM_CTRLB_0)); - - /* Disble Power Down of CKE due to 1 CKE on combo part */ - writel(0x00000081, SDRC_REG(POWER)); - - /* SDRC_MANUAL command register */ - /* NOP command */ - writel(0x00000000, SDRC_REG(MANUAL_0)); - /* Precharge command */ - writel(0x00000001, SDRC_REG(MANUAL_0)); - /* Auto-refresh command */ - writel(0x00000002, SDRC_REG(MANUAL_0)); - /* Auto-refresh command */ - writel(0x00000002, SDRC_REG(MANUAL_0)); - - /* SDRC MR0 register Burst length=4 */ - writel(0x00000032, SDRC_REG(MR_0)); - - /* SDRC DLLA control register */ - writel(0x0000000A, SDRC_REG(DLLA_CTRL)); + u32 test0, test1; + char cfg; + + init_sdram_ddr(); + + config_sdram_ddr(0, 0); /* 256MByte at CS0 */ + config_sdram_ddr(1, 0); /* 256MByte at CS1 */ + + test0 = get_ram_size((long *) 0x80000000, SZ_256M); + test1 = get_ram_size((long *) 0xA0000000, SZ_256M); + + /* mask out lower nible, its not tested with + in common/memsize.c */ + test1 &= 0xfffffff0; + + if ((test1 > 0) && (test1 != test0)) + hang(); + + cfg = -1; /* illegal configuration found */ + + if (test1 == 0) { + init_sdram_ddr(); + writel((sdrc_config[(uchar) cfg].mcfg & 0xfffc00ff), SDRC_REG(MCFG_1)); + + /* 1 x 256MByte */ + if (test0 == SZ_256M) + cfg = 2; + + if (cfg != -1) { + config_sdram_ddr(0, cfg); + writel(sdrc_config[(uchar) cfg].cs_cfg, SDRC_REG(CS_CFG)); + } + return; + } + + /* reinit both cs with correct size */ + /* 2 x 128MByte */ + if (test0 == SZ_128M) + cfg = 1; + /* 2 x 256MByte */ + if (test0 == SZ_256M) + cfg = 3; + + if (cfg != -1) { + init_sdram_ddr(); + writel(sdrc_config[(uchar) cfg].cs_cfg, SDRC_REG(CS_CFG)); + config_sdram_ddr(0, cfg); + config_sdram_ddr(1, cfg); + } } /** @@ -292,11 +370,16 @@ static int pcaal1_mem_init(void) */ gpmc_generic_init(0x10); #endif + add_mem_device("sram0", OMAP_SRAM_BASE, 60 * SZ_1K, + IORESOURCE_MEM_WRITEABLE); arm_add_mem_device("ram0", OMAP_SDRC_CS0, get_sdr_cs_size(SDRC_CS0_OSET)); + printf("found %s at SDCS0\n", size_human_readable(get_sdr_cs_size(SDRC_CS0_OSET))); - if ((get_sdr_cs_size(SDRC_CS1_OSET) != 0) && (get_sdr_cs1_base() != OMAP_SDRC_CS0)) + if ((get_sdr_cs_size(SDRC_CS1_OSET) != 0) && (get_sdr_cs1_base() != OMAP_SDRC_CS0)) { arm_add_mem_device("ram1", get_sdr_cs1_base(), get_sdr_cs_size(SDRC_CS1_OSET)); + printf("found %s at SDCS1\n", size_human_readable(get_sdr_cs_size(SDRC_CS1_OSET))); + } return 0; } @@ -310,6 +393,7 @@ struct omap_hsmmc_platform_data pcaal1_hsmmc_plat = { static int pcaal1_init_devices(void) { + gpmc_generic_nand_devices_init(0, 16, OMAP_ECC_BCH8_CODE_HW, &omap3_nand_cfg); #ifdef CONFIG_MCI_OMAP_HSMMC add_generic_device("omap-hsmmc", DEVICE_ID_DYNAMIC, NULL, OMAP_MMC1_BASE, SZ_4K, IORESOURCE_MEM, &pcaal1_hsmmc_plat); @@ -330,12 +414,7 @@ device_initcall(pcaal1_init_devices); static int pcaal1_late_init(void) { - struct device_d *nand; - - gpmc_generic_nand_devices_init(0, 16, OMAP_ECC_SOFT, &omap3_nand_cfg); - - nand = get_device_by_name("nand0"); - +#ifdef CONFIG_PARTITION devfs_add_partition("nand0", 0x00000, 0x80000, DEVFS_PARTITION_FIXED, "x-loader"); dev_add_bb_dev("self_raw", "x_loader0"); @@ -344,7 +423,7 @@ static int pcaal1_late_init(void) devfs_add_partition("nand0", 0x260000, 0x20000, DEVFS_PARTITION_FIXED, "env_raw"); dev_add_bb_dev("env_raw", "env0"); - +#endif return 0; } late_initcall(pcaal1_late_init); diff --git a/arch/arm/configs/phycard_a_l1_xload_defconfig b/arch/arm/configs/phycard_a_l1_xload_defconfig new file mode 100644 index 0000000000..30253cba1c --- /dev/null +++ b/arch/arm/configs/phycard_a_l1_xload_defconfig @@ -0,0 +1,43 @@ +CONFIG_ARCH_OMAP=y +CONFIG_OMAP_BUILD_IFT=y +CONFIG_MACH_PCAAL1=y +CONFIG_AEABI=y +CONFIG_THUMB2_BAREBOX=y +# CONFIG_CMD_ARM_CPUINFO is not set +# CONFIG_ARM_EXCEPTIONS is not set +CONFIG_ENVIRONMENT_VARIABLES=y +CONFIG_TEXT_BASE=0x40200000 +CONFIG_BAREBOX_MAX_IMAGE_SIZE=0x0000f000 +CONFIG_BAREBOX_MAX_BARE_INIT_SIZE=0x0000f000 +CONFIG_MEMORY_LAYOUT_FIXED=y +CONFIG_STACK_BASE=0x4020F000 +CONFIG_STACK_SIZE=0xc00 +CONFIG_MALLOC_BASE=0x84000000 +CONFIG_MALLOC_SIZE=0x1000000 +CONFIG_MALLOC_DUMMY=y +CONFIG_PROMPT="X-load pca-a-l1>" +CONFIG_CBSIZE=128 +CONFIG_SHELL_NONE=y +# CONFIG_ERRNO_MESSAGES is not set +# CONFIG_TIMESTAMP is not set +# CONFIG_CONSOLE_FULL is not set +# CONFIG_DEFAULT_ENVIRONMENT is not set +CONFIG_DRIVER_SERIAL_NS16550=y +CONFIG_DRIVER_SERIAL_NS16550_OMAP_EXTENSIONS=y +# CONFIG_SPI is not set +CONFIG_MTD=y +# CONFIG_MTD_WRITE is not set +# CONFIG_MTD_OOB_DEVICE is not set +CONFIG_NAND=y +# CONFIG_NAND_ECC_SOFT is not set +# CONFIG_NAND_ECC_HW_SYNDROME is not set +# CONFIG_NAND_ECC_HW_NONE is not set +# CONFIG_NAND_BBT is not set +CONFIG_NAND_OMAP_GPMC=y +CONFIG_MCI=y +CONFIG_MCI_STARTUP=y +# CONFIG_MCI_WRITE is not set +CONFIG_MCI_OMAP_HSMMC=y +# CONFIG_FS_RAMFS is not set +# CONFIG_FS_DEVFS is not set +CONFIG_FS_FAT=y diff --git a/arch/arm/mach-omap/Kconfig b/arch/arm/mach-omap/Kconfig index 386c4845f1..d735284a11 100644 --- a/arch/arm/mach-omap/Kconfig +++ b/arch/arm/mach-omap/Kconfig @@ -151,6 +151,7 @@ config MACH_PCM049 config MACH_PCAAL1 bool "Phytec phyCARD-A-L1" select OMAP_CLOCK_ALL + select HAVE_NOSHELL depends on ARCH_OMAP3 help Say Y here if you are using a phyCARD-A-L1 PCA-A-L1 diff --git a/arch/arm/mach-omap/gpmc.c b/arch/arm/mach-omap/gpmc.c index e8946d7c56..92a8ae043d 100644 --- a/arch/arm/mach-omap/gpmc.c +++ b/arch/arm/mach-omap/gpmc.c @@ -28,6 +28,7 @@ * MA 02111-1307 USA */ #include <common.h> +#include <clock.h> #include <init.h> #include <io.h> #include <mach/silicon.h> @@ -48,13 +49,22 @@ */ void gpmc_generic_init(unsigned int cfg) { + uint64_t start; unsigned int reg = GPMC_REG(CONFIG7_0); char x = 0; debug("gpmccfg=%x\n", cfg); /* Generic Configurations */ + /* reset gpmc */ + start = get_time_ns(); /* No idle, L3 clock free running */ - writel(0x10, GPMC_REG(SYS_CONFIG)); + writel(0x12, GPMC_REG(SYS_CONFIG)); + while (!readl(GPMC_REG(SYS_STATUS))) + if (is_timeout(start, MSECOND)) { + printf("timeout on gpmc reset\n"); + break; + } + /* No Timeout */ writel(0x00, GPMC_REG(TIMEOUT_CONTROL)); /* No IRQs */ diff --git a/arch/arm/mach-omap/include/mach/omap3-silicon.h b/arch/arm/mach-omap/include/mach/omap3-silicon.h index 361d25e999..e4002e6618 100644 --- a/arch/arm/mach-omap/include/mach/omap3-silicon.h +++ b/arch/arm/mach-omap/include/mach/omap3-silicon.h @@ -107,6 +107,7 @@ #define OMAP_EHCI_BASE (OMAP_L4_CORE_BASE + 0x64800) /** Interrupt Vector base address */ +#define OMAP_SRAM_BASE 0x40200000 #define OMAP_SRAM_INTVECT 0x4020F800 #define OMAP_SRAM_INTVECT_COPYSIZE 0x64 /** Temporary stack for us to use C calls in low_level_init */ |