]> git.sur5r.net Git - u-boot/commitdiff
ARM: Add X600 board support (SPEAr600 based)
authorStefan Roese <sr@denx.de>
Wed, 30 May 2012 22:59:08 +0000 (22:59 +0000)
committerAlbert ARIBAUD <albert.u.boot@aribaud.net>
Thu, 4 Oct 2012 08:18:32 +0000 (10:18 +0200)
This patch adds support for the X600 SPEAr600 based board. Its also
the first SPEAr600 board that uses the newly introduced SPEAr600
SPL support. Xloader is not necessary any more. By using the new
"u-boot.spr" make target, one image will generated containing both,
U-Boot SPL (with mkimage header as needed by the SPEAr BootROM, and
the main U-Boot with mkimage header.

Signed-off-by: Stefan Roese <sr@denx.de>
Cc: Amit Virdi <amit.virdi@st.com>
Cc: Vipin Kumar <vipin.kumar@st.com>
MAINTAINERS
board/spear/x600/Makefile [new file with mode: 0644]
board/spear/x600/fpga.c [new file with mode: 0644]
board/spear/x600/fpga.h [new file with mode: 0644]
board/spear/x600/x600.c [new file with mode: 0644]
boards.cfg
include/configs/x600.h [new file with mode: 0644]

index 842ff57ea5cfd6f7e512acfbe4ceb8cc19f88f1b..45351cc23e0722e3b48e859b68b889ede733f9f2 100644 (file)
@@ -857,6 +857,8 @@ John Rigby <jcrigby@gmail.com>
 
 Stefan Roese <sr@denx.de>
 
+       x600            ARM926EJS (spear600 Soc)
+
        pdnb3           xscale/ixp
        scpu            xscale/ixp
 
diff --git a/board/spear/x600/Makefile b/board/spear/x600/Makefile
new file mode 100644 (file)
index 0000000..8c4e7e2
--- /dev/null
@@ -0,0 +1,47 @@
+#
+# (C) Copyright 2000-2004
+# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+#
+# 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 $(TOPDIR)/config.mk
+
+LIB    = $(obj)lib$(BOARD).o
+
+ifndef CONFIG_SPL_BUILD
+COBJS  := fpga.o $(BOARD).o
+endif
+SOBJS  :=
+
+SRCS   := $(SOBJS:.o=.S) $(COBJS:.o=.c)
+OBJS   := $(addprefix $(obj),$(COBJS))
+SOBJS  := $(addprefix $(obj),$(SOBJS))
+
+$(LIB):        $(obj).depend $(OBJS) $(SOBJS)
+       $(call cmd_link_o_target, $(OBJS) $(SOBJS))
+
+#########################################################################
+
+# defines $(obj).depend target
+include $(SRCTREE)/rules.mk
+
+sinclude $(obj).depend
+
+#########################################################################
diff --git a/board/spear/x600/fpga.c b/board/spear/x600/fpga.c
new file mode 100644 (file)
index 0000000..85eb31b
--- /dev/null
@@ -0,0 +1,280 @@
+/*
+ * Copyright (C) 2012 Stefan Roese <sr@denx.de>
+ *
+ * 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 <spartan3.h>
+#include <command.h>
+#include <asm/gpio.h>
+#include <asm/io.h>
+#include <asm/arch/hardware.h>
+#include <asm/arch/spr_misc.h>
+#include <asm/arch/spr_ssp.h>
+
+/*
+ * FPGA program pin configuration on X600:
+ *
+ * Only PROG and DONE are connected to GPIOs. INIT is not connected to the
+ * SoC at all. And CLOCK and DATA are connected to the SSP2 port. We use
+ * 16bit serial writes via this SSP port to write the data bits into the
+ * FPGA.
+ */
+#define CONFIG_SYS_FPGA_PROG           2
+#define CONFIG_SYS_FPGA_DONE           3
+
+/*
+ * Set the active-low FPGA reset signal.
+ */
+static void fpga_reset(int assert)
+{
+       /*
+        * On x600 we have no means to toggle the FPGA reset signal
+        */
+       debug("%s:%d: RESET (%d)\n", __func__, __LINE__, assert);
+}
+
+/*
+ * Set the FPGA's active-low SelectMap program line to the specified level
+ */
+static int fpga_pgm_fn(int assert, int flush, int cookie)
+{
+       debug("%s:%d: FPGA PROG (%d)\n", __func__, __LINE__, assert);
+
+       gpio_set_value(CONFIG_SYS_FPGA_PROG, assert);
+
+       return assert;
+}
+
+/*
+ * Test the state of the active-low FPGA INIT line.  Return 1 on INIT
+ * asserted (low).
+ */
+static int fpga_init_fn(int cookie)
+{
+       static int state;
+
+       debug("%s:%d: init (state=%d)\n", __func__, __LINE__, state);
+
+       /*
+        * On x600, the FPGA INIT signal is not connected to the SoC.
+        * We can't read the INIT status. Let's return the "correct"
+        * INIT signal state generated via a local state-machine.
+        */
+       if (++state == 1) {
+               return 1;
+       } else {
+               state = 0;
+               return 0;
+       }
+}
+
+/*
+ * Test the state of the active-high FPGA DONE pin
+ */
+static int fpga_done_fn(int cookie)
+{
+       struct ssp_regs *ssp = (struct ssp_regs *)CONFIG_SSP2_BASE;
+
+       /*
+        * Wait for Tx-FIFO to become empty before looking for DONE
+        */
+       while (!(readl(&ssp->sspsr) & SSPSR_TFE))
+               ;
+
+       if (gpio_get_value(CONFIG_SYS_FPGA_DONE))
+               return 1;
+       else
+               return 0;
+}
+
+/*
+ * FPGA pre-configuration function. Just make sure that
+ * FPGA reset is asserted to keep the FPGA from starting up after
+ * configuration.
+ */
+static int fpga_pre_config_fn(int cookie)
+{
+       debug("%s:%d: FPGA pre-configuration\n", __func__, __LINE__);
+       fpga_reset(TRUE);
+
+       return 0;
+}
+
+/*
+ * FPGA post configuration function. Blip the FPGA reset line and then see if
+ * the FPGA appears to be running.
+ */
+static int fpga_post_config_fn(int cookie)
+{
+       int rc = 0;
+
+       debug("%s:%d: FPGA post configuration\n", __func__, __LINE__);
+
+       fpga_reset(TRUE);
+       udelay(100);
+       fpga_reset(FALSE);
+       udelay(100);
+
+       return rc;
+}
+
+static int fpga_clk_fn(int assert_clk, int flush, int cookie)
+{
+       /*
+        * No dedicated clock signal on x600 (data & clock generated)
+        * in SSP interface. So we don't have to do anything here.
+        */
+       return assert_clk;
+}
+
+static int fpga_wr_fn(int assert_write, int flush, int cookie)
+{
+       struct ssp_regs *ssp = (struct ssp_regs *)CONFIG_SSP2_BASE;
+       static int count;
+       static u16 data;
+
+       /*
+        * First collect 16 bits of data
+        */
+       data = data << 1;
+       if (assert_write)
+               data |= 1;
+
+       /*
+        * If 16 bits are not available, return for more bits
+        */
+       count++;
+       if (count != 16)
+               return assert_write;
+
+       count = 0;
+
+       /*
+        * Wait for Tx-FIFO to become ready
+        */
+       while (!(readl(&ssp->sspsr) & SSPSR_TNF))
+               ;
+
+       /* Send 16 bits to FPGA via SSP bus */
+       writel(data, &ssp->sspdr);
+
+       return assert_write;
+}
+
+static Xilinx_Spartan3_Slave_Serial_fns x600_fpga_fns = {
+       fpga_pre_config_fn,
+       fpga_pgm_fn,
+       fpga_clk_fn,
+       fpga_init_fn,
+       fpga_done_fn,
+       fpga_wr_fn,
+       fpga_post_config_fn,
+};
+
+static Xilinx_desc fpga[CONFIG_FPGA_COUNT] = {
+       XILINX_XC3S1200E_DESC(slave_serial, &x600_fpga_fns, 0)
+};
+
+/*
+ * Initialize the SelectMap interface.  We assume that the mode and the
+ * initial state of all of the port pins have already been set!
+ */
+static void fpga_serialslave_init(void)
+{
+       debug("%s:%d: Initialize serial slave interface\n", __func__, __LINE__);
+       fpga_pgm_fn(FALSE, FALSE, 0);   /* make sure program pin is inactive */
+}
+
+static int expi_setup(int freq)
+{
+       struct misc_regs *misc = (struct misc_regs *)CONFIG_SPEAR_MISCBASE;
+       int pll2_m, pll2_n, pll2_p, expi_x, expi_y;
+
+       pll2_m = (freq * 2) / 1000;
+       pll2_n = 15;
+       pll2_p = 1;
+       expi_x = 1;
+       expi_y = 2;
+
+       /*
+        * Disable reset, Low compression, Disable retiming, Enable Expi,
+        * Enable soft reset, DMA, PLL2, Internal
+        */
+       writel(EXPI_CLK_CFG_LOW_COMPR | EXPI_CLK_CFG_CLK_EN | EXPI_CLK_CFG_RST |
+              EXPI_CLK_SYNT_EN | EXPI_CLK_CFG_SEL_PLL2 |
+              EXPI_CLK_CFG_INT_CLK_EN | (expi_y << 16) | (expi_x << 24),
+              &misc->expi_clk_cfg);
+
+       /*
+        * 6 uA, Internal feedback, 1st order, Non-dithered, Sample Parameters,
+        * Enable PLL2, Disable reset
+        */
+       writel((pll2_m << 24) | (pll2_p << 8) | (pll2_n), &misc->pll2_frq);
+       writel(PLL2_CNTL_6UA | PLL2_CNTL_SAMPLE | PLL2_CNTL_ENABLE |
+              PLL2_CNTL_RESETN | PLL2_CNTL_LOCK, &misc->pll2_cntl);
+
+       /*
+        * Disable soft reset
+        */
+       clrbits_le32(&misc->expi_clk_cfg, EXPI_CLK_CFG_RST);
+
+       return 0;
+}
+
+/*
+ * Initialize the fpga
+ */
+int x600_init_fpga(void)
+{
+       struct ssp_regs *ssp = (struct ssp_regs *)CONFIG_SSP2_BASE;
+       struct misc_regs *misc = (struct misc_regs *)CONFIG_SPEAR_MISCBASE;
+
+       /* Enable SSP2 clock */
+       writel(readl(&misc->periph1_clken) | MISC_SSP2ENB | MISC_GPIO4ENB,
+              &misc->periph1_clken);
+
+       /* Set EXPI clock to 45 MHz */
+       expi_setup(45000);
+
+       /* Configure GPIO directions */
+       gpio_direction_output(CONFIG_SYS_FPGA_PROG, 0);
+       gpio_direction_input(CONFIG_SYS_FPGA_DONE);
+
+       writel(SSPCR0_DSS_16BITS, &ssp->sspcr0);
+       writel(SSPCR1_SSE, &ssp->sspcr1);
+
+       /*
+        * Set lowest prescale divisor value (CPSDVSR) of 2 for max download
+        * speed.
+        *
+        * Actual data clock rate is: 80MHz / (CPSDVSR * (SCR + 1))
+        * With CPSDVSR at 2 and SCR at 0, the maximume clock rate is 40MHz.
+        */
+       writel(2, &ssp->sspcpsr);
+
+       fpga_init();
+       fpga_serialslave_init();
+
+       debug("%s:%d: Adding fpga 0\n", __func__, __LINE__);
+       fpga_add(fpga_xilinx, &fpga[0]);
+
+       return 0;
+}
diff --git a/board/spear/x600/fpga.h b/board/spear/x600/fpga.h
new file mode 100644 (file)
index 0000000..2b18557
--- /dev/null
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2012 Stefan Roese <sr@denx.de>
+ *
+ * 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
+ */
+
+int x600_init_fpga(void);
diff --git a/board/spear/x600/x600.c b/board/spear/x600/x600.c
new file mode 100644 (file)
index 0000000..96ec0ad
--- /dev/null
@@ -0,0 +1,124 @@
+/*
+ * (C) Copyright 2009
+ * Vipin Kumar, ST Micoelectronics, vipin.kumar@st.com.
+ *
+ * Copyright (C) 2012 Stefan Roese <sr@denx.de>
+ *
+ * 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 <nand.h>
+#include <netdev.h>
+#include <phy.h>
+#include <rtc.h>
+#include <asm/io.h>
+#include <asm/arch/hardware.h>
+#include <asm/arch/spr_defs.h>
+#include <asm/arch/spr_misc.h>
+#include <linux/mtd/fsmc_nand.h>
+#include "fpga.h"
+
+static struct nand_chip nand_chip[CONFIG_SYS_MAX_NAND_DEVICE];
+
+int board_init(void)
+{
+       /*
+        * X600 is equipped with an M41T82 RTC. This RTC has the
+        * HT bit (Halt Update), which needs to be cleared upon
+        * power-up. Otherwise the RTC is halted.
+        */
+       rtc_reset();
+
+       return spear_board_init(MACH_TYPE_SPEAR600);
+}
+
+int board_late_init(void)
+{
+       /*
+        * Monitor and env protection on by default
+        */
+       flash_protect(FLAG_PROTECT_SET,
+                     CONFIG_SYS_FLASH_BASE, CONFIG_SYS_FLASH_BASE +
+                     CONFIG_SYS_SPL_LEN + CONFIG_SYS_MONITOR_LEN +
+                     2 * CONFIG_ENV_SECT_SIZE - 1,
+                     &flash_info[0]);
+
+       /* Init FPGA subsystem */
+       x600_init_fpga();
+
+       return 0;
+}
+
+/*
+ * board_nand_init - Board specific NAND initialization
+ * @nand:      mtd private chip structure
+ *
+ * Called by nand_init_chip to initialize the board specific functions
+ */
+
+void board_nand_init(void)
+{
+       struct misc_regs *const misc_regs_p =
+               (struct misc_regs *)CONFIG_SPEAR_MISCBASE;
+       struct nand_chip *nand = &nand_chip[0];
+
+       if (!(readl(&misc_regs_p->auto_cfg_reg) & MISC_NANDDIS))
+               fsmc_nand_init(nand);
+}
+
+int designware_board_phy_init(struct eth_device *dev, int phy_addr,
+       int (*mii_write)(struct eth_device *, u8, u8, u16),
+       int dw_reset_phy(struct eth_device *))
+{
+       /* Extended PHY control 1, select GMII */
+       mii_write(dev, phy_addr, 23, 0x0020);
+
+       /* Software reset necessary after GMII mode selction */
+       dw_reset_phy(dev);
+
+       /* Enable extended page register access */
+       mii_write(dev, phy_addr, 31, 0x0001);
+
+       /* 17e: Enhanced LED behavior, needs to be written twice */
+       mii_write(dev, phy_addr, 17, 0x09ff);
+       mii_write(dev, phy_addr, 17, 0x09ff);
+
+       /* 16e: Enhanced LED method select */
+       mii_write(dev, phy_addr, 16, 0xe0ea);
+
+       /* Disable extended page register access */
+       mii_write(dev, phy_addr, 31, 0x0000);
+
+       /* Enable clock output pin */
+       mii_write(dev, phy_addr, 18, 0x0049);
+
+       return 0;
+}
+
+int board_eth_init(bd_t *bis)
+{
+       int ret = 0;
+
+       if (designware_initialize(0, CONFIG_SPEAR_ETHBASE, CONFIG_PHY_ADDR,
+                                 PHY_INTERFACE_MODE_GMII) >= 0)
+               ret++;
+
+       return ret;
+}
index f9df74b265268eb8b35f4ccf38a5979f3fae3b1e..5eb35c95940aea1b299e7b94bb94f1239883325b 100644 (file)
@@ -218,6 +218,7 @@ spear600                     arm         arm926ejs   spear600            spear
 spear600_nand                arm         arm926ejs   spear600            spear          spear       spear6xx_evb:spear600,nand
 spear600_usbtty              arm         arm926ejs   spear600            spear          spear       spear6xx_evb:spear600,usbtty
 spear600_usbtty_nand         arm         arm926ejs   spear600            spear          spear       spear6xx_evb:spear600,usbtty,nand
