Dear Fred Fan, In message <12537172421605-git-send-email-fanyef...@gmail.com> you wrote: > This patch just supports boot into u-boot from mmc or spi-nor flash. > It just implements console, iomux and clock. There are no ethernet, > nor-flash, mmc or other peripheral drivers. > > Signed-off-by: Fred.Fan <fanyef...@gmail.com> > Signed-off-by: Fred.Fan <r01...@freescale.com>
Please use a shorter subject (it gets tructaed), something like: mx51_babbage: add support for Freescale iMX51 board > diff --git a/MAKEALL b/MAKEALL > index edebaea..852baf1 100755 > --- a/MAKEALL > +++ b/MAKEALL > @@ -581,6 +581,7 @@ LIST_ARM_CORTEX_A8=" \ > omap3_pandora \ > omap3_zoom1 \ > omap3_zoom2 \ > + mx51_babbage \ Please keep lists sorted. > diff --git a/board/freescale/mx51_babbage/board-mx51_babbage.h > b/board/freescale/mx51_babbage/board-mx51_babbage.h > new file mode 100644 > index 0000000..31e3875 > --- /dev/null > +++ b/board/freescale/mx51_babbage/board-mx51_babbage.h Please drop the "board-" part of the file name. > +/* > + * The code contained herein is licensed under the GNU General Public > + * License. You may obtain a copy of the GNU General Public License > + * Version 2 or later at the following locations: Please use correct licnese terms. Specify which version of the license applies, i. e. use something like: This code is licensed under the GPL, version 2 (or any later version). > +/*! > + * @defgroup BRDCFG_MX51_BABBAGE Board Configuration Options > + * @ingroup MSL_MX51_BABBAGE > + */ Please get rid of this "!", "@defgroup", "@ingroup" etc. stuff. > +/*! > + * @file mx51_babbage/board-mx51_babbage.h Drop this line. It carries no information. > + * @brief This file contains all the board level configuration options. > + * Drop the blank line. > + * It currently hold the options defined for MX51 babbage Platform. > + * > + * @ingroup BRDCFG_MX51_BABBAGE Drop this line, Please apply similar to the rest of the code. > +/* CPLD offsets */ > +#define PBC_LED_CTRL (0x20000) > +#define PBC_SB_STAT (0x20008) > +#define PBC_ID_AAAA (0x20040) > +#define PBC_ID_5555 (0x20048) > +#define PBC_VERSION (0x20050) > +#define PBC_ID_CAFE (0x20058) > +#define PBC_INT_STAT (0x20010) > +#define PBC_INT_MASK (0x20038) > +#define PBC_INT_REST (0x20020) > +#define PBC_SW_RESET (0x20060) Don't use base address + offsets, but declare proper C structures to describe the register layout. Then use I/O accessors to access registers. > diff --git a/board/freescale/mx51_babbage/config.mk > b/board/freescale/mx51_babbage/config.mk > new file mode 100644 > index 0000000..d8b0f10 > --- /dev/null > +++ b/board/freescale/mx51_babbage/config.mk > @@ -0,0 +1,2 @@ > +LDSCRIPT = board/$(VENDOR)/$(BOARD)/u-boot.lds > +TEXT_BASE = 0x97800000 Even though the file is short, please add a (C) and license header. > diff --git a/board/freescale/mx51_babbage/flash_header.S > b/board/freescale/mx51_babbage/flash_header.S > new file mode 100644 > index 0000000..bbac2c1 > --- /dev/null > +++ b/board/freescale/mx51_babbage/flash_header.S ... > +/*! > + * @file mx51_babbage/flash_head.S > + * @brief Thie file contains the information as the image header for boot. S/Thie/This/ ? Please explain what "image header" means. U-Boot has an image geader, too, but you probably refer to something different. > + * The boot rom code will parse this structure , load image and initial > + * hardware as the description of hardware setting. > + */ I read: "The ROM code will ... load ... initial hardware" ? Something seems to be missing, or do you mean s/initial/initialize/ ? Please clean up. > +#include <config.h> > +#include <asm/arch/mx51.h> > +#include "board-mx51_babbage.h" > + > +#ifdef CONFIG_FLASH_HEADER > +#ifndef CONFIG_FLASH_HEADER_OFFSET It seems this is a iMX51 specific thing, right? Then please make this clear in the name oif the file and the macro names. "FLASH_HEADER" or "flash_head" is way too generic. > diff --git a/board/freescale/mx51_babbage/lowlevel_init.S > b/board/freescale/mx51_babbage/lowlevel_init.S > new file mode 100644 > index 0000000..bf536b1 > --- /dev/null > +++ b/board/freescale/mx51_babbage/lowlevel_init.S How much of this is really board specific code, or how much of it should be moved to the CPU directory instead? > +int dram_init(void) > +{ > + gd->bd->bi_dram[0].start = PHYS_SDRAM_1; > + gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE; Please use get_ram_size() for autosizing and (simple) RAM test. > +} > + > +static void setup_uart(void) > +{ > + unsigned int pad = PAD_CTL_HYS_ENABLE | PAD_CTL_PKE_ENABLE | > + PAD_CTL_PUE_PULL | PAD_CTL_DRV_HIGH; > + > + mxc_request_iomux(MX51_PIN_UART1_RXD, IOMUX_CONFIG_ALT0); > + mxc_iomux_set_pad(MX51_PIN_UART1_RXD, pad | PAD_CTL_SRE_FAST); > + mxc_request_iomux(MX51_PIN_UART1_TXD, IOMUX_CONFIG_ALT0); > + mxc_iomux_set_pad(MX51_PIN_UART1_TXD, pad | PAD_CTL_SRE_FAST); > + mxc_request_iomux(MX51_PIN_UART1_RTS, IOMUX_CONFIG_ALT0); > + mxc_iomux_set_pad(MX51_PIN_UART1_RTS, pad); > + mxc_request_iomux(MX51_PIN_UART1_CTS, IOMUX_CONFIG_ALT0); > + mxc_iomux_set_pad(MX51_PIN_UART1_CTS, pad); Hmm... the comment in the code for mxc_request_iomux() reads: * Request ownership for an IO pin. This function has to be the first one * being called before that pin is used. The caller has to check the * return value to make sure it returns 0. I do not see any such checks in your code? Either they are missing here, or the whole mxc_request_iomux() is not needed at all. > +static void setup_expio(void) > +{ ... > + /* WAL=0, WBED=1, WWSC=50, WADVA=2, WADVN=6, WEA=0, > + * WEN=0, WCSA=0, WCSN=0 > + */ Incorrect multiline comment. Please fix globally. > + /* Reset interrupt status reg */ > + writew(0x1F, mx51_io_base_addr + PBC_INT_REST); > + writew(0x00, mx51_io_base_addr + PBC_INT_REST); > + writew(0xFFFF, mx51_io_base_addr + PBC_INT_MASK); As mentioned above: do not use base address plus offset, but use a proper C structure to define the register map. > +#ifdef BOARD_LATE_INIT > +int board_late_init(void) > +{ > + return 0; > +} > +#endif If the function is not needed, then don't implement it. Don;t add dead code. > +int checkboard(void) > +{ > + printf("Board: MX51 BABBAGE "); > + > + if (system_rev & CHIP_REV_2_5) > + printf("2.5 ["); > + else if (system_rev & CHIP_REV_2_0) > + printf("2.0 ["); > + else if (system_rev & CHIP_REV_1_1) > + printf("1.1 ["); > + else > + printf("1.0 ["); Please use puts() for constant strings that don;t need any formatting. > diff --git a/board/freescale/mx51_babbage/u-boot.lds > b/board/freescale/mx51_babbage/u-boot.lds > new file mode 100644 > index 0000000..f608a6d > --- /dev/null > +++ b/board/freescale/mx51_babbage/u-boot.lds Does this board really need a specific linker script? Can we not use a generic one for all (or most of the) i.MX51 boards? > + . = ALIGN(4); > + .text : > + { > + /* WARNING - the following is hand-optimized to fit within */ > + /* the sector layout of our flash chips! XXX FIXME XXX */ Why is this needed / useful? It doesn't seem to match the environment definitions in your board config file. ... > diff --git a/cpu/arm_cortexa8/mx51/clock.c b/cpu/arm_cortexa8/mx51/clock.c > new file mode 100644 > index 0000000..3abcdc8 > --- /dev/null > +++ b/cpu/arm_cortexa8/mx51/clock.c ... > +static u32 __decode_pll(enum pll_clocks pll, u32 infreq) ... > +u32 __get_mcu_main_clk(void) ... > +static u32 __get_periph_clk(void) Is there any special reason for the "__" pat in all these names? You are aware that this has a special meaning in standard conforming C code, aren't you? Please also add comments what all these functions are doing. Hey, and add comments what the code is doing. It's not exactly obvious to me. > + u32 reg; > + > + reg = __raw_readl(MXC_CCM_CBCDR); > + if (reg & MXC_CCM_CBCDR_PERIPH_CLK_SEL) { > + reg = __raw_readl(MXC_CCM_CBCMR); > + switch ((reg & MXC_CCM_CBCMR_PERIPH_CLK_SEL_MASK) >> > + MXC_CCM_CBCMR_PERIPH_CLK_SEL_OFFSET) { > + case 0: > + return __decode_pll(PLL1_CLK, CONFIG_MX51_HCLK_FREQ); > + case 1: > + return __decode_pll(PLL3_CLK, CONFIG_MX51_HCLK_FREQ); > + default: > + return 0; > + } > + } > + return __decode_pll(PLL2_CLK, CONFIG_MX51_HCLK_FREQ); In such cases it's better to turn around the logig, i. e. write: if ((reg & MXC_CCM_CBCDR_PERIPH_CLK_SEL) == 0) return __decode_pll(PLL2_CLK, CONFIG_MX51_HCLK_FREQ); reg = __raw_readl(MXC_CCM_CBCMR); switch ((reg & MXC_CCM_CBCMR_PERIPH_CLK_SEL_MASK) >> MXC_CCM_CBCMR_PERIPH_CLK_SEL_OFFSET) { case 0: return __decode_pll(PLL1_CLK, CONFIG_MX51_HCLK_FREQ); case 1: return __decode_pll(PLL3_CLK, CONFIG_MX51_HCLK_FREQ); default: return 0; } /* NOTREACHED */ You see? Less indentation = easier to read. ... > +void mxc_show_clocks(void) > +{ > + u32 freq; > + > + freq = __decode_pll(PLL1_CLK, CONFIG_MX51_HCLK_FREQ); > + printf("mx51 pll1: %dMHz\n", freq / 1000000); > + freq = __decode_pll(PLL2_CLK, CONFIG_MX51_HCLK_FREQ); > + printf("mx51 pll2: %dMHz\n", freq / 1000000); > + freq = __decode_pll(PLL3_CLK, CONFIG_MX51_HCLK_FREQ); > + printf("mx51 pll3: %dMHz\n", freq / 1000000); > + printf("ipg clock : %dHz\n", mxc_get_clock(MXC_IPG_CLK)); > + printf("ipg per clock : %dHz\n", mxc_get_clock(MXC_IPG_PERCLK)); > + printf("uart clock : %dHz\n", mxc_get_clock(MXC_UART_CLK)); > + printf("cspi clock : %dHz\n", mxc_get_clock(MXC_CSPI_CLK)); Please don't print too much during regular boot. Either make this debug() code, or provide a separate command so the user can print this if he is interested in this information. Standard boot output shall be terse, as it affects boot ime. > diff --git a/cpu/arm_cortexa8/mx51/crm_regs.h > b/cpu/arm_cortexa8/mx51/crm_regs.h > new file mode 100644 > index 0000000..6436bed > --- /dev/null > +++ b/cpu/arm_cortexa8/mx51/crm_regs.h Should this file go to include/... ? > +/* > + * Copyright 2009 Freescale Semiconductor, Inc. All Rights Reserved. > + */ > + > +/* > + * The code contained herein is licensed under the GNU General Public > + * License. You may obtain a copy of the GNU General Public License > + * Version 2 or later at the following locations: See license header comments above. > + * http://www.opensource.org/licenses/gpl-license.html > + * http://www.gnu.org/copyleft/gpl.html > + */ > +#ifndef __ARCH_ARM_MACH_MX51_CRM_REGS_H__ > +#define __ARCH_ARM_MACH_MX51_CRM_REGS_H__ > + > +#define MXC_CCM_BASE CCM_BASE_ADDR > +#define MXC_DPLL1_BASE PLL1_BASE_ADDR > +#define MXC_DPLL2_BASE PLL2_BASE_ADDR > +#define MXC_DPLL3_BASE PLL3_BASE_ADDR > + > +/* PLL Register Offsets */ > +#define MXC_PLL_DP_CTL 0x00 > +#define MXC_PLL_DP_CONFIG 0x04 > +#define MXC_PLL_DP_OP 0x08 > +#define MXC_PLL_DP_MFD 0x0C > +#define MXC_PLL_DP_MFN 0x10 > +#define MXC_PLL_DP_MFNMINUS 0x14 > +#define MXC_PLL_DP_MFNPLUS 0x18 > +#define MXC_PLL_DP_HFS_OP 0x1C > +#define MXC_PLL_DP_HFS_MFD 0x20 > +#define MXC_PLL_DP_HFS_MFN 0x24 > +#define MXC_PLL_DP_MFN_TOGC 0x28 > +#define MXC_PLL_DP_DESTAT 0x2c See comments above - use C structs instead of offset definitions. > diff --git a/cpu/arm_cortexa8/mx51/iomux.c b/cpu/arm_cortexa8/mx51/iomux.c > new file mode 100644 > index 0000000..80082aa > --- /dev/null > +++ b/cpu/arm_cortexa8/mx51/iomux.c ... > +static inline u32 _get_mux_reg(iomux_pin_name_t pin) > +{ > + u32 mux_reg = PIN_TO_IOMUX_MUX(pin); > + > + if (is_soc_rev(CHIP_REV_2_0) < 0) { > + if ((pin == MX51_PIN_NANDF_RB5) || > + (pin == MX51_PIN_NANDF_RB6) || > + (pin == MX51_PIN_NANDF_RB7)) > + ; /* Do nothing */ > + else if (mux_reg >= 0x2FC) > + mux_reg += 8; > + else if (mux_reg >= 0x130) > + mux_reg += 0xC; > + } > + mux_reg += IOMUXSW_MUX_CTL; > + return mux_reg; > +} > + > +static inline u32 _get_pad_reg(iomux_pin_name_t pin) > +{ Please add comments what all this stuff is supposed to do. > + > + if (is_soc_rev(CHIP_REV_2_0) < 0) { > + if ((pin == MX51_PIN_NANDF_RB5) || > + (pin == MX51_PIN_NANDF_RB6) || > + (pin == MX51_PIN_NANDF_RB7)) > + ; /* Do nothing */ > + else if (pad_reg == 0x4D0 - PAD_I_START) > + pad_reg += 0x4C; > + else if (pad_reg == 0x860 - PAD_I_START) > + pad_reg += 0x9C; > + else if (pad_reg >= 0x804 - PAD_I_START) > + pad_reg += 0xB0; > + else if (pad_reg >= 0x7FC - PAD_I_START) > + pad_reg += 0xB4; > + else if (pad_reg >= 0x4E4 - PAD_I_START) > + pad_reg += 0xCC; > + else > + pad_reg += 8; You may also want to explain suchblack magic like the code here. And please add parens around the (0x??? - PAD_I_START) parts. ... > +/*! > + * This function is used to configure a pin through the IOMUX module. > + * FIXED ME: for backward compatible. Will be static function! I don't understand what this means. Please explain. > + * @param pin a pin number as defined in \b #iomux_pin_name_t > + * @param cfg an output function as defined in \b > #iomux_pin_cfg_t > + * > + * @return 0 if successful; Non-zero otherwise > + */ > +static int iomux_config_mux(iomux_pin_name_t pin, iomux_pin_cfg_t cfg) ... > +#if defined(CONFIG_DISPLAY_CPUINFO) > +int print_cpuinfo(void) > +{ > + printf("CPU: Freescale i.MX51 family %d.%dV at %d MHz\n", > + (get_board_rev() & 0xFF) >> 4, > + (get_board_rev() & 0xF), > + __get_mcu_main_clk() / 1000000); > + mxc_show_clocks(); Please see above - please be terse. > diff --git a/cpu/arm_cortexa8/mx51/timer.c b/cpu/arm_cortexa8/mx51/timer.c > new file mode 100644 > index 0000000..5201768 > --- /dev/null > +++ b/cpu/arm_cortexa8/mx51/timer.c ... > +/* General purpose timers registers */ > +#define GPTCR GPT1_BASE_ADDR /* Control register */ > +#define GPTPR (GPT1_BASE_ADDR + 0x4) /* Prescaler register */ > +#define GPTSR (GPT1_BASE_ADDR + 0x8) /* Status register */ > +#define GPTCNT (GPT1_BASE_ADDR + 0x24) /* Counter register */ > + > +/* General purpose timers bitfields */ > +#define GPTCR_SWR (1<<15) /* Software reset */ > +#define GPTCR_FRR (1<<9) /* Freerun / restart */ > +#define GPTCR_CLKSOURCE_32 (4<<6) /* Clock source */ > +#define GPTCR_TEN (1) /* Timer enable */ Move to header file. Use C struct instead of base addr + offsets. ... > +/*! > + * defines for SPBA modules > + */ > +#define SPBA_SDHC1 0x04 > +#define SPBA_SDHC2 0x08 > +#define SPBA_UART3 0x0C > +#define SPBA_CSPI1 0x10 > +#define SPBA_SSI2 0x14 > +#define SPBA_SDHC3 0x20 > +#define SPBA_SDHC4 0x24 > +#define SPBA_SPDIF 0x28 > +#define SPBA_ATA 0x30 > +#define SPBA_SLIM 0x34 > +#define SPBA_HSI2C 0x38 > +#define SPBA_CTRL 0x3C Use C struct ? > +/* > + * Interrupt numbers > + */ > +#define MXC_INT_BASE 0 > +#define MXC_INT_RESV0 0 > +#define MXC_INT_MMC_SDHC1 1 > +#define MXC_INT_MMC_SDHC2 2 > +#define MXC_INT_MMC_SDHC3 3 > +#define MXC_INT_MMC_SDHC4 4 > +#define MXC_INT_RESV5 5 > +#define MXC_INT_SDMA 6 > +#define MXC_INT_IOMUX 7 > +#define MXC_INT_NFC 8 > +#define MXC_INT_VPU 9 > +#define MXC_INT_IPU_ERR 10 > +#define MXC_INT_IPU_SYN 11 > +#define MXC_INT_GPU 12 > +#define MXC_INT_RESV13 13 > +#define MXC_INT_USB_H1 14 > +#define MXC_INT_EMI 15 > +#define MXC_INT_USB_H2 16 > +#define MXC_INT_USB_H3 17 > +#define MXC_INT_USB_OTG 18 > +#define MXC_INT_SAHARA_H0 19 > +#define MXC_INT_SAHARA_H1 20 > +#define MXC_INT_SCC_SMN 21 > +#define MXC_INT_SCC_STZ 22 > +#define MXC_INT_SCC_SCM 23 > +#define MXC_INT_SRTC_NTZ 24 > +#define MXC_INT_SRTC_TZ 25 > +#define MXC_INT_RTIC 26 > +#define MXC_INT_CSU 27 > +#define MXC_INT_SLIM_B 28 > +#define MXC_INT_SSI1 29 > +#define MXC_INT_SSI2 30 > +#define MXC_INT_UART1 31 > +#define MXC_INT_UART2 32 > +#define MXC_INT_UART3 33 > +#define MXC_INT_RESV34 34 > +#define MXC_INT_RESV35 35 > +#define MXC_INT_CSPI1 36 > +#define MXC_INT_CSPI2 37 > +#define MXC_INT_CSPI 38 > +#define MXC_INT_GPT 39 > +#define MXC_INT_EPIT1 40 > +#define MXC_INT_EPIT2 41 > +#define MXC_INT_GPIO1_INT7 42 > +#define MXC_INT_GPIO1_INT6 43 > +#define MXC_INT_GPIO1_INT5 44 > +#define MXC_INT_GPIO1_INT4 45 > +#define MXC_INT_GPIO1_INT3 46 > +#define MXC_INT_GPIO1_INT2 47 > +#define MXC_INT_GPIO1_INT1 48 > +#define MXC_INT_GPIO1_INT0 49 > +#define MXC_INT_GPIO1_LOW 50 > +#define MXC_INT_GPIO1_HIGH 51 > +#define MXC_INT_GPIO2_LOW 52 > +#define MXC_INT_GPIO2_HIGH 53 > +#define MXC_INT_GPIO3_LOW 54 > +#define MXC_INT_GPIO3_HIGH 55 > +#define MXC_INT_GPIO4_LOW 56 > +#define MXC_INT_GPIO4_HIGH 57 > +#define MXC_INT_WDOG1 58 > +#define MXC_INT_WDOG2 59 > +#define MXC_INT_KPP 60 > +#define MXC_INT_PWM1 61 > +#define MXC_INT_I2C1 62 > +#define MXC_INT_I2C2 63 > +#define MXC_INT_HS_I2C 64 > +#define MXC_INT_RESV65 65 > +#define MXC_INT_RESV66 66 > +#define MXC_INT_SIM_IPB 67 > +#define MXC_INT_SIM_DAT 68 > +#define MXC_INT_IIM 69 > +#define MXC_INT_ATA 70 > +#define MXC_INT_CCM1 71 > +#define MXC_INT_CCM2 72 > +#define MXC_INT_GPC1 73 > +#define MXC_INT_GPC2 74 > +#define MXC_INT_SRC 75 > +#define MXC_INT_NM 76 > +#define MXC_INT_PMU 77 > +#define MXC_INT_CTI_IRQ 78 > +#define MXC_INT_CTI1_TG0 79 > +#define MXC_INT_CTI1_TG1 80 > +#define MXC_INT_MCG_ERR 81 > +#define MXC_INT_MCG_TMR 82 > +#define MXC_INT_MCG_FUNC 83 > +#define MXC_INT_RESV84 84 > +#define MXC_INT_RESV85 85 > +#define MXC_INT_RESV86 86 > +#define MXC_INT_FEC 87 > +#define MXC_INT_OWIRE 88 > +#define MXC_INT_CTI1_TG2 89 > +#define MXC_INT_SJC 90 > +#define MXC_INT_SPDIF 91 > +#define MXC_INT_TVE 92 > +#define MXC_INT_FIRI 93 > +#define MXC_INT_PWM2 94 > +#define MXC_INT_SLIM_EXP 95 > +#define MXC_INT_SSI3 96 > +#define MXC_INT_RESV97 97 > +#define MXC_INT_CTI1_TG3 98 > +#define MXC_INT_SMC_RX 99 > +#define MXC_INT_VPU_IDLE 100 > +#define MXC_INT_RESV101 101 > +#define MXC_INT_GPU_IDLE 102 > + > +#define MXC_MAX_INT_LINES 128 Use C struct ? And so on and on ... > diff --git a/include/configs/mx51_babbage.h b/include/configs/mx51_babbage.h > new file mode 100644 > index 0000000..a24b39b > --- /dev/null > +++ b/include/configs/mx51_babbage.h ... > +#define BOARD_LATE_INIT Why do you #define this, when you don't need it at all? > +#define CONFIG_SYS_MEMTEST_START 0 /* memtest works on */ > +#define CONFIG_SYS_MEMTEST_END 0x10000 That's not exactly a thorough testing, then. And is low memory really unused? Please check! > +#undef CONFIG_SYS_CLKS_IN_HZ /* everything, incl board info, > in Hz */ Don't undef what doesn't exist. > +#define CONFIG_SYS_LOAD_ADDR CONFIG_LOADADDR > + > +#define CONFIG_SYS_HZ CONFIG_MX51_CLK32/* use 32kHz clock as source */ CONFIG_SYS_HZ must be 1000. Best regards, Wolfgang Denk -- DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: w...@denx.de Voodoo Programming: Things programmers do that they know shouldn't work but they try anyway, and which sometimes actually work, such as recompiling everything. - Karl Lehenbauer _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot