diff mbox

[V5,06/10] SMDK5250: Initialise and Enable DWMMC, support FDT and non-FDT

Message ID 1358768638-14187-7-git-send-email-amarendra.xt@samsung.com
State New
Headers show

Commit Message

Amar Jan. 21, 2013, 11:43 a.m. UTC
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

Comments

Simon Glass Jan. 26, 2013, 8:13 p.m. UTC | #1
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 mbox

Patch

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)