From: Albert ARIBAUD <albert.u.boot@aribaud.net>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH v2] arm: vf610: initial integration for colibri vf50
Date: Thu, 17 Oct 2013 07:53:51 +0200 [thread overview]
Message-ID: <20131017075351.0a37245d@lilith> (raw)
In-Reply-To: <47c0191fb886a64ac71e06fcb571dc1715317eb2.1380545752.git.marcel@ziswiler.com>
Hi Marcel,
On Mon, 30 Sep 2013 14:57:12 +0200, Marcel Ziswiler
<marcel@ziswiler.com> wrote:
> Add initial Colibri VF50 support based off Freescale's implementation
> for the Vybrid Tower System TWR-VF65GS10:
> - New machine ID.
> - Default UART_A on SCI0.
> - FEC1 only.
> - Enabled command line editing.
> - PLL5 based RMII clocking (e.g. no external crystal).
> - UART_A and UART_C I/O muxing.
>
> Tested on early Colibri VF50 prototypes V1.0a booting off SD card
> (mandatory for initial loading). Loading Linux kernel off SD card or by
> TFTP.
>
> Changes v2:
> - Boot off gfxRAM rather than sysRAM0 to increase available space.
> - Fixed board string previously just copied from Tower.
Note: changes should not appear in the commit message; they should go
below the commit message delimiter '---'.
> Signed-off-by: Marcel Ziswiler <marcel@ziswiler.com>
> ---
> board/toradex/colibri_vf50/Makefile | 26 ++
> board/toradex/colibri_vf50/colibri_vf50.c | 413 +++++++++++++++++++++++++++++
> board/toradex/colibri_vf50/imximage.cfg | 17 ++
> boards.cfg | 1 +
> include/configs/colibri_vf50.h | 224 ++++++++++++++++
> 5 files changed, 681 insertions(+)
> create mode 100644 board/toradex/colibri_vf50/Makefile
> create mode 100644 board/toradex/colibri_vf50/colibri_vf50.c
> create mode 100644 board/toradex/colibri_vf50/imximage.cfg
> create mode 100644 include/configs/colibri_vf50.h
>
> diff --git a/board/toradex/colibri_vf50/Makefile b/board/toradex/colibri_vf50/Makefile
> new file mode 100644
> index 0000000..43d21ab
> --- /dev/null
> +++ b/board/toradex/colibri_vf50/Makefile
> @@ -0,0 +1,26 @@
> +#
> +# Copyright 2013 Toradex, Inc.
> +#
> +# SPDX-License-Identifier: GPL-2.0+
> +#
> +
> +include $(TOPDIR)/config.mk
> +
> +LIB = $(obj)lib$(BOARD).o
> +
> +COBJS := $(BOARD).o
> +
> +SRCS := $(COBJS:.o=.c)
> +OBJS := $(addprefix $(obj),$(COBJS))
> +
> +$(LIB): $(obj).depend $(OBJS)
> + $(call cmd_link_o_target, $(OBJS))
> +
> +#########################################################################
> +
> +# defines $(obj).depend target
> +include $(SRCTREE)/rules.mk
> +
> +sinclude $(obj).depend
> +
> +#########################################################################
> diff --git a/board/toradex/colibri_vf50/colibri_vf50.c b/board/toradex/colibri_vf50/colibri_vf50.c
> new file mode 100644
> index 0000000..83b6a67
> --- /dev/null
> +++ b/board/toradex/colibri_vf50/colibri_vf50.c
> @@ -0,0 +1,413 @@
> +/*
> + * Copyright 2013 Toradex, Inc.
> + *
> + * Based on vf610twr.c:
> + * Copyright 2013 Freescale Semiconductor, Inc.
> + *
> + * SPDX-License-Identifier: GPL-2.0+
> + */
> +
> +#include <common.h>
> +#include <asm/io.h>
> +#include <asm/arch/imx-regs.h>
> +#include <asm/arch/iomux-vf610.h>
> +#include <asm/arch/crm_regs.h>
> +#include <asm/arch/clock.h>
> +#include <mmc.h>
> +#include <fsl_esdhc.h>
> +#include <miiphy.h>
> +#include <netdev.h>
> +#include <i2c.h>
> +
> +DECLARE_GLOBAL_DATA_PTR;
> +
> +#define UART_PAD_CTRL (PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_MED | \
> + PAD_CTL_DSE_25ohm | PAD_CTL_OBE_IBE_ENABLE)
> +
> +#define ESDHC_PAD_CTRL (PAD_CTL_PUS_100K_UP | PAD_CTL_SPEED_HIGH | \
> + PAD_CTL_DSE_20ohm | PAD_CTL_OBE_IBE_ENABLE)
> +
> +#define ENET_PAD_CTRL (PAD_CTL_PUS_47K_UP | PAD_CTL_SPEED_HIGH | \
> + PAD_CTL_DSE_50ohm | PAD_CTL_OBE_IBE_ENABLE)
> +
> +void setup_iomux_ddr(void)
> +{
> + static const iomux_v3_cfg_t ddr_pads[] = {
> + VF610_PAD_DDR_A15__DDR_A_15,
> + VF610_PAD_DDR_A14__DDR_A_14,
> + VF610_PAD_DDR_A13__DDR_A_13,
> + VF610_PAD_DDR_A12__DDR_A_12,
> + VF610_PAD_DDR_A11__DDR_A_11,
> + VF610_PAD_DDR_A10__DDR_A_10,
> + VF610_PAD_DDR_A9__DDR_A_9,
> + VF610_PAD_DDR_A8__DDR_A_8,
> + VF610_PAD_DDR_A7__DDR_A_7,
> + VF610_PAD_DDR_A6__DDR_A_6,
> + VF610_PAD_DDR_A5__DDR_A_5,
> + VF610_PAD_DDR_A4__DDR_A_4,
> + VF610_PAD_DDR_A3__DDR_A_3,
> + VF610_PAD_DDR_A2__DDR_A_2,
> + VF610_PAD_DDR_A1__DDR_A_1,
> + VF610_PAD_DDR_BA2__DDR_BA_2,
> + VF610_PAD_DDR_BA1__DDR_BA_1,
> + VF610_PAD_DDR_BA0__DDR_BA_0,
> + VF610_PAD_DDR_CAS__DDR_CAS_B,
> + VF610_PAD_DDR_CKE__DDR_CKE_0,
> + VF610_PAD_DDR_CLK__DDR_CLK_0,
> + VF610_PAD_DDR_CS__DDR_CS_B_0,
> + VF610_PAD_DDR_D15__DDR_D_15,
> + VF610_PAD_DDR_D14__DDR_D_14,
> + VF610_PAD_DDR_D13__DDR_D_13,
> + VF610_PAD_DDR_D12__DDR_D_12,
> + VF610_PAD_DDR_D11__DDR_D_11,
> + VF610_PAD_DDR_D10__DDR_D_10,
> + VF610_PAD_DDR_D9__DDR_D_9,
> + VF610_PAD_DDR_D8__DDR_D_8,
> + VF610_PAD_DDR_D7__DDR_D_7,
> + VF610_PAD_DDR_D6__DDR_D_6,
> + VF610_PAD_DDR_D5__DDR_D_5,
> + VF610_PAD_DDR_D4__DDR_D_4,
> + VF610_PAD_DDR_D3__DDR_D_3,
> + VF610_PAD_DDR_D2__DDR_D_2,
> + VF610_PAD_DDR_D1__DDR_D_1,
> + VF610_PAD_DDR_D0__DDR_D_0,
> + VF610_PAD_DDR_DQM1__DDR_DQM_1,
> + VF610_PAD_DDR_DQM0__DDR_DQM_0,
> + VF610_PAD_DDR_DQS1__DDR_DQS_1,
> + VF610_PAD_DDR_DQS0__DDR_DQS_0,
> + VF610_PAD_DDR_RAS__DDR_RAS_B,
> + VF610_PAD_DDR_WE__DDR_WE_B,
> + VF610_PAD_DDR_ODT1__DDR_ODT_0,
> + VF610_PAD_DDR_ODT0__DDR_ODT_1,
> + };
> +
> + imx_iomux_v3_setup_multiple_pads(ddr_pads, ARRAY_SIZE(ddr_pads));
> +}
> +
> +void ddr_phy_init(void)
> +{
> + struct ddrmr_regs *ddrmr = (struct ddrmr_regs *)DDR_BASE_ADDR;
> +
> + writel(DDRMC_PHY_DQ_TIMING, &ddrmr->phy[0]);
Do we need writel()s here? They should only be used when order of
writes matters.
> + writel(DDRMC_PHY_DQ_TIMING, &ddrmr->phy[16]);
> + writel(DDRMC_PHY_DQ_TIMING, &ddrmr->phy[32]);
> + writel(DDRMC_PHY_DQ_TIMING, &ddrmr->phy[48]);
> +
> + writel(DDRMC_PHY_DQS_TIMING, &ddrmr->phy[1]);
> + writel(DDRMC_PHY_DQS_TIMING, &ddrmr->phy[17]);
> + writel(DDRMC_PHY_DQS_TIMING, &ddrmr->phy[33]);
> + writel(DDRMC_PHY_DQS_TIMING, &ddrmr->phy[49]);
> +
> + writel(DDRMC_PHY_CTRL, &ddrmr->phy[2]);
> + writel(DDRMC_PHY_CTRL, &ddrmr->phy[18]);
> + writel(DDRMC_PHY_CTRL, &ddrmr->phy[34]);
> + writel(DDRMC_PHY_CTRL, &ddrmr->phy[50]);
> +
> + writel(DDRMC_PHY_MASTER_CTRL, &ddrmr->phy[3]);
> + writel(DDRMC_PHY_MASTER_CTRL, &ddrmr->phy[19]);
> + writel(DDRMC_PHY_MASTER_CTRL, &ddrmr->phy[35]);
> + writel(DDRMC_PHY_MASTER_CTRL, &ddrmr->phy[51]);
> +
> + writel(DDRMC_PHY_SLAVE_CTRL, &ddrmr->phy[4]);
> + writel(DDRMC_PHY_SLAVE_CTRL, &ddrmr->phy[20]);
> + writel(DDRMC_PHY_SLAVE_CTRL, &ddrmr->phy[36]);
> + writel(DDRMC_PHY_SLAVE_CTRL, &ddrmr->phy[52]);
> +
> + writel(DDRMC_PHY50_DDR3_MODE | DDRMC_PHY50_EN_SW_HALF_CYCLE,
> + &ddrmr->phy[50]);
> +}
> +
> +void ddr_ctrl_init(void)
> +{
> + struct ddrmr_regs *ddrmr = (struct ddrmr_regs *)DDR_BASE_ADDR;
> +
> + writel(DDRMC_CR00_DRAM_CLASS_DDR3, &ddrmr->cr[0]);
> + writel(DDRMC_CR02_DRAM_TINIT(32), &ddrmr->cr[2]);
> + writel(DDRMC_CR10_TRST_PWRON(124), &ddrmr->cr[10]);
> +
> + writel(DDRMC_CR11_CKE_INACTIVE(80000), &ddrmr->cr[11]);
> + writel(DDRMC_CR12_WRLAT(5) | DDRMC_CR12_CASLAT_LIN(12), &ddrmr->cr[12]);
> + writel(DDRMC_CR13_TRC(21) | DDRMC_CR13_TRRD(4) | DDRMC_CR13_TCCD(4) |
> + DDRMC_CR13_TBST_INT_INTERVAL(4), &ddrmr->cr[13]);
> + writel(DDRMC_CR14_TFAW(20) | DDRMC_CR14_TRP(6) | DDRMC_CR14_TWTR(4) |
> + DDRMC_CR14_TRAS_MIN(15), &ddrmr->cr[14]);
> + writel(DDRMC_CR16_TMRD(4) | DDRMC_CR16_TRTP(4), &ddrmr->cr[16]);
> + writel(DDRMC_CR17_TRAS_MAX(28080) | DDRMC_CR17_TMOD(12),
> + &ddrmr->cr[17]);
> + writel(DDRMC_CR18_TCKESR(4) | DDRMC_CR18_TCKE(3), &ddrmr->cr[18]);
> +
> + writel(DDRMC_CR20_AP_EN, &ddrmr->cr[20]);
> + writel(DDRMC_CR21_TRCD_INT(6) | DDRMC_CR21_TRAS_LOCKOUT |
> + DDRMC_CR21_CCMAP_EN, &ddrmr->cr[21]);
> +
> + writel(DDRMC_CR22_TDAL(11), &ddrmr->cr[22]);
> + writel(DDRMC_CR23_BSTLEN(3) | DDRMC_CR23_TDLL(512), &ddrmr->cr[23]);
> + writel(DDRMC_CR24_TRP_AB(6), &ddrmr->cr[24]);
> +
> + writel(DDRMC_CR25_TREF_EN, &ddrmr->cr[25]);
> + writel(DDRMC_CR26_TREF(3112) | DDRMC_CR26_TRFC(44), &ddrmr->cr[26]);
> + writel(DDRMC_CR28_TREF_INT(5), &ddrmr->cr[28]);
> + writel(DDRMC_CR29_TPDEX(3), &ddrmr->cr[29]);
> +
> + writel(DDRMC_CR30_TXPDLL(10), &ddrmr->cr[30]);
> + writel(DDRMC_CR31_TXSNR(68) | DDRMC_CR31_TXSR(512), &ddrmr->cr[31]);
> + writel(DDRMC_CR33_EN_QK_SREF, &ddrmr->cr[33]);
> + writel(DDRMC_CR34_CKSRX(5) | DDRMC_CR34_CKSRE(5), &ddrmr->cr[34]);
> +
> + writel(DDRMC_CR38_FREQ_CHG_EN, &ddrmr->cr[38]);
> + writel(DDRMC_CR39_PHY_INI_COM(1024) | DDRMC_CR39_PHY_INI_STA(16) |
> + DDRMC_CR39_FRQ_CH_DLLOFF(2), &ddrmr->cr[39]);
> +
> + writel(DDRMC_CR41_PHY_INI_STRT_INI_DIS, &ddrmr->cr[41]);
> + writel(DDRMC_CR48_MR1_DA_0(70) | DDRMC_CR48_MR0_DA_0(1056),
> + &ddrmr->cr[48]);
> +
> + writel(DDRMC_CR66_ZQCL(256) | DDRMC_CR66_ZQINIT(512), &ddrmr->cr[66]);
> + writel(DDRMC_CR67_ZQCS(64), &ddrmr->cr[67]);
> + writel(DDRMC_CR69_ZQ_ON_SREF_EX(2), &ddrmr->cr[69]);
> +
> + writel(DDRMC_CR70_REF_PER_ZQ(64), &ddrmr->cr[70]);
> + writel(DDRMC_CR72_ZQCS_ROTATE, &ddrmr->cr[72]);
> +
> + writel(DDRMC_CR73_APREBIT(10) | DDRMC_CR73_COL_DIFF(1) |
> + DDRMC_CR73_ROW_DIFF(3), &ddrmr->cr[73]);
> + writel(DDRMC_CR74_BANKSPLT_EN | DDRMC_CR74_ADDR_CMP_EN |
> + DDRMC_CR74_CMD_AGE_CNT(255) | DDRMC_CR74_AGE_CNT(255),
> + &ddrmr->cr[74]);
> + writel(DDRMC_CR75_RW_PG_EN | DDRMC_CR75_RW_EN | DDRMC_CR75_PRI_EN |
> + DDRMC_CR75_PLEN, &ddrmr->cr[75]);
> + writel(DDRMC_CR76_NQENT_ACTDIS(3) | DDRMC_CR76_D_RW_G_BKCN(3) |
> + DDRMC_CR76_W2R_SPLT_EN | DDRMC_CR76_CS_EN, &ddrmr->cr[76]);
> + writel(DDRMC_CR77_CS_MAP | DDRMC_CR77_DI_RD_INTLEAVE |
> + DDRMC_CR77_SWAP_EN, &ddrmr->cr[77]);
> + writel(DDRMC_CR78_BUR_ON_FLY_BIT(12), &ddrmr->cr[78]);
> + writel(DDRMC_CR79_CTLUPD_AREF, &ddrmr->cr[79]);
> +
> + writel(DDRMC_CR82_INT_MASK, &ddrmr->cr[82]);
> +
> + writel(DDRMC_CR87_ODT_WR_MAPCS0 | DDRMC_CR87_ODT_RD_MAPCS0,
> + &ddrmr->cr[87]);
> + writel(DDRMC_CR88_TODTL_CMD(4), &ddrmr->cr[88]);
> + writel(DDRMC_CR89_AODT_RWSMCS(2), &ddrmr->cr[89]);
> +
> + writel(DDRMC_CR91_R2W_SMCSDL(2), &ddrmr->cr[91]);
> + writel(DDRMC_CR96_WLMRD(40) | DDRMC_CR96_WLDQSEN(25), &ddrmr->cr[96]);
> +
> + writel(DDRMC_CR105_RDLVL_DL_0(32), &ddrmr->cr[105]);
> + writel(DDRMC_CR110_RDLVL_DL_1(32), &ddrmr->cr[110]);
> + writel(DDRMC_CR114_RDLVL_GTDL_2(8224), &ddrmr->cr[114]);
> +
> + writel(DDRMC_CR117_AXI0_W_PRI(1) | DDRMC_CR117_AXI0_R_PRI(1),
> + &ddrmr->cr[117]);
> + writel(DDRMC_CR118_AXI1_W_PRI(1) | DDRMC_CR118_AXI1_R_PRI(1),
> + &ddrmr->cr[118]);
> +
> + writel(DDRMC_CR120_AXI0_PRI1_RPRI(2) | DDRMC_CR120_AXI0_PRI0_RPRI(2),
> + &ddrmr->cr[120]);
> + writel(DDRMC_CR121_AXI0_PRI3_RPRI(2) | DDRMC_CR121_AXI0_PRI2_RPRI(2),
> + &ddrmr->cr[121]);
> + writel(DDRMC_CR122_AXI1_PRI1_RPRI(1) | DDRMC_CR122_AXI1_PRI0_RPRI(1) |
> + DDRMC_CR122_AXI0_PRIRLX(100), &ddrmr->cr[122]);
> + writel(DDRMC_CR123_AXI1_PRI3_RPRI(1) | DDRMC_CR123_AXI1_PRI2_RPRI(1),
> + &ddrmr->cr[123]);
> + writel(DDRMC_CR124_AXI1_PRIRLX(100), &ddrmr->cr[124]);
> +
> + writel(DDRMC_CR126_PHY_RDLAT(11), &ddrmr->cr[126]);
> + writel(DDRMC_CR132_WRLAT_ADJ(5) | DDRMC_CR132_RDLAT_ADJ(6),
> + &ddrmr->cr[132]);
> + writel(DDRMC_CR139_PHY_WRLV_RESPLAT(4) | DDRMC_CR139_PHY_WRLV_LOAD(7) |
> + DDRMC_CR139_PHY_WRLV_DLL(3) | DDRMC_CR139_PHY_WRLV_EN(3),
> + &ddrmr->cr[139]);
> +
> + writel(DDRMC_CR154_PAD_ZQ_EARLY_CMP_EN_TIMER(13) |
> + DDRMC_CR154_PAD_ZQ_MODE(1), &ddrmr->cr[154]);
> + writel(DDRMC_CR155_AXI0_AWCACHE | DDRMC_CR155_PAD_ODT_BYTE1(2),
> + &ddrmr->cr[155]);
> + writel(DDRMC_CR158_TWR(6), &ddrmr->cr[158]);
> +
> + ddr_phy_init();
> +
> + writel(DDRMC_CR00_DRAM_CLASS_DDR3 | DDRMC_CR00_START, &ddrmr->cr[0]);
> +
> + udelay(200);
Please add a comment explaining the reason for this delay and its
duration.
> +}
> +
> +int dram_init(void)
> +{
> + setup_iomux_ddr();
> +
> + ddr_ctrl_init();
> + gd->ram_size = get_ram_size((void *)PHYS_SDRAM, PHYS_SDRAM_SIZE);
> +
> + return 0;
> +}
> +
> +static void setup_iomux_uart(void)
> +{
> + static const iomux_v3_cfg_t uart_pads[] = {
> + NEW_PAD_CTRL(VF610_PAD_PTB4__UART1_TX, UART_PAD_CTRL), /* UART_C_TXD: SCI1_TX */
> + NEW_PAD_CTRL(VF610_PAD_PTB5__UART1_RX, UART_PAD_CTRL), /* UART_C_RXD: SCI1_RX */
> + NEW_PAD_CTRL(VF610_PAD_PTB10__UART0_TX, UART_PAD_CTRL), /* UART_A_TXD: SCI0_TX */
> + NEW_PAD_CTRL(VF610_PAD_PTB11__UART0_RX, UART_PAD_CTRL), /* UART_A_RXD: SCI0_RX */
> + };
> +
> + imx_iomux_v3_setup_multiple_pads(uart_pads, ARRAY_SIZE(uart_pads));
> +}
> +
> +static void setup_iomux_enet(void)
> +{
> + static const iomux_v3_cfg_t enet0_pads[] = {
> + NEW_PAD_CTRL(VF610_PAD_PTA6__RMII0_CLKOUT, ENET_PAD_CTRL),
> + NEW_PAD_CTRL(VF610_PAD_PTC10__RMII1_MDIO, ENET_PAD_CTRL),
> + NEW_PAD_CTRL(VF610_PAD_PTC9__RMII1_MDC, ENET_PAD_CTRL),
> + NEW_PAD_CTRL(VF610_PAD_PTC11__RMII1_CRS_DV, ENET_PAD_CTRL),
> + NEW_PAD_CTRL(VF610_PAD_PTC12__RMII1_RD1, ENET_PAD_CTRL),
> + NEW_PAD_CTRL(VF610_PAD_PTC13__RMII1_RD0, ENET_PAD_CTRL),
> + NEW_PAD_CTRL(VF610_PAD_PTC14__RMII1_RXER, ENET_PAD_CTRL),
> + NEW_PAD_CTRL(VF610_PAD_PTC15__RMII1_TD1, ENET_PAD_CTRL),
> + NEW_PAD_CTRL(VF610_PAD_PTC16__RMII1_TD0, ENET_PAD_CTRL),
> + NEW_PAD_CTRL(VF610_PAD_PTC17__RMII1_TXEN, ENET_PAD_CTRL),
> + };
> +
> + imx_iomux_v3_setup_multiple_pads(enet0_pads, ARRAY_SIZE(enet0_pads));
> +}
> +
> +static void setup_iomux_i2c(void)
> +{
> + static const iomux_v3_cfg_t i2c0_pads[] = {
> + VF610_PAD_PTB14__I2C0_SCL,
> + VF610_PAD_PTB15__I2C0_SDA,
> + };
> +
> + imx_iomux_v3_setup_multiple_pads(i2c0_pads, ARRAY_SIZE(i2c0_pads));
> +}
> +
> +#ifdef CONFIG_FSL_ESDHC
> +struct fsl_esdhc_cfg esdhc_cfg[1] = {
> + {ESDHC1_BASE_ADDR},
> +};
> +
> +int board_mmc_getcd(struct mmc *mmc)
> +{
> + /* eSDHC1 is always present */
> + return 1;
> +}
> +
> +int board_mmc_init(bd_t *bis)
> +{
> + static const iomux_v3_cfg_t esdhc1_pads[] = {
> + NEW_PAD_CTRL(VF610_PAD_PTA24__ESDHC1_CLK, ESDHC_PAD_CTRL),
> + NEW_PAD_CTRL(VF610_PAD_PTA25__ESDHC1_CMD, ESDHC_PAD_CTRL),
> + NEW_PAD_CTRL(VF610_PAD_PTA26__ESDHC1_DAT0, ESDHC_PAD_CTRL),
> + NEW_PAD_CTRL(VF610_PAD_PTA27__ESDHC1_DAT1, ESDHC_PAD_CTRL),
> + NEW_PAD_CTRL(VF610_PAD_PTA28__ESDHC1_DAT2, ESDHC_PAD_CTRL),
> + NEW_PAD_CTRL(VF610_PAD_PTA29__ESDHC1_DAT3, ESDHC_PAD_CTRL),
> + };
> +
> + esdhc_cfg[0].sdhc_clk = mxc_get_clock(MXC_ESDHC_CLK);
> +
> + imx_iomux_v3_setup_multiple_pads(
> + esdhc1_pads, ARRAY_SIZE(esdhc1_pads));
> +
> + return fsl_esdhc_initialize(bis, &esdhc_cfg[0]);
> +}
> +#endif
> +
> +static void clock_init(void)
> +{
> + struct ccm_reg *ccm = (struct ccm_reg *)CCM_BASE_ADDR;
> + struct anadig_reg *anadig = (struct anadig_reg *)ANADIG_BASE_ADDR;
> +
> + clrsetbits_le32(&ccm->ccgr0, CCM_REG_CTRL_MASK,
> + CCM_CCGR0_UART0_CTRL_MASK);
> + clrsetbits_le32(&ccm->ccgr1, CCM_REG_CTRL_MASK,
> + CCM_CCGR1_PIT_CTRL_MASK | CCM_CCGR1_WDOGA5_CTRL_MASK);
> + clrsetbits_le32(&ccm->ccgr2, CCM_REG_CTRL_MASK,
> + CCM_CCGR2_IOMUXC_CTRL_MASK | CCM_CCGR2_PORTA_CTRL_MASK |
> + CCM_CCGR2_PORTB_CTRL_MASK | CCM_CCGR2_PORTC_CTRL_MASK |
> + CCM_CCGR2_PORTD_CTRL_MASK | CCM_CCGR2_PORTE_CTRL_MASK);
> + clrsetbits_le32(&ccm->ccgr3, CCM_REG_CTRL_MASK,
> + CCM_CCGR3_ANADIG_CTRL_MASK);
> + clrsetbits_le32(&ccm->ccgr4, CCM_REG_CTRL_MASK,
> + CCM_CCGR4_WKUP_CTRL_MASK | CCM_CCGR4_CCM_CTRL_MASK |
> + CCM_CCGR4_GPC_CTRL_MASK | CCM_CCGR4_I2C0_CTRL_MASK);
> + clrsetbits_le32(&ccm->ccgr6, CCM_REG_CTRL_MASK,
> + CCM_CCGR6_OCOTP_CTRL_MASK | CCM_CCGR6_DDRMC_CTRL_MASK);
> + clrsetbits_le32(&ccm->ccgr7, CCM_REG_CTRL_MASK,
> + CCM_CCGR7_SDHC1_CTRL_MASK);
> + clrsetbits_le32(&ccm->ccgr9, CCM_REG_CTRL_MASK,
> + CCM_CCGR9_FEC0_CTRL_MASK | CCM_CCGR9_FEC1_CTRL_MASK);
> +
> + clrsetbits_le32(&anadig->pll5_ctrl, ANADIG_PLL5_CTRL_BYPASS |
> + ANADIG_PLL5_CTRL_POWERDOWN, ANADIG_PLL5_CTRL_ENABLE |
> + ANADIG_PLL5_CTRL_DIV_SELECT);
> + clrsetbits_le32(&anadig->pll2_ctrl, ANADIG_PLL2_CTRL_POWERDOWN,
> + ANADIG_PLL2_CTRL_ENABLE | ANADIG_PLL2_CTRL_DIV_SELECT);
> + clrsetbits_le32(&anadig->pll1_ctrl, ANADIG_PLL1_CTRL_POWERDOWN,
> + ANADIG_PLL1_CTRL_ENABLE | ANADIG_PLL1_CTRL_DIV_SELECT);
> +
> + clrsetbits_le32(&ccm->ccr, CCM_CCR_OSCNT_MASK,
> + CCM_CCR_FIRC_EN | CCM_CCR_OSCNT(5));
> + clrsetbits_le32(&ccm->ccsr, CCM_REG_CTRL_MASK,
> + CCM_CCSR_PLL1_PFD_CLK_SEL(3) | CCM_CCSR_PLL2_PFD4_EN |
> + CCM_CCSR_PLL2_PFD3_EN | CCM_CCSR_PLL2_PFD2_EN |
> + CCM_CCSR_PLL2_PFD1_EN | CCM_CCSR_PLL1_PFD4_EN |
> + CCM_CCSR_PLL1_PFD3_EN | CCM_CCSR_PLL1_PFD2_EN |
> + CCM_CCSR_PLL1_PFD1_EN | CCM_CCSR_DDRC_CLK_SEL(1) |
> + CCM_CCSR_FAST_CLK_SEL(1) | CCM_CCSR_SYS_CLK_SEL(4));
> + clrsetbits_le32(&ccm->cacrr, CCM_REG_CTRL_MASK,
> + CCM_CACRR_IPG_CLK_DIV(1) | CCM_CACRR_BUS_CLK_DIV(2) |
> + CCM_CACRR_ARM_CLK_DIV(0));
> + clrsetbits_le32(&ccm->cscmr1, CCM_REG_CTRL_MASK,
> + CCM_CSCMR1_ESDHC1_CLK_SEL(3));
> + clrsetbits_le32(&ccm->cscdr1, CCM_REG_CTRL_MASK,
> + CCM_CSCDR1_RMII_CLK_EN);
> + clrsetbits_le32(&ccm->cscdr2, CCM_REG_CTRL_MASK,
> + CCM_CSCDR2_ESDHC1_EN | CCM_CSCDR2_ESDHC1_CLK_DIV(0));
> + clrsetbits_le32(&ccm->cscmr2, CCM_REG_CTRL_MASK,
> + CCM_CSCMR2_RMII_CLK_SEL(2)); /* PLL5 main clock */
> +}
> +
> +static void mscm_init(void)
> +{
> + struct mscm_ir *mscmir = (struct mscm_ir *)MSCM_IR_BASE_ADDR;
> + int i;
> +
> + for (i = 0; i < MSCM_IRSPRC_NUM; i++)
> + writew(MSCM_IRSPRC_CP0_EN, &mscmir->irsprc[i]);
> +}
> +
> +int board_phy_config(struct phy_device *phydev)
> +{
> + if (phydev->drv->config)
> + phydev->drv->config(phydev);
> +
> + return 0;
> +}
> +
> +int board_early_init_f(void)
> +{
> + clock_init();
> + mscm_init();
> +
> + setup_iomux_uart();
> + setup_iomux_enet();
> + setup_iomux_i2c();
> +
> + return 0;
> +}
> +
> +int board_init(void)
> +{
> + /* address of boot parameters */
> + gd->bd->bi_boot_params = PHYS_SDRAM + 0x100;
> +
> + return 0;
> +}
> +
> +int checkboard(void)
> +{
> + puts("Board: Colibri VF50\n");
> +
> + return 0;
> +}
> diff --git a/board/toradex/colibri_vf50/imximage.cfg b/board/toradex/colibri_vf50/imximage.cfg
> new file mode 100644
> index 0000000..c4369d6
> --- /dev/null
> +++ b/board/toradex/colibri_vf50/imximage.cfg
> @@ -0,0 +1,17 @@
> +/*
> + * Copyright 2013 Toradex, Inc.
> + *
> + * SPDX-License-Identifier: GPL-2.0+
> + *
> + * Refer docs/README.imxmage for more details about how-to configure
> + * and create imximage boot image
> + *
> + * The syntax is taken as close as possible with the kwbimage
> + */
> +#include <asm/imx-common/imximage.cfg>
> +
> +/* image version */
> +IMAGE_VERSION 2
> +
> +/* Boot Offset 0x400, valid for both SD and NAND boot */
> +BOOT_OFFSET FLASH_OFFSET_STANDARD
> diff --git a/boards.cfg b/boards.cfg
> index 80846c9..7e037ed 100644
> --- a/boards.cfg
> +++ b/boards.cfg
> @@ -342,6 +342,7 @@ Active arm armv7 socfpga altera socfpga
> Active arm armv7 u8500 st-ericsson snowball snowball - Mathieu Poirier <mathieu.poirier@linaro.org>
> Active arm armv7 u8500 st-ericsson u8500 u8500_href - -
> Active arm armv7 vf610 freescale vf610twr vf610twr vf610twr:IMX_CONFIG=board/freescale/vf610twr/imximage.cfg Alison Wang <b18965@freescale.com>
> +Active arm armv7 vf610 toradex colibri_vf50 colibri_vf50 colibri_vf50:IMX_CONFIG=board/toradex/colibri_vf50/imximage.cfg Marcel Ziswiler <marcel@ziswiler.com>
> Active arm armv7 zynq xilinx zynq zynq - Michal Simek <monstr@monstr.eu>
> Active arm armv7 zynq xilinx zynq zynq_dcc zynq:ZYNQ_DCC Michal Simek <monstr@monstr.eu>
> Active arm armv7:arm720t tegra114 nvidia dalmore dalmore - Tom Warren <twarren@nvidia.com>
> diff --git a/include/configs/colibri_vf50.h b/include/configs/colibri_vf50.h
> new file mode 100644
> index 0000000..21e4e8d
> --- /dev/null
> +++ b/include/configs/colibri_vf50.h
> @@ -0,0 +1,224 @@
> +/*
> + * Copyright 2013 Toradex, Inc.
> + *
> + * Configuration settings for the Toradex VF50 module.
> + *
> + * Based on vf610twr.h:
> + * Copyright 2013 Freescale Semiconductor, Inc.
> + *
> + * SPDX-License-Identifier: GPL-2.0+
> + */
> +
> +#ifndef __CONFIG_H
> +#define __CONFIG_H
> +
> +#include <asm/arch/imx-regs.h>
> +#include <config_cmd_default.h>
> +
> +#define CONFIG_VF610
> +
> +#define CONFIG_DISPLAY_CPUINFO
> +#define CONFIG_DISPLAY_BOARDINFO
> +
> +#define CONFIG_MACH_TYPE 4749
> +
> +#define CONFIG_SKIP_LOWLEVEL_INIT
> +
> +/* Enable passing of ATAGs */
> +#define CONFIG_CMDLINE_TAG
> +
> +#define CONFIG_CMD_FUSE
> +#ifdef CONFIG_CMD_FUSE
> +#define CONFIG_MXC_OCOTP
> +#endif
> +
> +/* Size of malloc() pool */
> +#define CONFIG_SYS_MALLOC_LEN (CONFIG_ENV_SIZE + 2 * 1024 * 1024)
> +
> +#define CONFIG_BOARD_EARLY_INIT_F
> +
> +#define CONFIG_FSL_LPUART
> +#define LPUART_BASE UART0_BASE
> +
> +/* Allow to overwrite serial and ethaddr */
> +#define CONFIG_ENV_OVERWRITE
> +#define CONFIG_BAUDRATE 115200
> +
> +#undef CONFIG_CMD_IMLS
> +
> +#define CONFIG_MMC
> +#define CONFIG_FSL_ESDHC
> +#define CONFIG_SYS_FSL_ESDHC_ADDR 0
> +#define CONFIG_SYS_FSL_ESDHC_NUM 1
> +
> +#define CONFIG_SYS_FSL_ERRATUM_ESDHC111
> +
> +#define CONFIG_CMD_MMC
> +#define CONFIG_GENERIC_MMC
> +#define CONFIG_CMD_FAT
> +#define CONFIG_DOS_PARTITION
> +
> +#define CONFIG_CMD_PING
> +#define CONFIG_CMD_DHCP
> +#define CONFIG_CMD_MII
> +#define CONFIG_CMD_NET
> +#define CONFIG_FEC_MXC
> +#define CONFIG_MII
> +#define IMX_FEC_BASE ENET1_BASE_ADDR
> +#define CONFIG_FEC_XCV_TYPE RMII
> +#define CONFIG_FEC_MXC_PHYADDR 0
> +#define CONFIG_PHYLIB
> +#define CONFIG_PHY_MICREL
> +
> +/* I2C Configs */
> +#define CONFIG_CMD_I2C
> +#define CONFIG_HARD_I2C
> +#define CONFIG_I2C_MXC
> +#define CONFIG_SYS_I2C_BASE I2C0_BASE_ADDR
> +#define CONFIG_SYS_I2C_SPEED 100000
> +
> +#define CONFIG_BOOTDELAY 3
> +
> +#define CONFIG_LOADADDR 0x82000000
> +#define CONFIG_SYS_TEXT_BASE 0x3f408000
> +
> +#define CONFIG_EXTRA_ENV_SETTINGS \
> + "script=boot.scr\0" \
> + "uimage=uImage\0" \
> + "console=ttyLP0\0" \
> + "fdt_high=0xffffffff\0" \
> + "initrd_high=0xffffffff\0" \
> + "fdt_file=colibri_vf50.dtb\0" \
> + "fdt_addr=0x81000000\0" \
> + "boot_fdt=try\0" \
> + "ip_dyn=yes\0" \
> + "mmcdev=" __stringify(CONFIG_SYS_MMC_ENV_DEV) "\0" \
> + "mmcpart=1\0" \
> + "mmcroot=/dev/mmcblk0p2 rootwait rw\0" \
> + "update_sd_firmware_filename=u-boot.imx\0" \
> + "update_sd_firmware=" \
> + "if test ${ip_dyn} = yes; then " \
> + "setenv get_cmd dhcp; " \
> + "else " \
> + "setenv get_cmd tftp; " \
> + "fi; " \
> + "if mmc dev ${mmcdev}; then " \
> + "if ${get_cmd} ${update_sd_firmware_filename}; then " \
> + "setexpr fw_sz ${filesize} / 0x200; " \
> + "setexpr fw_sz ${fw_sz} + 1; " \
> + "mmc write ${loadaddr} 0x2 ${fw_sz}; " \
> + "fi; " \
> + "fi\0" \
> + "mmcargs=setenv bootargs console=${console},${baudrate} " \
> + "root=${mmcroot}\0" \
> + "loadbootscript=" \
> + "fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${script};\0" \
> + "bootscript=echo Running bootscript from mmc ...; " \
> + "source\0" \
> + "loaduimage=fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${uimage}\0" \
> + "loadfdt=fatload mmc ${mmcdev}:${mmcpart} ${fdt_addr} ${fdt_file}\0" \
> + "mmcboot=echo Booting from mmc ...; " \
> + "run mmcargs; " \
> + "if test ${boot_fdt} = yes || test ${boot_fdt} = try; then " \
> + "if run loadfdt; then " \
> + "bootm ${loadaddr} - ${fdt_addr}; " \
> + "else " \
> + "if test ${boot_fdt} = try; then " \
> + "bootm; " \
> + "else " \
> + "echo WARN: Cannot load the DT; " \
> + "fi; " \
> + "fi; " \
> + "else " \
> + "bootm; " \
> + "fi;\0" \
> + "netargs=setenv bootargs console=${console},${baudrate} " \
> + "root=/dev/nfs " \
> + "ip=dhcp nfsroot=${serverip}:${nfsroot},v3,tcp\0" \
> + "netboot=echo Booting from net ...; " \
> + "run netargs; " \
> + "if test ${ip_dyn} = yes; then " \
> + "setenv get_cmd dhcp; " \
> + "else " \
> + "setenv get_cmd tftp; " \
> + "fi; " \
> + "${get_cmd} ${uimage}; " \
> + "if test ${boot_fdt} = yes || test ${boot_fdt} = try; then " \
> + "if ${get_cmd} ${fdt_addr} ${fdt_file}; then " \
> + "bootm ${loadaddr} - ${fdt_addr}; " \
> + "else " \
> + "if test ${boot_fdt} = try; then " \
> + "bootm; " \
> + "else " \
> + "echo WARN: Cannot load the DT; " \
> + "fi; " \
> + "fi; " \
> + "else " \
> + "bootm; " \
> + "fi;\0"
> +
> +#define CONFIG_BOOTCOMMAND \
> + "mmc dev ${mmcdev}; if mmc rescan; then " \
> + "if run loadbootscript; then " \
> + "run bootscript; " \
> + "else " \
> + "if run loaduimage; then " \
> + "run mmcboot; " \
> + "else run netboot; " \
> + "fi; " \
> + "fi; " \
> + "else run netboot; fi"
> +
> +/* Miscellaneous configurable options */
> +#define CONFIG_SYS_LONGHELP /* undef to save memory */
> +#define CONFIG_SYS_HUSH_PARSER /* use "hush" command parser */
> +#define CONFIG_SYS_PROMPT_HUSH_PS2 "> "
> +#define CONFIG_SYS_PROMPT "=> "
> +#undef CONFIG_AUTO_COMPLETE
> +#define CONFIG_SYS_CBSIZE 256 /* Console I/O Buffer Size */
> +#define CONFIG_SYS_PBSIZE \
> + (CONFIG_SYS_CBSIZE + sizeof(CONFIG_SYS_PROMPT) + 16)
> +#define CONFIG_SYS_MAXARGS 16 /* max number of command args */
> +#define CONFIG_SYS_BARGSIZE CONFIG_SYS_CBSIZE
> +
> +#define CONFIG_CMD_MEMTEST
> +#define CONFIG_SYS_MEMTEST_START 0x80010000
> +#define CONFIG_SYS_MEMTEST_END 0x87C00000
> +
> +#define CONFIG_SYS_LOAD_ADDR CONFIG_LOADADDR
> +#define CONFIG_SYS_HZ 1000
> +#define CONFIG_CMDLINE_EDITING
> +
> +/*
> + * Stack sizes
> + * The stack sizes are set up in start.S using the settings below
> + */
> +#define CONFIG_STACKSIZE (128 * 1024) /* regular stack */
> +
> +/* Physical memory map */
> +#define CONFIG_NR_DRAM_BANKS 1
> +#define PHYS_SDRAM (0x80000000)
> +#define PHYS_SDRAM_SIZE (128 * 1024 * 1024)
> +
> +#define CONFIG_SYS_SDRAM_BASE PHYS_SDRAM
> +#define CONFIG_SYS_INIT_RAM_ADDR IRAM_BASE_ADDR
> +#define CONFIG_SYS_INIT_RAM_SIZE IRAM_SIZE
> +
> +#define CONFIG_SYS_INIT_SP_OFFSET \
> + (CONFIG_SYS_INIT_RAM_SIZE - GENERATED_GBL_DATA_SIZE)
> +#define CONFIG_SYS_INIT_SP_ADDR \
> + (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET)
> +
> +/* FLASH and environment organization */
> +#define CONFIG_SYS_NO_FLASH
> +
> +#define CONFIG_ENV_SIZE (8 * 1024)
> +#define CONFIG_ENV_IS_IN_MMC
> +
> +#define CONFIG_ENV_OFFSET (12 * 64 * 1024)
> +#define CONFIG_SYS_MMC_ENV_DEV 0
> +
> +#define CONFIG_OF_LIBFDT
> +#define CONFIG_CMD_BOOTZ
> +
> +#endif
Amicalement,
--
Albert.
prev parent reply other threads:[~2013-10-17 5:53 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-09-30 12:57 [U-Boot] [PATCH v2] arm: vf610: initial integration for colibri vf50 Marcel Ziswiler
2013-10-17 5:53 ` Albert ARIBAUD [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20131017075351.0a37245d@lilith \
--to=albert.u.boot@aribaud.net \
--cc=u-boot@lists.denx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.