Message ID | 1358768638-14187-7-git-send-email-amarendra.xt@samsung.com |
---|---|
State | New |
Headers | show |
Hi Amar, On Tue, Jan 22, 2013 at 12:43 AM, Amar <amarendra.xt@samsung.com> wrote: > This patch enables and initialises DWMMC for SMDK5250. > Supports both FDT and non-FDT. This patch creates a new file > 'exynos5-dt.c' meant for FDT support. > exynos5-dt.c: This file shall contain all code which supports FDT. > Any addition of FDT support for any module needs to be > added in this file. > smdk5250.c: This file shall contain the code which supports non-FDT. > version. Any addition of non-FDT support for any module > needs to be added in this file. > May be, the file smdk5250.c can be removed in near future > when non-FDT is not required. > > The Makefile is updated to compile only one of the files > exynos5-dt.c / smdk5250.c based on FDT configuration. > > NOTE: > Please note that all additions corresponding to FDT need to be added into the > file exynos5-dt.c. > At same time if non-FDT support is required then add the corresponding > updations into smdk5250.c. > > Signed-off-by: Amar <amarendra.xt@samsung.com> This looks OK to me. It could perhaps be separated into a patch to create the exynos5-dt.c file, and a separate one to enable the mmc, but I think this is fine. I am a little concerned at the possible code duplication between smdk250.c and exynos5-dt.c - if this becomes a problem later perhaps you could create a common file for things like board_uart_init(). Acked-by: Simon Glass <sjg@chromium.org> > --- > Changes since V1: > 1)A new file 'exynos5-dt.c' is created meant for FDT support > 2)Makefile is updated to compile only one of the files > exynos5-dt.c / smdk5250.c based on FDT configuration > > Changes since V2: > 1)Updation of commit message and resubmition of proper patch set. > > Changes since V3: > No change. > > Changes since V4: > 1)Replaced the function call 'exynos_dwmmc_init(0, 8);' with the > function exynos_dwmmc_add_port() in smdk5250.c. > 2)dram_init() is updated to use for loop to compute the ram size. > 3)dram_init_banksize() is updated to use for loop to initialise > the dram bank size. > 4)board_uart_init() is updated to use for loop to initialise UARTS. > 5)In non-FDT case NULL is passed as parameter to board_i2c_init(). > > board/samsung/smdk5250/Makefile | 4 + > board/samsung/smdk5250/exynos5-dt.c | 211 ++++++++++++++++++++++++++++++++++++ > board/samsung/smdk5250/smdk5250.c | 170 ++++++++++------------------- > include/configs/exynos5250-dt.h | 6 + > 4 files changed, 279 insertions(+), 112 deletions(-) > create mode 100644 board/samsung/smdk5250/exynos5-dt.c > > diff --git a/board/samsung/smdk5250/Makefile b/board/samsung/smdk5250/Makefile > index 47c6a5a..ecca9f3 100644 > --- a/board/samsung/smdk5250/Makefile > +++ b/board/samsung/smdk5250/Makefile > @@ -32,8 +32,12 @@ COBJS += tzpc_init.o > COBJS += smdk5250_spl.o > > ifndef CONFIG_SPL_BUILD > +ifdef CONFIG_OF_CONTROL > +COBJS += exynos5-dt.o > +else > COBJS += smdk5250.o > endif > +endif > > ifdef CONFIG_SPL_BUILD > COBJS += spl_boot.o > diff --git a/board/samsung/smdk5250/exynos5-dt.c b/board/samsung/smdk5250/exynos5-dt.c > new file mode 100644 > index 0000000..a4b0e10 > --- /dev/null > +++ b/board/samsung/smdk5250/exynos5-dt.c > @@ -0,0 +1,211 @@ > +/* > + * Copyright (C) 2012 Samsung Electronics > + * > + * See file CREDITS for list of people who contributed to this > + * project. > + * > + * 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 <fdtdec.h> > +#include <asm/io.h> > +#include <i2c.h> > +#include <netdev.h> > +#include <spi.h> > +#include <asm/arch/cpu.h> > +#include <asm/arch/dwmmc.h> > +#include <asm/arch/gpio.h> > +#include <asm/arch/mmc.h> > +#include <asm/arch/pinmux.h> > +#include <asm/arch/sromc.h> > +#include <power/pmic.h> > + > +DECLARE_GLOBAL_DATA_PTR; > + > +int board_init(void) > +{ > + gd->bd->bi_boot_params = (PHYS_SDRAM_1 + 0x100UL); > +#ifdef CONFIG_EXYNOS_SPI > + spi_init(); > +#endif > + return 0; > +} > + > +int dram_init(void) > +{ > + int i; > + u32 addr; > + > + for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) { > + addr = CONFIG_SYS_SDRAM_BASE + (i * SDRAM_BANK_SIZE); > + gd->ram_size += get_ram_size((long *)addr, SDRAM_BANK_SIZE); > + } > + return 0; > +} > + > +#if defined(CONFIG_POWER) > +int power_init_board(void) > +{ > + if (pmic_init(I2C_PMIC)) { > + debug("Could not initialise PMIC\n"); > + return -1; > + } else > + return 0; > +} > +#endif > + > +void dram_init_banksize(void) > +{ > + int i; > + u32 addr, size; > + > + for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) { > + addr = CONFIG_SYS_SDRAM_BASE + (i * SDRAM_BANK_SIZE); > + size = get_ram_size((long *)addr, SDRAM_BANK_SIZE); > + > + gd->bd->bi_dram[i].start = addr; > + gd->bd->bi_dram[i].size = size; > + } > +} > + > +static int decode_sromc(const void *blob, struct fdt_sromc *config) > +{ > + int err; > + int node; > + > + node = fdtdec_next_compatible(blob, 0, COMPAT_SAMSUNG_EXYNOS5_SROMC); > + if (node < 0) { > + debug("Could not find SROMC node\n"); > + return node; > + } > + > + config->bank = fdtdec_get_int(blob, node, "bank", 0); > + config->width = fdtdec_get_int(blob, node, "width", 2); > + > + err = fdtdec_get_int_array(blob, node, "srom-timing", config->timing, > + FDT_SROM_TIMING_COUNT); > + if (err < 0) { > + debug("Could not decode SROMC configuration" > + "Error: %s\n", fdt_strerror(err)); > + return -FDT_ERR_NOTFOUND; > + } > + return 0; > +} > + > +int board_eth_init(bd_t *bis) > +{ > +#ifdef CONFIG_SMC911X > + u32 smc_bw_conf, smc_bc_conf; > + struct fdt_sromc config; > + fdt_addr_t base_addr; > + int node; > + > + node = decode_sromc(gd->fdt_blob, &config); > + if (node < 0) { > + debug("%s: Could not find sromc configuration\n", __func__); > + return 0; > + } > + node = fdtdec_next_compatible(gd->fdt_blob, node, COMPAT_SMSC_LAN9215); > + if (node < 0) { > + debug("%s: Could not find lan9215 configuration\n", __func__); > + return 0; > + } > + > + /* We now have a node, so any problems from now on are errors */ > + base_addr = fdtdec_get_addr(gd->fdt_blob, node, "reg"); > + if (base_addr == FDT_ADDR_T_NONE) { > + debug("%s: Could not find lan9215 address\n", __func__); > + return -1; > + } > + > + /* Ethernet needs data bus width of 16 bits */ > + if (config.width != 2) { > + debug("%s: Unsupported bus width %d\n", __func__, > + config.width); > + return -1; > + } > + smc_bw_conf = SROMC_DATA16_WIDTH(config.bank) > + | SROMC_BYTE_ENABLE(config.bank); > + > + smc_bc_conf = SROMC_BC_TACS(config.timing[FDT_SROM_TACS]) | > + SROMC_BC_TCOS(config.timing[FDT_SROM_TCOS]) | > + SROMC_BC_TACC(config.timing[FDT_SROM_TACC]) | > + SROMC_BC_TCOH(config.timing[FDT_SROM_TCOH]) | > + SROMC_BC_TAH(config.timing[FDT_SROM_TAH]) | > + SROMC_BC_TACP(config.timing[FDT_SROM_TACP]) | > + SROMC_BC_PMC(config.timing[FDT_SROM_PMC]); > + > + /* Select and configure the SROMC bank */ > + exynos_pinmux_config(PERIPH_ID_SROMC, config.bank); > + s5p_config_sromc(config.bank, smc_bw_conf, smc_bc_conf); > + return smc911x_initialize(0, base_addr); > +#endif > + return 0; > +} > + > +#ifdef CONFIG_DISPLAY_BOARDINFO > +int checkboard(void) > +{ > + printf("\nBoard: SMDK5250\n"); > + > + return 0; > +} > +#endif > + > +#ifdef CONFIG_GENERIC_MMC > +int board_mmc_init(bd_t *bis) > +{ > + int ret; > + /* dwmmc initializattion for available channels */ > + ret = exynos_dwmmc_init(gd->fdt_blob); > + if (ret) > + debug("dwmmc init failed\n"); > + > + return ret; > +} > +#endif > + > +static int board_uart_init(void) > +{ > + int err, uart_id, ret = 0; > + > + for (uart_id = PERIPH_ID_UART0; uart_id <= PERIPH_ID_UART3; uart_id++) { > + err = exynos_pinmux_config(uart_id, PINMUX_FLAG_NONE); > + if (err) { > + debug("UART%d not configured\n", > + (uart_id - PERIPH_ID_UART0)); > + ret |= err; > + } > + } > + return ret; > +} > + > +#ifdef CONFIG_BOARD_EARLY_INIT_F > +int board_early_init_f(void) > +{ > + int err; > + err = board_uart_init(); > + if (err) { > + debug("UART init failed\n"); > + return err; > + } > +#ifdef CONFIG_SYS_I2C_INIT_BOARD > + board_i2c_init(gd->fdt_blob); > +#endif > + return err; > +} > +#endif > diff --git a/board/samsung/smdk5250/smdk5250.c b/board/samsung/smdk5250/smdk5250.c > index 7a5f132..e3a2593 100644 > --- a/board/samsung/smdk5250/smdk5250.c > +++ b/board/samsung/smdk5250/smdk5250.c > @@ -28,6 +28,7 @@ > #include <netdev.h> > #include <spi.h> > #include <asm/arch/cpu.h> > +#include <asm/arch/dwmmc.h> > #include <asm/arch/gpio.h> > #include <asm/arch/mmc.h> > #include <asm/arch/pinmux.h> > @@ -68,80 +69,40 @@ int board_init(void) > > int dram_init(void) > { > - gd->ram_size = get_ram_size((long *)PHYS_SDRAM_1, PHYS_SDRAM_1_SIZE) > - + get_ram_size((long *)PHYS_SDRAM_2, PHYS_SDRAM_2_SIZE) > - + get_ram_size((long *)PHYS_SDRAM_3, PHYS_SDRAM_3_SIZE) > - + get_ram_size((long *)PHYS_SDRAM_4, PHYS_SDRAM_4_SIZE) > - + get_ram_size((long *)PHYS_SDRAM_5, PHYS_SDRAM_7_SIZE) > - + get_ram_size((long *)PHYS_SDRAM_6, PHYS_SDRAM_7_SIZE) > - + get_ram_size((long *)PHYS_SDRAM_7, PHYS_SDRAM_7_SIZE) > - + get_ram_size((long *)PHYS_SDRAM_8, PHYS_SDRAM_8_SIZE); > + int i; > + u32 addr; > + > + for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) { > + addr = CONFIG_SYS_SDRAM_BASE + (i * SDRAM_BANK_SIZE); > + gd->ram_size += get_ram_size((long *)addr, SDRAM_BANK_SIZE); > + } > return 0; > } > > #if defined(CONFIG_POWER) > int power_init_board(void) > { > - if (pmic_init(I2C_PMIC)) > + if (pmic_init(I2C_PMIC)) { > + debug("Could not initialise PMIC\n"); > return -1; > - else > + } else > return 0; > } > #endif > > void dram_init_banksize(void) > { > - gd->bd->bi_dram[0].start = PHYS_SDRAM_1; > - gd->bd->bi_dram[0].size = get_ram_size((long *)PHYS_SDRAM_1, > - PHYS_SDRAM_1_SIZE); > - gd->bd->bi_dram[1].start = PHYS_SDRAM_2; > - gd->bd->bi_dram[1].size = get_ram_size((long *)PHYS_SDRAM_2, > - PHYS_SDRAM_2_SIZE); > - gd->bd->bi_dram[2].start = PHYS_SDRAM_3; > - gd->bd->bi_dram[2].size = get_ram_size((long *)PHYS_SDRAM_3, > - PHYS_SDRAM_3_SIZE); > - gd->bd->bi_dram[3].start = PHYS_SDRAM_4; > - gd->bd->bi_dram[3].size = get_ram_size((long *)PHYS_SDRAM_4, > - PHYS_SDRAM_4_SIZE); > - gd->bd->bi_dram[4].start = PHYS_SDRAM_5; > - gd->bd->bi_dram[4].size = get_ram_size((long *)PHYS_SDRAM_5, > - PHYS_SDRAM_5_SIZE); > - gd->bd->bi_dram[5].start = PHYS_SDRAM_6; > - gd->bd->bi_dram[5].size = get_ram_size((long *)PHYS_SDRAM_6, > - PHYS_SDRAM_6_SIZE); > - gd->bd->bi_dram[6].start = PHYS_SDRAM_7; > - gd->bd->bi_dram[6].size = get_ram_size((long *)PHYS_SDRAM_7, > - PHYS_SDRAM_7_SIZE); > - gd->bd->bi_dram[7].start = PHYS_SDRAM_8; > - gd->bd->bi_dram[7].size = get_ram_size((long *)PHYS_SDRAM_8, > - PHYS_SDRAM_8_SIZE); > -} > + int i; > + u32 addr, size; > > -#ifdef CONFIG_OF_CONTROL > -static int decode_sromc(const void *blob, struct fdt_sromc *config) > -{ > - int err; > - int node; > + for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) { > + addr = CONFIG_SYS_SDRAM_BASE + (i * SDRAM_BANK_SIZE); > + size = get_ram_size((long *)addr, SDRAM_BANK_SIZE); > > - node = fdtdec_next_compatible(blob, 0, COMPAT_SAMSUNG_EXYNOS5_SROMC); > - if (node < 0) { > - debug("Could not find SROMC node\n"); > - return node; > + gd->bd->bi_dram[i].start = addr; > + gd->bd->bi_dram[i].size = size; > } > - > - config->bank = fdtdec_get_int(blob, node, "bank", 0); > - config->width = fdtdec_get_int(blob, node, "width", 2); > - > - err = fdtdec_get_int_array(blob, node, "srom-timing", config->timing, > - FDT_SROM_TIMING_COUNT); > - if (err < 0) { > - debug("Could not decode SROMC configuration\n"); > - return -FDT_ERR_NOTFOUND; > - } > - > - return 0; > } > -#endif > > int board_eth_init(bd_t *bis) > { > @@ -149,27 +110,7 @@ int board_eth_init(bd_t *bis) > u32 smc_bw_conf, smc_bc_conf; > struct fdt_sromc config; > fdt_addr_t base_addr; > - int node; > > -#ifdef CONFIG_OF_CONTROL > - node = decode_sromc(gd->fdt_blob, &config); > - if (node < 0) { > - debug("%s: Could not find sromc configuration\n", __func__); > - return 0; > - } > - node = fdtdec_next_compatible(gd->fdt_blob, node, COMPAT_SMSC_LAN9215); > - if (node < 0) { > - debug("%s: Could not find lan9215 configuration\n", __func__); > - return 0; > - } > - > - /* We now have a node, so any problems from now on are errors */ > - base_addr = fdtdec_get_addr(gd->fdt_blob, node, "reg"); > - if (base_addr == FDT_ADDR_T_NONE) { > - debug("%s: Could not find lan9215 address\n", __func__); > - return -1; > - } > -#else > /* Non-FDT configuration - bank number and timing parameters*/ > config.bank = CONFIG_ENV_SROM_BANK; > config.width = 2; > @@ -182,7 +123,6 @@ int board_eth_init(bd_t *bis) > config.timing[FDT_SROM_TACP] = 0x09; > config.timing[FDT_SROM_PMC] = 0x01; > base_addr = CONFIG_SMC911X_BASE; > -#endif > > /* Ethernet needs data bus width of 16 bits */ > if (config.width != 2) { > @@ -221,48 +161,54 @@ int checkboard(void) > #ifdef CONFIG_GENERIC_MMC > int board_mmc_init(bd_t *bis) > { > - int err; > + int err, ret = 0, index, bus_width; > + u32 base; > > err = exynos_pinmux_config(PERIPH_ID_SDMMC0, PINMUX_FLAG_8BIT_MODE); > - if (err) { > + if (err) > debug("SDMMC0 not configured\n"); > - return err; > - } > - > - err = s5p_mmc_init(0, 8); > - return err; > + ret |= err; > + > + /*EMMC: dwmmc Channel-0 with 8 bit bus width */ > + index = 0; > + base = samsung_get_base_mmc() + (0x10000 * index); > + bus_width = 8; > + err = exynos_dwmci_add_port(index, base, bus_width, (u32)NULL); > + if (err) > + debug("dwmmc Channel-0 init failed\n"); > + ret |= err; > + > + err = exynos_pinmux_config(PERIPH_ID_SDMMC2, PINMUX_FLAG_NONE); > + if (err) > + debug("SDMMC2 not configured\n"); > + ret |= err; > + > + /*SD: dwmmc Channel-2 with 4 bit bus width */ > + index = 2; > + base = samsung_get_base_mmc() + (0x10000 * index); > + bus_width = 4; > + err = exynos_dwmci_add_port(index, base, bus_width, (u32)NULL); > + if (err) > + debug("dwmmc Channel-2 init failed\n"); > + ret |= err; > + > + return ret; > } > #endif > > static int board_uart_init(void) > { > - int err; > - > - err = exynos_pinmux_config(PERIPH_ID_UART0, PINMUX_FLAG_NONE); > - if (err) { > - debug("UART0 not configured\n"); > - return err; > - } > - > - err = exynos_pinmux_config(PERIPH_ID_UART1, PINMUX_FLAG_NONE); > - if (err) { > - debug("UART1 not configured\n"); > - return err; > + int err, uart_id, ret = 0; > + > + for (uart_id = PERIPH_ID_UART0; uart_id <= PERIPH_ID_UART3; uart_id++) { > + err = exynos_pinmux_config(uart_id, PINMUX_FLAG_NONE); > + if (err) { > + debug("UART%d not configured\n", > + (uart_id - PERIPH_ID_UART0)); > + ret |= err; > + } > } > - > - err = exynos_pinmux_config(PERIPH_ID_UART2, PINMUX_FLAG_NONE); > - if (err) { > - debug("UART2 not configured\n"); > - return err; > - } > - > - err = exynos_pinmux_config(PERIPH_ID_UART3, PINMUX_FLAG_NONE); > - if (err) { > - debug("UART3 not configured\n"); > - return err; > - } > - > - return 0; > + return ret; > } > > #ifdef CONFIG_BOARD_EARLY_INIT_F > @@ -275,7 +221,7 @@ int board_early_init_f(void) > return err; > } > #ifdef CONFIG_SYS_I2C_INIT_BOARD > - board_i2c_init(gd->fdt_blob); > + board_i2c_init(NULL); > #endif > return err; > } > diff --git a/include/configs/exynos5250-dt.h b/include/configs/exynos5250-dt.h > index cabd2f2..3fa86b2 100644 > --- a/include/configs/exynos5250-dt.h > +++ b/include/configs/exynos5250-dt.h > @@ -95,6 +95,8 @@ > #define CONFIG_MMC > #define CONFIG_SDHCI > #define CONFIG_S5P_SDHCI > +#define CONFIG_DWMMC > +#define CONFIG_EXYNOS_DWMMC > > #define CONFIG_BOARD_EARLY_INIT_F > > @@ -210,6 +212,10 @@ > > #define CONFIG_DOS_PARTITION > > +#define CONFIG_EFI_PARTITION > +#define CONFIG_CMD_PART > +#define CONFIG_PARTITION_UUIDS > + > #define CONFIG_IRAM_STACK 0x02050000 > > #define CONFIG_SYS_INIT_SP_ADDR (CONFIG_SYS_LOAD_ADDR - 0x1000000) > -- > 1.8.0 >
diff --git a/board/samsung/smdk5250/Makefile b/board/samsung/smdk5250/Makefile index 47c6a5a..ecca9f3 100644 --- a/board/samsung/smdk5250/Makefile +++ b/board/samsung/smdk5250/Makefile @@ -32,8 +32,12 @@ COBJS += tzpc_init.o COBJS += smdk5250_spl.o ifndef CONFIG_SPL_BUILD +ifdef CONFIG_OF_CONTROL +COBJS += exynos5-dt.o +else COBJS += smdk5250.o endif +endif ifdef CONFIG_SPL_BUILD COBJS += spl_boot.o diff --git a/board/samsung/smdk5250/exynos5-dt.c b/board/samsung/smdk5250/exynos5-dt.c new file mode 100644 index 0000000..a4b0e10 --- /dev/null +++ b/board/samsung/smdk5250/exynos5-dt.c @@ -0,0 +1,211 @@ +/* + * Copyright (C) 2012 Samsung Electronics + * + * See file CREDITS for list of people who contributed to this + * project. + * + * 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 <fdtdec.h> +#include <asm/io.h> +#include <i2c.h> +#include <netdev.h> +#include <spi.h> +#include <asm/arch/cpu.h> +#include <asm/arch/dwmmc.h> +#include <asm/arch/gpio.h> +#include <asm/arch/mmc.h> +#include <asm/arch/pinmux.h> +#include <asm/arch/sromc.h> +#include <power/pmic.h> + +DECLARE_GLOBAL_DATA_PTR; + +int board_init(void) +{ + gd->bd->bi_boot_params = (PHYS_SDRAM_1 + 0x100UL); +#ifdef CONFIG_EXYNOS_SPI + spi_init(); +#endif + return 0; +} + +int dram_init(void) +{ + int i; + u32 addr; + + for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) { + addr = CONFIG_SYS_SDRAM_BASE + (i * SDRAM_BANK_SIZE); + gd->ram_size += get_ram_size((long *)addr, SDRAM_BANK_SIZE); + } + return 0; +} + +#if defined(CONFIG_POWER) +int power_init_board(void) +{ + if (pmic_init(I2C_PMIC)) { + debug("Could not initialise PMIC\n"); + return -1; + } else + return 0; +} +#endif + +void dram_init_banksize(void) +{ + int i; + u32 addr, size; + + for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) { + addr = CONFIG_SYS_SDRAM_BASE + (i * SDRAM_BANK_SIZE); + size = get_ram_size((long *)addr, SDRAM_BANK_SIZE); + + gd->bd->bi_dram[i].start = addr; + gd->bd->bi_dram[i].size = size; + } +} + +static int decode_sromc(const void *blob, struct fdt_sromc *config) +{ + int err; + int node; + + node = fdtdec_next_compatible(blob, 0, COMPAT_SAMSUNG_EXYNOS5_SROMC); + if (node < 0) { + debug("Could not find SROMC node\n"); + return node; + } + + config->bank = fdtdec_get_int(blob, node, "bank", 0); + config->width = fdtdec_get_int(blob, node, "width", 2); + + err = fdtdec_get_int_array(blob, node, "srom-timing", config->timing, + FDT_SROM_TIMING_COUNT); + if (err < 0) { + debug("Could not decode SROMC configuration" + "Error: %s\n", fdt_strerror(err)); + return -FDT_ERR_NOTFOUND; + } + return 0; +} + +int board_eth_init(bd_t *bis) +{ +#ifdef CONFIG_SMC911X + u32 smc_bw_conf, smc_bc_conf; + struct fdt_sromc config; + fdt_addr_t base_addr; + int node; + + node = decode_sromc(gd->fdt_blob, &config); + if (node < 0) { + debug("%s: Could not find sromc configuration\n", __func__); + return 0; + } + node = fdtdec_next_compatible(gd->fdt_blob, node, COMPAT_SMSC_LAN9215); + if (node < 0) { + debug("%s: Could not find lan9215 configuration\n", __func__); + return 0; + } + + /* We now have a node, so any problems from now on are errors */ + base_addr = fdtdec_get_addr(gd->fdt_blob, node, "reg"); + if (base_addr == FDT_ADDR_T_NONE) { + debug("%s: Could not find lan9215 address\n", __func__); + return -1; + } + + /* Ethernet needs data bus width of 16 bits */ + if (config.width != 2) { + debug("%s: Unsupported bus width %d\n", __func__, + config.width); + return -1; + } + smc_bw_conf = SROMC_DATA16_WIDTH(config.bank) + | SROMC_BYTE_ENABLE(config.bank); + + smc_bc_conf = SROMC_BC_TACS(config.timing[FDT_SROM_TACS]) | + SROMC_BC_TCOS(config.timing[FDT_SROM_TCOS]) | + SROMC_BC_TACC(config.timing[FDT_SROM_TACC]) | + SROMC_BC_TCOH(config.timing[FDT_SROM_TCOH]) | + SROMC_BC_TAH(config.timing[FDT_SROM_TAH]) | + SROMC_BC_TACP(config.timing[FDT_SROM_TACP]) | + SROMC_BC_PMC(config.timing[FDT_SROM_PMC]); + + /* Select and configure the SROMC bank */ + exynos_pinmux_config(PERIPH_ID_SROMC, config.bank); + s5p_config_sromc(config.bank, smc_bw_conf, smc_bc_conf); + return smc911x_initialize(0, base_addr); +#endif + return 0; +} + +#ifdef CONFIG_DISPLAY_BOARDINFO +int checkboard(void) +{ + printf("\nBoard: SMDK5250\n"); + + return 0; +} +#endif + +#ifdef CONFIG_GENERIC_MMC +int board_mmc_init(bd_t *bis) +{ + int ret; + /* dwmmc initializattion for available channels */ + ret = exynos_dwmmc_init(gd->fdt_blob); + if (ret) + debug("dwmmc init failed\n"); + + return ret; +} +#endif + +static int board_uart_init(void) +{ + int err, uart_id, ret = 0; + + for (uart_id = PERIPH_ID_UART0; uart_id <= PERIPH_ID_UART3; uart_id++) { + err = exynos_pinmux_config(uart_id, PINMUX_FLAG_NONE); + if (err) { + debug("UART%d not configured\n", + (uart_id - PERIPH_ID_UART0)); + ret |= err; + } + } + return ret; +} + +#ifdef CONFIG_BOARD_EARLY_INIT_F +int board_early_init_f(void) +{ + int err; + err = board_uart_init(); + if (err) { + debug("UART init failed\n"); + return err; + } +#ifdef CONFIG_SYS_I2C_INIT_BOARD + board_i2c_init(gd->fdt_blob); +#endif + return err; +} +#endif diff --git a/board/samsung/smdk5250/smdk5250.c b/board/samsung/smdk5250/smdk5250.c index 7a5f132..e3a2593 100644 --- a/board/samsung/smdk5250/smdk5250.c +++ b/board/samsung/smdk5250/smdk5250.c @@ -28,6 +28,7 @@ #include <netdev.h> #include <spi.h> #include <asm/arch/cpu.h> +#include <asm/arch/dwmmc.h> #include <asm/arch/gpio.h> #include <asm/arch/mmc.h> #include <asm/arch/pinmux.h> @@ -68,80 +69,40 @@ int board_init(void) int dram_init(void) { - gd->ram_size = get_ram_size((long *)PHYS_SDRAM_1, PHYS_SDRAM_1_SIZE) - + get_ram_size((long *)PHYS_SDRAM_2, PHYS_SDRAM_2_SIZE) - + get_ram_size((long *)PHYS_SDRAM_3, PHYS_SDRAM_3_SIZE) - + get_ram_size((long *)PHYS_SDRAM_4, PHYS_SDRAM_4_SIZE) - + get_ram_size((long *)PHYS_SDRAM_5, PHYS_SDRAM_7_SIZE) - + get_ram_size((long *)PHYS_SDRAM_6, PHYS_SDRAM_7_SIZE) - + get_ram_size((long *)PHYS_SDRAM_7, PHYS_SDRAM_7_SIZE) - + get_ram_size((long *)PHYS_SDRAM_8, PHYS_SDRAM_8_SIZE); + int i; + u32 addr; + + for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) { + addr = CONFIG_SYS_SDRAM_BASE + (i * SDRAM_BANK_SIZE); + gd->ram_size += get_ram_size((long *)addr, SDRAM_BANK_SIZE); + } return 0; } #if defined(CONFIG_POWER) int power_init_board(void) { - if (pmic_init(I2C_PMIC)) + if (pmic_init(I2C_PMIC)) { + debug("Could not initialise PMIC\n"); return -1; - else + } else return 0; } #endif void dram_init_banksize(void) { - gd->bd->bi_dram[0].start = PHYS_SDRAM_1; - gd->bd->bi_dram[0].size = get_ram_size((long *)PHYS_SDRAM_1, - PHYS_SDRAM_1_SIZE); - gd->bd->bi_dram[1].start = PHYS_SDRAM_2; - gd->bd->bi_dram[1].size = get_ram_size((long *)PHYS_SDRAM_2, - PHYS_SDRAM_2_SIZE); - gd->bd->bi_dram[2].start = PHYS_SDRAM_3; - gd->bd->bi_dram[2].size = get_ram_size((long *)PHYS_SDRAM_3, - PHYS_SDRAM_3_SIZE); - gd->bd->bi_dram[3].start = PHYS_SDRAM_4; - gd->bd->bi_dram[3].size = get_ram_size((long *)PHYS_SDRAM_4, - PHYS_SDRAM_4_SIZE); - gd->bd->bi_dram[4].start = PHYS_SDRAM_5; - gd->bd->bi_dram[4].size = get_ram_size((long *)PHYS_SDRAM_5, - PHYS_SDRAM_5_SIZE); - gd->bd->bi_dram[5].start = PHYS_SDRAM_6; - gd->bd->bi_dram[5].size = get_ram_size((long *)PHYS_SDRAM_6, - PHYS_SDRAM_6_SIZE); - gd->bd->bi_dram[6].start = PHYS_SDRAM_7; - gd->bd->bi_dram[6].size = get_ram_size((long *)PHYS_SDRAM_7, - PHYS_SDRAM_7_SIZE); - gd->bd->bi_dram[7].start = PHYS_SDRAM_8; - gd->bd->bi_dram[7].size = get_ram_size((long *)PHYS_SDRAM_8, - PHYS_SDRAM_8_SIZE); -} + int i; + u32 addr, size; -#ifdef CONFIG_OF_CONTROL -static int decode_sromc(const void *blob, struct fdt_sromc *config) -{ - int err; - int node; + for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) { + addr = CONFIG_SYS_SDRAM_BASE + (i * SDRAM_BANK_SIZE); + size = get_ram_size((long *)addr, SDRAM_BANK_SIZE); - node = fdtdec_next_compatible(blob, 0, COMPAT_SAMSUNG_EXYNOS5_SROMC); - if (node < 0) { - debug("Could not find SROMC node\n"); - return node; + gd->bd->bi_dram[i].start = addr; + gd->bd->bi_dram[i].size = size; } - - config->bank = fdtdec_get_int(blob, node, "bank", 0); - config->width = fdtdec_get_int(blob, node, "width", 2); - - err = fdtdec_get_int_array(blob, node, "srom-timing", config->timing, - FDT_SROM_TIMING_COUNT); - if (err < 0) { - debug("Could not decode SROMC configuration\n"); - return -FDT_ERR_NOTFOUND; - } - - return 0; } -#endif int board_eth_init(bd_t *bis) { @@ -149,27 +110,7 @@ int board_eth_init(bd_t *bis) u32 smc_bw_conf, smc_bc_conf; struct fdt_sromc config; fdt_addr_t base_addr; - int node; -#ifdef CONFIG_OF_CONTROL - node = decode_sromc(gd->fdt_blob, &config); - if (node < 0) { - debug("%s: Could not find sromc configuration\n", __func__); - return 0; - } - node = fdtdec_next_compatible(gd->fdt_blob, node, COMPAT_SMSC_LAN9215); - if (node < 0) { - debug("%s: Could not find lan9215 configuration\n", __func__); - return 0; - } - - /* We now have a node, so any problems from now on are errors */ - base_addr = fdtdec_get_addr(gd->fdt_blob, node, "reg"); - if (base_addr == FDT_ADDR_T_NONE) { - debug("%s: Could not find lan9215 address\n", __func__); - return -1; - } -#else /* Non-FDT configuration - bank number and timing parameters*/ config.bank = CONFIG_ENV_SROM_BANK; config.width = 2; @@ -182,7 +123,6 @@ int board_eth_init(bd_t *bis) config.timing[FDT_SROM_TACP] = 0x09; config.timing[FDT_SROM_PMC] = 0x01; base_addr = CONFIG_SMC911X_BASE; -#endif /* Ethernet needs data bus width of 16 bits */ if (config.width != 2) { @@ -221,48 +161,54 @@ int checkboard(void) #ifdef CONFIG_GENERIC_MMC int board_mmc_init(bd_t *bis) { - int err; + int err, ret = 0, index, bus_width; + u32 base; err = exynos_pinmux_config(PERIPH_ID_SDMMC0, PINMUX_FLAG_8BIT_MODE); - if (err) { + if (err) debug("SDMMC0 not configured\n"); - return err; - } - - err = s5p_mmc_init(0, 8); - return err; + ret |= err; + + /*EMMC: dwmmc Channel-0 with 8 bit bus width */ + index = 0; + base = samsung_get_base_mmc() + (0x10000 * index); + bus_width = 8; + err = exynos_dwmci_add_port(index, base, bus_width, (u32)NULL); + if (err) + debug("dwmmc Channel-0 init failed\n"); + ret |= err; + + err = exynos_pinmux_config(PERIPH_ID_SDMMC2, PINMUX_FLAG_NONE); + if (err) + debug("SDMMC2 not configured\n"); + ret |= err; + + /*SD: dwmmc Channel-2 with 4 bit bus width */ + index = 2; + base = samsung_get_base_mmc() + (0x10000 * index); + bus_width = 4; + err = exynos_dwmci_add_port(index, base, bus_width, (u32)NULL); + if (err) + debug("dwmmc Channel-2 init failed\n"); + ret |= err; + + return ret; } #endif static int board_uart_init(void) { - int err; - - err = exynos_pinmux_config(PERIPH_ID_UART0, PINMUX_FLAG_NONE); - if (err) { - debug("UART0 not configured\n"); - return err; - } - - err = exynos_pinmux_config(PERIPH_ID_UART1, PINMUX_FLAG_NONE); - if (err) { - debug("UART1 not configured\n"); - return err; + int err, uart_id, ret = 0; + + for (uart_id = PERIPH_ID_UART0; uart_id <= PERIPH_ID_UART3; uart_id++) { + err = exynos_pinmux_config(uart_id, PINMUX_FLAG_NONE); + if (err) { + debug("UART%d not configured\n", + (uart_id - PERIPH_ID_UART0)); + ret |= err; + } } - - err = exynos_pinmux_config(PERIPH_ID_UART2, PINMUX_FLAG_NONE); - if (err) { - debug("UART2 not configured\n"); - return err; - } - - err = exynos_pinmux_config(PERIPH_ID_UART3, PINMUX_FLAG_NONE); - if (err) { - debug("UART3 not configured\n"); - return err; - } - - return 0; + return ret; } #ifdef CONFIG_BOARD_EARLY_INIT_F @@ -275,7 +221,7 @@ int board_early_init_f(void) return err; } #ifdef CONFIG_SYS_I2C_INIT_BOARD - board_i2c_init(gd->fdt_blob); + board_i2c_init(NULL); #endif return err; } diff --git a/include/configs/exynos5250-dt.h b/include/configs/exynos5250-dt.h index cabd2f2..3fa86b2 100644 --- a/include/configs/exynos5250-dt.h +++ b/include/configs/exynos5250-dt.h @@ -95,6 +95,8 @@ #define CONFIG_MMC #define CONFIG_SDHCI #define CONFIG_S5P_SDHCI +#define CONFIG_DWMMC +#define CONFIG_EXYNOS_DWMMC #define CONFIG_BOARD_EARLY_INIT_F @@ -210,6 +212,10 @@ #define CONFIG_DOS_PARTITION +#define CONFIG_EFI_PARTITION +#define CONFIG_CMD_PART +#define CONFIG_PARTITION_UUIDS + #define CONFIG_IRAM_STACK 0x02050000 #define CONFIG_SYS_INIT_SP_ADDR (CONFIG_SYS_LOAD_ADDR - 0x1000000)
This patch enables and initialises DWMMC for SMDK5250. Supports both FDT and non-FDT. This patch creates a new file 'exynos5-dt.c' meant for FDT support. exynos5-dt.c: This file shall contain all code which supports FDT. Any addition of FDT support for any module needs to be added in this file. smdk5250.c: This file shall contain the code which supports non-FDT. version. Any addition of non-FDT support for any module needs to be added in this file. May be, the file smdk5250.c can be removed in near future when non-FDT is not required. The Makefile is updated to compile only one of the files exynos5-dt.c / smdk5250.c based on FDT configuration. NOTE: Please note that all additions corresponding to FDT need to be added into the file exynos5-dt.c. At same time if non-FDT support is required then add the corresponding updations into smdk5250.c. Signed-off-by: Amar <amarendra.xt@samsung.com> --- Changes since V1: 1)A new file 'exynos5-dt.c' is created meant for FDT support 2)Makefile is updated to compile only one of the files exynos5-dt.c / smdk5250.c based on FDT configuration Changes since V2: 1)Updation of commit message and resubmition of proper patch set. Changes since V3: No change. Changes since V4: 1)Replaced the function call 'exynos_dwmmc_init(0, 8);' with the function exynos_dwmmc_add_port() in smdk5250.c. 2)dram_init() is updated to use for loop to compute the ram size. 3)dram_init_banksize() is updated to use for loop to initialise the dram bank size. 4)board_uart_init() is updated to use for loop to initialise UARTS. 5)In non-FDT case NULL is passed as parameter to board_i2c_init(). board/samsung/smdk5250/Makefile | 4 + board/samsung/smdk5250/exynos5-dt.c | 211 ++++++++++++++++++++++++++++++++++++ board/samsung/smdk5250/smdk5250.c | 170 ++++++++++------------------- include/configs/exynos5250-dt.h | 6 + 4 files changed, 279 insertions(+), 112 deletions(-) create mode 100644 board/samsung/smdk5250/exynos5-dt.c