+x600                        arm         arm926ejs   -                   spear          spear       x600
 versatileab                  arm         arm926ejs   versatile           armltd         versatile   versatile:ARCH_VERSATILE_AB
 versatilepb                  arm         arm926ejs   versatile           armltd         versatile   versatile:ARCH_VERSATILE_PB
 versatileqemu                arm         arm926ejs   versatile           armltd         versatile   versatile:ARCH_VERSATILE_QEMU,ARCH_VERSATILE_PB
diff --git a/include/configs/x600.h b/include/configs/x600.h
new file mode 100644 (file)
index 0000000..3082aaa
--- /dev/null
@@ -0,0 +1,339 @@
+/*
+ * (C) Copyright 2009
+ * Vipin Kumar, STMicroelectronics, <vipin.kumar@st.com>
+ *
+ * Copyright (C) 2012 Stefan Roese <sr@denx.de>
+ *
+ * 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
+ */
+
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+/*
+ * High Level Configuration Options
+ * (easy to change)
+ */
+#define CONFIG_SPEAR600                                /* SPEAr600 SoC */
+#define CONFIG_X600                            /* on X600 board */
+
+#include <asm/arch/hardware.h>
+
+/* Timer, HZ specific defines */
+#define CONFIG_SYS_HZ                          1000
+#define CONFIG_SYS_HZ_CLOCK                    8300000
+
+#define        CONFIG_SYS_TEXT_BASE                    0x00800040
+#define CONFIG_SYS_FLASH_BASE                  0xf8000000
+/* Reserve 8KiB for SPL */
+#define CONFIG_SPL_PAD_TO                      8192    /* decimal for 'dd' */
+#define CONFIG_SYS_SPL_LEN                     CONFIG_SPL_PAD_TO
+#define CONFIG_SYS_UBOOT_BASE                  (CONFIG_SYS_FLASH_BASE + \
+                                                CONFIG_SYS_SPL_LEN)
+#define CONFIG_SYS_MONITOR_BASE                        CONFIG_SYS_FLASH_BASE
+#define CONFIG_SYS_MONITOR_LEN                 0x60000
+
+#define CONFIG_ENV_IS_IN_FLASH
+
+/* Serial Configuration (PL011) */
+#define CONFIG_SYS_SERIAL0                     0xD0000000
+#define CONFIG_SYS_SERIAL1                     0xD0080000
+#define CONFIG_PL01x_PORTS                     { (void *)CONFIG_SYS_SERIAL0, \
+                                               (void *)CONFIG_SYS_SERIAL1 }
+#define CONFIG_PL011_SERIAL
+#define CONFIG_PL011_CLOCK                     (48 * 1000 * 1000)
+#define CONFIG_CONS_INDEX                      0
+#define CONFIG_BAUDRATE                                115200
+#define CONFIG_SYS_BAUDRATE_TABLE              { 9600, 19200, 38400, \
+                                                 57600, 115200 }
+#define CONFIG_SYS_LOADS_BAUD_CHANGE
+
+/* NOR FLASH config options */
+#define CONFIG_ST_SMI
+#define CONFIG_SYS_MAX_FLASH_BANKS             1
+#define CONFIG_SYS_FLASH_BANK_SIZE             0x01000000
+#define CONFIG_SYS_FLASH_ADDR_BASE             { CONFIG_SYS_FLASH_BASE }
+#define CONFIG_SYS_MAX_FLASH_SECT              128
+#define CONFIG_SYS_FLASH_EMPTY_INFO
+#define CONFIG_SYS_FLASH_ERASE_TOUT            (3 * CONFIG_SYS_HZ)
+#define CONFIG_SYS_FLASH_WRITE_TOUT            (3 * CONFIG_SYS_HZ)
+
+/* NAND FLASH config options */
+#define CONFIG_NAND_FSMC
+#define CONFIG_SYS_NAND_SELF_INIT
+#define CONFIG_SYS_MAX_NAND_DEVICE             1
+#define CONFIG_SYS_NAND_BASE                   CONFIG_FSMC_NAND_BASE
+#define CONFIG_MTD_ECC_SOFT
+#define CONFIG_SYS_FSMC_NAND_8BIT
+#define CONFIG_SYS_NAND_ONFI_DETECTION
+
+/* UBI/UBI config options */
+#define CONFIG_MTD_DEVICE
+#define CONFIG_MTD_PARTITIONS
+#define CONFIG_RBTREE
+
+/* Ethernet config options */
+#define CONFIG_MII
+#define CONFIG_DESIGNWARE_ETH
+#define CONFIG_DW_SEARCH_PHY
+#define CONFIG_NET_MULTI
+#define CONFIG_PHY_RESET_DELAY                 10000           /* in usec */
+#define CONFIG_DW_AUTONEG
+#define CONFIG_PHY_ADDR                0       /* PHY address */
+#define CONFIG_PHY_GIGE                        /* Include GbE speed/duplex detection */
+
+#define CONFIG_SPEAR_GPIO
+
+/* I2C config options */
+#define CONFIG_HARD_I2C
+#define CONFIG_DW_I2C
+#define CONFIG_SYS_I2C_SPEED                   400000
+#define CONFIG_SYS_I2C_SLAVE                   0x02
+#define CONFIG_I2C_CHIPADDRESS                 0x50
+
+#define CONFIG_RTC_M41T62      1
+#define CONFIG_SYS_I2C_RTC_ADDR        0x68
+
+/* FPGA config options */
+#define CONFIG_FPGA
+#define CONFIG_FPGA_XILINX
+#define CONFIG_FPGA_SPARTAN3
+#define CONFIG_FPGA_COUNT      1
+
+/*
+ * Command support defines
+ */
+#define CONFIG_CMD_CACHE
+#define CONFIG_CMD_DATE
+#define CONFIG_CMD_DHCP
+#define CONFIG_CMD_ENV
+#define CONFIG_CMD_FPGA
+#define CONFIG_CMD_GPIO
+#define CONFIG_CMD_I2C
+#define CONFIG_CMD_MEMORY
+#define CONFIG_CMD_MII
+#define CONFIG_CMD_MTDPARTS
+#define CONFIG_CMD_NAND
+#define CONFIG_CMD_NET
+#define CONFIG_CMD_PING
+#define CONFIG_CMD_RUN
+#define CONFIG_CMD_SAVES
+#define CONFIG_CMD_UBI
+#define CONFIG_CMD_UBIFS
+#define CONFIG_LZO
+
+/* This must be included AFTER the definition of CONFIG_COMMANDS (if any) */
+#include <config_cmd_default.h>
+
+#define CONFIG_BOOTDELAY                       3
+
+#define CONFIG_SYS_HUSH_PARSER                 /* Use the HUSH parser  */
+#define        CONFIG_SYS_PROMPT_HUSH_PS2      "> "
+
+/*
+ * U-Boot Environment placing definitions.
+ */
+#define CONFIG_ENV_SECT_SIZE                   0x00010000
+#define CONFIG_ENV_ADDR                                (CONFIG_SYS_MONITOR_BASE + \
+                                                CONFIG_SYS_MONITOR_LEN)
+#define CONFIG_ENV_SIZE                                0x02000
+#define CONFIG_ENV_ADDR_REDUND                 (CONFIG_ENV_ADDR + \
+                                                CONFIG_ENV_SECT_SIZE)
+#define CONFIG_ENV_SIZE_REDUND                 (CONFIG_ENV_SIZE)
+
+/* Miscellaneous configurable options */
+#define CONFIG_ARCH_CPU_INIT
+#define CONFIG_DISPLAY_CPUINFO
+#define CONFIG_BOOT_PARAMS_ADDR                        0x00000100
+#define CONFIG_CMDLINE_TAG
+#define CONFIG_OF_LIBFDT               /* enable passing of devicetree */
+#define CONFIG_SETUP_MEMORY_TAGS
+#define CONFIG_MISC_INIT_R
+#define CONFIG_BOARD_LATE_INIT
+#define CONFIG_LOOPW                   /* enable loopw command         */
+#define CONFIG_MX_CYCLIC               /* enable mdc/mwc commands      */
+#define CONFIG_ZERO_BOOTDELAY_CHECK
+#define CONFIG_AUTOBOOT_KEYED
+#define CONFIG_AUTOBOOT_STOP_STR               " "
+#define CONFIG_AUTOBOOT_PROMPT                 \
+               "Hit SPACE in %d seconds to stop autoboot.\n", bootdelay
+
+#define CONFIG_SYS_MEMTEST_START               0x00800000
+#define CONFIG_SYS_MEMTEST_END                 0x04000000
+#define CONFIG_SYS_MALLOC_LEN                  (1024 * 1024)
+#define CONFIG_IDENT_STRING                    "-SPEAr"
+#define CONFIG_SYS_LONGHELP
+#define CONFIG_SYS_PROMPT                      "X600> "
+#define CONFIG_CMDLINE_EDITING
+#define CONFIG_SYS_CBSIZE                      256
+#define CONFIG_SYS_PBSIZE                      (CONFIG_SYS_CBSIZE + \
+                                                sizeof(CONFIG_SYS_PROMPT) + 16)
+#define CONFIG_SYS_MAXARGS                     16
+#define CONFIG_SYS_BARGSIZE                    CONFIG_SYS_CBSIZE
+#define CONFIG_SYS_LOAD_ADDR                   0x00800000
+#define CONFIG_SYS_CONSOLE_INFO_QUIET
+#define CONFIG_SYS_64BIT_VSPRINTF
+
+/* Use last 2 lwords in internal SRAM for bootcounter */
+#define CONFIG_BOOTCOUNT_LIMIT
+#define CONFIG_SYS_BOOTCOUNT_ADDR      0xd2801ff8
+
+#define CONFIG_HOSTNAME                                x600
+#define CONFIG_UBI_PART                                ubi0
+#define CONFIG_UBIFS_VOLUME                    rootfs
+
+#define xstr(s)        str(s)
+#define str(s) #s
+
+#define MTDIDS_DEFAULT         "nand0=nand"
+#define MTDPARTS_DEFAULT       "mtdparts=nand:64M(ubi0),64M(ubi1)"
+
+#define        CONFIG_EXTRA_ENV_SETTINGS                                       \
+       "u-boot_addr=1000000\0"                                         \
+       "u-boot=" xstr(CONFIG_HOSTNAME) "/u-boot.spr\0"                 \
+       "load=tftp ${u-boot_addr} ${u-boot}\0"                          \
+       "update=protect off " xstr(CONFIG_SYS_MONITOR_BASE) " +${filesize};"\
+               "erase " xstr(CONFIG_SYS_MONITOR_BASE) " +${filesize};" \
+               "cp.b ${u-boot_addr} " xstr(CONFIG_SYS_MONITOR_BASE)    \
+               " ${filesize};"                                         \
+               "protect on " xstr(CONFIG_SYS_MONITOR_BASE)             \
+               " +${filesize}\0"                                       \
+       "upd=run load update\0"                                         \
+       "ubifs=" xstr(CONFIG_HOSTNAME) "/ubifs.img\0"                   \
+       "part=" xstr(CONFIG_UBI_PART) "\0"                              \
+       "vol=" xstr(CONFIG_UBIFS_VOLUME) "\0"                           \
+       "load_ubifs=tftp ${kernel_addr} ${ubifs}\0"                     \
+       "update_ubifs=ubi part ${part};ubi write ${kernel_addr} ${vol}" \
+               " ${filesize}\0"                                        \
+       "upd_ubifs=run load_ubifs update_ubifs\0"                       \
+       "init_ubifs=nand erase.part ubi0;ubi part ${part};"             \
+               "ubi create ${vol} 4000000\0"                           \
+       "netdev=eth0\0"                                                 \
+       "rootpath=/opt/eldk-4.2/arm\0"                                  \
+       "nfsargs=setenv bootargs root=/dev/nfs rw "                     \
+               "nfsroot=${serverip}:${rootpath}\0"                     \
+       "ramargs=setenv bootargs root=/dev/ram rw\0"                    \
+       "boot_part=0\0"                                                 \
+       "altbootcmd=if test $boot_part -eq 0;then "                     \
+                       "echo Switching to partition 1!;"               \
+                       "setenv boot_part 1;"                           \
+               "else; "                                                \
+                       "echo Switching to partition 0!;"               \
+                       "setenv boot_part 0;"                           \
+               "fi;"                                                   \
+               "saveenv;boot\0"                                        \
+       "ubifsargs=set bootargs ubi.mtd=ubi${boot_part} "               \
+               "root=ubi0:rootfs rootfstype=ubifs\0"                   \
+       "kernel=" xstr(CONFIG_HOSTNAME) "/uImage\0"                     \
+       "kernel_fs=/boot/uImage \0"                                     \
+       "kernel_addr=1000000\0"                                         \
+       "dtb=" xstr(CONFIG_HOSTNAME) "/" xstr(CONFIG_HOSTNAME) ".dtb\0" \
+       "dtb_fs=/boot/" xstr(CONFIG_HOSTNAME) ".dtb\0"                  \
+       "dtb_addr=1800000\0"                                            \
+       "load_kernel=tftp ${kernel_addr} ${kernel}\0"                   \
+       "load_dtb=tftp ${dtb_addr} ${dtb}\0"                            \
+       "addip=setenv bootargs ${bootargs} "                            \
+               "ip=${ipaddr}:${serverip}:${gatewayip}:${netmask}"      \
+               ":${hostname}:${netdev}:off panic=1\0"                  \
+       "addcon=setenv bootargs ${bootargs} console=ttyAMA0,"           \
+               "${baudrate}\0"                                         \
+       "addmtd=setenv bootargs ${bootargs} ${mtdparts}\0"              \
+       "net_nfs=run load_dtb load_kernel; "                            \
+               "run nfsargs addip addcon addmtd addmisc;"              \
+               "bootm ${kernel_addr} - ${dtb_addr}\0"                  \
+       "mtdids=" MTDIDS_DEFAULT "\0"                                   \
+       "mtdparts=" MTDPARTS_DEFAULT "\0"                               \
+       "nand_ubifs=run ubifs_mount ubifs_load ubifsargs addip"         \
+               " addcon addmisc addmtd;"                               \
+               "bootm ${kernel_addr} - ${dtb_addr}\0"                  \
+       "ubifs_mount=ubi part ubi${boot_part};ubifsmount rootfs\0"      \
+       "ubifs_load=ubifsload ${kernel_addr} ${kernel_fs};"             \
+               "ubifsload ${dtb_addr} ${dtb_fs};\0"                    \
+       "nand_ubifs=run ubifs_mount ubifs_load ubifsargs addip addcon " \
+               "addmtd addmisc;bootm ${kernel_addr} - ${dtb_addr}\0"   \
+       "bootcmd=run nand_ubifs\0"                                      \
+       "\0"
+
+/* Stack sizes */
+#define CONFIG_STACKSIZE                       (512 * 1024)
+
+/* Physical Memory Map */
+#define CONFIG_NR_DRAM_BANKS                   1
+#define PHYS_SDRAM_1                           0x00000000
+#define PHYS_SDRAM_1_MAXSIZE                   0x40000000
+
+#define CONFIG_SYS_SDRAM_BASE                  PHYS_SDRAM_1
+#define CONFIG_SYS_INIT_RAM_ADDR               0xD2800000
+#define CONFIG_SYS_INIT_RAM_SIZE               0x2000
+
+#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)
+
+/*
+ * SPL related defines
+ */
+#define CONFIG_SPL
+#define CONFIG_SPL_TEXT_BASE   0xd2800b00
+#define        CONFIG_SPL_START_S_PATH "arch/arm/cpu/arm926ejs/spear"
+#define CONFIG_SPL_LDSCRIPT    "arch/arm/cpu/arm926ejs/spear/u-boot-spl.lds"
+
+#define CONFIG_SPL_SERIAL_SUPPORT
+#define CONFIG_SPL_LIBCOMMON_SUPPORT   /* image.c */
+#define CONFIG_SPL_LIBGENERIC_SUPPORT  /* string.c */
+#define CONFIG_SPL_NO_PRINTF
+
+/*
+ * Please select/define only one of the following
+ * Each definition corresponds to a supported DDR chip.
+ * DDR configuration is based on the following selection
+ */
+#define CONFIG_DDR_MT47H64M16          1
+#define CONFIG_DDR_MT47H32M16          0
+#define CONFIG_DDR_MT47H128M8          0
+
+/*
+ * Synchronous/Asynchronous operation of DDR
+ *
+ * Select CONFIG_DDR_2HCLK for DDR clk = 333MHz, synchronous operation
+ * Select CONFIG_DDR_HCLK for DDR clk = 166MHz, synchronous operation
+ * Select CONFIG_DDR_PLL2 for DDR clk = PLL2, asynchronous operation
+ */
+#define CONFIG_DDR_2HCLK               1
+#define CONFIG_DDR_HCLK                        0
+#define CONFIG_DDR_PLL2                        0
+
+/*
+ * xxx_BOOT_SUPPORTED macro defines whether a booting type is supported
+ * or not. Modify/Add to only these macros to define new boot types
+ */
+#define USB_BOOT_SUPPORTED             0
+#define PCIE_BOOT_SUPPORTED            0
+#define SNOR_BOOT_SUPPORTED            1
+#define NAND_BOOT_SUPPORTED            1
+#define PNOR_BOOT_SUPPORTED            0
+#define TFTP_BOOT_SUPPORTED            0
+#define UART_BOOT_SUPPORTED            0
+#define SPI_BOOT_SUPPORTED             0
+#define I2C_BOOT_SUPPORTED             0
+#define MMC_BOOT_SUPPORTED             0
+
+#endif  /* __CONFIG_H */