1 From 23b6527003ca6a12d7872e9e552160041d8b6285 Mon Sep 17 00:00:00 2001
2 From: Terry Lv <r65388@freescale.com>
3 Date: Wed, 24 Jun 2009 11:31:38 +0800
4 Subject: [PATCH] ENGR00113611: Add FEC support for BBG2.
6 Add FEC support for BBG2.
8 Signed-off-by: Terry Lv <r65388@freescale.com>
10 board/freescale/imx51/imx51.c | 255 +++++++++++++++++++++++++++++++-------
11 cpu/arm_cortexa8/mx51/generic.c | 25 ++++
12 drivers/mmc/fsl_mmc.c | 2 +
13 drivers/net/mxc_fec.c | 13 +-
14 drivers/spi/imx_spi_pmic.c | 14 ++-
15 include/asm-arm/arch-mx51/mx51.h | 1 +
16 include/configs/imx51.h | 35 +++++-
18 8 files changed, 289 insertions(+), 61 deletions(-)
20 diff --git a/board/freescale/imx51/imx51.c b/board/freescale/imx51/imx51.c
21 index b0bbf46..5c3c022 100644
22 --- a/board/freescale/imx51/imx51.c
23 +++ b/board/freescale/imx51/imx51.c
28 -#include <asm/errno.h>
29 #include <asm/arch/mx51.h>
30 #include <asm/arch/mx51_pins.h>
31 #include <asm/arch/iomux.h>
32 +#include <asm/errno.h>
34 #include "board-imx51.h"
35 #include <asm/arch/imx_spi.h>
36 +#include <asm/arch/imx_spi_pmic.h>
38 DECLARE_GLOBAL_DATA_PTR;
40 @@ -158,48 +159,6 @@ static void setup_expio(void)
41 writew(reg, mx51_io_base_addr + PBC_SW_RESET);
48 - gd->bd->bi_arch_number = MACH_TYPE_MX51_3DS; /* board id for linux */
49 - /* address of boot parameters */
50 - gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100;
58 -#ifdef BOARD_LATE_INIT
59 -int board_late_init(void)
67 - printf("Board: MX51 3STACK [");
68 - switch (__REG(SRC_BASE_ADDR + 0x8)) {
86 void spi_io_init(struct imx_spi_dev_t *dev)
89 @@ -242,13 +201,177 @@ void spi_io_init(struct imx_spi_dev_t *dev)
93 +static void setup_fec(void)
96 + writel(0x3, IOMUXC_BASE_ADDR + 0x0D4);
97 + writel(0x1FD, IOMUXC_BASE_ADDR + 0x0468);
98 + writel(0x0, IOMUXC_BASE_ADDR + 0x0954);
101 + writel(0x2, IOMUXC_BASE_ADDR + 0x13C);
102 + writel(0x2004, IOMUXC_BASE_ADDR + 0x0524);
105 + writel(0x3, IOMUXC_BASE_ADDR + 0x0EC);
106 + writel(0x180, IOMUXC_BASE_ADDR + 0x0480);
107 + writel(0x0, IOMUXC_BASE_ADDR + 0x0964);
110 + writel(0x3, IOMUXC_BASE_ADDR + 0x0E8);
111 + writel(0x180, IOMUXC_BASE_ADDR + 0x047C);
112 + writel(0x0, IOMUXC_BASE_ADDR + 0x0960);
115 + writel(0x3, IOMUXC_BASE_ADDR + 0x0d8);
116 + writel(0x180, IOMUXC_BASE_ADDR + 0x046C);
117 + writel(0x0, IOMUXC_BASE_ADDR + 0x095C);
120 + writel(0x2, IOMUXC_BASE_ADDR + 0x016C);
121 + writel(0x2180, IOMUXC_BASE_ADDR + 0x0554);
122 + writel(0x0, IOMUXC_BASE_ADDR + 0x0958);
125 + writel(0x2, IOMUXC_BASE_ADDR + 0x148);
126 + writel(0x2004, IOMUXC_BASE_ADDR + 0x0530);
129 + writel(0x2, IOMUXC_BASE_ADDR + 0x144);
130 + writel(0x2004, IOMUXC_BASE_ADDR + 0x052C);
133 + writel(0x2, IOMUXC_BASE_ADDR + 0x140);
134 + writel(0x2004, IOMUXC_BASE_ADDR + 0x0528);
137 + writel(0x2, IOMUXC_BASE_ADDR + 0x0170);
138 + writel(0x2004, IOMUXC_BASE_ADDR + 0x0558);
141 + writel(0x1, IOMUXC_BASE_ADDR + 0x014C);
142 + writel(0x2004, IOMUXC_BASE_ADDR + 0x0534);
145 + writel(0x2, IOMUXC_BASE_ADDR + 0x0138);
146 + writel(0x2004, IOMUXC_BASE_ADDR + 0x0520);
149 + writel(0x1, IOMUXC_BASE_ADDR + 0x0150);
150 + writel(0x2180, IOMUXC_BASE_ADDR + 0x0538);
151 + writel(0x0, IOMUXC_BASE_ADDR + 0x0974);
154 + writel(0x1, IOMUXC_BASE_ADDR + 0x0124);
155 + writel(0x2180, IOMUXC_BASE_ADDR + 0x0500);
156 + writel(0x0, IOMUXC_BASE_ADDR + 0x094c);
159 + writel(0x1, IOMUXC_BASE_ADDR + 0x0128);
160 + writel(0x2180, IOMUXC_BASE_ADDR + 0x0504);
161 + writel(0x0, IOMUXC_BASE_ADDR + 0x0968);
164 + writel(0x3, IOMUXC_BASE_ADDR + 0x0f4);
165 + writel(0x180, IOMUXC_BASE_ADDR + 0x0488);
166 + writel(0x0, IOMUXC_BASE_ADDR + 0x0950);
169 + writel(0x3, IOMUXC_BASE_ADDR + 0x0f0);
170 + writel(0x180, IOMUXC_BASE_ADDR + 0x0484);
171 + writel(0x0, IOMUXC_BASE_ADDR + 0x0970);
174 + writel(0x2, IOMUXC_BASE_ADDR + 0x164);
175 + writel(0x2180, IOMUXC_BASE_ADDR + 0x054C);
176 + writel(0x0, IOMUXC_BASE_ADDR + 0x096C);
179 +static void power_init(void)
181 + struct spi_slave *slave;
185 + slave = spi_pmic_probe();
187 + /* power up the system first */
188 + pmic_reg(slave, 34, 0x00200000, 1);
190 + if (mxc_get_clock(MXC_FEC_CLK) > 800000000) {
191 + /* Set core voltage to 1.175V */
192 + val = pmic_reg(slave, 24, 0, 0);
193 + val = (val & (~0x1F)) | 0x17;
194 + pmic_reg(slave, 24, val, 1);
197 + /* Setup VCC (SW2) to 1.225 */
198 + val = pmic_reg(slave, 25, 0, 0);
199 + val = (val & (~0x1F)) | 0x19;
200 + pmic_reg(slave, 25, val, 1);
202 + /* Setup 1V2_DIG1 (SW3) to 1.2 */
203 + val = pmic_reg(slave, 26, 0, 0);
204 + val = (val & (~0x1F)) | 0x18;
205 + pmic_reg(slave, 25, val, 1);
207 + /* Set VDIG to 1.65V, VGEN3 to 1.8V, VCAM to 2.5V */
208 + val = pmic_reg(slave, 30, 0, 0);
211 + pmic_reg(slave, 30, val, 1);
213 + /* Set VVIDEO to 2.775V, VAUDIO to 3V, VSD to 3.15V */
214 + val = pmic_reg(slave, 31, 0, 0);
217 + pmic_reg(slave, 31, val, 1);
219 + /* Configure VGEN3 and VCAM regulators to use external PNP */
221 + pmic_reg(slave, 33, val, 1);
224 + reg = readl(GPIO2_BASE_ADDR + 0x0);
225 + reg &= ~0x4000; /* Lower reset line */
226 + writel(reg, GPIO2_BASE_ADDR + 0x0);
228 + reg = readl(GPIO2_BASE_ADDR + 0x4);
229 + reg |= 0x4000; /* configure GPIO lines as output */
230 + writel(reg, GPIO2_BASE_ADDR + 0x4);
232 + /* Reset the ethernet controller over GPIO */
233 + writel(0x1, IOMUXC_BASE_ADDR + 0x0AC);
235 + /* Enable VGEN3, VCAM, VAUDIO, VVIDEO, VSD regulators */
237 + pmic_reg(slave, 33, val, 1);
241 + reg = readl(GPIO2_BASE_ADDR + 0x0);
243 + writel(reg, GPIO2_BASE_ADDR + 0x0);
245 + /* Setup the FEC after enabling the regulators */
248 + spi_pmic_free(slave);
251 #ifdef CONFIG_NET_MULTI
253 +#if defined(CONFIG_DRIVER_SMC911X)
254 +extern int smc911x_initialize(bd_t *bis);
256 int board_eth_init(bd_t *bis)
260 #if defined(CONFIG_DRIVER_SMC911X)
261 - rc = smc911x_initialize(bis);
262 + rc = smc911x_initialize(bis);
268 @@ -329,3 +452,47 @@ int sdhc_init(void)
273 +int board_init(void)
277 + gd->bd->bi_arch_number = MACH_TYPE_MX51_3DS; /* board id for linux */
278 + /* address of boot parameters */
279 + gd->bd->bi_boot_params = PHYS_SDRAM_1 + 0x100;
287 +#ifdef BOARD_LATE_INIT
288 +int board_late_init(void)
295 +int checkboard(void)
297 + printf("Board: MX51 3STACK [");
298 + switch (__REG(SRC_BASE_ADDR + 0x8)) {
316 diff --git a/cpu/arm_cortexa8/mx51/generic.c b/cpu/arm_cortexa8/mx51/generic.c
317 index ef8ef98..6f928f6 100644
318 --- a/cpu/arm_cortexa8/mx51/generic.c
319 +++ b/cpu/arm_cortexa8/mx51/generic.c
323 #include <asm/arch/mx51.h>
324 +#include <asm/errno.h>
325 #include "crm_regs.h"
328 @@ -203,6 +204,10 @@ unsigned int mxc_get_clock(enum mxc_clock clk)
329 return __get_uart_clk();
331 return __get_cspi_clk();
333 + return __decode_pll(PLL1_CLK, CONFIG_MX51_HCLK_FREQ);
339 @@ -233,3 +238,23 @@ int print_cpuinfo(void)
345 + * Initializes on-chip ethernet controllers.
346 + * to override, implement board_eth_init()
348 + #if defined(CONFIG_MXC_FEC)
349 + extern int mxc_fec_initialize(bd_t *bis);
352 +int cpu_eth_init(bd_t *bis)
356 +#if defined(CONFIG_MXC_FEC)
357 + rc = mxc_fec_initialize(bis);
363 diff --git a/drivers/mmc/fsl_mmc.c b/drivers/mmc/fsl_mmc.c
364 index 2fbf4d6..85829d0 100644
365 --- a/drivers/mmc/fsl_mmc.c
366 +++ b/drivers/mmc/fsl_mmc.c
368 #define RETRY_TIMEOUT (10)
371 +extern int sdhc_init();
373 extern int fat_register_device(block_dev_desc_t *dev_desc, int part_no);
375 static block_dev_desc_t mmc_dev;
376 diff --git a/drivers/net/mxc_fec.c b/drivers/net/mxc_fec.c
377 index 218c432..91d248b 100644
378 --- a/drivers/net/mxc_fec.c
379 +++ b/drivers/net/mxc_fec.c
380 @@ -121,7 +121,7 @@ static inline void fec_localhw_setup(volatile fec_t *fecp)
381 fecp->fec_miigsk_enr = FEC_MIIGSK_ENR_EN;
384 -static inline void fec_localhw_setup(struct fec_t *fecp)
385 +static inline void fec_localhw_setup(fec_t *fecp)
389 @@ -271,7 +271,7 @@ static inline u16 getFecPhyStatus(volatile fec_t *fecp, unsigned char addr)
393 -static void setFecDuplexSpeed(volatile fec_t *fecp, unsigned char addr,
394 +static void setFecDuplexSpeed(volatile fec_t *fecp, unsigned char addr,
398 @@ -386,7 +386,7 @@ int fec_send(struct eth_device *dev, volatile void *packet, int length)
401 if (j >= FEC_MAX_TIMEOUT)
402 - printf("TX timeout packet at %x\n", packet);
403 + printf("TX timeout packet at %p\n", packet);
406 printf("%s[%d] %s: cycles: %d status: %x retry cnt: %d\n",
407 @@ -612,7 +612,7 @@ int fec_init(struct eth_device *dev, bd_t *bd)
411 - fec_localhw_setup(fecp);
412 + fec_localhw_setup((fec_t *)fecp);
414 #if defined (CONFIG_CMD_MII) || defined (CONFIG_MII) || \
415 defined (CONFIG_DISCOVER_PHY)
416 @@ -622,10 +622,11 @@ int fec_init(struct eth_device *dev, bd_t *bd)
417 if (info->phy_addr < 0 || info->phy_addr > 0x1F)
418 info->phy_addr = mxc_fec_mii_discover_phy(dev);
420 - setFecDuplexSpeed(fecp, bd, info->dup_spd);
421 + setFecDuplexSpeed(fecp, (unsigned char)bd, info->dup_spd);
423 #ifndef CONFIG_DISCOVER_PHY
424 - setFecDuplexSpeed(fecp, bd, (FECDUPLEX << 16) | FECSPEED);
425 + setFecDuplexSpeed(fecp, (unsigned char)bd,
426 + (FECDUPLEX << 16) | FECSPEED);
427 #endif /* ifndef CONFIG_SYS_DISCOVER_PHY */
428 #endif /* CONFIG_CMD_MII || CONFIG_MII */
430 diff --git a/drivers/spi/imx_spi_pmic.c b/drivers/spi/imx_spi_pmic.c
431 index bce42c2..79d798d 100644
432 --- a/drivers/spi/imx_spi_pmic.c
433 +++ b/drivers/spi/imx_spi_pmic.c
434 @@ -53,13 +53,17 @@ u32 pmic_reg(struct spi_slave *slave, u32 reg, u32 val, u32 write)
435 pmic_tx = (write << 31) | (reg << 25) | (val & 0x00FFFFFF);
436 printf("reg=0x%x, val=0x%08x\n", reg, pmic_tx);
438 - spi_xfer(slave, 4 << 3, (u8 *)&pmic_tx,
439 - (u8 *)&pmic_rx, 0);
440 + if (spi_xfer(slave, 4 << 3, (u8 *)&pmic_tx, (u8 *)&pmic_rx,
441 + SPI_XFER_BEGIN | SPI_XFER_END)) {
446 pmic_tx &= ~(1 << 31);
447 - spi_xfer(slave, 4 << 3,
448 - (u8 *)&pmic_tx, (u8 *)&pmic_rx, 0);
449 + if (spi_xfer(slave, 4 << 3, (u8 *)&pmic_tx, (u8 *)&pmic_rx,
450 + SPI_XFER_BEGIN | SPI_XFER_END)) {
456 @@ -73,7 +77,7 @@ void show_pmic_info(struct spi_slave *slave)
459 rev_id = pmic_reg(slave, 7, 0, 0);
460 - printf("PMIC ID: 0x%08x [Rev: ", rev_id);
461 + debug("PMIC ID: 0x%08x [Rev: ", rev_id);
462 switch (rev_id & 0x1F) {
465 diff --git a/include/asm-arm/arch-mx51/mx51.h b/include/asm-arm/arch-mx51/mx51.h
466 index 29120ab..14c2b2d 100644
467 --- a/include/asm-arm/arch-mx51/mx51.h
468 +++ b/include/asm-arm/arch-mx51/mx51.h
469 @@ -405,6 +405,7 @@ MXC_IPG_CLK,
476 extern unsigned int mxc_get_clock(enum mxc_clock clk);
477 diff --git a/include/configs/imx51.h b/include/configs/imx51.h
478 index 7bd6c38..3257843 100644
479 --- a/include/configs/imx51.h
480 +++ b/include/configs/imx51.h
482 #define CONFIG_CMD_MMC
483 #define CONFIG_DOS_PARTITION 1
484 #define CONFIG_CMD_FAT 1
485 +#define CONFIG_MMC_BASE 0x0
490 +#define CONFIG_HAS_ETH1
491 +#define CONFIG_NET_MULTI 1
492 +#define CONFIG_MXC_FEC
494 +#define CONFIG_DISCOVER_PHY
496 +#define CONFIG_FEC0_IOBASE FEC_BASE_ADDR
497 +#define CONFIG_FEC0_PINMUX -1
498 +#define CONFIG_FEC0_PHY_ADDR 0x1F
499 +#define CONFIG_FEC0_MIIBASE -1
501 +#define CONFIG_CMD_PING
502 +#define CONFIG_CMD_DHCP
503 +#define CONFIG_CMD_MII
504 +#define CONFIG_CMD_NET
506 /* allow to overwrite serial and ethaddr */
507 #define CONFIG_ENV_OVERWRITE
508 -#define CONFIG_CONS_INDEX 1
509 -#define CONFIG_BAUDRATE 115200
510 +#define CONFIG_CONS_INDEX 1
511 +#define CONFIG_BAUDRATE 115200
512 #define CONFIG_SYS_BAUDRATE_TABLE {9600, 19200, 38400, 57600, 115200}
514 -#define CONFIG_MMC_BASE 0x0
516 /***********************************************************
518 ***********************************************************/
519 @@ -116,11 +134,13 @@
521 #define CONFIG_BOOTDELAY 3
523 +#define CONFIG_PRIME "FEC0"
525 #define CONFIG_LOADADDR 0x90800000 /* loadaddr env var */
527 #define CONFIG_EXTRA_ENV_SETTINGS \
529 - "ethprime=smc911x\0" \
530 + "ethprime=FEC0\0" \
531 "uboot_addr=0xa0000000\0" \
532 "uboot=u-boot.bin\0" \
535 "setenv filesize; saveenv\0"
539 #define CONFIG_DRIVER_SMC911X 1
540 #define CONFIG_DRIVER_SMC911X_16_BIT 1
541 #define CONFIG_DRIVER_SMC911X_BASE_VARIABLE mx51_io_base_addr
545 * The MX51 3stack board seems to have a hardware "peculiarity" confirmed under
547 * Miscellaneous configurable options
549 #define CONFIG_SYS_LONGHELP /* undef to save memory */
550 -#define CONFIG_SYS_PROMPT "=> "
551 +#define CONFIG_SYS_PROMPT "BBG U-Boot > "
552 +#define CONFIG_AUTO_COMPLETE
553 #define CONFIG_SYS_CBSIZE 256 /* Console I/O Buffer Size */
554 /* Print Buffer Size */
555 #define CONFIG_SYS_PBSIZE (CONFIG_SYS_CBSIZE + sizeof(CONFIG_SYS_PROMPT) + 16)
556 diff --git a/net/eth.c b/net/eth.c
557 index bb8b6e4..67f6646 100644
560 @@ -201,8 +201,13 @@ int eth_initialize(bd_t *bis)
562 /* Try board-specific initialization first. If it fails or isn't
563 * present, try the cpu-specific initialization */
564 +#ifdef CONFIG_ETH_PRIME
565 + board_eth_init(bis);
568 if (board_eth_init(bis) < 0)
572 #if defined(CONFIG_DB64360) || defined(CONFIG_CPCI750)
573 mv6436x_eth_initialize(bis);