All of lore.kernel.org
 help / color / mirror / Atom feed
* [RFC PATCH uboot] ARM: AST2500: add support
@ 2016-06-04 20:55 Cédric Le Goater
  0 siblings, 0 replies; only message in thread
From: Cédric Le Goater @ 2016-06-04 20:55 UTC (permalink / raw)
  To: openbmc

This is a port of u-boot from ast_sdk.v00.03.21 on version
v2016.05. Only the ast2500 (g5) support was extracted from the sdk.

To test :

   https://github.com/legoater/u-boot/tree/v2016.05-ast2500

To configure, just use target ast_g5_defconfig :

   make ARCH=arm CROSS_COMPILE=arm-none-eabi- ast_g5_defconfig

This is work in progress, it should boot your kernel but it could
brick your AST. So only use if you have a SPI programmer close by.

Cheers,

C.


Signed-off-by: Cédric Le Goater <clg@kaod.org>
---
 arch/arm/Kconfig                                   |    4 +
 arch/arm/Makefile                                  |    1 +
 arch/arm/cpu/arm1176/Makefile                      |    2 +
 arch/arm/cpu/arm1176/aspeed/Makefile               |   13 +
 arch/arm/cpu/arm1176/aspeed/cpu.c                  |   20 +
 arch/arm/cpu/arm1176/start.S                       |    7 +
 arch/arm/include/asm/arch-aspeed/aspeed.h          |   43 +
 arch/arm/include/asm/arch-aspeed/ast-ahbc.h        |   32 +
 arch/arm/include/asm/arch-aspeed/ast-sdmc.h        |   29 +
 arch/arm/include/asm/arch-aspeed/ast_g5_platform.h |  191 ++
 arch/arm/include/asm/arch-aspeed/ast_scu.h         |  116 ++
 arch/arm/include/asm/arch-aspeed/platform.h        |   54 +
 arch/arm/include/asm/arch-aspeed/regs-ahbc.h       |   41 +
 arch/arm/include/asm/arch-aspeed/regs-scu.h        | 1049 +++++++++++
 arch/arm/include/asm/arch-aspeed/regs-sdmc.h       |   38 +
 arch/arm/include/asm/arch-aspeed/regs-spi.h        |   55 +
 arch/arm/include/asm/mach-types.h                  |   13 +
 arch/arm/mach-aspeed/Makefile                      |   15 +
 arch/arm/mach-aspeed/ast-ahbc.c                    |   95 +
 arch/arm/mach-aspeed/ast-scu.c                     | 1900 +++++++++++++++++++
 arch/arm/mach-aspeed/ast-sdmc.c                    |  152 ++
 arch/arm/mach-aspeed/cpuinfo.c                     |   49 +
 arch/arm/mach-aspeed/flash.c                       | 1403 ++++++++++++++
 arch/arm/mach-aspeed/reset.c                       |   18 +
 arch/arm/mach-aspeed/timer.c                       |  147 ++
 board/aspeed/ast-g5/Kconfig                        |   18 +
 board/aspeed/ast-g5/Makefile                       |   30 +
 board/aspeed/ast-g5/ast-g5.c                       |   86 +
 board/aspeed/ast-g5/platform.S                     | 1985 ++++++++++++++++++++
 board/aspeed/ast-g5/platform_armsim2.S             |  451 +++++
 board/aspeed/ast-g5/platform_fpga.S                |  822 ++++++++
 board/aspeed/ast-g5/platform_fpga_ecc.S            |  843 +++++++++
 common/exports.c                                   |    6 +
 common/image.c                                     |   11 +
 configs/ast_g5_defconfig                           |    9 +
 drivers/net/ftgmac100.c                            |  502 +++--
 drivers/net/ftgmac100.h                            |   77 +-
 include/_exports.h                                 |    3 +
 include/configs/ast-g5.h                           |  245 +++
 include/flash.h                                    |   21 +
 include/spi.h                                      |    2 +
 41 files changed, 10467 insertions(+), 131 deletions(-)
 create mode 100644 arch/arm/cpu/arm1176/aspeed/Makefile
 create mode 100644 arch/arm/cpu/arm1176/aspeed/cpu.c
 create mode 100644 arch/arm/include/asm/arch-aspeed/aspeed.h
 create mode 100644 arch/arm/include/asm/arch-aspeed/ast-ahbc.h
 create mode 100644 arch/arm/include/asm/arch-aspeed/ast-sdmc.h
 create mode 100644 arch/arm/include/asm/arch-aspeed/ast_g5_platform.h
 create mode 100644 arch/arm/include/asm/arch-aspeed/ast_scu.h
 create mode 100644 arch/arm/include/asm/arch-aspeed/platform.h
 create mode 100644 arch/arm/include/asm/arch-aspeed/regs-ahbc.h
 create mode 100644 arch/arm/include/asm/arch-aspeed/regs-scu.h
 create mode 100644 arch/arm/include/asm/arch-aspeed/regs-sdmc.h
 create mode 100644 arch/arm/include/asm/arch-aspeed/regs-spi.h
 create mode 100644 arch/arm/mach-aspeed/Makefile
 create mode 100644 arch/arm/mach-aspeed/ast-ahbc.c
 create mode 100644 arch/arm/mach-aspeed/ast-scu.c
 create mode 100644 arch/arm/mach-aspeed/ast-sdmc.c
 create mode 100644 arch/arm/mach-aspeed/cpuinfo.c
 create mode 100644 arch/arm/mach-aspeed/flash.c
 create mode 100644 arch/arm/mach-aspeed/reset.c
 create mode 100644 arch/arm/mach-aspeed/timer.c
 create mode 100644 board/aspeed/ast-g5/Kconfig
 create mode 100644 board/aspeed/ast-g5/Makefile
 create mode 100644 board/aspeed/ast-g5/ast-g5.c
 create mode 100644 board/aspeed/ast-g5/platform.S
 create mode 100644 board/aspeed/ast-g5/platform_armsim2.S
 create mode 100644 board/aspeed/ast-g5/platform_fpga.S
 create mode 100644 board/aspeed/ast-g5/platform_fpga_ecc.S
 create mode 100644 configs/ast_g5_defconfig
 create mode 100644 include/configs/ast-g5.h

diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index 6b65d8e76a46..d02d6034c8d5 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -745,6 +745,9 @@ config TARGET_THUNDERX_88XX
 	bool "Support ThunderX 88xx"
 	select OF_CONTROL
 
+config TARGET_AST_G5
+       bool "Support ast2500"
+       select CPU_ARM1176
 endchoice
 
 source "arch/arm/mach-at91/Kconfig"
@@ -882,6 +885,7 @@ source "board/vscom/baltos/Kconfig"
 source "board/woodburn/Kconfig"
 source "board/work-microwave/work_92105/Kconfig"
 source "board/zipitz2/Kconfig"
+source "board/aspeed/ast-g5/Kconfig"
 
 source "arch/arm/Kconfig.debug"
 
diff --git a/arch/arm/Makefile b/arch/arm/Makefile
index d51634584bf4..ac328abea5e7 100644
--- a/arch/arm/Makefile
+++ b/arch/arm/Makefile
@@ -42,6 +42,7 @@ PLATFORM_CPPFLAGS += $(arch-y) $(tune-y)
 
 # Machine directory name.  This list is sorted alphanumerically
 # by CONFIG_* macro name.
+machine-$(CONFIG_ARCH_ASPEED)		+= aspeed
 machine-$(CONFIG_ARCH_AT91)		+= at91
 machine-$(CONFIG_ARCH_BCM283X)		+= bcm283x
 machine-$(CONFIG_ARCH_DAVINCI)		+= davinci
diff --git a/arch/arm/cpu/arm1176/Makefile b/arch/arm/cpu/arm1176/Makefile
index cd6dc9c1304d..dcc9dcd141fe 100644
--- a/arch/arm/cpu/arm1176/Makefile
+++ b/arch/arm/cpu/arm1176/Makefile
@@ -12,3 +12,5 @@ obj- += dummy.o
 extra-y	= start.o
 
 obj-y += ../arm11/
+
+obj-$(if $(filter aspeed,$(SOC)),y) += aspeed/
diff --git a/arch/arm/cpu/arm1176/aspeed/Makefile b/arch/arm/cpu/arm1176/aspeed/Makefile
new file mode 100644
index 000000000000..6758fe8d3a50
--- /dev/null
+++ b/arch/arm/cpu/arm1176/aspeed/Makefile
@@ -0,0 +1,13 @@
+#
+# 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
+#
+
+obj-y	+= cpu.o
diff --git a/arch/arm/cpu/arm1176/aspeed/cpu.c b/arch/arm/cpu/arm1176/aspeed/cpu.c
new file mode 100644
index 000000000000..f9b608a67d08
--- /dev/null
+++ b/arch/arm/cpu/arm1176/aspeed/cpu.c
@@ -0,0 +1,20 @@
+/*
+ * 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 <asm/io.h>
+
+int arch_cpu_init(void)
+{
+
+	return 0;
+}
diff --git a/arch/arm/cpu/arm1176/start.S b/arch/arm/cpu/arm1176/start.S
index a602d4e69374..c86e561223bb 100644
--- a/arch/arm/cpu/arm1176/start.S
+++ b/arch/arm/cpu/arm1176/start.S
@@ -35,6 +35,13 @@
  */
 
 	.globl reset
+#ifdef CONFIG_AST_SCURE_BOOT
+_ast_security_boot:
+	.word CONFIG_DSS_KEY_ADDR
+	.word CONFIG_SIMAGE_ADDR
+	.word CONFIG_SIMAGE_SIZE
+	.word CONFIG_SIGNATURE_ADDR
+#endif
 
 reset:
 	/*
diff --git a/arch/arm/include/asm/arch-aspeed/aspeed.h b/arch/arm/include/asm/arch-aspeed/aspeed.h
new file mode 100644
index 000000000000..556c280af261
--- /dev/null
+++ b/arch/arm/include/asm/arch-aspeed/aspeed.h
@@ -0,0 +1,43 @@
+/*
+ *  arch/arm/plat-aspeed/include/plat/aspeed.h
+ *
+ *  Copyright (C) 2012-2020  ASPEED Technology Inc.
+ *
+ * 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
+ */
+#if defined(CONFIG_ARCH_AST3200) || defined(CONFIG_ARCH_AST2500) || defined(CONFIG_ARCH_AST1520)
+#define AST_SOC_G5
+#define NEW_VIC
+#define SRAM_SIZE 		SZ_32K
+#elif defined(CONFIG_ARCH_AST1400) || defined(CONFIG_ARCH_AST2400) || defined(CONFIG_ARCH_AST3100)
+#define AST_SOC_G4
+#define NEW_VIC
+#define SRAM_SIZE 		SZ_32K
+#elif defined(CONFIG_ARCH_AST1300) || defined(CONFIG_ARCH_AST2300) || defined(CONFIG_ARCH_AST1510)
+#define AST_SOC_G3
+#define NEW_VIC
+#define SRAM_SIZE 		SZ_16K
+#elif defined(CONFIG_ARCH_AST2150) || defined(CONFIG_ARCH_AST2200)
+#define AST_SOC_G2_5
+#elif defined(CONFIG_ARCH_AST1100) || defined(CONFIG_ARCH_AST2050) || defined(CONFIG_ARCH_AST2100)
+#define AST_SOC_G2
+#elif defined(CONFIG_ARCH_AST2000) || defined(CONFIG_ARCH_AST1000)
+#define AST_SOC_G1
+#elif defined(CONFIG_ARCH_AST1010)
+#define NEW_VIC
+#define SRAM_SIZE 		SZ_64K
+#else
+#error "Not define SoC generation"
+#endif
diff --git a/arch/arm/include/asm/arch-aspeed/ast-ahbc.h b/arch/arm/include/asm/arch-aspeed/ast-ahbc.h
new file mode 100644
index 000000000000..c00d8589d20e
--- /dev/null
+++ b/arch/arm/include/asm/arch-aspeed/ast-ahbc.h
@@ -0,0 +1,32 @@
+/********************************************************************************
+* File Name     : arch/arm/mach-aspeed/include/plat/ast-ahbc.h
+* Author        : Ryan Chen
+* Description   : AST SCU Service Header
+*
+* Copyright (C) 2012-2020  ASPEED Technology Inc.
+* 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
+
+*   History      :
+*      1. 2014/08/03 Ryan Chen create this file
+*
+********************************************************************************/
+
+#ifndef __AST_AHBC_H_INCLUDED
+#define __AST_AHBC_H_INCLUDED
+
+extern void ast_ahbc_boot_remap(void);
+
+#ifdef AST_SOC_G5
+extern void ast_ahbc_lpc_plus_mapping(u8 enable);
+extern void ast_ahbc_peie_mapping(u8 enable);
+#endif
+
+#endif
diff --git a/arch/arm/include/asm/arch-aspeed/ast-sdmc.h b/arch/arm/include/asm/arch-aspeed/ast-sdmc.h
new file mode 100644
index 000000000000..73cacb52cc13
--- /dev/null
+++ b/arch/arm/include/asm/arch-aspeed/ast-sdmc.h
@@ -0,0 +1,29 @@
+/********************************************************************************
+* File Name     : arch/arm/mach-aspeed/include/plat/ast-sdmc.h
+* Author        : Ryan Chen
+* Description   : AST SDMC Header
+*
+* Copyright (C) 2012-2020  ASPEED Technology Inc.
+* 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
+
+*   History      :
+*      1. 2012/08/03 Ryan Chen create this file
+*
+********************************************************************************/
+
+#ifndef __AST_SDMC_H_INCLUDED
+#define __AST_SDMC_H_INCLUDED
+
+extern u32 ast_sdmc_get_mem_size(void);
+extern u8 ast_sdmc_get_eec(void);
+extern u8 ast_sdmc_get_cache(void);
+
+#endif
diff --git a/arch/arm/include/asm/arch-aspeed/ast_g5_platform.h b/arch/arm/include/asm/arch-aspeed/ast_g5_platform.h
new file mode 100644
index 000000000000..6284ec8db0e2
--- /dev/null
+++ b/arch/arm/include/asm/arch-aspeed/ast_g5_platform.h
@@ -0,0 +1,191 @@
+/*
+ * 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 _AST_G5_PLATFORM_H_
+#define _AST_G5_PLATFORM_H_                 1
+
+#ifdef CONFIG_AST_PCIE_EXT
+/*
+#define AST_PCI_EXT_ADC					(AST_PCIE_WIN_BASE + 0x2000)
+#define AST_PCI_EXT_PWM					(AST_PCIE_WIN_BASE + 0x3000)
+#define AST_PCI_EXT_GPIO					(AST_PCIE_WIN_BASE + 0x4000)
+*/
+#define AST_PCI_EXT_I2C					(AST_PCIE_WIN_BASE + 0x5000)
+#define AST_PCI_EXT_SCU					(AST_PCIE_WIN_BASE + 0x6000)
+#define AST_PCI_EXT_VIC					(AST_PCIE_WIN_BASE + 0x7000)
+
+#define AST_PCI_EXT_GPIO					(AST_PCIE_WIN_BASE + 0x10000)
+#define AST_PCI_EXT_UART1				(AST_PCIE_WIN_BASE + 0x13000)
+#define AST_PCI_EXT_UART0				(AST_PCIE_WIN_BASE + 0x14000)
+#define AST_PCI_EXT_UART2				(AST_PCIE_WIN_BASE + 0x1D000)
+#define AST_PCI_EXT_UART3				(AST_PCIE_WIN_BASE + 0x1E000)
+#define AST_PCI_EXT_UART4				(AST_PCIE_WIN_BASE + 0x1F000)
+
+#endif
+
+#define AST_DRAM_BASE					0x80000000
+
+#define AST_SRAM_SIZE					(SZ_32K)
+
+#define AST_AHBC_BASE					0x1E600000	/* AHB CONTROLLER */
+
+#define AST_FMC_BASE        				0x1E620000	/* NEW SMC CONTROLLER */
+#define AST_FMC_SPI0_BASE				0x1E630000	/* NEW SMC CONTROLLER */
+#define AST_FMC_SPI1_BASE				0x1E631000	/* NEW SMC CONTROLLER */
+
+#define AST_MIC_BASE						0x1E650000	/* Memory Integrity Check Controller */
+#define AST_MAC0_BASE					0x1E660000	/* MAC1 */
+#define AST_MAC1_BASE					0x1E680000	/* MAC2 */
+
+#define AST_VHUB_BASE					0x1E6A0000	/* USB 2.0 VIRTUAL HUB CONTROLLER */
+#define AST_EHCI0_BASE					0x1E6A1000	/* USB 2.0 HOST CONTROLLER */
+#define AST_UDC1_BASE					0x1E6A2000	/* USB 2.0 Device CONTROLLER */
+#define AST_EHCI1_BASE					0x1E6A3000	/* USB 2.0 HOST CONTROLLER */
+#define AST_UHCI_BASE					0x1E6B0000	/* USB 1.1 HOST CONTROLLER */
+#define AST_VIC_BASE						0x1E6C0000	/* VIC */
+#define AST_SDMC_BASE					0x1E6E0000	/* MMC SDRAM*/
+#define AST_HID_BASE						0x1E6E1000	/* USB 1.1 Controller */
+#define AST_SCU_BASE						0x1E6E2000	/* SCU */
+#define AST_CRYPTO_BASE					0x1E6E3000	/* Crypto */
+#define AST_JTAG_BASE					0x1E6E4000	/* JTAG */
+#define AST_I2S_BASE						0x1E6E5000	/* I2S */
+#define AST_CRT0_BASE					0x1E6E6000	/* CRT0 */
+#define AST_CRT1_BASE					0x1E6E6100	/* CRT1 */
+#define AST_CRT2_BASE					0x1E6E6200	/* CRT2 */
+#define AST_CRT3_BASE					0x1E6E6300	/* CRT3 */
+#define AST_XDMA_BASE					0x1E6E7000	/* XDMA */
+#define AST_MCTP_BASE					0x1E6E8000	/* MCTP */
+#define AST_ADC_BASE					0x1E6E9000	/* ADC */
+#define AST_ENTROPY_BASE				0x1E6EB000	/* Entropy  */
+#define AST_BULK_BASE					0x1E6EB100	/* Bulk Decoder	*/
+#define AST_CMDQ_BASE					0x1E6EB180	/* CMDQ */
+#define AST_BITBLT_BASE					0x1E6EB200	/* Bitblt	*/
+#define AST_RLE_BASE					0x1E6EB300	/* RLE	*/
+#define AST_EGFX_BASE					0x1E6EB400	/* EGFX	*/
+#define AST_VMASK_BASE					0x1E6EB600	/* VMASK	*/
+#define AST_GMASK_BASE					0x1E6EB680	/* GMASK	*/
+
+#define AST_EGFX_SYS_BASE				0x1E6EB700	/* EGFXSYS*/
+
+#define AST_LPC_PLUS_BASE				0x1E6EC000	/* LPC+ */
+#define AST_PCIE_PLDA_BASE				0x1E6ED000	/* PCIE PLDA Bridge */
+#define AST_ESPI_BASE						0x1E6EE000	/* e-SPI  */
+#define AST_BSRAM_BASE					0x1E6EF000	/* Battery Backup SRAM  */
+#define AST_P2X_BASE                      		0x1E6F0000	/* P2X */
+
+/* */
+
+#define AST_VIDEO_BASE              			0x1E700000	/* VIDEO ENGINE */
+#define AST_SRAM_BASE               			0x1E720000	/* SRAM */
+#define AST_SDHC_BASE					0x1E740000	/* SD */
+#define AST_2D_BASE						0x1E760000	/* 2D */
+#define AST_GPIO_BASE					0x1E780000	/* GPIO */
+#define AST_SGPIO_BASE					0x1E780200	/* SGPIO */
+#define AST_SGPIO_S_BASE				0x1E780300	/* SGPIO Slave*/
+#define AST_RTC_BASE						0x1E781000	/* RTC */
+#define AST_TIMER_BASE              			0x1E782000	/* TIMER #0~2*/
+#define AST_UART1_BASE              			0x1E783000	/* UART1 */
+#define AST_UART0_BASE              			0x1E784000	/* UART5 */
+#define AST_WDT_BASE                			0x1E785000	/* WDT */
+#define AST_PWM_BASE					0x1E786000	/* PWM */
+#define AST_VUART0_BASE					0x1E787000	/* VUART1 */
+#define AST_PUART_BASE					0x1E788000	/* PUART */
+#define AST_LPC_BASE						0x1E789000	/* LPC */
+#define AST_MBX_BASE					0x1E789200	/* Mailbox */
+#define AST_I2C_BASE						0x1E78A000	/* I2C */
+#define AST_PECI_BASE						0x1E78B000	/* PECI */
+#define AST_PCIARBITER_BASE			0x1E78C000	/* PCI ARBITER */
+#define AST_UART2_BASE					0x1E78D000	/* UART2 */
+#define AST_UART3_BASE					0x1E78E000	/* UART3 */
+#define AST_UART4_BASE					0x1E78F000	/* UART4 */
+#define AST_UART5_BASE					0x1E790000	/* UART6 */
+#define AST_UART6_BASE					0x1E791000	/* UART7 */
+#define AST_UART7_BASE					0x1E792000	/* UART8 */
+#define AST_UART8_BASE					0x1E793000	/* UART9 */
+#define AST_UART9_BASE					0x1E794000	/* UART10 */
+#define AST_UART10_BASE					0x1E795000	/* UART11 */
+#define AST_UART11_BASE					0x1E796000	/* UART12 */
+#define AST_UART12_BASE					0x1E797000	/* UART13 */
+#define AST_UART_SDMA_BASE			0x1E79E000	/* UART SDMA */
+
+#define AST_H264_BASE					0x1E7C0000	/* H.264 */
+#define AST_FORMATTER_BASE			0x1E7C2100	/* Formatter */
+
+
+#define AST_FMC_CS0_BASE				0x20000000	/* CS0 */
+#define AST_FMC_CS1_BASE				0x28000000	/* CS1 */
+#define AST_FMC_CS2_BASE				0x2a000000	/* CS2 */
+
+#define AST_SPI0_CS0_BASE				0x30000000	/* SPI 2 Flash CS 0 Memory */
+#define AST_SPI0_CS1_BASE				0x32000000	/* SPI 2 Flash CS 1 Memory */
+
+#define AST_SPI1_CS0_BASE				0x38000000	/* SPI 3 Flash CS 0 Memory */
+#define AST_SPI1_CS1_BASE				0x3a000000	/* SPI 3 Flash CS 1 Memory */
+
+#define AST_LPC_BRIDGE					0x60000000
+#define AST_LPC_PLUS_BRIDGE			0x70000000
+
+#define AST_PCIE_WIN_BASE				0x70000000
+#define AST_PCIE_WIN_SIZE				0x10000000
+
+#ifdef CONFIG_AST_VIDEO
+#define ASR_VIDEO_MEM_SIZE				0x2800000		//40MB
+#define ASR_VIDEO_MEM 					(AST_DRAM_BASE + (SZ_8M*10))//(AST_DRAM_BASE + SZ_256M)
+
+#define AST_CRT0_MEM_SIZE				SZ_8M
+#define AST_CRT0_MEM_BASE				(ASR_VIDEO_MEM + ASR_VIDEO_MEM_SIZE)
+#else
+
+#define AST_CRT0_MEM_SIZE				SZ_8M
+#define AST_CRT0_MEM_BASE				(AST_DRAM_BASE + 0x8000000)		//from 128M
+#endif
+
+#define AST_CURSOR0_MEM_SIZE			SZ_1M
+#define AST_CURSOR0_MEM_BASE			(AST_CRT0_MEM_BASE + AST_CRT0_MEM_SIZE)
+
+#define AST_CRT1_MEM_SIZE				SZ_8M
+#define AST_CRT1_MEM_BASE				(AST_CURSOR0_MEM_BASE + AST_CURSOR0_MEM_SIZE)
+
+#define AST_CRT2_MEM_SIZE				SZ_8M
+#define AST_CRT2_MEM_BASE				(AST_CRT1_MEM_BASE + AST_CRT1_MEM_SIZE)
+
+#define AST_CRT3_MEM_SIZE				SZ_8M
+#define AST_CRT3_MEM_BASE				(AST_CRT2_MEM_BASE + AST_CRT2_MEM_SIZE)
+
+#define AST_BULK_STREAM_MEM_SIZE		SZ_8M	//4Mb for bulk , 4Mb for history
+#define AST_BULK_STREAM_MEM_BASE		(AST_CRT3_MEM_BASE + AST_CRT3_MEM_SIZE)
+
+#define AST_GRAPHIC_STREAM_MEM_SIZE	SZ_8M	//4Mb for bulk , 4Mb for history
+#define AST_GRAPHIC_STREAM_MEM_BASE	(AST_BULK_STREAM_MEM_BASE + AST_BULK_STREAM_MEM_SIZE)
+
+#define AST_ENTROPY_MEM_SIZE			SZ_4M
+#define AST_ENTROPY_MEM_BASE 			(AST_GRAPHIC_STREAM_MEM_BASE + AST_GRAPHIC_STREAM_MEM_SIZE)
+
+#define AST_CMDQ_MEM_SIZE				SZ_2M
+#define AST_CMDQ_MEM_BASE 			(AST_ENTROPY_MEM_BASE + AST_ENTROPY_MEM_SIZE)
+
+#define AST_VMASK_MEM_SIZE			SZ_1M
+#define AST_VMASK_MEM_BASE 			(AST_CMDQ_MEM_BASE + AST_CMDQ_MEM_SIZE)
+
+#define AST_GMASK_MEM_SIZE			SZ_1M
+#define AST_GMASK_MEM_BASE 			(AST_VMASK_MEM_BASE + AST_VMASK_MEM_SIZE)
+
+#define AST_H264_MEM_SIZE				0x1100000 		//11MB : BS 8MB + fifo 3 * 3MB
+#define AST_H264_MEM_BASE 				(AST_GMASK_MEM_BASE + AST_GMASK_MEM_SIZE)
+
+#define AST_FORMATTER_MEM_SIZE		0xC00000 			//12MB
+#define AST_FORMATTER_MEM_BASE 		(AST_H264_MEM_BASE + AST_H264_MEM_SIZE)
+#endif
diff --git a/arch/arm/include/asm/arch-aspeed/ast_scu.h b/arch/arm/include/asm/arch-aspeed/ast_scu.h
new file mode 100644
index 000000000000..f961f4c289a3
--- /dev/null
+++ b/arch/arm/include/asm/arch-aspeed/ast_scu.h
@@ -0,0 +1,116 @@
+/********************************************************************************
+* File Name     : arch/arm/mach-aspeed/include/plat/ast-scu.h
+* Author        : Ryan Chen
+* Description   : AST SCU Service Header
+*
+* Copyright (C) 2012-2020  ASPEED Technology Inc.
+* 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
+
+*   History      :
+*      1. 2012/08/03 Ryan Chen create this file
+*
+********************************************************************************/
+
+#ifndef __AST_SCU_H_INCLUDED
+#define __AST_SCU_H_INCLUDED
+
+//information
+extern void ast_scu_show_system_info (void);
+extern void ast_scu_sys_rest_info(void);
+extern void ast_scu_security_info(void);
+extern u32 ast_scu_revision_id(void);
+extern u32 ast_scu_get_phy_interface(u8 mac_num);
+extern u32 ast_scu_get_phy_config(u8 mac_num);
+extern u32 ast_scu_get_vga_memsize(void);
+extern void ast_scu_get_who_init_dram(void);
+
+//CLK
+extern void ast_scu_uart_div(void);
+extern u32 ast_get_clk_source(void);
+extern u32 ast_get_h_pll_clk(void);
+extern u32 ast_get_ahb_div(void);
+
+extern u32 ast_get_m_pll_clk(void);
+extern u32 ast_get_ahbclk(void);
+
+extern u32 ast_get_pclk(void);
+extern u32 ast_get_sd_clock_src(void);
+extern u32 ast_get_d2_pll_clk(void);
+extern void ast_set_d2_pll_clk(u32 pll_setting);
+
+extern u32 ast_get_lhclk(void);
+
+extern void ast_scu_set_vga_display(u8 enable);
+extern u8 ast_scu_get_vga_display(void);
+
+extern u32 ast_scu_get_vga_memsize(void);
+
+//Ctrl Initial
+extern void ast_scu_init_uart(u8);
+extern void ast_scu_init_video(u8 dynamic_en);
+extern void ast_scu_reset_video(void);
+extern void ast_scu_init_eth(u8 num);
+extern void ast_scu_init_lpc(void);
+extern u8 ast_scu_get_lpc_plus_enable(void);
+extern void ast_scu_init_usb_port1(void);
+extern void ast_scu_init_usb_port2(void);
+extern void ast_scu_init_uhci(void);
+extern void ast_scu_init_sdhci(void);
+extern void ast_scu_init_i2c(void);
+extern void ast_scu_init_pwm_tacho(void);
+extern void ast_scu_init_adc(void);
+extern void ast_scu_init_mctp(void);
+extern void ast_scu_init_pcie(void);
+extern void ast_scu_init_xdma(void);
+extern void ast_scu_init_peci(void);
+extern void ast_scu_init_jtag(void);
+extern void ast_scu_init_rfx(void);
+extern void ast_scu_init_h264(void);
+extern void ast_scu_set_crt_source(u8 dac_soource);
+extern void ast_scu_init_crt(void);
+extern void ast_scu_init_hace(void);
+extern void ast_scu_uartx_init(void);
+extern void ast_scu_spi_master(u8 mode);
+
+//Share pin
+extern void ast_scu_multi_func_uart(u8 uart);
+extern void ast_scu_multi_func_video(void);
+extern void ast_scu_multi_func_eth(u8 num);
+
+extern void ast_scu_multi_func_nand(void);
+
+extern void ast_scu_multi_func_nor(void);
+
+extern void ast_scu_multi_func_romcs(u8 num);
+
+extern void ast_scu_multi_func_i2c(void);
+extern void ast_scu_multi_func_pwm_tacho(void);
+//0 : usb 1.1 hid controller, 1:usb 2.0 device controller, 2:usb 2.0 host2 controller
+extern void ast_scu_multi_func_usb_port1_mode(u8 mode);
+//0 : hub mode , 1: usb host mode
+extern void ast_scu_multi_func_usb_port2_mode(u8 mode);
+//0 : gpioQ6,7 mode , 1: usb1.1 host port 4 mode
+extern void ast_scu_multi_func_usb_port34_mode(u8 mode);
+
+extern void ast_scu_multi_func_sdhc_8bit_mode(void);
+extern void ast_scu_multi_func_sdhc_slot(u8 slot);
+extern void ast_scu_multi_func_crt(void);
+
+extern void ast_scu_multi_nic_switch(u8 enable);
+extern void ast_scu_multi_func_sgpio(void);
+
+extern void ast_scu_hw_random_enable(u8 enable);
+extern u32 ast_scu_hw_random_read(void);
+extern u8 ast_scu_get_hw_random_type(void);
+extern void ast_scu_set_hw_random_type(u8 type);
+extern u8 ast_scu_adc_trim_read(void);
+
+#endif
diff --git a/arch/arm/include/asm/arch-aspeed/platform.h b/arch/arm/include/asm/arch-aspeed/platform.h
new file mode 100644
index 000000000000..2f5597d99f57
--- /dev/null
+++ b/arch/arm/include/asm/arch-aspeed/platform.h
@@ -0,0 +1,54 @@
+/*
+ * 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 _AST_PLATFORM_H_
+#define _AST_PLATFORM_H_                 1
+
+#include <asm/arch/aspeed.h>
+
+#define AST_PLL_25MHZ			25000000
+#define AST_PLL_24MHZ			24000000
+#define AST_PLL_12MHZ			12000000
+
+/*********************************************************************************/
+#if defined(CONFIG_ARCH_AST1520)
+#include <asm/arch/ast1520_platform.h>
+#elif defined(CONFIG_ARCH_AST2000)
+#include <asm/arch/ast2000_platform.h>
+#elif defined(CONFIG_ARCH_AST2100)
+#include <asm/arch/ast2100_platform.h>
+#elif defined(CONFIG_ARCH_AST2200)
+#include <asm/arch/ast2200_platform.h>
+#elif defined(CONFIG_ARCH_AST2300)
+#include <asm/arch/ast2300_platform.h>
+#elif defined(CONFIG_ARCH_AST2400)
+#include <asm/arch/ast2400_platform.h>
+#elif defined(AST_SOC_G5)
+#include <asm/arch/ast_g5_platform.h>
+#elif defined(CONFIG_ARCH_AST1010)
+#include <asm/arch/ast1010_platform.h>
+#else
+#err "No define for platform.h"
+#endif
+
+/*********************************************************************************/
+/* Companion Base Address */
+#if defined(CONFIG_ARCH_AST1070)
+#include <asm/arch/ast1070_platform.h>
+#endif
+/*********************************************************************************/
+
+#endif
diff --git a/arch/arm/include/asm/arch-aspeed/regs-ahbc.h b/arch/arm/include/asm/arch-aspeed/regs-ahbc.h
new file mode 100644
index 000000000000..08d9f65703ca
--- /dev/null
+++ b/arch/arm/include/asm/arch-aspeed/regs-ahbc.h
@@ -0,0 +1,41 @@
+/* arch/arm/mach-aspeed/include/mach/regs-ahbc.h
+ *
+ * Copyright (C) 2012-2020  ASPEED Technology Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ *   History      :
+ *    1. 2012/12/29 Ryan Chen Create
+ *
+********************************************************************************/
+#ifndef __AST_AHBC_H
+#define __AST_AHBC_H                     1
+
+#include <asm/arch/aspeed.h>
+
+/* Register for AHBC */
+#define AST_AHBC_PROTECT			0x00		/*	Protection Key Register 	*/
+
+
+#define AST_AHBC_PRIORITY_CTRL		0x80		/*	Priority Cortrol Register */
+
+#define AST_AHBC_ADDR_REMAP		0x8C		/*	Address Remapping Register */
+
+/*	AST_AHBC_PROTECT			0x00		Protection Key Register 	*/
+#define AHBC_PROTECT_UNLOCK		0xAEED1A03
+
+/*	AST_AHBC_ADDR_REMAP		0x8C		Address Remapping Register */
+#define AHBC_PCI_REMAP1			(1 << 5)
+#define AHBC_PCI_REMAP0			(1 << 4)
+
+#if defined(AST_SOC_G5)
+#define AHBC_PCIE_MAP				(1 << 5)
+#define AHBC_LPC_PLUS_MAP			(1 << 4)
+#else
+#define AHBC_BOOT_REMAP			1
+#endif
+
+
+#endif
diff --git a/arch/arm/include/asm/arch-aspeed/regs-scu.h b/arch/arm/include/asm/arch-aspeed/regs-scu.h
new file mode 100644
index 000000000000..e54fb87b2baf
--- /dev/null
+++ b/arch/arm/include/asm/arch-aspeed/regs-scu.h
@@ -0,0 +1,1049 @@
+/* arch/arm/mach-aspeed/include/mach/regs-scu.h
+ *
+ * Copyright (C) 2012-2020  ASPEED Technology Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ *   History      :
+ *    1. 2012/12/29 Ryan Chen Create
+ *
+********************************************************************************/
+#ifndef __AST_SCU_H
+#define __AST_SCU_H                     1
+
+#include <asm/arch/aspeed.h>
+/*
+ *  Register for SCU
+ *  */
+#define AST_SCU_PROTECT				0x00		/*	protection key register	*/
+#define AST_SCU_RESET				0x04		/*	system reset control register */
+#define AST_SCU_RESET2				0xD4		/*	Reset Control register set 2*/
+#define AST_SCU_CLK_SEL				0x08		/*	clock selection register	*/
+#define AST_SCU_CLK_SEL2			0xD8		/*	clock selection register Set 2*/
+#define AST_SCU_CLK_STOP			0x0C		/*	clock stop control register	*/
+#define AST_SCU_CLK_STOP2			0xDC		/*	clock stop control register set 2*/
+#define AST_SCU_COUNT_CTRL			0x10		/*	frequency counter control register	*/
+#define AST_SCU_COUNT_VAL			0x14		/*	frequency counter measure register 	*/
+#define AST_SCU_INTR_CTRL			0x18		/*	Interrupt control and status register	*/
+#define AST_SCU_D2_PLL				0x1C		/*	D2-PLL Parameter  register	*/
+#define AST_SCU_D2_PLL_EXTEND		0x13C 		/*	D2-PLL Extender Parameter  register */
+#define AST_SCU_M_PLL				0x20		/*	M-PLL Parameter register		*/
+#define AST_SCU_H_PLL				0x24		/*	H-PLL Parameter register		*/
+#define AST_SCU_MH_PLL_EXTEND		0x148		/*	Extended Parameter of M/H-PLL register */
+#ifdef AST_SOC_G5
+#define AST_SCU_D_PLL				0x28		/*	D-PLL Parameter  register	*/
+#define AST_SCU_D_PLL_EXTEND0		0x130		/*	D-PLL Extended Parameter  register	*/
+#define AST_SCU_D_PLL_EXTEND1		0x134		/*	D-PLL Extended Parameter  register	*/
+#define AST_SCU_D_PLL_EXTEND2		0x138		/*	D-PLL Extended Parameter  register	*/
+#else
+#define AST_SCU_FREQ_LIMIT			0x28		/*	frequency counter comparsion register */
+#endif
+#define AST_SCU_MISC1_CTRL			0x2C		/*	Misc. Control register */
+#define AST_SCU_PCI_CONF1			0x30		/*	PCI configuration setting register#1 */
+#define AST_SCU_PCI_CONF2			0x34		/*	PCI configuration setting register#2 */
+#define AST_SCU_PCI_CONF3			0x38		/*	PCI configuration setting register#3 */
+#define AST_SCU_SYS_CTRL			0x3C		/*	System reset contrl/status register*/
+#define AST_SCU_SOC_SCRATCH0		0x40		/*	SOC scratch 0~31 register */
+#define AST_SCU_SOC_SCRATCH1		0x44		/*	SOC scratch 32~63 register */
+#define AST_SCU_VGA0				0x40		/*	VGA fuction handshake register */
+#define AST_SCU_VGA1				0x44		/*	VGA fuction handshake register */
+#define AST_SCU_MAC_CLK				0x48		/*	MAC interface clock delay setting register */
+#define AST_SCU_MISC2_CTRL			0x4C		/*	Misc. 2 Control register */
+#define AST_SCU_VGA_SCRATCH0		0x50		/*	VGA Scratch register */
+#define AST_SCU_VGA_SCRATCH1		0x54		/*	VGA Scratch register */
+#define AST_SCU_VGA_SCRATCH2		0x58		/*	VGA Scratch register */
+#define AST_SCU_VGA_SCRATCH3		0x5c		/*	VGA Scratch register */
+#define AST_SCU_VGA_SCRATCH4		0x60		/*	VGA Scratch register */
+#define AST_SCU_VGA_SCRATCH5		0x64		/*	VGA Scratch register */
+#define AST_SCU_VGA_SCRATCH6		0x68		/*	VGA Scratch register */
+#define AST_SCU_VGA_SCRATCH7		0x6c		/*	VGA Scratch register */
+#define AST_SCU_HW_STRAP1			0x70		/*	hardware strapping register */
+#define AST_SCU_RAMDOM_GEN			0x74		/*	random number generator register */
+#if defined(CONFIG_ARCH_AST1100) || defined(CONFIG_ARCH_AST2050) || defined(CONFIG_ARCH_AST2100) || defined(CONFIG_ARCH_AST2200)
+#define AST_SCU_MULTI_FUNC_2		0x78
+#else
+#define AST_SCU_RAMDOM_DATA			0x78		/*	random number generator data output*/
+#endif
+#define AST_SCU_REVISION_ID			0x7C		/*	Silicon revision ID register */
+#define AST_SCU_FUN_PIN_CTRL1		0x80		/*	Multi-function Pin Control#1*/
+#define AST_SCU_FUN_PIN_CTRL2		0x84		/*	Multi-function Pin Control#2*/
+#define AST_SCU_FUN_PIN_CTRL3		0x88		/*	Multi-function Pin Control#3*/
+#define AST_SCU_FUN_PIN_CTRL4		0x8C		/*	Multi-function Pin Control#4*/
+#define AST_SCU_FUN_PIN_CTRL5		0x90		/*	Multi-function Pin Control#5*/
+#define AST_SCU_FUN_PIN_CTRL6		0x94		/*	Multi-function Pin Control#6*/
+#define AST_SCU_WDT_RESET			0x9C		/*	Watchdog Reset Selection */
+#define AST_SCU_FUN_PIN_CTRL7		0xA0		/*	Multi-function Pin Control#7*/
+#define AST_SCU_FUN_PIN_CTRL8		0xA4		/*	Multi-function Pin Control#8*/
+#define AST_SCU_FUN_PIN_CTRL9		0xA8		/*	Multi-function Pin Control#9*/
+#define AST_SCU_MAC_CLK_DELAY_100M	0xB8		/*	MAC interface clock delay 100M setting*/
+#define AST_SCU_MAC_CLK_DELAY_10M		0xBC		/*	MAC interface clock delay 10M setting*/
+#define AST_SCU_PWR_SAVING_EN		0xC0		/*	Power Saving Wakeup Enable*/
+#define AST_SCU_PWR_SAVING_CTRL		0xC4		/*	Power Saving Wakeup Control*/
+#define AST_SCU_HW_STRAP2			0xD0		/*	Haardware strapping register set 2*/
+#define AST_SCU_COUNTER4			0xE0		/*	SCU Free Run Counter Read Back #4*/
+#define AST_SCU_COUNTER4_EXT		0xE4		/*	SCU Free Run Counter Extended Read Back #4*/
+
+#if defined(CONFIG_ARCH_AST1010)
+#define AST_SCU_CPU_BASE0_ADDR      0x100       /*   CPU Base Address for Segment 0x20:0000~0x2F:FFFF*/
+#define AST_SCU_CPU_BASE1_ADDR		0x104		/*	CPU Base Address for Segment 0x30:0000~0x3F:FFFF*/
+#define AST_SCU_CPU_BASE2_ADDR		0x108		/*	CPU Base Address for Segment 0x40:0000~0x4F:FFFF*/
+#define AST_SCU_CPU_BASE3_ADDR		0x10C		/*	CPU Base Address for Segment 0x50:0000~0x5F:FFFF*/
+#define AST_SCU_CPU_BASE4_ADDR		0x110		/*	CPU Base Address for Segment 0x60:0000~0x6F:FFFF*/
+#define AST_SCU_CPU_BASE5_ADDR		0x114		/*	CPU Base Address for Segment 0x70:0000~0x7F:FFFF*/
+#define AST_SCU_CPU_BASE6_ADDR      0x118   	/*   CPU Base Address for Segment 0x80:0000~0xFF:FFFF*/
+#define AST_SCU_CPU_CACHE_CTRL		0x11C		/*	CPU Cache Function Control*/
+#else
+//CPU 2
+#define AST_SCU_CPU2_CTRL			0x100		/*	CPU2 Control Register*/
+#define AST_SCU_CPU2_BASE0_ADDR		0x104		/*	CPU2 Base Address for Segment 0x00:0000~0x1F:FFFF*/
+#define AST_SCU_CPU2_BASE1_ADDR		0x108		/*	CPU2 Base Address for Segment 0x20:0000~0x3F:FFFF*/
+#define AST_SCU_CPU2_BASE2_ADDR		0x10C		/*	CPU2 Base Address for Segment 0x40:0000~0x5F:FFFF*/
+#define AST_SCU_CPU2_BASE3_ADDR		0x110		/*	CPU2 Base Address for Segment 0x60:0000~0x7F:FFFF*/
+#define AST_SCU_CPU2_BASE4_ADDR		0x114		/*	CPU2 Base Address for Segment 0x80:0000~0xFF:FFFF*/
+#define AST_SCU_CPU2_CACHE_CTRL		0x118		/*	CPU2 Cache Function Control */
+#endif
+//
+
+#define AST_SCU_DPLL_PAR0				0x130
+#define AST_SCU_DPLL_PAR1				0x134
+#define AST_SCU_DPLL_PAR2				0x138
+
+#define AST_SCU_OTP0				0x150
+#define AST_SCU_OTP1				0x154
+#define AST_SCU_OTP2				0x158
+#define AST_SCU_OTP3				0x15C
+
+#define AST_SCU_UART24_REF			0x160		/*	Generate UART 24Mhz Ref from H-PLL when CLKIN is 25Mhz */
+#define AST_SCU_PCIE_CONFIG_SET		0x180		/*	PCI-E Configuration Setting Control Register */
+#define AST_SCU_BMC_MMIO_DEC		0x184		/*	BMC MMIO Decode Setting Register */
+#define AST_SCU_DEC_AREA1			0x188		/*	1st relocated controller decode area location */
+#define AST_SCU_DEC_AREA2			0x18C		/*	2nd relocated controller decode area location */
+#define AST_SCU_MBOX_DEC_AREA		0x190		/*	Mailbox decode area location*/
+#define AST_SCU_SRAM_DEC_AREA0		0x194		/*	Shared SRAM area decode location*/
+#define AST_SCU_SRAM_DEC_AREA1		0x198		/*	Shared SRAM area decode location*/
+#define AST_SCU_BMC_CLASS			0x19C		/*	BMC device class code and revision ID */
+#define AST_SCU_BMC_DEV_ID			0x1A4		/*	BMC device ID */
+
+#define AST_SCU_MAC_CLK_DUTY		0x1DC		/*	Clock Duty Selection */
+
+
+/*	AST_SCU_PROTECT: 0x00  - protection key register */
+#define SCU_PROTECT_UNLOCK			0x1688A8A8
+
+/*	AST_SCU_RESET :0x04	 - system reset control register */
+#if defined (CONFIG_ARCH_AST1010)
+#define SCU_RESET_ADC				(0x1 << 6)
+#define SCU_RESET_JTAG				(0x1 << 5)
+#define SCU_RESET_MAC0				(0x1 << 4)
+#define SCU_RESET_PECI				(0x1 << 3)
+#define SCU_RESET_PWM				(0x1 << 2)
+#define SCU_RESET_LPC				(0x1 << 1)
+#define SCU_RESET_I2C				(0x1)
+#else
+#define SCU_RESET_H264				(0x1 << 26)
+#define SCU_RESET_XDMA				(0x1 << 25)
+#define SCU_RESET_MCTP				(0x1 << 24)
+#define SCU_RESET_P2X				(0x1 << 24)
+#define SCU_RESET_ADC				(0x1 << 23)
+#define SCU_RESET_JTAG				(0x1 << 22)
+#ifdef AST_SOC_G5
+#define SCU_RESET_PCIE_DIR			(0x1 << 21)
+#define SCU_RESET_PCIE				(0x1 << 19)
+#else
+#define SCU_PWAKE_PIN_EN			(0x1 << 20)
+#define SCU_PWAKE_PIN_OUT			(0x1 << 19)
+#endif
+#define SCU_RESET_MIC				(0x1 << 18)
+#define SCU_RESET_RFX				(0x1 << 17)
+#define SCU_RESET_SD				(0x1 << 16)
+#define SCU_RESET_USB11				(0x1 << 15)
+#define SCU_RESET_USB20				(0x1 << 14)
+#define SCU_RESET_CRT				(0x1 << 13)
+#define SCU_RESET_MAC1				(0x1 << 12)
+#define SCU_RESET_MAC0				(0x1 << 11)
+#define SCU_RESET_PECI				(0x1 << 10)
+#define SCU_RESET_PWM				(0x1 << 9)
+#define SCU_PCI_VGA_DIS				(0x1 << 8)
+#define SCU_RESET_2D				(0x1 << 7)
+#define SCU_RESET_VIDEO				(0x1 << 6)
+#define SCU_RESET_LPC				(0x1 << 5)
+#define SCU_RESET_HACE				(0x1 << 4)
+#define SCU_RESET_USB_P1			(0x1 << 3)
+#define SCU_RESET_I2C				(0x1 << 2)
+#define SCU_RESET_AHB				(0x1 << 1)
+#define SCU_RESET_SRAM_CTRL			(0x1 << 0)
+#endif
+
+/* AST_SCU_RESET2				0xD4		Reset Control register set 2	*/
+#define SCU_RESET_CRT3				(0x1 << 8)
+#define SCU_RESET_CRT2				(0x1 << 7)
+#define SCU_RESET_CRT1				(0x1 << 6)
+#define SCU_RESET_CRT0				(0x1 << 5)
+#define SCU_RESET_NIC1				(0x1 << 4)
+#define SCU_RESET_NIC0				(0x1 << 3)
+#define SCU_RESET_RFXDEC			(0x1 << 2)
+#define SCU_RESET_BITBLT				(0x1 << 1)
+#define SCU_RESET_RFXCMQ			(0x1)
+
+/*	AST_SCU_CLK_SEL	 : 0x08 - clock selection register	*/
+#if defined(CONFIG_ARCH_AST1010)
+#define SCU_CLK_MAC_DIV(x)			(x << 12)
+#define SCU_CLK_MAC_MASK			(0x3 << 12)
+#define SCU_LHCLK_SOURCE_EN			(0x1 << 11)		//0: ext , 1:internel
+#define SCU_LHCLK_LPC_DIV(x)		(x << 8)
+#define SCU_LHCLK_LPC_MASK			(0x7 << 8)
+#define SCU_PCLK_APB_DIV(x)			(x << 5)
+#define SCU_GET_PCLK_DIV(x)			((x >> 5) & 0x7)
+#define SCU_PCLK_APB_DIV_MASK		(0x7 << 5)		//limitation on PCLK .. PCLK > 0.5*LCLK (33Mhz)
+#define SCU_CLK_CPU_AHB_SLOW_EN		(0x1 << 4)
+#define SCU_CLK_CPU_AHB_SLOW(x)		(x << 3)
+#define SCU_CLK_CPU_AHB_SLOW_MASK	(0x3 << 3)
+#define SCU_GET_AHB_DIV(x)			((x >> 2) & 0x3)
+#define SCU_CLK_CPU_AHB_SLOW_IDLE	(0x1 << 1)
+#define SCU_CLK_CPU_AHB_DYN_SLOW_EN	(0x1)
+#else
+#define SCU_CLK_VIDEO_SLOW_EN		(0x1 << 31)
+//G5 the same with RemoteFX EPDEC
+#define SCU_CLK_VIDEO_SLOW_SET(x)	(x << 28)
+#define SCU_CLK_VIDEO_SLOW_MASK		(0x7 << 28)
+#define SCU_CLK_2D_ENG_GCLK_INVERT	(0x1 << 27)		//valid only at CRT mode SCU2C[7]
+#define SCU_CLK_2D_ENG_THROT_EN		(0x1 << 26)		//valid only at CRT mode SCU2C[7]
+#define SCU_PCLK_APB_DIV(x)			(x << 23)
+#define SCU_GET_PCLK_DIV(x)			((x >> 23) & 0x7)
+#define SCU_PCLK_APB_DIV_MASK		(0x7 << 23)		//limitation on PCLK .. PCLK > 0.5*LCLK (33Mhz)
+#define SCU_GET_LHCLK_DIV(x)		((x >> 20) & 0x7)
+#define SCU_SET_LHCLK_DIV(x)		(x << 20)
+#define SCU_LHCLK_DIV_MASK			(0x7 << 20)
+#define SCU_LHCLK_SOURCE_EN			(0x1 << 19)		//0: ext , 1:internel
+#define SCU_CLK_MAC_DIV(x)			(x << 16)
+#define SCU_CLK_MAC_MASK			(0x7 << 16)
+#define SCU_CLK_SD_EN				(0x1 << 15)
+#define SCU_CLK_VIDE0_SO_D2			(0x1 << 8)
+#define SCU_CLK_SD_DIV(x)			(x << 12)
+#define SCU_CLK_SD_GET_DIV(x)		((x >> 12) & 0x7)
+#define SCU_CLK_SD_MASK				(0x7 << 12)
+#if defined(AST_SOC_G5)
+#define SCU_CRT_CLK_L_SOURCE			(0x1 << 8)
+#else
+#define SCU_CLK_VIDEO_DELAY(x)		(x << 8)
+#define SCU_CLK_VIDEO_DELAY_MASK	(0xf << 8)
+#endif
+#define SCU_CLK_CPU_AHB_SLOW_EN		(0x1 << 7)
+#define SCU_CLK_CPU_AHB_SLOW(x)		(x << 4)
+#define SCU_CLK_CPU_AHB_SLOW_MASK	(0x7 << 4)
+#define SCU_GET_AHB_SLOW_DIV(x)		((x >> 4) & 0x7)
+#define SCU_ECLK_SOURCE(x)			(x << 2)
+#define SCU_ECLK_SOURCE_MASK		(0x3 << 2)
+#define SCU_CLK_CPU_AHB_SLOW_IDLE	(0x1 << 1)
+#define SCU_CLK_CPU_AHB_DYN_SLOW_EN	(0x1 << 0)
+#endif
+
+/*	AST_SCU_CLK_SEL2	: 0xD8 - clock selection register Set 2	*/
+#define SCU_VIDEO4_OUTPUT_CLK_INVERT			(1 << 29)
+#define SCU_VIDEO4_OUTPUT_CLK_DELAY(x)			(x << 24)
+#define SCU_VIDEO4_OUTPUT_CLK_DELAY_MASK	(0x1f << 24)
+#define SCU_VIDEO3_OUTPUT_CLK_INVERT			(1 << 23)
+#define SCU_VIDEO3_OUTPUT_CLK_DELAY(x)			(x << 18)
+#define SCU_VIDEO3_OUTPUT_CLK_DELAY_MASK	(0x1f << 18)
+#define SCU_VIDEO2_OUTPUT_CLK_INVERT			(1 << 17)
+#define SCU_VIDEO2_OUTPUT_CLK_DELAY(x)			(x << 12)
+#define SCU_VIDEO2_OUTPUT_CLK_DELAY_MASK	(0x1f << 12)
+#define SCU_VIDEO1_OUTPUT_CLK_INVERT			(1 << 11)
+#define SCU_VIDEO1_OUTPUT_CLK_DELAY(x)			(x << 6)
+#define SCU_VIDEO1_OUTPUT_CLK_DELAY_MASK	(0x1f << 6)
+#define SCU_GET_H264CLK_DIV(x)					((x & 0x7) >> 3)
+#define SCU_SET_H264CLK_DIV(x)					(x << 3)
+#define SCU_H264CLK_MASK						(7 << 3)
+#define SCU_GET_BCLK_DIV(x)						(x & 0x7)
+#define SCU_SET_BCLK_DIV(x)						(x)
+
+
+/*	AST_SCU_CLK_STOP : 0x0C - clock stop control register	*/
+#if defined(CONFIG_ARCH_AST1010)
+#define SCU_LHCLK_STOP_EN			(0x1 << 7)
+#define SCU_MAC0CLK_STOP_EN			(0x1 << 6)
+#define SCU_UART3_CLK_STOP_EN		(0x1 << 5)
+#define SCU_UART2_CLK_STOP_EN		(0x1 << 4)
+#define SCU_UART1_CLK_STOP_EN		(0x1 << 3)
+#define SCU_LCLK_STOP_EN			(0x1 << 2)
+#define SCU_REFCLK_STOP_EN			(0x1 << 1)
+#define SCU_MCLK_STOP_EN			(0x1)
+#else
+#define SCU_LHCLK_STOP_EN			(0x1 << 28)
+#define SCU_SDCLK_STOP_EN			(0x1 << 27)
+#define SCU_UART4CLK_STOP_EN		(0x1 << 26)
+#define SCU_UART3CLK_STOP_EN		(0x1 << 25)
+#define SCU_RSACLK_STOP_EN			(0x1 << 24)
+//bit 23 must keep 1
+#define SCU_H264_STOP_EN			(0x1 << 22)
+#define SCU_MAC1CLK_STOP_EN		(0x1 << 21)
+#define SCU_MAC0CLK_STOP_EN		(0x1 << 20)
+//bit 19 must keep 1
+#if defined(AST_SOC_G5)
+#define SCU_ESPI_CLK_STOP_EN		(0x1 << 19)
+#endif
+
+#define SCU_RFX_CLK_STOP_EN		(0x1 << 18)
+#define SCU_UART5CLK_STOP_EN		(0x1 << 17)
+#define SCU_UART2CLK_STOP_EN		(0x1 << 16)
+#define SCU_UART1CLK_STOP_EN		(0x1 << 15)
+#define SCU_USB20_PHY_CLK_EN		(0x1 << 14)
+#define SCU_YCLK_STOP_EN			(0x1 << 13)
+#define SCU_D2CLK_STOP_EN			(0x1 << 10)
+#define SCU_USB11CLK_STOP_EN		(0x1 << 9)
+#define SCU_LCLK_STOP_EN			(0x1 << 8)
+#define SCU_USB_P1_STOP_EN			(0x1 << 7)
+#define SCU_REFCLK_STOP_EN			(0x1 << 6)
+#define SCU_DCLK_STOP_EN			(0x1 << 5)
+#define SCU_SACLK_STOP_EN			(0x1 << 4)
+#define SCU_VCLK_STOP_EN			(0x1 << 3)
+#define SCU_VCLK_STOP_EN			(0x1 << 3)
+#define SCU_MCLK_STOP_EN			(0x1 << 2)
+#define SCU_GCLK_STOP_EN			(0x1 << 1)
+#define SCU_ECLK_STOP_EN			(0x1 << 0)
+#endif
+
+/* AST_SCU_CLK_STOP2	: 0xDC - clock stop control register set 2*/
+#define SCU_NIC2_STOP_EN			(0x1 << 10)
+#define SCU_NIC1_STOP_EN			(0x1 << 9)
+#define SCU_CMQCLK_STOP			(0x1 << 8)
+#define SCU_RFXCLK_STOP				(0x1 << 7)
+#define SCU_BITBLTCLK_STOP			(0x1 << 6)
+/* bit 6*/
+#define SCU_UART_DIV13				(0x1 << 4)
+#define SCU_UARTXCLK_STOP			(0x1 << 3)
+#define SCU_D4CLK_STOP				(0x1 << 2)
+#define SCU_D3CLK_STOP				(0x1 << 1)
+#define SCU_D2CLK_STOP				(0x1)
+
+/* AST_SCU_COUNT_CTRL : 0x10 - frequency counter control register	*/
+#if defined(AST_SOC_G5)
+#define SCU_OSC_OUT_EN				(0x1 << 8)
+#endif
+#define SCU_FREQ_COMP_RESULT			(0x1 << 7)
+#define SCU_FREQ_MEASU_FINISH			(0x1 << 6)
+#define SCU_FREQ_SOURCE_FOR_MEASU(x)	(x << 2)
+#define SCU_FREQ_SOURCE_FOR_MEASU_MASK	(0xf << 2)
+
+#if defined(AST_SOC_G5)
+#define SCU_SOURCE_PCLK					0xf
+#define SCU_SOURCE_VPACLK				0xe
+#define SCU_SOURCE_VPBCLK				0xd
+#define SCU_SOURCE_12M					0xc
+#define SCU_SOURCE_LCLK					0xb
+#define SCU_SOURCE_GRCLK				0xa
+#define SCU_SOURCE_HCLK					0x9
+#define SCU_SOURCE_MCLK					0x8
+#define SCU_SOURCE_BCLK					0x7
+#define SCU_SOURCE_XPCLK				0x6
+#define SCU_SOURCE_D2_CLK				0x5
+#define SCU_SOURCE_D_CLK				0x4
+#define SCU_SOURCE_DLY32				0x3
+#define SCU_SOURCE_DLY16				0x2
+#define SCU_SOURCE_NAND					0x1
+#define SCU_SOURCE_DEL_CELL				0x0
+#else
+#define SCU_SOURCE_6M					0xf
+#define SCU_SOURCE_12M					0xe
+#define SCU_SOURCE_I2SM_CLK				0xd
+#define SCU_SOURCE_H_CLK				0xc
+#define SCU_SOURCE_B_CLK				0xb
+#define SCU_SOURCE_D2_PLL				0xa
+
+#define SCU_SOURCE_VIDEO_CLK			0x7
+#define SCU_SOURCE_LPC_CLK				0x6
+#define SCU_SOURCE_I2S_CLK				0x5
+#define SCU_SOURCE_M_CLK				0x4
+#define SCU_SOURCE_SALI_CLK				0x3
+#define SCU_SOURCE_D_PLL				0x2
+#define SCU_SOURCE_NAND					0x1
+#define SCU_SOURCE_DEL_CELL				0x0
+#endif
+#define SCU_OSC_COUNT_EN				(0x1 << 1)
+#define SCU_RING_OSC_EN					(0x1 << 0)
+
+
+/*  AST_SCU_INTR_CTRL : 0x18 - Interrupt control and status register   */
+#define INTR_LPC_H_L_RESET				(0x1 << 21)
+#define INTR_LPC_L_H_RESET				(0x1 << 20)
+#define INTR_PCIE_H_L_RESET				(0x1 << 19)
+#define INTR_PCIE_L_H_RESET				(0x1 << 18)
+#define INTR_VGA_SCRATCH_CHANGE			(0x1 << 17)
+#define INTR_VGA_CURSOR_CHANGE			(0x1 << 16)
+#define INTR_ISSUE_MSI					(0x1 << 6)
+#define INTR_LPC_H_L_RESET_EN			(0x1 << 5)
+#define INTR_LPC_L_H_RESET_EN			(0x1 << 4)
+#define INTR_PCIE_H_L_RESET_EN			(0x1 << 3)
+#define INTR_PCIE_L_H_RESET_EN			(0x1 << 2)
+#define INTR_VGA_SCRATCH_CHANGE_EN		(0x1 << 1)
+#define INTR_VGA_CURSOR_CHANGE_EN		(0x1 << 0)
+
+/*	AST_SCU_D2_PLL: 0x1C - D2-PLL Parameter  register */
+#ifdef AST_SOC_G5
+#define SCU_D2_PLL_SET_ODNUM(x)		(x << 19)
+#define SCU_D2_PLL_GET_ODNUM(x)		((x >> 19) & 0x3)
+#define SCU_D2_PLL_OD_MASK				(0x3 << 19)
+#define SCU_D2_PLL_SET_PNUM(x)			(x << 13)
+#define SCU_D2_PLL_GET_PNUM(x)			((x >>13)&0x3f)
+#define SCU_D2_PLL_PNUM_MASK			(0x3f << 13)
+#define SCU_D2_PLL_SET_NNUM(x)			(x << 8)
+#define SCU_D2_PLL_GET_NNUM(x)			((x >>8)&0x1f)
+#define SCU_D2_PLL_NNUM_MASK			(0x1f << 8)
+#define SCU_D2_PLL_SET_MNUM(x)			(x)
+#define SCU_D2_PLL_GET_MNUM(x)			(x & 0xff)
+#define SCU_D2_PLL_MNUM_MASK			(0xff)
+
+/*	AST_SCU_D2_PLL_EXTEND: 0x13C - D2-PLL Extender Parameter  register */
+#define SCU_D2_PLL_PARAMETER0(x)		((x) << 5)
+#define SCU_D2_PLL_SET_MODE(x)			((x) << 3)
+#define SCU_D2_PLL_GET_MODE(x)			(((x) >> 3) & 0x3)
+#define SCU_D2_PLL_RESET				(0x1 << 2)
+#define SCU_D2_PLL_BYPASS				(0x1 << 1)
+#define SCU_D2_PLL_OFF					(0x1)
+#else
+#define SCU_D2_PLL_SET_PD2(x)			(x << 19)
+#define SCU_D2_PLL_GET_PD2(x)			((x >> 19)&0x7)
+#define SCU_D2_PLL_PD2_MASK				(0x7 << 19)
+#define SCU_D2_PLL_BYPASS				(0x1 << 18)
+#define SCU_D2_PLL_OFF					(0x1 << 17)
+#define SCU_D2_PLL_SET_PD(x)			(x << 15)
+#define SCU_D2_PLL_GET_PD(x)			((x >> 15) &0x3)
+#define SCU_D2_PLL_PD_MASK				(0x3 << 15)
+#define SCU_D2_PLL_SET_OD(x)			(x << 13)
+#define SCU_D2_PLL_GET_OD(x)			((x >> 13) & 0x3)
+#define SCU_D2_PLL_OD_MASK				(0x3 << 13)
+#define SCU_D2_PLL_SET_DENUM(x)			(x << 8)
+#define SCU_D2_PLL_GET_DENUM(x)			((x >>8)&0x1f)
+#define SCU_D2_PLL_DENUM_MASK			(0x1f << 8)
+#define SCU_D2_PLL_SET_NUM(x)			(x)
+#define SCU_D2_PLL_GET_NUM(x)			(x & 0xff)
+#define SCU_D2_PLL_NUM_MASK				(0xff)
+#endif
+
+/*	AST_SCU_M_PLL : 0x20	- M-PLL Parameter register	*/
+#ifdef AST_SOC_G5
+#define SCU_M_PLL_RESET					(0x1 << 21)
+#define SCU_M_PLL_BYPASS				(0x1 << 20)
+#define SCU_M_PLL_OFF					(0x1 << 19)
+#define SCU_M_PLL_GET_PDNUM(x)			((x >> 13) & 0x3f)
+#define SCU_M_PLL_GET_MNUM(x)			((x >> 5) & 0xff)
+#define SCU_M_PLL_GET_NNUM(x)			(x & 0x1f)
+#else
+#define SCU_M_PLL_BYPASS				(0x1 << 17)
+#define SCU_M_PLL_OFF					(0x1 << 16)
+#define SCU_M_PLL_NUM(x)				(x << 5)
+#define SCU_M_PLL_GET_NUM(x)			((x >> 5) & 0x3f)
+#define SCU_M_PLL_NUM_MASK				(0x3f << 5)
+#define SCU_M_PLL_OUT_DIV				(0x1 << 4)
+#define SCU_M_PLL_GET_DIV(x)			((x >> 4) & 0x1)
+#define SCU_M_PLL_DENUM(x)				(x)
+#define SCU_M_PLL_GET_DENUM(x)			(x & 0xf)
+#endif
+
+/*	AST_SCU_H_PLL: 0x24- H-PLL Parameter register		*/
+#if defined(CONFIG_ARCH_AST1010)
+#define SCU_H_PLL_MASK_EN				(0x1 << 10)
+#define SCU_H_PLL_REST_EN				(0x1 << 9)
+#define SCU_H_PLL_OUT_DIV(x)			(x << 7)
+#define SCU_H_PLL_GET_DIV(x)			((x >> 7) & 0x3)
+#define SCU_H_PLL_GET_DENUM(x)			((x >> 6) & 0x1)
+#define SCU_H_PLL_NUM(x)				(x)
+#define SCU_H_PLL_GET_NUM(x)			(x & 0x3f)
+#define SCU_H_PLL_NUM_MASK				(0x3f)
+#elif defined(AST_SOC_G5)
+#define SCU_H_PLL_PARAMETER0(x)			((x) << 22)
+#define SCU_H_PLL_GET_PARAMETER0(x)		((x >> 22) & 0x3ff)
+#define SCU_H_PLL_PARAMETER0_MASK(x)	(0x3ff << 22)
+#define SCU_H_PLL_GET_PARAMETER0(x)		((x >> 22) & 0x3ff)
+#define SCU_H_PLL_RESET					(0x1 << 21)
+#define SCU_H_PLL_BYPASS_EN			(0x1 << 20)
+#define SCU_H_PLL_OFF					(0x1 << 19)
+#define SCU_H_PLL_PNUM(x)				(x << 13)
+#define SCU_H_PLL_GET_PNUM(x)			((x >> 13) & 0x3f)
+#define SCU_H_PLL_PNUM_MASK			(0x3f << 13)
+#define SCU_H_PLL_MNUM(x)				(x << 5)
+#define SCU_H_PLL_GET_MNUM(x)			((x >> 5) & 0xff)
+#define SCU_H_PLL_MNUM_MASK			(0xff << 5)
+#define SCU_H_PLL_NNUM(x)				(x)
+#define SCU_H_PLL_GET_NNUM(x)			(x & 0xf)
+#define SCU_H_PLL_NNUM_MASK			(0xf)
+#else
+#define SCU_H_PLL_PARAMETER				(0x1 << 18)
+#define SCU_H_PLL_BYPASS_EN				(0x1 << 17)
+#define SCU_H_PLL_OFF					(0x1 << 16)
+#define SCU_H_PLL_NUM(x)				(x << 5)
+#define SCU_H_PLL_GET_NUM(x)			((x >> 5) & 0x3f)
+#define SCU_H_PLL_NUM_MASK				(0x3f << 5)
+#define SCU_H_PLL_OUT_DIV				(0x1 << 4)
+#define SCU_H_PLL_GET_DIV(x)			((x >> 4) & 0x1)
+#define SCU_H_PLL_DENUM(x)				(x)
+#define SCU_H_PLL_GET_DENUM(x)			(x & 0xf)
+#define SCU_H_PLL_DENUM_MASK			(0xf)
+#endif
+
+/* 	AST_SCU_MH_PLL_EXTEND : 0x148 - Extended Parameter of M/H-PLL register */
+#define SCU_H_PLL_GET_PARAMETER1(x)		((x >> 16) & 0x3f)
+#define SCU_H_PLL_PARAMETER1_MASK(x)	(0x3f << 16)
+#define SCU_M_PLL_GET_PARAMETER1(x)		(x & 0x3f)
+#define SCU_M_PLL_PARAMETER1_MASK(x)	(0x3f)
+
+#ifdef AST_SOC_G5
+/*	AST_SCU_D_PLL : 0x28 - D-PLL Parameter  register	*/
+#define SCU_D_PLL_GET_SIP(x)				((x >>27) & 0x1f)
+#define SCU_D_PLL_GET_SIC(x)				((x >>22) & 0x1f)
+#define SCU_D_PLL_GET_ODNUM(x)			((x >>19) & 0x7)
+#define SCU_D_PLL_GET_PNUM(x)			((x >>13) & 0x3f)
+#define SCU_D_PLL_GET_NNUM(x)			((x >>8) & 0x1f)
+#define SCU_D_PLL_GET_MNUM(x)			(x & 0xff)
+
+/*	AST_SCU_D_PLL_EXTEND : 0x130 - D-PLL Extended Parameter  register	*/
+#define SCU_D_PLL_SET_MODE(x)			((x & 0x3) << 3)
+#define SCU_D_PLL_RESET					(0x1 << 2)
+#define SCU_D_PLL_BYPASS				(0x1 << 1)
+#define SCU_D_PLL_OFF					(0x1)
+
+#else
+/*	AST_SCU_FREQ_LIMIT : 0x28 - frequency counter comparsion register */
+#define SCU_FREQ_U_LIMIT(x)			(x << 16)
+#define SCU_FREQ_U_LIMIT_MASK		(0x3fff << 16)
+#define SCU_FREQ_L_LIMIT(x)			(x)
+#define SCU_FREQ_L_LIMIT_MASK		(0x3fff)
+#endif
+
+/*	AST_SCU_MISC1_CTRL : 0x2C - Misc. Control register */
+#define SCU_MISC_JTAG_MASTER_DIS	(0x1 << 26)
+#define SCU_MISC_DRAM_W_P2A_DIS		(0x1 << 25)
+#define SCU_MISC_SPI_W_P2A_DIS		(0x1 << 24)
+#define SCU_MISC_SOC_W_P2A_DIS		(0x1 << 23)
+#define SCU_MISC_FLASH_W_P2A_DIS	(0x1 << 22)
+#ifdef AST_SOC_G5
+#define SCU_MISC_CRT_CLK_H_SOURCE		(0x1 << 21)
+#define SCU_MISC_D_PLL_SOURCE			(0x1 << 20)
+#else
+#define SCU_MISC_D_PLL_ASSIGN(x)	(x << 20)
+#define SCU_MISC_D_PLL_ASSIGN_MASK	(0x3 << 20)
+#endif
+#define SCU_MISC_VGA_CONFIG_PREFETCH	(0x1 << 19)
+#define SCU_MISC_DVO_SOURCE_CRT			(0x1 << 18) 	//0:VGA , 1:CRT
+#define SCU_MISC_DAC_MASK				(0x3 << 16)
+#define SCU_MISC_SET_DAC_SOURCE(x)		(x << 16)
+#define SCU_MISC_DAC_SOURCE_CRT			(0x1 << 16)		//00 VGA, 01: CRT, 1x: PASS-Through DVO
+#define SCU_MISC_DAC_SOURCE_MASK		(0x3 << 16)
+#define SCU_MISC_JTAG_TO_PCIE_EN		(0x1 << 15)
+#define SCU_MISC_JTAG__M_TO_PCIE_EN		(0x1 << 14)
+#define SCU_MISC_VUART_TO_CTRL			(0x1 << 13)
+#define SCU_MISC_DIV13_EN				(0x1 << 12)
+#define SCU_MISC_Y_CLK_INVERT			(0x1 << 11)
+#define SCU_MISC_OUT_DELAY				(0x1 << 9)
+#define SCU_MISC_PCI_TO_AHB_DIS			(0x1 << 8)
+#define SCU_MISC_2D_CRT_EN				(0x1 << 7)
+#define SCU_MISC_VGA_CRT_DIS			(0x1 << 6)
+#define SCU_MISC_VGA_REG_ACCESS_EN		(0x1 << 5)
+#define SCU_MISC_D2_PLL_DIS				(0x1 << 4)
+#define SCU_MISC_DAC_DIS				(0x1 << 3)
+#define SCU_MISC_D_PLL_DIS				(0x1 << 2)
+#define SCU_MISC_OSC_CLK_OUT_PIN		(0x1 << 1)
+#define SCU_MISC_LPC_TO_SPI_DIS			(0x1 << 0)
+
+/*	AST_SCU_PCI_CONF1 : 0x30 - PCI configuration setting register#1 */
+#define SCU_PCI_DEVICE_ID(x)			(x << 16)
+#define SCU_PCI_VENDOR_ID(x)			(x)
+
+/*	AST_SCU_PCI_CONF2	0x34		PCI configuration setting register#2 */
+#define SCU_PCI_SUB_SYS_ID(x)			(x << 16)
+#define SCU_PCI_SUB_VENDOR_ID(x)		(x)
+
+/*	AST_SCU_PCI_CONF3	0x38		PCI configuration setting register#3 */
+#define SCU_PCI_CLASS_CODE(x)			(x << 8)
+#define SCU_PCI_REVISION_ID(x)			(x)
+
+/*	AST_SCU_SYS_CTRL	0x3C		System reset contrl/status register*/
+#if defined(CONFIG_ARCH_AST1010)
+#define SCU_SYS_WDT_FULL_FLAG			(0x1 << 2)
+#define SCU_SYS_WDT_SOC_RESET			(0x1 << 1)
+#elif defined(AST_SOC_G5)
+#define SCU_SYS_WDT3_RESET_FLAG			(0x1 << 4)
+#define SCU_SYS_WDT2_RESET_FLAG			(0x1 << 3)
+#define SCU_SYS_WDT_RESET_FLAG			(0x1 << 2)
+#define SCU_SYS_EXT_RESET_FLAG			(0x1 << 1)
+#else
+#define SCU_SYS_EXT_SOC_RESET_EN		(0x1 << 3)
+#define SCU_SYS_EXT_RESET_FLAG			(0x1 << 2)
+#define SCU_SYS_WDT_RESET_FLAG			(0x1 << 1)
+#endif
+#define SCU_SYS_PWR_RESET_FLAG			(0x1 << 0)
+
+/*	AST_SCU_SOC_SCRATCH0	0x40		SOC scratch 0~31 register */
+
+
+
+
+/*	AST_SCU_SOC_SCRATCH1	0x44		SOC scratch 32~63 register */
+
+
+/*	AST_SCU_VGA0		0x40		VGA fuction handshake register */
+#define SCU_VGA_SLT_HANDSHAKE(x)		(x << 24)
+#define SCU_VGA_SLT_HANDSHAKE_MASK		(0xff << 24)
+#define SCU_VGA_CTM_DEF(x)				(x << 16)
+#define SCU_VGA_CTM_DEF_MASK			(0xff << 16)
+#define SCU_MAC0_PHY_MODE(x)			(x << 14)
+#define SCU_MAC0_GET_PHY_MODE(x)		((x >> 14) & 0x3)
+#define SCU_MAC0_PHY_MODE_MASK(x)		(0x3 << 14)
+#define SCU_MAC1_PHY_MODE(x)			(x << 12)
+#define SCU_MAC1_PHY_MODE_MASK			(0x3 << 12)
+#define SCU_MAC1_GET_PHY_MODE(x)		((x >> 12) & 0x3)
+
+#define SCU_VGA_ASPEED_DEF(x)			(x << 8)
+#define SCU_VGA_ASPEED_DEF_MASK			(0xf << 8)
+
+#define SCU_VGA_DRAM_INIT_MASK(x)		((x >> 7) & 0x1)
+
+/*	AST_SCU_VGA1		0x44		VGA fuction handshake register */
+
+
+/*	AST_SCU_MAC_CLK		0x48		MAC interface clock delay setting register */
+
+
+
+/*	AST_SCU_MISC2_CTRL		0x4C		Misc. 2 Control register */
+#ifdef AST_SOC_G5
+#define SCU_PCIE_MAPPING_HIGH			(1 << 15)
+#define SCU_MALI_DTY_MODE				(1 << 8)
+#define SCU_MALI_RC_MODE				(1 << 7)
+#endif
+#define SCU_PCI_BM_ENABLE				(1 << 6)
+#define SCU_DAC_GC_SET(x)				((x & 0x7) << 3)
+#define SCU_DAC_FS_SET(x)				(x & 0x7)
+
+/*	AST_SCU_VGA_SCRATCH0	0x50		VGA Scratch register */
+/*	AST_SCU_VGA_SCRATCH1	0x54		VGA Scratch register */
+/*	AST_SCU_VGA_SCRATCH2	0x58		VGA Scratch register */
+/*	AST_SCU_VGA_SCRATCH3	0x5c		VGA Scratch register */
+/*	AST_SCU_VGA_SCRATCH4	0x60		VGA Scratch register */
+/*	AST_SCU_VGA_SCRATCH5	0x64		VGA Scratch register */
+/*	AST_SCU_VGA_SCRATCH6	0x68		VGA Scratch register */
+/*	AST_SCU_VGA_SCRATCH7	0x6c		VGA Scratch register */
+
+/*	AST_SCU_HW_STRAP1			0x70		hardware strapping register */
+#ifdef AST_SOC_G5
+
+#define CLK_25M_IN					(0x1 << 23)
+
+#define SCU_HW_STRAP_2ND_BOOT_WDT		(0x1 << 17)
+#define SCU_HW_STRAP_SUPER_IO_CONFIG	(0x1 << 16)
+#define SCU_HW_STRAP_VGA_CLASS_CODE		(0x1 << 15)
+#define SCU_HW_STRAP_LPC_RESET_PIN		(0x1 << 14)
+#define SCU_HW_STRAP_SPI_MODE(x)			(x << 12)
+#define SCU_HW_STRAP_SPI_MODE_MASK		(0x3 << 12)
+#define SCU_HW_STRAP_SPI_MASTER			(0x1 << 12)
+#define SCU_HW_STRAP_SPI_M_S_EN			(0x2 << 12)
+#define SCU_HW_STRAP_SPI_PASS_THROUGH	(0x3 << 12)
+#define SCU_HW_STRAP_GET_AXI_AHB_RATIO(x)	((x >> 9) & 0x7)
+#define SCU_HW_STRAP_GET_CPU_AXI_RATIO(x)	((x >> 8) & 0x1)
+#define SCU_HW_STRAP_MAC1_RGMII		(0x1 << 7)
+#define SCU_HW_STRAP_MAC0_RGMII		(0x1 << 6)
+#define SCU_HW_STRAP_VGA_BIOS_ROM	(0x1 << 5)
+#define SCU_HW_STRAP_SPI_WIDTH		(0x1 << 4)
+
+#define SCU_HW_STRAP_VGA_SIZE_GET(x)	((x >> 2)& 0x3)
+#define SCU_HW_STRAP_VGA_MASK			(0x3 << 3)
+#define SCU_HW_STRAP_VGA_SIZE_SET(x)	(x << 2)
+
+#define VGA_8M_DRAM				0
+#define VGA_16M_DRAM			1
+#define VGA_32M_DRAM			2
+#define VGA_64M_DRAM			3
+
+#define SCU_HW_STRAP_DIS_BOOT 			(1)
+#else
+#define SCU_HW_STRAP_SW_DEFINE(x)		(x << 29)
+#define SCU_HW_STRAP_SW_DEFINE_MASK		(0x3 << 29)
+#define SCU_HW_STRAP_DRAM_SIZE			(x << 29)
+#define SCU_HW_STRAP_DRAM_SIZE_MASK		(0x3 << 29)
+
+#define SCU_HW_STRAP_DRAM_CONFIG		(x << 24)
+#define SCU_HW_STRAP_DRAM_CONFIG_MASK	(0x7 << 24)
+
+#define SCU_HW_STRAP_GPIOE_PT_EN		(0x1 << 22)
+#define SCU_HW_STRAP_GPIOD_PT_EN		(0x1 << 21)
+#define SCU_HW_STRAP_LPC_DEC_SUPER_IO	(0x1 << 20)
+#define SCU_HW_STRAP_ACPI_DIS			(0x1 << 19)
+
+//bit 23, 18 [1,0]
+#define SCU_HW_STRAP_SET_CLK_SOURCE(x)		((((x&0x3) >> 1)<<23)||((x&0x1) << 18))
+#define SCU_HW_STRAP_GET_CLK_SOURCE(x)		(((x>>23)&0x1<<1) | ((x>>18)&0x1))
+#define SCU_HW_STRAP_CLK_SOURCE_MASK		((0x1 << 23) | (0x1 << 18))
+
+#define CLK_25M_IN					(0x1 << 23)
+#define CLK_24M_IN					0
+#define CLK_48M_IN					1
+#define CLK_25M_IN_24M_USB_CKI		3
+#define CLK_25M_IN_48M_USB_CKI		3
+
+#define SCU_HW_STRAP_2ND_BOOT_WDT		(0x1 << 17)
+#define SCU_HW_STRAP_SUPER_IO_CONFIG	(0x1 << 16)
+#define SCU_HW_STRAP_VGA_CLASS_CODE		(0x1 << 15)
+#define SCU_HW_STRAP_LPC_RESET_PIN		(0x1 << 14)
+#define SCU_HW_STRAP_SPI_MODE(x)			(x << 12)
+#define SCU_HW_STRAP_SPI_MODE_MASK		(0x3 << 12)
+#define SCU_HW_STRAP_SPI_MASTER			(0x1 << 12)
+#define SCU_HW_STRAP_SPI_M_S_EN			(0x2 << 12)
+#define SCU_HW_STRAP_SPI_PASS_THROUGH	(0x3 << 12)
+
+#define SCU_HW_STRAP_SET_CPU_AHB_RATIO(x)		(x << 10)
+#define SCU_HW_STRAP_GET_CPU_AHB_RATIO(x)		((x >> 10) & 3)
+#define SCU_HW_STRAP_CPU_AHB_RATIO_MASK		(0x3 << 10)
+
+
+#define CPU_AHB_RATIO_1_1		0
+#define CPU_AHB_RATIO_2_1		1
+#define CPU_AHB_RATIO_4_1		2
+#define CPU_AHB_RATIO_3_1		3
+
+#define SCU_HW_STRAP_GET_H_PLL_CLK(x)	((x >> 8 )& 0x3)
+#define SCU_HW_STRAP_H_PLL_CLK_MASK		(0x3 << 8)
+#define CPU_384MHZ		0
+#define CPU_360MHZ		1
+#define CPU_336MHZ		2
+#define CPU_408MHZ		3
+
+#define SCU_HW_STRAP_MAC1_RGMII		(0x1 << 7)
+#define SCU_HW_STRAP_MAC0_RGMII		(0x1 << 6)
+#define SCU_HW_STRAP_VGA_BIOS_ROM	(0x1 << 5)
+#define SCU_HW_STRAP_SPI_WIDTH		(0x1 << 4)
+#define SCU_HW_STRAP_VGA_SIZE_GET(x)		((x >> 2)& 0x3)
+#define SCU_HW_STRAP_VGA_MASK			(0x3 << 2)
+#define SCU_HW_STRAP_VGA_SIZE_SET(x)		(x << 2)
+
+#define VGA_8M_DRAM			0
+#define VGA_16M_DRAM			1
+#define VGA_32M_DRAM			2
+#define VGA_64M_DRAM			3
+
+#define SCU_HW_STRAP_BOOT_MODE(x)		(x)
+#define NOR_BOOT		0
+#define NAND_BOOT		1
+#define SPI_BOOT		2
+#define DIS_BOOT		3
+#endif
+/*	AST_SCU_RAMDOM_GEN		0x74		random number generator register */
+#define RNG_TYPE_MASK			(0x7 << 1)
+#define RNG_SET_TYPE(x)			((x) << 1)
+#define RNG_GET_TYPE(x)			(((x) >> 1)  & 0x7)
+#define RNG_ENABLE				0x1
+/*	AST_SCU_RAMDOM_DATA		0x78		random number generator data output*/
+
+/*	AST_SCU_MULTI_FUNC_2	0x78 */
+
+#define MULTI_FUNC_VIDEO_RGB18			(0x1 << 2)
+#define MULTI_FUNC_VIDEO_SINGLE_EDGE	(0x1 << 0)
+
+
+
+/*	AST_SCU_REVISION_ID		0x7C		Silicon revision ID register */
+#define AST_SOC_GEN				24
+#define AST1100_A0				0x00000200
+#define AST1100_A1				0x00000201
+#define AST1100_A2				0x00000202
+#define AST1100_A3				0x00000202
+
+#define AST2050_A0				0x00000200
+#define AST2050_A1				0x00000201
+#define AST2050_A2				0x00000202
+#define AST2050_A3				0x00000202
+
+#define AST2100_A0				0x00000300
+#define AST2100_A1				0x00000301
+#define AST2100_A2				0x00000302
+#define AST2100_A3				0x00000302
+
+#define AST2200_A0				0x00000102
+#define AST2200_A1				0x00000102
+
+#define AST2300_A0				0x01000003
+#define AST2300_A1				0x01010303
+#define AST1300_A1				0x01010003
+#define AST1050_A1				0x01010203
+
+#define AST2400_A0				0x02000303
+
+#define GET_CHIP_REVISION(x)			((x & 0xff000000) >> 24)
+
+#define GET_HW_REVISION_ID(x)	((x & 0xff0000) >> 16)
+
+#define AST_DRAM_BASE_4		0x40000000
+#define AST_DRAM_BASE_8		0x80000000
+
+/*	AST_SCU_FUN_PIN_CTRL1		0x80		Multi-function Pin Control#1*/
+#define SCU_FUN_PIN_UART4_RXD	(0x1 << 31)
+#define SCU_FUN_PIN_UART4_TXD	(0x1 << 30)
+#define SCU_FUN_PIN_UART4_NRTS	(0x1 << 29)
+#define SCU_FUN_PIN_UART4_NDTR	(0x1 << 28)
+#define SCU_FUN_PIN_UART4_NRI	(0x1 << 27)
+#define SCU_FUN_PIN_UART4_NDSR	(0x1 << 26)
+#define SCU_FUN_PIN_UART4_NDCD	(0x1 << 25)
+#define SCU_FUN_PIN_UART4_NCTS	(0x1 << 24)
+#define SCU_FUN_PIN_UART3_RXD	(0x1 << 23)
+#define SCU_FUN_PIN_UART3_TXD	(0x1 << 22)
+#define SCU_FUN_PIN_UART3_NRTS	(0x1 << 21)
+#define SCU_FUN_PIN_UART3_NDTR	(0x1 << 20)
+#define SCU_FUN_PIN_UART3_NRI	(0x1 << 19)
+#define SCU_FUN_PIN_UART3_NDSR	(0x1 << 18)
+#define SCU_FUN_PIN_UART3_NDCD	(0x1 << 17)
+#define SCU_FUN_PIN_UART3_NCTS	(0x1 << 16)
+
+
+
+
+#define SCU_FUN_PIN_MAC1_PHY_LINK	(0x1 << 1)
+#define SCU_FUN_PIN_MAC0_PHY_LINK	(0x1)
+
+
+/*	AST_SCU_FUN_PIN_CTRL2		0x84		Multi-function Pin Control#2*/
+#define SCU_FUN_PIN_VPIB9		(0x1 << 31)
+#define SCU_FUN_PIN_VPIB8		(0x1 << 30)
+#define SCU_FUN_PIN_VPIB7		(0x1 << 29)
+#define SCU_FUN_PIN_VPIB6		(0x1 << 28)
+#define SCU_FUN_PIN_VPIB5		(0x1 << 27)
+#define SCU_FUN_PIN_VPIB4		(0x1 << 26)
+#define SCU_FUN_PIN_VPIB3		(0x1 << 25)
+#define SCU_FUN_PIN_VPIB2		(0x1 << 24)
+#define SCU_FUN_PIN_VPIB1		(0x1 << 23)
+#define SCU_FUN_PIN_VPIB0		(0x1 << 22)
+#define SCU_FUN_PIN_VPICLK		(0x1 << 21)
+#define SCU_FUN_PIN_VPIVS		(0x1 << 20)
+#define SCU_FUN_PIN_VPIHS		(0x1 << 19)
+#define SCU_FUN_PIN_VPIODD		(0x1 << 18)
+#define SCU_FUN_PIN_VPIDE		(0x1 << 17)
+
+#define SCU_FUN_PIN_DDCDAT		(0x1 << 15)
+#define SCU_FUN_PIN_DDCCLK		(0x1 << 14)
+#define SCU_FUN_PIN_VGAVS		(0x1 << 13)
+#define SCU_FUN_PIN_VGAHS		(0x1 << 12)
+
+#define SCU_FUN_PIN_UART2_RXD	(0x1 << 31)
+#define SCU_FUN_PIN_UART2_TXD	(0x1 << 30)
+#define SCU_FUN_PIN_UART2_NRTS	(0x1 << 29)
+#define SCU_FUN_PIN_UART2_NDTR	(0x1 << 28)
+#define SCU_FUN_PIN_UART2_NRI	(0x1 << 27)
+#define SCU_FUN_PIN_UART2_NDSR	(0x1 << 26)
+#define SCU_FUN_PIN_UART2_NDCD	(0x1 << 25)
+#define SCU_FUN_PIN_UART2_NCTS	(0x1 << 24)
+#define SCU_FUN_PIN_UART1_RXD	(0x1 << 23)
+#define SCU_FUN_PIN_UART1_TXD	(0x1 << 22)
+#define SCU_FUN_PIN_UART1_NRTS	(0x1 << 21)
+#define SCU_FUN_PIN_UART1_NDTR	(0x1 << 20)
+#define SCU_FUN_PIN_UART1_NRI	(0x1 << 19)
+#define SCU_FUN_PIN_UART1_NDSR	(0x1 << 18)
+#define SCU_FUN_PIN_UART1_NDCD	(0x1 << 17)
+#define SCU_FUN_PIN_UART1_NCTS	(0x1 << 16)
+
+#define SCU_FUN_PIN_SGPMI		(0x1 << 11)
+#define SCU_FUN_PIN_SGPMO		(0x1 << 10)
+#define SCU_FUN_PIN_SGPMLD		(0x1 << 9)
+#define SCU_FUN_PIN_SGPMCK		(0x1 << 8)
+
+#if defined(AST_SOC_G5)
+#define SCU_FUN_PIN_I2C4_SALT4	(0x1 << 7)
+#define SCU_FUN_PIN_I2C3_SALT3	(0x1 << 6)
+#define SCU_FUN_PIN_I2C2_SALT2	(0x1 << 5)
+#define SCU_FUN_PIN_I2C1_SALT1	(0x1 << 4)
+#else
+#define SCU_FUN_PIN_NAND_FLWP	(0x1 << 7)
+#define SCU_FUN_PIN_NAND_FLBUSY	(0x1 << 6)
+#endif
+
+/*	AST_SCU_FUN_PIN_CTRL3		0x88		Multi-function Pin Control#3*/
+#if	defined(CONFIG_ARCH_AST1010)
+#define SCU_FUN_PIN_MAC0_MDIO	(0x1 << 23)
+#define SCU_FUN_PIN_MAC0_MDC	(0x1 << 22)
+#else
+#define SCU_FUN_PIN_MAC0_MDIO	(0x1 << 31)
+#define SCU_FUN_PIN_MAC0_MDC	(0x1 << 30)
+#define SCU_FUN_PIN_ROMA25		(0x1 << 29)
+#define SCU_FUN_PIN_ROMA24		(0x1 << 28)
+#define SCU_FUN_PIN_ROMCS4		(0x1 << 27)
+#define SCU_FUN_PIN_ROMCS3		(0x1 << 26)
+#define SCU_FUN_PIN_ROMCS2		(0x1 << 25)
+#define SCU_FUN_PIN_ROMCS1		(0x1 << 24)
+#define SCU_FUN_PIN_ROMCS(x)	(0x1 << (23+x))
+
+#define SCU_FUN_PIN_USBP4_DN	(0x1 << 23)
+#define SCU_FUN_PIN_USBP4_DP	(0x1 << 22)
+#define SCU_FUN_PIN_USBP3_DN	(0x1 << 21)
+#define SCU_FUN_PIN_USBP3_DP	(0x1 << 20)
+//Video pin
+#define SCU_FUN_PIN_VPIR9		(0x1 << 19)
+#define SCU_FUN_PIN_VPIR8		(0x1 << 18)
+#define SCU_FUN_PIN_VPIR7		(0x1 << 17)
+#define SCU_FUN_PIN_VPIR6		(0x1 << 16)
+#define SCU_FUN_PIN_VPIR5		(0x1 << 15)
+#define SCU_FUN_PIN_VPIR4		(0x1 << 14)
+#define SCU_FUN_PIN_VPIR3		(0x1 << 13)
+#define SCU_FUN_PIN_VPIR2		(0x1 << 12)
+#define SCU_FUN_PIN_VPIR1		(0x1 << 11)
+#define SCU_FUN_PIN_VPIR0		(0x1 << 10)
+#define SCU_FUN_PIN_VPIG9		(0x1 << 9)
+#define SCU_FUN_PIN_VPIG8		(0x1 << 8)
+#define SCU_FUN_PIN_VPIG7		(0x1 << 7)
+#define SCU_FUN_PIN_VPIG6		(0x1 << 6)
+#define SCU_FUN_PIN_VPIG5		(0x1 << 5)
+#define SCU_FUN_PIN_VPIG4		(0x1 << 4)
+#define SCU_FUN_PIN_VPIG3		(0x1 << 3)
+#define SCU_FUN_PIN_VPIG2		(0x1 << 2)
+#define SCU_FUN_PIN_VPIG1		(0x1 << 1)
+#define SCU_FUN_PIN_VPIG0		(0x1 << 0)
+#endif
+
+
+//pwm pin
+#define SCU_FUN_PIN_PWM_TACHO	(0)
+/*	AST_SCU_FUN_PIN_CTRL4		0x8C		Multi-function Pin Control#4*/
+#define SCU_FUN_PIN_ROMA23		(0x1 << 7)
+#define SCU_FUN_PIN_ROMA22		(0x1 << 6)
+
+#define SCU_FUN_PIN_ROMWE		(0x1 << 5)
+#define SCU_FUN_PIN_ROMOE		(0x1 << 4)
+#define SCU_FUN_PIN_ROMD7		(0x1 << 3)
+#define SCU_FUN_PIN_ROMD6		(0x1 << 2)
+#define SCU_FUN_PIN_ROMD5		(0x1 << 1)
+#define SCU_FUN_PIN_ROMD4		(0x1)
+
+/*	AST_SCU_FUN_PIN_CTRL5		0x90		Multi-function Pin Control#5*/
+#define SCU_FUN_PIN_SPICS1		(0x1 << 31)
+#define SCU_FUN_PIN_LPC_PLUS	(0x1 << 30)
+#define SCU_FUC_PIN_USB20_HOST	(0x1 << 29)
+#define SCU_FUC_PIN_USB11_PORT4	(0x1 << 28)
+#define SCU_FUC_PIN_I2C14		(0x1 << 27)
+#define SCU_FUC_PIN_I2C13		(0x1 << 26)
+#define SCU_FUC_PIN_I2C12		(0x1 << 25)
+#define SCU_FUC_PIN_I2C11		(0x1 << 24)
+#define SCU_FUC_PIN_I2C10		(0x1 << 23)
+#define SCU_FUC_PIN_I2C9		(0x1 << 22)
+#define SCU_FUC_PIN_I2C8		(0x1 << 21)
+#define SCU_FUC_PIN_I2C7		(0x1 << 20)
+#define SCU_FUC_PIN_I2C6		(0x1 << 19)
+#define SCU_FUC_PIN_I2C5		(0x1 << 18)
+#define SCU_FUC_PIN_I2C4		(0x1 << 17)
+#define SCU_FUC_PIN_I2C3		(0x1 << 16)
+#define SCU_FUC_PIN_MII2_RX_DWN_DIS		(0x1 << 15)
+#define SCU_FUC_PIN_MII2_TX_DWN_DIS		(0x1 << 14)
+#define SCU_FUC_PIN_MII1_RX_DWN_DIS		(0x1 << 13)
+#define SCU_FUC_PIN_MII1_TX_DWN_DIS		(0x1 << 12)
+
+#define SCU_FUC_PIN_MII2_TX_DRIV(x)		(x << 10)
+#define SCU_FUC_PIN_MII2_TX_DRIV_MASK	(0x3 << 10)
+#define SCU_FUC_PIN_MII1_TX_DRIV(x)		(x << 8)
+#define SCU_FUC_PIN_MII1_TX_DRIV_MASK	(0x3 << 8)
+
+#define MII_NORMAL_DRIV	0x0
+#define MII_HIGH_DRIV	0x2
+
+#define SCU_FUC_PIN_UART6		(0x1 << 7)
+#define SCU_FUC_PIN_ROM_16BIT	(0x1 << 6)
+#define SCU_FUC_PIN_DIGI_V_OUT(x)	(x)
+#define SCU_FUC_PIN_DIGI_V_OUT_MASK	(0x3)
+
+#define VIDEO_DISABLE	0x0
+#define VIDEO_12BITS	0x1
+#define VIDEO_24BITS	0x2
+//#define VIDEO_DISABLE	0x3
+
+#define SCU_FUC_PIN_USB11_PORT2	(0x1 << 3)
+#define SCU_FUC_PIN_SD1_8BIT		(0x1 << 3)
+
+#define SCU_FUC_PIN_MAC1_MDIO		(0x1 << 2)
+#define SCU_FUC_PIN_SD2		(0x1 << 1)
+#define SCU_FUC_PIN_SD1		(0x1 << 0)
+
+
+/*	AST_SCU_FUN_PIN_CTRL6		0x94		Multi-function Pin Control#6*/
+#define SCU_FUN_PIN_USBP1_MODE(x)	(x << 13)	/* Select USB2.0 Port\#2 function mode */
+#define SCU_FUN_PIN_USBP1_MASK		(0x3 << 13)	/* Select USB2.0 Port\#2 function mode */
+#define USB_HID_MODE	0
+#define USB_DEV_MODE	1
+#define USB_HOST_MODE	2
+#define SCU_FUN_PIN_SGPIOP2			(0x1 << 12)	/* Enable Slave SGPIO port 2 function pins */
+#define SCU_FUN_PIN_UART13			(0x1 << 11)	/* Enable UART13 function pins */
+#define SCU_FUN_PIN_UART12			(0x1 << 10)	/* Enable UART12 function pins */
+#define SCU_FUN_PIN_UART11			(0x1 << 9)	/* Enable UART11 function pins */
+#define SCU_FUN_PIN_UART10			(0x1 << 8)	/* Enable UART10 function pins */
+#define SCU_FUN_PIN_UART9			(0x1 << 7)	/* Enable UART9 function pins */
+#define SCU_FUN_PIN_UART8			(0x1 << 6)	/* Enable UART8 function pins */
+#define SCU_FUN_PIN_UART7			(0x1 << 5)	/* Enable UART7 function pins */
+#define SCU_FUN_PIN_I2S2			(0x1 << 4)
+#define SCU_FUN_PIN_I2S1			(0x1 << 3)
+#define SCU_FUN_PIN_VIDEO_SO		(0x1 << 2)
+#define SCU_FUN_PIN_DVO_24BIT		(0x1)
+#define SCU_VIDEO_OUT_MASK		(~0x3)
+
+/*	AST_SCU_WDT_RESET		0x9C		Watchdog Reset Selection */
+/*	AST_SCU_FUN_PIN_CTRL7		0xA0		Multi-function Pin Control#7*/
+/*	AST_SCU_FUN_PIN_CTRL8		0xA4		Multi-function Pin Control#8*/
+#define SCU_FUN_PIN_ROMA17		(0x1 << 31)
+#define SCU_FUN_PIN_ROMA16		(0x1 << 30)
+#define SCU_FUN_PIN_ROMA15		(0x1 << 29)
+#define SCU_FUN_PIN_ROMA14		(0x1 << 28)
+#define SCU_FUN_PIN_ROMA13		(0x1 << 27)
+#define SCU_FUN_PIN_ROMA12		(0x1 << 26)
+#define SCU_FUN_PIN_ROMA11		(0x1 << 25)
+#define SCU_FUN_PIN_ROMA10		(0x1 << 24)
+#define SCU_FUN_PIN_ROMA9		(0x1 << 23)
+#define SCU_FUN_PIN_ROMA8		(0x1 << 22)
+#define SCU_FUN_PIN_ROMA7		(0x1 << 21)
+#define SCU_FUN_PIN_ROMA6		(0x1 << 20)
+#define SCU_FUN_PIN_ROMA5		(0x1 << 19)
+#define SCU_FUN_PIN_ROMA4		(0x1 << 18)
+#define SCU_FUN_PIN_ROMA3		(0x1 << 17)
+#define SCU_FUN_PIN_ROMA2		(0x1 << 16)
+
+/*	AST_SCU_FUN_PIN_CTRL9		0xA8		Multi-function Pin Control#9*/
+#define SCU_FUN_PIN_ROMA21		(0x1 << 3)
+#define SCU_FUN_PIN_ROMA20		(0x1 << 2)
+#define SCU_FUN_PIN_ROMA19		(0x1 << 1)
+#define SCU_FUN_PIN_ROMA18		(0x1)
+
+/*	AST_SCU_PWR_SAVING_EN		0xC0		Power Saving Wakeup Enable*/
+/*	AST_SCU_PWR_SAVING_CTRL		0xC4		Power Saving Wakeup Control*/
+/*	AST_SCU_HW_STRAP2			0xD0		Haardware strapping register set 2*/
+
+
+/*	AST_SCU_COUNTER4			0xE0		SCU Free Run Counter Read Back #4*/
+/*	AST_SCU_COUNTER4_EXT		0xE4		SCU Free Run Counter Extended Read Back #4*/
+
+//CPU 2
+/*	AST_SCU_CPU2_CTRL			0x100		CPU2 Control Register*/
+/*	AST_SCU_CPU2_BASE0_ADDR		0x104		CPU2 Base Address for Segment 0x00:0000~0x1F:FFFF*/
+/*	AST_SCU_CPU2_BASE1_ADDR		0x108		CPU2 Base Address for Segment 0x20:0000~0x3F:FFFF*/
+/*	AST_SCU_CPU2_BASE2_ADDR		0x10C		CPU2 Base Address for Segment 0x40:0000~0x5F:FFFF*/
+/*	AST_SCU_CPU2_BASE3_ADDR		0x110		CPU2 Base Address for Segment 0x60:0000~0x7F:FFFF*/
+/*	AST_SCU_CPU2_BASE4_ADDR		0x114		CPU2 Base Address for Segment 0x80:0000~0xFF:FFFF*/
+/*	AST_SCU_CPU2_CACHE_CTRL		0x118		CPU2 Cache Function Control */
+
+#if defined(CONFIG_ARCH_AST1010)
+/*	AST_SCU_CPU_CACHE_CTRL		0x11C		CPU Cache Function Control*/
+#define SCU_AREA7_CACHE_EN		(0x1 << 8)
+#define SCU_AREA6_CACHE_EN		(0x1 << 7)
+#define SCU_AREA5_CACHE_EN		(0x1 << 6)
+#define SCU_AREA4_CACHE_EN		(0x1 << 5)
+#define SCU_AREA3_CACHE_EN		(0x1 << 4)
+#define SCU_AREA2_CACHE_EN		(0x1 << 3)
+#define SCU_AREA1_CACHE_EN		(0x1 << 2)
+#define SCU_AREA0_CACHE_EN		(0x1 << 1)
+#define SCU_CACHE_EN			(0x1)
+#endif
+//
+/*	AST_SCU_UART24_REF			0x160		Generate UART 24Mhz Ref from H-PLL when CLKIN is 25Mhz */
+/*	AST_SCU_PCIE_CONFIG_SET		0x180		PCI-E Configuration Setting Control Register */
+/*	AST_SCU_BMC_MMIO_DEC		0x184		BMC MMIO Decode Setting Register */
+/*	AST_SCU_DEC_AREA1			0x188		1st relocated controller decode area location */
+/*	AST_SCU_DEC_AREA2			0x18C		2nd relocated controller decode area location */
+/*	AST_SCU_MBOX_DEC_AREA		0x190		Mailbox decode area location*/
+/*	AST_SCU_SRAM_DEC_AREA0		0x194		Shared SRAM area decode location*/
+/*	AST_SCU_SRAM_DEC_AREA1		0x198		Shared SRAM area decode location*/
+/*	AST_SCU_BMC_CLASS			0x19C		BMC device class code and revision ID */
+/*	AST_SCU_BMC_DEV_ID			0x1A4		BMC device ID */
+
+#endif
diff --git a/arch/arm/include/asm/arch-aspeed/regs-sdmc.h b/arch/arm/include/asm/arch-aspeed/regs-sdmc.h
new file mode 100644
index 000000000000..55ce2f2df0ab
--- /dev/null
+++ b/arch/arm/include/asm/arch-aspeed/regs-sdmc.h
@@ -0,0 +1,38 @@
+/* arch/arm/mach-aspeed/include/mach/regs-sdmc.h
+ *
+ * Copyright (C) 2012-2020  ASPEED Technology Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ *   History      :
+ *    1. 2012/12/29 Ryan Chen Create
+ *
+********************************************************************************/
+#ifndef __AST_SDMC_H
+#define __AST_SDMC_H                     1
+
+/*
+ *  Register for SDMC
+ *  */
+#define AST_SDMC_PROTECT	0x00		/*	protection key register	*/
+#define AST_SDMC_CONFIG		0x04		/*	Configuration register */
+
+/*	AST_SDMC_PROTECT: 0x00  - protection key register */
+#define SDMC_PROTECT_UNLOCK			0xFC600309
+
+#if defined(CONFIG_ARCH_AST1010)
+/*	AST_SDMC_CONFIG :0x04	 - Configuration register */
+#define SDMC_CONFIG_16MB			1
+
+#else
+/*	AST_SDMC_CONFIG :0x04	 - Configuration register */
+#define SDMC_CONFIG_VER_NEW		(0x1 << 28)
+#define SDMC_CONFIG_MEM_GET(x)		(x & 0x3)
+
+#define SDMC_CONFIG_CACHE_EN		(0x1 << 10)
+#define SDMC_CONFIG_EEC_EN			(0x1 << 7)
+#endif
+
+#endif
diff --git a/arch/arm/include/asm/arch-aspeed/regs-spi.h b/arch/arm/include/asm/arch-aspeed/regs-spi.h
new file mode 100644
index 000000000000..a5cb39f6e771
--- /dev/null
+++ b/arch/arm/include/asm/arch-aspeed/regs-spi.h
@@ -0,0 +1,55 @@
+/*
+ * Register definitions for the AST SPI Controller
+ */
+
+/* Register offsets */
+#define AST_SPI_CONFIG			0x00
+#define AST_SPI_CTRL			0x04
+#define AST_SPI_DMA_STS			0x08
+#define AST_SPI_MISC			0x10
+#define AST_SPI_TIMING			0x14
+
+#define AST_SPI_DMA_CTRL		0x80
+#define AST_SPI_DMA_FLASH_BASE	0x84
+#define AST_SPI_DMA_DRAM_BASE	0x88
+#define AST_SPI_DMA_LENGTH		0x8c
+
+
+/* AST_SPI_CONFIG 0x00 : SPI Flash Configuration Register */
+#define SPI_CONF_CS1			(0x1 << 2)
+#define SPI_CONF_CLKX2			(0x1 << 1)
+#define SPI_CONF_WRITE_EN		(0x1)
+
+/* FMC_CE0_CTRL	for SPI 0x10, 0x14, 0x18, 0x1c, 0x20 */
+#define SPI_IO_MODE(x)			(x << 28)
+#define SPI_SINGLE_BIT			0
+#define SPI_DUAL_BIT_D			2
+#define SPI_DUAL_BIT_DA			3
+#define SPI_CE_WIDTH(x)			(x << 24)
+#define SPI_CMD_DATA(x)			(x << 16)
+#define SPI_DUMMY_CMD			(1 << 15)
+#define SPI_DUMMY_HIGH			(1 << 14)
+//#define SPI_CLK_DIV				(1 << 13)		?? TODO ask....
+//#define SPI_ADDR_CYCLE			(1 << 13)		?? TODO ask....
+#define SPI_CMD_MERGE_DIS		(1 << 12)
+#define SPI_CLK_DIV(x)			(x << 8)
+#define SPI_CLK_DIV_MASK		(0xf << 8)
+
+#define SPI_DUMMY_LOW			(x << 6)
+#define SPI_LSB_FIRST_CTRL		(1 << 5)
+#define SPI_CPOL_1				(1 << 4)
+#define SPI_DUAL_DATA			(1 << 3)
+#define SPI_CE_INACTIVE			(1 << 2)
+#define SPI_CMD_MODE			(x)
+#define SPI_CMD_NOR_R_MODE		0
+#define SPI_CMD_FAST_R_MODE		1
+#define SPI_CMD_NOR_W_MODE		2
+#define SPI_CMD_USER_MODE		3
+
+/* AST_SPI_DMA_CTRL				0x80 */
+#define SPI_DMA_EN				(1 << 0)
+
+
+#define FLASH_STATUS_DMA_BUSY		0x0000
+#define FLASH_STATUS_DMA_READY		0x0800
+#define FLASH_STATUS_DMA_CLEAR		0x0800
diff --git a/arch/arm/include/asm/mach-types.h b/arch/arm/include/asm/mach-types.h
index d51be0b1d2f8..8b0c2438fe3c 100644
--- a/arch/arm/include/asm/mach-types.h
+++ b/arch/arm/include/asm/mach-types.h
@@ -1107,6 +1107,7 @@ extern unsigned int __machine_arch_type;
 #define MACH_TYPE_COLIBRI_T30          4493
 #define MACH_TYPE_APALIS_T30           4513
 #define MACH_TYPE_OMAPL138_LCDK        2495
+#define MACH_TYPE_ASPEED               8888
 
 #ifdef CONFIG_ARCH_EBSA110
 # ifdef machine_arch_type
@@ -14188,6 +14189,18 @@ extern unsigned int __machine_arch_type;
 # define machine_is_apalis_t30()	(0)
 #endif
 
+#ifdef CONFIG_MACH_ASPEED
+# ifdef machine_arch_type
+#  undef machine_arch_type
+#  define machine_arch_type __machine_arch_type
+# else
+#  define machine_arch_type MACH_TYPE_ASPEED
+# endif
+# define machine_is_aspeed()	(machine_arch_type == MACH_TYPE_ASPEED)
+#else
+# define machine_is_aspeed()	(0)
+#endif
+
 /*
  * These have not yet been registered
  */
diff --git a/arch/arm/mach-aspeed/Makefile b/arch/arm/mach-aspeed/Makefile
new file mode 100644
index 000000000000..d72f62a75fba
--- /dev/null
+++ b/arch/arm/mach-aspeed/Makefile
@@ -0,0 +1,15 @@
+#
+# 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
+#
+
+
+obj-y += timer.o reset.o cpuinfo.o ast-scu.o ast-ahbc.o ast-sdmc.o
+obj-$(CONFIG_AST_SPI_NOR) += flash.o
diff --git a/arch/arm/mach-aspeed/ast-ahbc.c b/arch/arm/mach-aspeed/ast-ahbc.c
new file mode 100644
index 000000000000..5686bed12df2
--- /dev/null
+++ b/arch/arm/mach-aspeed/ast-ahbc.c
@@ -0,0 +1,95 @@
+/********************************************************************************
+* File Name     : arch/arm/mach-aspeed/ast-ahbc.c
+* Author         : Ryan Chen
+* Description   : AST AHB Ctrl
+*
+* Copyright (C) 2012-2020  ASPEED Technology Inc.
+* 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
+
+
+*   History      :
+*    1. 2014/03/15 Ryan Chen Create
+*
+********************************************************************************/
+#include <common.h>
+#include <asm/processor.h>
+#include <asm/io.h>
+#include <asm/arch/regs-ahbc.h>
+#include <asm/arch/ast-ahbc.h>
+#include <asm/arch/aspeed.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+//#define AST_AHBC_DEBUG
+
+#ifdef AST_AHBC_DEBUG
+#define AHBCDBUG(fmt, args...) printf("%s() " fmt, __FUNCTION__, ## args)
+#else
+#define AHBCDBUG(fmt, args...)
+#endif
+
+static u32 ast_ahbc_base = AST_AHBC_BASE;
+static inline u32
+ast_ahbc_read(u32 reg)
+{
+	u32 val;
+	val = readl(ast_ahbc_base + reg);
+	AHBCDBUG("reg = 0x%08x, val = 0x%08x\n", reg, val);
+
+	return val;
+}
+
+static inline void
+ast_ahbc_write(u32 val, u32 reg)
+{
+	AHBCDBUG("reg = 0x%08x, val = 0x%08x\n", reg, val);
+
+#ifdef CONFIG_AST_AHBC_LOCK
+	//unlock
+	writel(AHBC_PROTECT_UNLOCK, ast_ahbc_base);
+	writel(val, ast_ahbc_base + reg);
+	//lock
+	writel(0xaa,ast_ahbc_base);
+#else
+	writel(AHBC_PROTECT_UNLOCK, ast_ahbc_base);
+	writel(val, ast_ahbc_base + reg);
+#endif
+
+}
+
+//***********************************Information ***********************************
+
+extern void ast_ahbc_boot_remap(void)
+{
+#if defined(AST_SOC_G5)
+#else
+	ast_ahbc_write(ast_ahbc_read(AST_AHBC_ADDR_REMAP) | AHBC_BOOT_REMAP, AST_AHBC_ADDR_REMAP);
+#endif
+
+}
+
+#ifdef AST_SOC_G5
+extern void ast_ahbc_peie_mapping(u8 enable)
+{
+	if(enable)
+		ast_ahbc_write(ast_ahbc_read(AST_AHBC_ADDR_REMAP) | AHBC_PCIE_MAP, AST_AHBC_ADDR_REMAP);
+	else
+		ast_ahbc_write(ast_ahbc_read(AST_AHBC_ADDR_REMAP) & ~AHBC_PCIE_MAP, AST_AHBC_ADDR_REMAP);
+}
+
+extern void ast_ahbc_lpc_plus_mapping(u8 enable)
+{
+	if(enable)
+		ast_ahbc_write(ast_ahbc_read(AST_AHBC_ADDR_REMAP) | AHBC_LPC_PLUS_MAP, AST_AHBC_ADDR_REMAP);
+	else
+		ast_ahbc_write(ast_ahbc_read(AST_AHBC_ADDR_REMAP) & ~AHBC_LPC_PLUS_MAP, AST_AHBC_ADDR_REMAP);
+}
+#endif
diff --git a/arch/arm/mach-aspeed/ast-scu.c b/arch/arm/mach-aspeed/ast-scu.c
new file mode 100644
index 000000000000..fb1ad38c4f17
--- /dev/null
+++ b/arch/arm/mach-aspeed/ast-scu.c
@@ -0,0 +1,1900 @@
+/********************************************************************************
+* File Name     : arch/arm/cpu/ast-common/ast-scu.c
+* Author         : Ryan Chen
+* Description   : AST SCU
+*
+* Copyright (C) 2012-2020  ASPEED Technology Inc.
+* 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
+
+CLK24M
+ |
+ |--> H-PLL -->HCLK
+ |
+ |--> M-PLL -xx->MCLK
+ |
+ |--> V-PLL1 -xx->DCLK
+ |
+ |--> V-PLL2 -xx->D2CLK
+ |
+ |--> USB2PHY -->UTMICLK
+
+
+*   History      :
+*    1. 2012/08/15 Ryan Chen Create
+*
+********************************************************************************/
+#include <common.h>
+#include <asm/processor.h>
+#include <asm/io.h>
+#include <asm/arch/regs-scu.h>
+#include <asm/arch/ast_scu.h>
+#include <asm/arch/platform.h>
+#include <asm/arch/aspeed.h>
+
+//#define ASPEED_SCU_LOCK
+//#define ASPEED_SCU_DEBUG
+
+#ifdef ASPEED_SCU_DEBUG
+#define SCUDBUG(fmt, args...) printf("%s() " fmt, __FUNCTION__, ## args)
+#else
+#define SCUDBUG(fmt, args...)
+#endif
+
+#define SCUMSG(fmt, args...) printf(fmt, ## args)
+
+static u32 ast_scu_base = AST_SCU_BASE;
+
+static inline u32
+ast_scu_read(u32 reg)
+{
+	u32 val;
+
+	val = readl(ast_scu_base + reg);
+
+	SCUDBUG("ast_scu_read : reg = 0x%08x, val = 0x%08x\n", reg, val);
+
+	return val;
+}
+
+static inline void
+ast_scu_write(u32 val, u32 reg)
+{
+	SCUDBUG("ast_scu_write : reg = 0x%08x, val = 0x%08x\n", reg, val);
+#ifdef CONFIG_AST_SCU_LOCK
+	//unlock
+	writel(SCU_PROTECT_UNLOCK, ast_scu_base);
+	writel(val, ast_scu_base + reg);
+	//lock
+	writel(0xaa,ast_scu_base);
+#else
+	writel(SCU_PROTECT_UNLOCK, ast_scu_base);
+	writel(val, ast_scu_base + reg);
+#endif
+}
+
+//SoC mapping Table
+struct soc_id {
+	const char	* name;
+	u32	rev_id;
+};
+
+static struct soc_id soc_map_table[] = {
+	[0] = {
+		.name = "AST1100/AST2050-A0",
+		.rev_id = 0x00000200,
+	},
+	[1] = {
+		.name = "AST1100/AST2050-A1",
+		.rev_id = 0x00000201,
+	},
+	[2] = {
+		.name = "AST1100/AST2050-A2,3/AST2150-A0,1",
+		.rev_id = 0x00000202,
+	},
+	[3] = {
+		.name = "AST1510/AST2100-A0",
+		.rev_id = 0x00000300,
+	},
+	[4] = {
+		.name = "AST1510/AST2100-A1",
+		.rev_id = 0x00000301,
+	},
+	[5] = {
+		.name = "AST1510/AST2100-A2,3",
+		.rev_id = 0x00000302,
+	},
+	[6] = {
+		.name = "AST2200-A0,1",
+		.rev_id = 0x00000102,
+	},
+	[7] = {
+		.name = "AST2300-A0",
+		.rev_id = 0x01000003,
+	},
+	[8] = {
+		.name = "AST2300-A1",
+		.rev_id = 0x01010303,
+	},
+	[9] = {
+		.name = "AST1300-A1",
+		.rev_id = 0x01010003,
+	},
+	[10] = {
+		.name = "AST1050-A1",
+		.rev_id = 0x01010203,
+	},
+	[11] = {
+		.name = "AST2400-A0",
+		.rev_id = 0x02000303,
+	},
+	[12] = {
+		.name = "AST2400-A1",
+		.rev_id = 0x02010303,
+	},
+	[13] = {
+		.name = "AST1010-A0",
+		.rev_id = 0x03000003,
+	},
+	[14] = {
+		.name = "AST1010-A1",
+		.rev_id = 0x03010003,
+	},
+	[15] = {
+		.name = "AST1520-A0",
+		.rev_id = 0x03000203,
+	},
+	[16] = {
+		.name = "AST3200-A0",
+		.rev_id = 0x03000303,
+	},
+	[17] = {
+		.name = "AST2500-A0",
+		.rev_id = 0x04000303,
+	},
+	[18] = {
+		.name = "AST2510-A0",
+		.rev_id = 0x04000103,
+	},
+	[19] = {
+		.name = "AST2520-A0",
+		.rev_id = 0x04000203,
+	},
+	[20] = {
+		.name = "AST2530-A0",
+		.rev_id = 0x04000403,
+	},
+	[21] = {
+		.name = "AST1520-A1",
+		.rev_id = 0x03010203,
+	},
+	[22] = {
+		.name = "AST3200-A1",
+		.rev_id = 0x03010303,
+	},
+	[23] = {
+		.name = "AST2500-A1",
+		.rev_id = 0x04010303,
+	},
+	[24] = {
+		.name = "AST2510-A1",
+		.rev_id = 0x04010103,
+	},
+	[25] = {
+		.name = "AST2520-A1",
+		.rev_id = 0x04010203,
+	},
+	[26] = {
+		.name = "AST2530-A1",
+		.rev_id = 0x04010403,
+	},
+};
+//***********************************Initial control***********************************
+#ifdef SCU_RESET_VIDEO
+extern void
+ast_scu_reset_video(void)
+{
+	ast_scu_write(ast_scu_read(AST_SCU_RESET) | SCU_RESET_VIDEO, AST_SCU_RESET);
+	udelay(100);
+	ast_scu_write(ast_scu_read(AST_SCU_RESET) & ~SCU_RESET_VIDEO, AST_SCU_RESET);
+}
+
+
+extern void
+ast_scu_init_video(u8 dynamic_en)
+{
+	//Video Engine Clock Enable and Reset
+	//  Enable Clock & ECLK = inverse of (M-PLL / 2)
+	if(dynamic_en)
+		ast_scu_write((ast_scu_read(AST_SCU_CLK_SEL) & ~SCU_CLK_VIDEO_SLOW_MASK) | SCU_CLK_VIDEO_SLOW_EN | SCU_CLK_VIDEO_SLOW_SET(0), AST_SCU_CLK_SEL);
+	else {
+		if(GET_CHIP_REVISION(ast_scu_read(AST_SCU_REVISION_ID)) == 4)
+			ast_scu_write((ast_scu_read(AST_SCU_CLK_SEL) & ~(SCU_ECLK_SOURCE_MASK | SCU_CLK_VIDEO_SLOW_MASK | SCU_CLK_VIDEO_SLOW_EN)), AST_SCU_CLK_SEL);
+		else
+			ast_scu_write((ast_scu_read(AST_SCU_CLK_SEL) & ~(SCU_ECLK_SOURCE_MASK | SCU_CLK_VIDEO_SLOW_EN)) | SCU_ECLK_SOURCE(2), AST_SCU_CLK_SEL);
+	}
+
+	// Enable CLK
+	ast_scu_write(ast_scu_read(AST_SCU_CLK_STOP) & ~(SCU_ECLK_STOP_EN | SCU_VCLK_STOP_EN), AST_SCU_CLK_STOP);
+	mdelay(10);
+	ast_scu_write(ast_scu_read(AST_SCU_RESET) | SCU_RESET_VIDEO, AST_SCU_RESET);
+	udelay(100);
+	ast_scu_write(ast_scu_read(AST_SCU_RESET) & ~SCU_RESET_VIDEO, AST_SCU_RESET);
+}
+#endif
+
+#ifdef SCU_UART1CLK_STOP_EN
+extern void
+ast_scu_init_uart(u8 uart)
+{
+	u32 clk_stop_en = 0;
+
+	//uart 1
+	if(uart & 0x2) {
+		clk_stop_en |= SCU_UART1CLK_STOP_EN;
+	}
+
+	if(uart & 0x4) {
+		clk_stop_en |= SCU_UART2CLK_STOP_EN;
+	}
+
+	if(uart & 0x8) {
+		clk_stop_en |= SCU_UART3CLK_STOP_EN;
+	}
+
+	if(uart & 0x10) {
+		clk_stop_en |= SCU_UART4CLK_STOP_EN;
+	}
+
+	ast_scu_write(ast_scu_read(AST_SCU_CLK_STOP) & ~(clk_stop_en), AST_SCU_CLK_STOP);
+
+}
+#endif
+
+extern void
+ast_scu_init_eth(u8 num)
+{
+
+//Set MAC delay Timing
+#if defined(AST_SOC_G5)
+	//a1
+//	ast_scu_write(0x00145249, AST_SCU_MAC_CLK);
+//	ast_scu_write(0x00145249, AST_SCU_MAC_CLK_DELAY_100M);
+//	ast_scu_write(0x00145249, AST_SCU_MAC_CLK_DELAY_10M);
+//	ast_scu_write((0x6a << 16) | (0x6a << 8), AST_SCU_MAC_CLK_DUTY);
+#elif defined(CONFIG_ARCH_AST1010)
+// do nothing
+#else
+	//AST2300 max clk to 125Mhz, AST2400 max clk to 198Mhz
+	if(ast_scu_read(AST_SCU_HW_STRAP1) & (SCU_HW_STRAP_MAC1_RGMII | SCU_HW_STRAP_MAC0_RGMII))	//RGMII --> H-PLL/6
+		ast_scu_write((ast_scu_read(AST_SCU_CLK_SEL) & ~SCU_CLK_MAC_MASK) | SCU_CLK_MAC_DIV(2), AST_SCU_CLK_SEL);
+	else	//RMII --> H-PLL/10
+		ast_scu_write((ast_scu_read(AST_SCU_CLK_SEL) & ~SCU_CLK_MAC_MASK) | SCU_CLK_MAC_DIV(4), AST_SCU_CLK_SEL);
+
+	ast_scu_write(0x2255, AST_SCU_MAC_CLK);
+#endif
+
+	switch(num) {
+		case 0:
+			ast_scu_write(ast_scu_read(AST_SCU_RESET) | SCU_RESET_MAC0,
+							AST_SCU_RESET);
+			udelay(100);
+			ast_scu_write(ast_scu_read(AST_SCU_CLK_STOP) & ~SCU_MAC0CLK_STOP_EN,
+							AST_SCU_CLK_STOP);
+			udelay(1000);
+			ast_scu_write(ast_scu_read(AST_SCU_RESET) & ~SCU_RESET_MAC0,
+							AST_SCU_RESET);
+
+			break;
+#if defined(AST_MAC1_BASE)
+		case 1:
+			ast_scu_write(ast_scu_read(AST_SCU_RESET) | SCU_RESET_MAC1,
+							AST_SCU_RESET);
+			udelay(100);
+			ast_scu_write(ast_scu_read(AST_SCU_CLK_STOP) & ~SCU_MAC1CLK_STOP_EN,
+							AST_SCU_CLK_STOP);
+			udelay(1000);
+			ast_scu_write(ast_scu_read(AST_SCU_RESET) & ~SCU_RESET_MAC1,
+							AST_SCU_RESET);
+			break;
+#endif
+	}
+}
+
+#ifdef SCU_RESET_USB11
+extern void
+ast_scu_init_uhci(void)
+{
+	//USB1.1 Host's Clock Enable and Reset
+	ast_scu_write(ast_scu_read(AST_SCU_CLK_STOP) & ~SCU_USB11CLK_STOP_EN, AST_SCU_CLK_STOP);
+	mdelay(10);
+
+	ast_scu_write(ast_scu_read(AST_SCU_RESET) & ~SCU_RESET_USB11, AST_SCU_RESET);
+}
+#endif
+
+#ifdef SCU_RESET_USB20
+extern void
+ast_scu_init_usb_port1(void)
+{
+	/* EHCI controller engine init. Process similar to VHub. */
+	/* Following reset sequence can resolve "vhub dead on first power on" issue on V4 board. */
+	//reset USB20
+	ast_scu_write(ast_scu_read(AST_SCU_RESET) | SCU_RESET_USB20, AST_SCU_RESET);
+
+	//enable USB20 clock
+	ast_scu_write(ast_scu_read(AST_SCU_CLK_STOP) | SCU_USB20_PHY_CLK_EN, AST_SCU_CLK_STOP);
+	mdelay(10);
+
+	ast_scu_write(ast_scu_read(AST_SCU_RESET) & ~SCU_RESET_USB20, AST_SCU_RESET);
+}
+
+
+extern void
+ast_scu_init_usb_port2()
+{
+#ifdef AST_SOC_G5
+	ast_scu_write(ast_scu_read(AST_SCU_RESET) | SCU_RESET_USB_P1, AST_SCU_RESET);
+
+	//enable USB20 clock
+	ast_scu_write(ast_scu_read(AST_SCU_CLK_STOP) & ~SCU_USB_P1_STOP_EN, AST_SCU_CLK_STOP);
+	mdelay(10);
+
+	ast_scu_write(ast_scu_read(AST_SCU_RESET) & ~SCU_RESET_USB_P1, AST_SCU_RESET);
+#endif
+}
+#endif
+
+#ifdef SCU_RESET_SD
+extern void
+ast_scu_init_sdhci(void)
+{
+	//SDHCI Host's Clock Enable and Reset
+	ast_scu_write(ast_scu_read(AST_SCU_RESET) | SCU_RESET_SD, AST_SCU_RESET);
+
+	ast_scu_write(ast_scu_read(AST_SCU_CLK_STOP) & ~SCU_SDCLK_STOP_EN, AST_SCU_CLK_STOP);
+	mdelay(10);
+
+	ast_scu_write(ast_scu_read(AST_SCU_CLK_SEL) | SCU_CLK_SD_EN, AST_SCU_CLK_SEL);
+	mdelay(10);
+
+	// SDCLK = H-PLL / 4, G5 = H-PLL /8
+	ast_scu_write((ast_scu_read(AST_SCU_CLK_SEL) & ~SCU_CLK_SD_MASK) | SCU_CLK_SD_DIV(1),
+		AST_SCU_CLK_SEL);
+	mdelay(10);
+
+	ast_scu_write(ast_scu_read(AST_SCU_RESET) & ~SCU_RESET_SD, AST_SCU_RESET);
+}
+#endif
+
+extern void
+ast_scu_init_i2c(void)
+{
+	ast_scu_write(ast_scu_read(AST_SCU_RESET) & ~SCU_RESET_I2C, AST_SCU_RESET);
+}
+
+
+extern void
+ast_scu_init_pwm_tacho(void)
+{
+	ast_scu_write(ast_scu_read(AST_SCU_RESET) | SCU_RESET_PWM, AST_SCU_RESET);
+	ast_scu_write(ast_scu_read(AST_SCU_RESET) & ~SCU_RESET_PWM, AST_SCU_RESET);
+}
+
+
+extern void
+ast_scu_init_adc(void)
+{
+	ast_scu_write(ast_scu_read(AST_SCU_RESET) | SCU_RESET_ADC, AST_SCU_RESET);
+	ast_scu_write(ast_scu_read(AST_SCU_RESET) & ~SCU_RESET_ADC, AST_SCU_RESET);
+}
+
+#ifdef SCU_RESET_PCIE
+extern void
+ast_scu_init_pcie(void)
+{
+	//pcie host reset
+	ast_scu_write(ast_scu_read(AST_SCU_RESET) & ~SCU_RESET_PCIE, AST_SCU_RESET);
+	ast_scu_write(ast_scu_read(AST_SCU_RESET) | SCU_RESET_PCIE_DIR, AST_SCU_RESET);
+	ast_scu_write(ast_scu_read(AST_SCU_RESET) | SCU_RESET_PCIE, AST_SCU_RESET);
+	mdelay(10);
+	ast_scu_write(ast_scu_read(AST_SCU_RESET) & ~SCU_RESET_PCIE, AST_SCU_RESET);
+
+	//p2x reset
+	ast_scu_write(ast_scu_read(AST_SCU_RESET) & ~SCU_RESET_P2X, AST_SCU_RESET);
+
+	//use 0x7c for clr
+	ast_scu_write(SCU_HW_STRAP_VGA_MASK, AST_SCU_REVISION_ID);
+	ast_scu_write(SCU_HW_STRAP_VGA_SIZE_SET(VGA_64M_DRAM), AST_SCU_HW_STRAP1);
+
+	ast_scu_write(ast_scu_read(AST_SCU_MISC2_CTRL) | SCU_PCIE_MAPPING_HIGH | SCU_MALI_RC_MODE | SCU_MALI_DTY_MODE, AST_SCU_MISC2_CTRL);
+}
+#endif
+
+#ifdef SCU_RESET_MCTP
+extern void
+ast_scu_init_mctp(void)
+{
+	//Notice : Must after Host reset
+//	ast_scu_write(ast_scu_read(AST_SCU_RESET) | SCU_RESET_MCTP, AST_SCU_RESET);
+	ast_scu_write(ast_scu_read(AST_SCU_RESET) & ~SCU_RESET_MCTP, AST_SCU_RESET);
+}
+#endif
+
+#ifdef SCU_RESET_XDMA
+extern void
+ast_scu_init_xdma(void)
+{
+	//Notice : 1. Must after Host reset, 2. DRAM Controller 0x08 memory protection must disable [Protect REQ#] 3. VGA PCI Bus master enable offset 0x04[bit2]
+//	ast_scu_write(ast_scu_read(AST_SCU_RESET) | SCU_RESET_XDMA, AST_SCU_RESET);
+	ast_scu_write(ast_scu_read(AST_SCU_RESET) & ~SCU_RESET_XDMA, AST_SCU_RESET);
+}
+#endif
+
+extern void
+ast_scu_init_peci(void)
+{
+	ast_scu_write(ast_scu_read(AST_SCU_RESET) | SCU_RESET_PECI, AST_SCU_RESET);
+	udelay(3);
+	ast_scu_write(ast_scu_read(AST_SCU_RESET) & ~SCU_RESET_PECI, AST_SCU_RESET);
+}
+
+
+extern void
+ast_scu_init_jtag(void)
+{
+	ast_scu_write(ast_scu_read(AST_SCU_RESET) | SCU_RESET_JTAG, AST_SCU_RESET);
+	udelay(3);
+	ast_scu_write(ast_scu_read(AST_SCU_RESET) & ~SCU_RESET_JTAG, AST_SCU_RESET);
+}
+
+#ifdef SCU_RESET_HACE
+extern void
+ast_scu_init_hace(void)
+{
+	//enable YCLK for HAC
+	ast_scu_write(ast_scu_read(AST_SCU_CLK_STOP) &
+					~(SCU_YCLK_STOP_EN | SCU_RSACLK_STOP_EN),
+					AST_SCU_CLK_STOP);
+	mdelay(1);
+	ast_scu_write(ast_scu_read(AST_SCU_RESET) &
+					~SCU_RESET_HACE,
+					AST_SCU_RESET);
+}
+#endif
+
+extern void
+ast_scu_reset_lpc(void)
+{
+	//Note .. It have been enable in U-boot.....
+	ast_scu_write(ast_scu_read(AST_SCU_RESET) | SCU_RESET_LPC, AST_SCU_RESET);
+
+	ast_scu_write(ast_scu_read(AST_SCU_RESET) & ~SCU_RESET_LPC, AST_SCU_RESET);
+}
+
+
+extern void
+ast_scu_init_lpc(void)
+{
+	//Note .. It have been enable in U-boot.....
+//	ast_scu_write(ast_scu_read(AST_SCU_RESET) | SCU_RESET_LPC, AST_SCU_RESET);
+
+	//enable LPC clock LHCLK = H-PLL/8, SOC_G5 H-PLL/16
+	ast_scu_write(ast_scu_read(AST_SCU_CLK_STOP) |
+					SCU_SET_LHCLK_DIV(3) |
+					SCU_LHCLK_SOURCE_EN,
+					AST_SCU_CLK_STOP);
+}
+
+
+//////1 : lpc plus modes
+extern u8
+ast_scu_get_lpc_plus_enable(void)
+{
+	if(ast_scu_read(AST_SCU_FUN_PIN_CTRL5) & SCU_FUN_PIN_LPC_PLUS)
+		return 1;
+	else
+		return 0;
+}
+
+
+#ifdef AST_SOC_G5
+extern void
+ast_scu_init_rfx(void)
+{
+	ast_scu_write(ast_scu_read(AST_SCU_RESET) | SCU_RESET_RFX, AST_SCU_RESET);
+	ast_scu_write(ast_scu_read(AST_SCU_RESET2) | (SCU_RESET_RFXDEC | SCU_RESET_RFXCMQ | SCU_RESET_BITBLT), AST_SCU_RESET2);
+
+	//Use D1-PLL
+	ast_scu_write((ast_scu_read(AST_SCU_CLK_SEL) & ~(SCU_ECLK_SOURCE_MASK | SCU_CLK_VIDEO_SLOW_MASK | SCU_CLK_VIDEO_SLOW_EN)), AST_SCU_CLK_SEL);
+	ast_scu_write(ast_scu_read(AST_SCU_CLK_SEL) | SCU_ECLK_SOURCE(2), AST_SCU_CLK_SEL);
+
+	ast_scu_write((ast_scu_read(AST_SCU_MISC1_CTRL) & ~SCU_MISC_D_PLL_DIS) | SCU_MISC_D_PLL_SOURCE, AST_SCU_MISC1_CTRL);
+
+	ast_scu_write(0x75402031, AST_SCU_D_PLL);
+	ast_scu_write(0x00000580, AST_SCU_DPLL_PAR0);
+	ast_scu_write(0x00000000, AST_SCU_DPLL_PAR1);
+	ast_scu_write(0x0004AB1C, AST_SCU_DPLL_PAR2);
+
+	ast_scu_write(ast_scu_read(AST_SCU_CLK_STOP) & 	~(SCU_RFX_CLK_STOP_EN), AST_SCU_CLK_STOP);
+	ast_scu_write(ast_scu_read(AST_SCU_CLK_STOP2) & ~(SCU_CMQCLK_STOP | SCU_RFXCLK_STOP | SCU_BITBLTCLK_STOP), AST_SCU_CLK_STOP2);
+	udelay(3);
+	ast_scu_write(ast_scu_read(AST_SCU_RESET) & ~SCU_RESET_RFX, AST_SCU_RESET);
+	ast_scu_write(ast_scu_read(AST_SCU_RESET2) & ~(SCU_RESET_RFXDEC | SCU_RESET_RFXCMQ | SCU_RESET_BITBLT), AST_SCU_RESET2);
+
+	//Multi fun pin
+	ast_scu_write(ast_scu_read(AST_SCU_FUN_PIN_CTRL6) | SCU_FUN_PIN_DVO_24BIT, AST_SCU_FUN_PIN_CTRL6);
+
+}
+#else
+extern void
+ast_scu_init_rfx(void)
+{
+}
+#endif
+
+#ifdef SCU_RESET_H264
+extern void
+ast_scu_init_h264(void)
+{
+	ast_scu_write(ast_scu_read(AST_SCU_RESET) | SCU_RESET_H264, AST_SCU_RESET);
+	ast_scu_write(ast_scu_read(AST_SCU_CLK_SEL2) & 	~SCU_H264CLK_MASK, AST_SCU_CLK_SEL2);
+	ast_scu_write(ast_scu_read(AST_SCU_CLK_SEL2) | SCU_SET_H264CLK_DIV(3), AST_SCU_CLK_SEL2);
+	ast_scu_write(ast_scu_read(AST_SCU_CLK_STOP) & 	~SCU_H264_STOP_EN, AST_SCU_CLK_STOP);
+	udelay(3);
+	ast_scu_write(ast_scu_read(AST_SCU_RESET) & ~SCU_RESET_H264, AST_SCU_RESET);
+}
+#endif
+
+/* 0:disable spi 1: enable spi master 2:enable spi master and spi slave to ahb 3: enable spi pass-through*/
+extern void
+ast_scu_spi_master(u8 mode)
+{
+#ifdef AST_SOC_G5
+	switch(mode) {
+		case 0:
+			ast_scu_write(SCU_HW_STRAP_SPI_MODE_MASK, AST_SCU_REVISION_ID);
+			break;
+		case 1:
+			ast_scu_write(SCU_HW_STRAP_SPI_MODE_MASK, AST_SCU_REVISION_ID);
+			ast_scu_write(SCU_HW_STRAP_SPI_MASTER, AST_SCU_HW_STRAP1);
+			break;
+		case 2:
+			ast_scu_write(SCU_HW_STRAP_SPI_MODE_MASK, AST_SCU_REVISION_ID);
+			ast_scu_write(SCU_HW_STRAP_SPI_M_S_EN, AST_SCU_HW_STRAP1);
+			break;
+		case 3:
+			ast_scu_write(SCU_HW_STRAP_SPI_MODE_MASK, AST_SCU_REVISION_ID);
+			ast_scu_write(SCU_HW_STRAP_SPI_PASS_THROUGH, AST_SCU_HW_STRAP1);
+			break;
+	}
+#else
+	switch(mode) {
+		case 0:
+			ast_scu_write(ast_scu_read(AST_SCU_HW_STRAP1) & ~SCU_HW_STRAP_SPI_MODE_MASK, AST_SCU_HW_STRAP1);
+			break;
+		case 1:
+			ast_scu_write((ast_scu_read(AST_SCU_HW_STRAP1) & ~SCU_HW_STRAP_SPI_MODE_MASK) |SCU_HW_STRAP_SPI_MASTER, AST_SCU_HW_STRAP1);
+			break;
+		case 2:
+			ast_scu_write((ast_scu_read(AST_SCU_HW_STRAP1) & ~SCU_HW_STRAP_SPI_MODE_MASK) |SCU_HW_STRAP_SPI_MASTER, AST_SCU_HW_STRAP1);
+			break;
+		case 3:
+			ast_scu_write((ast_scu_read(AST_SCU_HW_STRAP1) & ~SCU_HW_STRAP_SPI_MODE_MASK) |SCU_HW_STRAP_SPI_PASS_THROUGH, AST_SCU_HW_STRAP1);
+			break;
+	}
+
+#endif
+}
+
+
+#ifdef SCU_RESET_CRT
+extern void
+ast_scu_init_crt(void)
+{
+	//ast2400 : VGA use D1 clk, CRT use D2 clk
+	//ast2500 : VGA use D1 clk, CRT use 40Mhz
+	//ast3200/ast1520 : VGA use D1 clk, CRT use D1/D2 clk select L: SCU08[bit 8] - H SCU2C[bit 21]
+
+#ifdef AST_SOC_G5
+
+#ifdef CONFIG_ARCH_AST3200
+	//Select D2 CLK source 00:D-PLL, 01: D2-PLL, 1x : 40Mhz
+	//H: 2c[bit : 21], L: 08[bit : 8]
+	ast_scu_write(ast_scu_read(AST_SCU_CLK_SEL) | SCU_CLK_VIDE0_SO_D2 , AST_SCU_CLK_SEL);
+
+	//Select D2-PLL parameter source [01]
+	ast_scu_write(ast_scu_read(AST_SCU_CLK_SEL) | SCU_CRT_CLK_L_SOURCE , AST_SCU_CLK_SEL);
+	ast_scu_write(ast_scu_read(AST_SCU_MISC1_CTRL) & ~SCU_MISC_CRT_CLK_H_SOURCE , AST_SCU_MISC1_CTRL);
+
+	//Off D2-PLL
+//	ast_scu_write(ast_scu_read(AST_SCU_D2_PLL_EXTEND) |  SCU_D2_PLL_OFF | SCU_D2_PLL_RESET , AST_SCU_D2_PLL_EXTEND);
+	ast_scu_write(0x585, AST_SCU_D2_PLL_EXTEND);
+
+	//set D2-PLL parameter
+	ast_scu_write((0x15 << 27) | (0xE << 22) | (0x03D << 13) | (0x40), AST_SCU_D2_PLL);
+
+	//enable D2-PLL
+//	ast_scu_write(ast_scu_read(AST_SCU_D2_PLL_EXTEND) &  ~(SCU_D2_PLL_OFF | SCU_D2_PLL_RESET) , AST_SCU_D2_PLL_EXTEND);
+	ast_scu_write(0x580, AST_SCU_D2_PLL_EXTEND);
+	ast_scu_write(ast_scu_read(AST_SCU_RESET) & ~SCU_RESET_CRT, AST_SCU_RESET);
+
+	ast_scu_write(ast_scu_read(AST_SCU_RESET2) & ~(SCU_RESET_CRT0 | SCU_RESET_CRT1 | SCU_RESET_CRT2 | SCU_RESET_CRT3), AST_SCU_RESET2);
+
+#else
+	//ast2500 use 40Mhz (init @ platform.S)
+	ast_scu_write(ast_scu_read(AST_SCU_RESET) & ~SCU_RESET_CRT, AST_SCU_RESET);
+
+	ast_scu_write(ast_scu_read(AST_SCU_RESET2) & ~SCU_RESET_CRT0, AST_SCU_RESET2);
+#endif
+
+	//enable CRT CLK
+	ast_scu_write(ast_scu_read(AST_SCU_CLK_STOP) & ~SCU_D2CLK_STOP_EN , AST_SCU_CLK_STOP);
+
+	ast_scu_write(0x1df, 0xd4);
+
+#else
+	//SOC VER < G5
+	/* Enable D2 - PLL */
+	ast_scu_write(ast_scu_read(AST_SCU_MISC1_CTRL) & ~SCU_MISC_D2_PLL_DIS, AST_SCU_MISC1_CTRL);
+
+	/* Reset CRT */
+	ast_scu_write(ast_scu_read(AST_SCU_RESET) | SCU_RESET_CRT, AST_SCU_RESET);
+
+	/* Set Delay 5 Compensation TODO ...*/
+	ast_scu_write((ast_scu_read(AST_SCU_CLK_SEL) & ~SCU_CLK_VIDEO_DELAY_MASK) |
+						SCU_CLK_VIDEO_DELAY(5), AST_SCU_CLK_SEL);
+
+	//enable D2 CLK
+	ast_scu_write(ast_scu_read(AST_SCU_CLK_STOP) & ~SCU_D2CLK_STOP_EN , AST_SCU_CLK_STOP);
+
+	udelay(10);
+	ast_scu_write(ast_scu_read(AST_SCU_RESET) & ~SCU_RESET_CRT, AST_SCU_RESET);
+
+#endif
+
+
+}
+#endif
+
+extern void
+ast_scu_uartx_init(void)
+{
+	ast_scu_write(ast_scu_read(AST_SCU_CLK_STOP2) &
+				~(SCU_UART_DIV13 | SCU_UARTXCLK_STOP),
+		AST_SCU_CLK_STOP2);
+
+}
+
+
+//***********************************CLK control***********************************
+extern void
+ast_scu_uart_div(void)
+{
+	ast_scu_write(ast_scu_read(AST_SCU_CLK_STOP2) &
+				~SCU_UART_DIV13,
+		AST_SCU_CLK_STOP2);
+}
+
+
+extern void
+ast_scu_clk_stop(u32 clk_name,u8 stop_enable)
+{
+	switch(clk_name){
+		default:
+			SCUMSG("ERRO clk_name :%d \n",clk_name);
+			break;
+	}
+}
+
+
+//***********************************CLK Information***********************************
+#ifdef CONFIG_ARCH_AST1010
+extern u32
+ast_get_clk_source(void)
+{
+	return AST_PLL_CLOCK;
+}
+#else
+extern u32
+ast_get_clk_source(void)
+{
+	if(ast_scu_read(AST_SCU_HW_STRAP1) & CLK_25M_IN)
+		return AST_PLL_25MHZ;
+	else
+		return AST_PLL_24MHZ;
+}
+#endif
+
+#if defined(AST_SOC_G5)
+extern u32
+ast_get_h_pll_clk(void)
+{
+	u32 clk=0;
+	u32 h_pll_set = ast_scu_read(AST_SCU_H_PLL);
+
+	if(h_pll_set & SCU_H_PLL_OFF)
+		return 0;
+
+	// Programming
+	clk = ast_get_clk_source();
+	if(h_pll_set & SCU_H_PLL_BYPASS_EN) {
+		return clk;
+	} else {
+		//P = SCU24[18:13]
+		//M = SCU24[12:5]
+		//N = SCU24[4:0]
+		//hpll = 24MHz * [(M+1) /(N+1)] / (P+1)
+		clk = ((clk * (SCU_H_PLL_GET_MNUM(h_pll_set) + 1)) / (SCU_H_PLL_GET_NNUM(h_pll_set) + 1)) /(SCU_H_PLL_GET_PNUM(h_pll_set) + 1);
+	}
+	SCUDBUG("h_pll = %d\n",clk);
+	return clk;
+}
+
+
+extern u32
+ast_get_m_pll_clk(void)
+{
+	u32 clk=0;
+	u32 m_pll_set = ast_scu_read(AST_SCU_M_PLL);
+
+	if(m_pll_set & SCU_M_PLL_OFF)
+		return 0;
+
+	// Programming
+	clk = ast_get_clk_source();
+	if(m_pll_set & SCU_M_PLL_BYPASS) {
+		return clk;
+	} else {
+		//PD  == SCU20[13:18]
+		//M  == SCU20[5:12]
+		//N  == SCU20[0:4]
+		//mpll =  24MHz * [(M+1) /(N+1)] / (P+1)
+		clk = ((clk * (SCU_M_PLL_GET_MNUM(m_pll_set) + 1)) / (SCU_M_PLL_GET_NNUM(m_pll_set) + 1))/(SCU_M_PLL_GET_PDNUM(m_pll_set) + 1);
+	}
+	SCUDBUG("m_pll = %d\n",clk);
+	return clk;
+}
+
+
+extern u32
+ast_get_ahbclk(void)
+{
+	unsigned int axi_div, ahb_div, hpll;
+
+	hpll = ast_get_h_pll_clk();
+	//AST2500 A1 fix
+	axi_div = 2;
+	ahb_div = (SCU_HW_STRAP_GET_AXI_AHB_RATIO(ast_scu_read(AST_SCU_HW_STRAP1)) + 1);
+
+	SCUDBUG("HPLL=%d, AXI_Div=%d, AHB_DIV = %d, AHB CLK=%d\n", hpll, axi_div, ahb_div, (hpll/axi_div)/ahb_div);
+	return ((hpll/axi_div)/ahb_div);
+
+}
+
+
+extern u32
+ast_get_d2_pll_clk(void)
+{
+	u32 clk=0;
+	u32 d2_pll_set = ast_scu_read(AST_SCU_D2_PLL);
+	u32 d2_pll_conf = ast_scu_read(AST_SCU_D2_PLL_EXTEND);
+	u32 MNUM,NNUM,PNUM,ODNUM;
+
+	if(d2_pll_conf & SCU_D2_PLL_OFF)
+		return 0;
+
+	// Programming
+	clk = ast_get_clk_source();
+	if(d2_pll_conf & SCU_D2_PLL_BYPASS) {
+		return clk;
+	} else {
+		MNUM = SCU_D2_PLL_GET_MNUM(d2_pll_set);
+		MNUM += 1;
+		NNUM = SCU_D2_PLL_GET_NNUM(d2_pll_set);
+		NNUM += 1;
+		PNUM = SCU_D2_PLL_GET_PNUM(d2_pll_set);
+		PNUM += 1;
+		ODNUM = SCU_D2_PLL_GET_ODNUM(d2_pll_set);
+		ODNUM += 1;
+//		printf("clk %d ,num %d ,denum %d ,od %d ,pd %d ,pd2 %d \n",clk, NUM , DENUM, OD, PD, PD2);
+		//hpll = 24MHz * [(M + 1) /(N + 1)] / (P + 1) / (OD + 1)
+		clk = (clk * MNUM) / (NNUM) / PNUM / ODNUM;
+	}
+
+	SCUDBUG("d2_pll = %d\n",clk);
+	return clk;
+}
+
+
+extern void
+ast_set_d2_pll_clk(u32 pll_setting)
+{
+	//Off D2-PLL
+//	ast_scu_write(ast_scu_read(AST_SCU_D2_PLL_EXTEND) |  SCU_D2_PLL_OFF | SCU_D2_PLL_RESET , AST_SCU_D2_PLL_EXTEND);
+	ast_scu_write(0x585, AST_SCU_D2_PLL_EXTEND);
+
+	//set D2-PLL parameter
+	ast_scu_write(pll_setting, AST_SCU_D2_PLL);
+
+	//enable D2-PLL
+//	ast_scu_write(ast_scu_read(AST_SCU_D2_PLL_EXTEND) &  ~(SCU_D2_PLL_OFF | SCU_D2_PLL_RESET) , AST_SCU_D2_PLL_EXTEND);
+	ast_scu_write(0x580, AST_SCU_D2_PLL_EXTEND);
+
+}
+
+
+extern u32
+ast_get_d_pll_clk(void)
+{
+	u32 clk=0;
+	u32 d_pll_set = ast_scu_read(AST_SCU_D_PLL);
+	u32 d_pll_conf = ast_scu_read(AST_SCU_D_PLL_EXTEND0);
+	u32 MNUM,NNUM,PNUM,ODNUM;
+
+	if(d_pll_conf & SCU_D_PLL_OFF)
+		return 0;
+
+	// Programming
+	clk = ast_get_clk_source();
+	if(d_pll_conf & SCU_D_PLL_BYPASS) {
+		return clk;
+	} else {
+		MNUM = SCU_D_PLL_GET_MNUM(d_pll_set);
+		MNUM += 1;
+		NNUM = SCU_D_PLL_GET_NNUM(d_pll_set);
+		NNUM += 1;
+		PNUM = SCU_D_PLL_GET_PNUM(d_pll_set);
+		PNUM += 1;
+		ODNUM = SCU_D_PLL_GET_ODNUM(d_pll_set);
+		ODNUM += 1;
+//		printf("clk %d ,num %d ,denum %d ,od %d ,pd %d ,pd2 %d \n",clk, NUM , DENUM, OD, PD, PD2);
+		//hpll = 24MHz * [(M + 1) /(N + 1)] / (P + 1) / (OD + 1)
+		clk = (clk * MNUM) / (NNUM) / PNUM / ODNUM;
+	}
+
+	SCUDBUG("d_pll = %d\n",clk);
+	return clk;
+}
+
+
+#elif defined(CONFIG_ARCH_AST1010)
+extern u32
+ast_get_h_pll_clk(void)
+{
+	u32 speed,clk=0;
+	u32 OD, NUM, DENUM;
+	u32 h_pll_set = ast_scu_read(AST_SCU_H_PLL);
+
+	clk = AST_PLL_CLOCK;
+	OD = (1 << (SCU_H_PLL_GET_DIV(h_pll_set)));
+	NUM = SCU_H_PLL_GET_NUM(h_pll_set);
+	DENUM = SCU_H_PLL_GET_DENUM(h_pll_set);
+	//hpll = 24MHz * (Numerator+1) / ((OD) * (Denumerator+1))
+	clk = clk * (NUM + 1) / OD / (DENUM + 1);
+
+//	printf("h_pll = %d\n",clk);
+	return clk;
+}
+
+extern u32
+ast_get_ahbclk(void)
+{
+	return ast_get_h_pll_clk();
+}
+
+
+extern u32
+ast_get_ahb_div(void)
+{
+	u32 div = ast_scu_read(AST_SCU_CLK_SEL);
+	div = SCU_GET_AHB_DIV(div);
+	div = (div + 1) * 2;
+	return div;
+}
+
+#else
+extern u32
+ast_get_h_pll_clk(void)
+{
+	u32 speed,clk=0;
+	u32 h_pll_set = ast_scu_read(AST_SCU_H_PLL);
+
+	if(h_pll_set & SCU_H_PLL_OFF)
+		return 0;
+
+	if(h_pll_set & SCU_H_PLL_PARAMETER) {
+		// Programming
+		clk = ast_get_clk_source();
+		if(h_pll_set & SCU_H_PLL_BYPASS_EN) {
+			return clk;
+		} else {
+			//OD == SCU24[4]
+			//OD = SCU_H_PLL_GET_DIV(h_pll_set);
+			//Numerator == SCU24[10:5]
+			//num = SCU_H_PLL_GET_NUM(h_pll_set);
+			//Denumerator == SCU24[3:0]
+			//denum = SCU_H_PLL_GET_DENUM(h_pll_set);
+
+			//hpll = 24MHz * (2-OD) * ((Numerator+2)/(Denumerator+1))
+			clk = ((clk * (2-SCU_H_PLL_GET_DIV(h_pll_set)) * (SCU_H_PLL_GET_NUM(h_pll_set)+2))/(SCU_H_PLL_GET_DENUM(h_pll_set)+1));
+		}
+	} else {
+		// HW Trap
+		speed = SCU_HW_STRAP_GET_H_PLL_CLK(ast_scu_read(AST_SCU_HW_STRAP1));
+		switch (speed) {
+			case 0:
+				clk = 384000000;
+				break;
+			case 1:
+				clk = 360000000;
+				break;
+			case 2:
+				clk = 336000000;
+				break;
+			case 3:
+				clk = 408000000;
+				break;
+			default:
+				BUG();
+				break;
+		}
+	}
+	SCUDBUG("h_pll = %d\n",clk);
+	return clk;
+}
+
+
+extern u32
+ast_get_m_pll_clk(void)
+{
+	u32 clk=0;
+	u32 m_pll_set = ast_scu_read(AST_SCU_M_PLL);
+
+	if(m_pll_set & SCU_M_PLL_OFF)
+		return 0;
+
+	// Programming
+	clk = ast_get_clk_source();
+	if(m_pll_set & SCU_M_PLL_BYPASS) {
+		return clk;
+	} else {
+		//OD == SCU24[4]
+		//OD = SCU_M_PLL_GET_DIV(h_pll_set);
+		//Numerator == SCU24[10:5]
+		//num = SCU_M_PLL_GET_NUM(h_pll_set);
+		//Denumerator == SCU24[3:0]
+		//denum = SCU_M_PLL_GET_DENUM(h_pll_set);
+
+		//hpll = 24MHz * (2-OD) * ((Numerator+2)/(Denumerator+1))
+		clk = (clk * (2-SCU_M_PLL_GET_DIV(m_pll_set)) * ((SCU_M_PLL_GET_NUM(m_pll_set)+2)/(SCU_M_PLL_GET_DENUM(m_pll_set)+1)));
+	}
+	SCUDBUG("m_pll = %d\n",clk);
+	return clk;
+}
+
+
+extern u32
+ast_get_ahbclk(void)
+{
+	unsigned int div, hpll;
+
+	hpll = ast_get_h_pll_clk();
+	div = SCU_HW_STRAP_GET_CPU_AHB_RATIO(ast_scu_read(AST_SCU_HW_STRAP1));
+	div += 1;
+
+	SCUDBUG("HPLL=%d, Div=%d, AHB CLK=%d\n", hpll, div, hpll/div);
+	return (hpll/div);
+}
+
+
+extern u32
+ast_get_d2_pll_clk(void)
+{
+	u32 clk=0;
+	u32 d2_pll_set = ast_scu_read(AST_SCU_D2_PLL);
+	u32 OD,NUM,DENUM,PD,PD2;
+
+	if(d2_pll_set & SCU_D2_PLL_OFF)
+		return 0;
+
+	// Programming
+	clk = ast_get_clk_source();
+	if(d2_pll_set & SCU_D2_PLL_BYPASS) {
+		return clk;
+	} else {
+		NUM = SCU_D2_PLL_GET_NUM(d2_pll_set);
+		DENUM = SCU_D2_PLL_GET_DENUM(d2_pll_set);
+		OD = SCU_D2_PLL_GET_OD(d2_pll_set);
+		OD = (1 << (OD - 1));
+		PD = SCU_D2_PLL_GET_PD(d2_pll_set);
+		PD += 1;
+		PD2 = SCU_D2_PLL_GET_PD2(d2_pll_set);
+		PD2 += 1;
+//		printf("clk %d ,num %d ,denum %d ,od %d ,pd %d ,pd2 %d \n",clk, NUM , DENUM, OD, PD, PD2);
+		//hpll = 24MHz * (Numerator * 2) / (Denumerator * OD * PD * PD2)
+		clk = (clk * NUM * 2) / (DENUM* OD * PD * PD2);
+	}
+
+	SCUDBUG("d2_pll = %d\n",clk);
+	return clk;
+}
+
+
+#endif
+
+extern u32
+ast_get_pclk(void)
+{
+	unsigned int div, hpll;
+
+	hpll = ast_get_h_pll_clk();
+	div = SCU_GET_PCLK_DIV(ast_scu_read(AST_SCU_CLK_SEL));
+#ifdef AST_SOC_G5
+	div = (div+1) << 2;
+#else
+	div = (div+1) << 1;
+#endif
+
+	SCUDBUG("HPLL=%d, Div=%d, PCLK=%d\n", hpll, div, hpll/div);
+	return (hpll/div);
+
+}
+
+
+extern u32
+ast_get_lhclk(void)
+{
+	unsigned int div, hpll;
+	u32 clk_sel = ast_scu_read(AST_SCU_CLK_SEL);
+//FPGA AST1070 is default 100/2 Mhz input
+//	return 50000000;
+	hpll = ast_get_h_pll_clk();
+	if(SCU_LHCLK_SOURCE_EN & clk_sel) {
+		div = SCU_GET_LHCLK_DIV(clk_sel);
+#ifdef AST_SOC_G5
+		div = (div+1) << 2;
+#else
+		div = (div+1) << 1;
+#endif
+		SCUDBUG("HPLL=%d, Div=%d, LHCLK = %d\n", hpll, div, hpll/div);
+		return (hpll/div);
+	} else {
+		SCUMSG("LPC CLK not enable \n");
+		return 0;
+	}
+
+}
+
+
+//Because value 0 is not allowed in SDIO12C D[15:8]: Host Control Settings #1 Register, we have to increase the maximum
+//host's clock in case that system will not ask host to set 1 in the sdhci_set_clock() function
+/*
+SCU7C: Silicon Revision ID Register
+D[31:24]: Chip ID
+0: AST2050/AST2100/AST2150/AST2200/AST3000
+1: AST2300
+
+D[23:16] Silicon revision ID for AST2300 generation and later
+0: A0
+1: A1
+2: A2
+.
+.
+.
+FPGA revision starts from 0x80
+
+
+D[11:8] Bounding option
+
+D[7:0] Silicon revision ID for AST2050/AST2100 generation (for software compatible)
+0: A0
+1: A1
+2: A2
+3: A3
+.
+.
+FPGA revision starts from 0x08, 8~10 means A0, 11+ means A1, AST2300 should be assigned to 3
+*/
+
+extern u32
+ast_get_sd_clock_src(void)
+{
+	u32 clk=0, sd_div;
+
+	clk = ast_get_h_pll_clk();
+	//get div
+	sd_div = SCU_CLK_SD_GET_DIV(ast_scu_read(AST_SCU_CLK_SEL));
+#ifdef AST_SOC_G5
+		sd_div = (sd_div+1) << 2;
+#else
+		sd_div = (sd_div+1) << 1;
+#endif
+		SCUDBUG("div %d, sdclk =%d \n",sd_div,clk/sd_div);
+		clk /= sd_div;
+
+	return clk;
+}
+
+
+extern void
+ast_scu_show_system_info (void)
+{
+
+#ifdef AST_SOC_G5
+	unsigned int axi_div, ahb_div, h_pll;
+
+	h_pll = ast_get_h_pll_clk();
+
+	//AST2500 A1 fix
+	axi_div = 2;
+	ahb_div = (SCU_HW_STRAP_GET_AXI_AHB_RATIO(ast_scu_read(AST_SCU_HW_STRAP1)) + 1);
+
+	SCUMSG("CPU = %d MHz , AXI = %d MHz, AHB = %d MHz (%d:%d:1) \n",
+			h_pll/1000000,
+			h_pll/axi_div/1000000,
+			h_pll/axi_div/ahb_div/1000000, axi_div, ahb_div);
+
+#else
+	u32 h_pll, div;
+
+	h_pll = ast_get_h_pll_clk();
+
+	div = SCU_HW_STRAP_GET_CPU_AHB_RATIO(ast_scu_read(AST_SCU_HW_STRAP1));
+	div += 1;
+	SCUMSG("CPU = %d MHz ,AHB = %d MHz (%d:1) \n", h_pll/1000000, h_pll/div/1000000,div);
+#endif
+	return ;
+}
+
+
+//*********************************** Multi-function pin control ***********************************
+extern void
+ast_scu_multi_func_uart(u8 uart)
+{
+	switch(uart) {
+		case 1:
+			ast_scu_write(ast_scu_read(AST_SCU_FUN_PIN_CTRL2) |
+						SCU_FUN_PIN_UART1_RXD |
+						SCU_FUN_PIN_UART1_TXD |
+						SCU_FUN_PIN_UART1_NRTS |
+						SCU_FUN_PIN_UART1_NDTR |
+						SCU_FUN_PIN_UART1_NRI |
+						SCU_FUN_PIN_UART1_NDSR |
+						SCU_FUN_PIN_UART1_NDCD |
+						SCU_FUN_PIN_UART1_NCTS,
+				AST_SCU_FUN_PIN_CTRL2);
+			break;
+		case 2:
+			ast_scu_write(ast_scu_read(AST_SCU_FUN_PIN_CTRL2) |
+						SCU_FUN_PIN_UART2_RXD |
+						SCU_FUN_PIN_UART2_TXD |
+						SCU_FUN_PIN_UART2_NRTS |
+						SCU_FUN_PIN_UART2_NDTR |
+						SCU_FUN_PIN_UART2_NRI |
+						SCU_FUN_PIN_UART2_NDSR |
+						SCU_FUN_PIN_UART2_NDCD |
+						SCU_FUN_PIN_UART2_NCTS,
+				AST_SCU_FUN_PIN_CTRL2);
+			break;
+		case 3:
+			ast_scu_write(ast_scu_read(AST_SCU_FUN_PIN_CTRL1) |
+						SCU_FUN_PIN_UART3_RXD |
+						SCU_FUN_PIN_UART3_TXD |
+						SCU_FUN_PIN_UART3_NRTS |
+						SCU_FUN_PIN_UART3_NDTR |
+						SCU_FUN_PIN_UART3_NRI |
+						SCU_FUN_PIN_UART3_NDSR |
+						SCU_FUN_PIN_UART3_NDCD |
+						SCU_FUN_PIN_UART3_NCTS,
+				AST_SCU_FUN_PIN_CTRL1);
+			break;
+		case 4:
+			ast_scu_write(ast_scu_read(AST_SCU_FUN_PIN_CTRL1) |
+						SCU_FUN_PIN_UART4_RXD |
+						SCU_FUN_PIN_UART4_TXD |
+						SCU_FUN_PIN_UART4_NRTS |
+						SCU_FUN_PIN_UART4_NDTR |
+						SCU_FUN_PIN_UART4_NRI |
+						SCU_FUN_PIN_UART4_NDSR |
+						SCU_FUN_PIN_UART4_NDCD |
+						SCU_FUN_PIN_UART4_NCTS,
+				AST_SCU_FUN_PIN_CTRL1);
+			break;
+		case 6:
+			ast_scu_write(ast_scu_read(AST_SCU_FUN_PIN_CTRL5) |
+						SCU_FUC_PIN_UART6,
+				AST_SCU_FUN_PIN_CTRL5);
+			break;
+#ifdef AST_SOC_G5
+		case 7:
+			ast_scu_write(ast_scu_read(AST_SCU_FUN_PIN_CTRL6) |
+						SCU_FUN_PIN_UART7,
+				AST_SCU_FUN_PIN_CTRL6);
+			break;
+		case 8:
+			ast_scu_write(ast_scu_read(AST_SCU_FUN_PIN_CTRL6) |
+						SCU_FUN_PIN_UART8,
+				AST_SCU_FUN_PIN_CTRL6);
+			break;
+		case 9:
+			ast_scu_write(ast_scu_read(AST_SCU_FUN_PIN_CTRL6) |
+						SCU_FUN_PIN_UART9,
+				AST_SCU_FUN_PIN_CTRL6);
+			break;
+		case 10:
+			ast_scu_write(ast_scu_read(AST_SCU_FUN_PIN_CTRL2) &
+						~(SCU_FUN_PIN_VGAVS | SCU_FUN_PIN_VGAHS),
+				AST_SCU_FUN_PIN_CTRL2);
+
+			ast_scu_write(ast_scu_read(AST_SCU_FUN_PIN_CTRL6) |
+						SCU_FUN_PIN_UART10,
+				AST_SCU_FUN_PIN_CTRL6);
+			break;
+		case 11:
+			ast_scu_write(ast_scu_read(AST_SCU_FUN_PIN_CTRL2) &
+						~(SCU_FUN_PIN_DDCDAT | SCU_FUN_PIN_DDCCLK),
+				AST_SCU_FUN_PIN_CTRL2);
+
+			ast_scu_write(ast_scu_read(AST_SCU_FUN_PIN_CTRL6) |
+						SCU_FUN_PIN_UART11,
+				AST_SCU_FUN_PIN_CTRL6);
+			break;
+		case 12:
+			ast_scu_write(ast_scu_read(AST_SCU_FUN_PIN_CTRL6) |
+						SCU_FUN_PIN_UART12,
+				AST_SCU_FUN_PIN_CTRL6);
+			break;
+		case 13:
+			ast_scu_write(ast_scu_read(AST_SCU_FUN_PIN_CTRL6) |
+						SCU_FUN_PIN_UART13,
+				AST_SCU_FUN_PIN_CTRL6);
+			break;
+#endif
+	}
+
+
+}
+
+extern void
+ast_scu_multi_func_video()
+{
+#if defined(CONFIG_ARCH_2100) || defined(CONFIG_ARCH_2200)
+	ast_scu_write(ast_scu_read(AST_SCU_MULTI_FUNC_2) |
+				MULTI_FUNC_VIDEO_RGB18 |
+				MULTI_FUNC_VIDEO_SINGLE_EDGE,
+		AST_SCU_MULTI_FUNC_2);
+#elif defined(CONFIG_ARCH_1100) || defined(CONFIG_ARCH_2050)
+	ast_scu_write(ast_scu_read(AST_SCU_MULTI_FUNC_2) |
+				MULTI_FUNC_VIDEO_RGB18 |
+				MULTI_FUNC_VIDEO_SINGLE_EDGE,
+		AST_SCU_MULTI_FUNC_2);
+#else
+
+#endif
+}
+
+#ifdef CONFIG_ARCH_AST1010
+extern void
+ast_scu_multi_func_eth(u8 num)
+{
+	switch(num) {
+		case 0:
+			ast_scu_write(ast_scu_read(AST_SCU_FUN_PIN_CTRL3) |
+						SCU_FUN_PIN_MAC0_MDIO |
+						SCU_FUN_PIN_MAC0_MDC |
+						0xff000000,
+				AST_SCU_FUN_PIN_CTRL3);
+
+			/* Currently we use fix value in MAC timing on EVB */
+			ast_scu_write(0x2255, AST_SCU_MAC_CLK);
+
+			break;
+		case 1:
+			ast_scu_write(ast_scu_read(AST_SCU_FUN_PIN_CTRL1) |
+						SCU_FUN_PIN_MAC1_PHY_LINK,
+				AST_SCU_FUN_PIN_CTRL1);
+
+			ast_scu_write(ast_scu_read(AST_SCU_FUN_PIN_CTRL5) |
+						SCU_FUC_PIN_MAC1_MDIO,
+				AST_SCU_FUN_PIN_CTRL5);
+
+			break;
+	}
+}
+#else
+extern void
+ast_scu_multi_func_eth(u8 num)
+{
+	switch(num) {
+		case 0:
+			if(ast_scu_read(AST_SCU_HW_STRAP1) & SCU_HW_STRAP_MAC0_RGMII) {
+				SCUMSG("MAC0 : RGMII \n");
+				ast_scu_write(ast_scu_read(AST_SCU_FUN_PIN_CTRL1) |
+							SCU_FUN_PIN_MAC0_PHY_LINK,
+					AST_SCU_FUN_PIN_CTRL1);
+			} else {
+				SCUMSG("MAC0 : RMII/NCSI \n");
+				ast_scu_write(ast_scu_read(AST_SCU_FUN_PIN_CTRL1) &
+							~SCU_FUN_PIN_MAC0_PHY_LINK,
+					AST_SCU_FUN_PIN_CTRL1);
+			}
+
+#ifdef AST_SOC_G5
+			ast_scu_write(ast_scu_read(AST_SCU_FUN_PIN_CTRL1) |
+						SCU_FUN_PIN_MAC0_PHY_LINK,
+				AST_SCU_FUN_PIN_CTRL1);
+
+#endif
+			ast_scu_write(ast_scu_read(AST_SCU_FUN_PIN_CTRL3) |
+						SCU_FUN_PIN_MAC0_MDIO |
+						SCU_FUN_PIN_MAC0_MDC,
+				AST_SCU_FUN_PIN_CTRL3);
+
+			break;
+		case 1:
+			if(ast_scu_read(AST_SCU_HW_STRAP1) & SCU_HW_STRAP_MAC1_RGMII) {
+				SCUMSG("MAC1 : RGMII \n");
+				ast_scu_write(ast_scu_read(AST_SCU_FUN_PIN_CTRL1) |
+							SCU_FUN_PIN_MAC1_PHY_LINK,
+					AST_SCU_FUN_PIN_CTRL1);
+			} else {
+				SCUMSG("MAC1 : RMII/NCSI \n");
+				ast_scu_write(ast_scu_read(AST_SCU_FUN_PIN_CTRL1) &
+						~SCU_FUN_PIN_MAC1_PHY_LINK,
+					AST_SCU_FUN_PIN_CTRL1);
+			}
+
+			ast_scu_write(ast_scu_read(AST_SCU_FUN_PIN_CTRL1) |
+						SCU_FUN_PIN_MAC1_PHY_LINK,
+				AST_SCU_FUN_PIN_CTRL1);
+
+			ast_scu_write(ast_scu_read(AST_SCU_FUN_PIN_CTRL5) |
+						SCU_FUC_PIN_MAC1_MDIO,
+				AST_SCU_FUN_PIN_CTRL5);
+
+			break;
+	}
+}
+#endif
+
+extern void
+ast_scu_multi_func_nand(void)
+{
+#ifdef AST_SOC_G5
+#else
+	//enable NAND flash multipin FLBUSY and FLWP
+	ast_scu_write(ast_scu_read(AST_SCU_FUN_PIN_CTRL2) |
+				SCU_FUN_PIN_NAND_FLBUSY | SCU_FUN_PIN_NAND_FLWP,
+		AST_SCU_FUN_PIN_CTRL2);
+#endif
+
+}
+
+#if 0
+extern void
+ast_scu_multi_func_nor(void)
+{
+	//Address
+	//ROMA2~17
+	ast_scu_write(ast_scu_read(AST_SCU_FUN_PIN_CTRL8) |
+				SCU_FUN_PIN_ROMA2 | SCU_FUN_PIN_ROMA3 |
+				SCU_FUN_PIN_ROMA4 | SCU_FUN_PIN_ROMA5 |
+				SCU_FUN_PIN_ROMA6 | SCU_FUN_PIN_ROMA7 |
+				SCU_FUN_PIN_ROMA8 | SCU_FUN_PIN_ROMA9 |
+				SCU_FUN_PIN_ROMA10 | SCU_FUN_PIN_ROMA11 |
+				SCU_FUN_PIN_ROMA12 | SCU_FUN_PIN_ROMA13 |
+				SCU_FUN_PIN_ROMA14 | SCU_FUN_PIN_ROMA15 |
+				SCU_FUN_PIN_ROMA16 | SCU_FUN_PIN_ROMA17,
+		AST_SCU_FUN_PIN_CTRL8);
+
+	//ROMA18~21
+	ast_scu_write(ast_scu_read(AST_SCU_FUN_PIN_CTRL9) |
+				SCU_FUN_PIN_ROMA18 | SCU_FUN_PIN_ROMA19 |
+				SCU_FUN_PIN_ROMA20 | SCU_FUN_PIN_ROMA21,
+		AST_SCU_FUN_PIN_CTRL9);
+
+	//ROMA22,23
+	ast_scu_write(ast_scu_read(AST_SCU_FUN_PIN_CTRL4) | SCU_FUN_PIN_ROMA22 | SCU_FUN_PIN_ROMA23,
+		AST_SCU_FUN_PIN_CTRL4);
+
+	//ROMA24,25
+	ast_scu_write(ast_scu_read(AST_SCU_FUN_PIN_CTRL3) | SCU_FUN_PIN_ROMA24 | SCU_FUN_PIN_ROMA25,
+		AST_SCU_FUN_PIN_CTRL3);
+
+	//SCU94 [1] = 0
+	ast_scu_write(ast_scu_read(AST_SCU_FUN_PIN_CTRL6) & SCU_VIDEO_OUT_MASK,
+		AST_SCU_FUN_PIN_CTRL6);
+
+
+	//data
+	//ROMD 4~7 //ROMWE#, OE#
+	ast_scu_write(ast_scu_read(AST_SCU_FUN_PIN_CTRL4) |
+			SCU_FUN_PIN_ROMOE | SCU_FUN_PIN_ROMWE |
+			SCU_FUN_PIN_ROMD4 | SCU_FUN_PIN_ROMD5 |
+			SCU_FUN_PIN_ROMD6 | SCU_FUN_PIN_ROMD7,
+			AST_SCU_FUN_PIN_CTRL4);
+
+	//ROMD 8~15
+	ast_scu_write(ast_scu_read(AST_SCU_FUN_PIN_CTRL5) |
+			SCU_FUC_PIN_ROM_16BIT,
+		AST_SCU_FUN_PIN_CTRL5);
+
+}
+#endif
+
+extern void
+ast_scu_multi_func_romcs(u8 num)
+{
+	ast_scu_write(ast_scu_read(AST_SCU_FUN_PIN_CTRL3) |
+			SCU_FUN_PIN_ROMCS(num),
+		AST_SCU_FUN_PIN_CTRL3);
+}
+
+extern void
+ast_scu_multi_func_i2c(void)
+{
+	//TODO check ... //In AST2400 Due to share pin with SD , please not enable I2C 10 ~14
+	// AST 2400 have 14 , AST 2300 9 ...
+#ifdef CONFIG_MMC_AST
+	ast_scu_write(ast_scu_read(AST_SCU_FUN_PIN_CTRL5) |
+			SCU_FUC_PIN_I2C3 |
+			SCU_FUC_PIN_I2C4 |
+			SCU_FUC_PIN_I2C5 |
+			SCU_FUC_PIN_I2C6 |
+			SCU_FUC_PIN_I2C7 |
+			SCU_FUC_PIN_I2C8 |
+			SCU_FUC_PIN_I2C9,
+		AST_SCU_FUN_PIN_CTRL5);
+#else
+	ast_scu_write((ast_scu_read(AST_SCU_FUN_PIN_CTRL5) |
+			SCU_FUC_PIN_I2C3 |
+			SCU_FUC_PIN_I2C4 |
+			SCU_FUC_PIN_I2C5 |
+			SCU_FUC_PIN_I2C6 |
+			SCU_FUC_PIN_I2C7 |
+			SCU_FUC_PIN_I2C8 |
+			SCU_FUC_PIN_I2C9 |
+			SCU_FUC_PIN_I2C10 |
+			SCU_FUC_PIN_I2C11 |
+			SCU_FUC_PIN_I2C12 |
+			SCU_FUC_PIN_I2C13 |
+			SCU_FUC_PIN_I2C14) &
+			~(SCU_FUC_PIN_SD1 | SCU_FUC_PIN_SD2),
+		AST_SCU_FUN_PIN_CTRL5);
+#endif
+}
+
+
+extern void
+ast_scu_multi_func_pwm_tacho(void)
+{
+	//TODO check
+	u32 sts = ast_scu_read(AST_SCU_FUN_PIN_CTRL3) &~0xcfffff;
+	ast_scu_write(sts | 0xc000ff, AST_SCU_FUN_PIN_CTRL3);
+}
+
+
+//0 : usb 2.0 hub mode, 1:usb 2.0 host2 controller
+extern void
+ast_scu_multi_func_usb_port1_mode(u8 mode)
+{
+	if(mode)
+		ast_scu_write(ast_scu_read(AST_SCU_FUN_PIN_CTRL5) | SCU_FUC_PIN_USB20_HOST,
+					AST_SCU_FUN_PIN_CTRL5);
+	else
+		ast_scu_write(ast_scu_read(AST_SCU_FUN_PIN_CTRL5) & ~SCU_FUC_PIN_USB20_HOST,
+					AST_SCU_FUN_PIN_CTRL5);
+}
+
+
+//0 : 1.1 hid 1, 1.1 host , 2, 2.0 host 3, 2.0 device
+extern void
+ast_scu_multi_func_usb_port2_mode(u8 mode)
+{
+#if defined(AST_SOC_G5)
+	if(mode == 0)
+		ast_scu_write((ast_scu_read(AST_SCU_FUN_PIN_CTRL6) & ~SCU_FUN_PIN_USBP1_MASK),
+					AST_SCU_FUN_PIN_CTRL6);
+	else if ((mode == 1) || (mode == 2))
+		ast_scu_write((ast_scu_read(AST_SCU_FUN_PIN_CTRL6) & ~SCU_FUN_PIN_USBP1_MASK) |
+					SCU_FUN_PIN_USBP1_MODE(0x2),
+					AST_SCU_FUN_PIN_CTRL6);
+	else if (mode == 3)
+		ast_scu_write((ast_scu_read(AST_SCU_FUN_PIN_CTRL6) & ~SCU_FUN_PIN_USBP1_MASK) |
+					SCU_FUN_PIN_USBP1_MODE(0x1),
+					AST_SCU_FUN_PIN_CTRL6);
+	else {
+		printf("nothing\n");
+	}
+#else
+	if(mode == 0)
+		ast_scu_write(ast_scu_read(AST_SCU_FUN_PIN_CTRL5) & ~SCU_FUC_PIN_USB11_PORT2,
+					AST_SCU_FUN_PIN_CTRL5);
+	else if (mode == 1)
+		ast_scu_write(ast_scu_read(AST_SCU_FUN_PIN_CTRL5) | SCU_FUC_PIN_USB11_PORT2,
+			AST_SCU_FUN_PIN_CTRL5);
+	else if (mode == 2)
+		ast_scu_write(ast_scu_read(AST_SCU_FUN_PIN_CTRL5) | SCU_FUC_PIN_USB20_HOST,
+					AST_SCU_FUN_PIN_CTRL5);
+	else {
+		printf("nothing\n");
+	}
+#endif
+}
+
+
+//0 : gpioQ6,7 mode , 1: usb1.1 host port 4 mode
+extern void
+ast_scu_multi_func_usb_port34_mode(u8 mode)
+{
+#if defined(AST_SOC_G5)
+	if(mode) {
+		ast_scu_write(ast_scu_read(AST_SCU_FUN_PIN_CTRL5) | SCU_FUC_PIN_USB11_PORT4,
+					AST_SCU_FUN_PIN_CTRL5);
+		ast_scu_write(ast_scu_read(AST_SCU_FUN_PIN_CTRL3) |
+					(SCU_FUN_PIN_USBP3_DP |SCU_FUN_PIN_USBP3_DN | SCU_FUN_PIN_USBP4_DP | SCU_FUN_PIN_USBP4_DN),
+					AST_SCU_FUN_PIN_CTRL3);
+	} else {
+		ast_scu_write(ast_scu_read(AST_SCU_FUN_PIN_CTRL5) & ~SCU_FUC_PIN_USB11_PORT4,
+					AST_SCU_FUN_PIN_CTRL5);
+		ast_scu_write(ast_scu_read(AST_SCU_FUN_PIN_CTRL3) &
+					~(SCU_FUN_PIN_USBP3_DP |SCU_FUN_PIN_USBP3_DN | SCU_FUN_PIN_USBP4_DP | SCU_FUN_PIN_USBP4_DN),
+					AST_SCU_FUN_PIN_CTRL3);
+	}
+#else
+	if(mode) {
+		ast_scu_write(ast_scu_read(AST_SCU_FUN_PIN_CTRL5) | SCU_FUC_PIN_USB11_PORT4,
+					AST_SCU_FUN_PIN_CTRL5);
+	} else {
+		ast_scu_write(ast_scu_read(AST_SCU_FUN_PIN_CTRL5) & ~SCU_FUC_PIN_USB11_PORT4,
+					AST_SCU_FUN_PIN_CTRL5);
+	}
+#endif
+}
+
+
+//0 : 1: SD1 function
+extern void
+ast_scu_multi_func_sdhc_8bit_mode(void)
+{
+		ast_scu_write(ast_scu_read(AST_SCU_FUN_PIN_CTRL5) | SCU_FUC_PIN_SD1 | SCU_FUC_PIN_SD1_8BIT,
+					AST_SCU_FUN_PIN_CTRL5);
+}
+
+
+extern void
+ast_scu_multi_func_sdhc_slot(u8 slot)
+{
+	switch(slot) {
+		case 1:
+			ast_scu_write(ast_scu_read(AST_SCU_FUN_PIN_CTRL5) | SCU_FUC_PIN_SD1,
+						AST_SCU_FUN_PIN_CTRL5);
+			break;
+		case 2:
+			ast_scu_write(ast_scu_read(AST_SCU_FUN_PIN_CTRL5) | SCU_FUC_PIN_SD2,
+						AST_SCU_FUN_PIN_CTRL5);
+			break;
+		case 3:
+			ast_scu_write(ast_scu_read(AST_SCU_FUN_PIN_CTRL5) | SCU_FUC_PIN_SD1 | SCU_FUC_PIN_SD2,
+						AST_SCU_FUN_PIN_CTRL5);
+			break;
+	}
+}
+
+
+//0: VGA , 1 : CRT, 2 : PASS through Port -A, 3 : PASS through Port -B
+extern void
+ast_scu_set_crt_source(u8 dac_soource)
+{
+	ast_scu_write((ast_scu_read(AST_SCU_MISC1_CTRL) & ~SCU_MISC_DAC_MASK) |
+				SCU_MISC_SET_DAC_SOURCE(dac_soource)  , AST_SCU_MISC1_CTRL);
+
+}
+
+
+extern void
+ast_scu_multi_func_crt(void)
+{
+	/* multi-pin for DVO enable DVO (bit18) is VGA , enable DAC (bit16) is CRT  */
+#if defined(CONFIG_AST_DAC) || defined(CONFIG_AST_DVO)
+		ast_scu_write((ast_scu_read(AST_SCU_MISC1_CTRL) & ~SCU_MISC_DAC_MASK)
+					| SCU_MISC_DAC_SOURCE_CRT | SCU_MISC_DVO_SOURCE_CRT | SCU_MISC_2D_CRT_EN , AST_SCU_MISC1_CTRL);
+#elif defined(CONFIG_AST_DVO)
+		ast_scu_write(ast_scu_read(AST_SCU_MISC1_CTRL) | SCU_MISC_DVO_SOURCE_CRT| SCU_MISC_2D_CRT_EN, AST_SCU_MISC1_CTRL);
+#else //default(CONFIG_AST_DAC)
+		ast_scu_write((ast_scu_read(AST_SCU_MISC1_CTRL) & ~SCU_MISC_DAC_MASK)
+					| SCU_MISC_DAC_SOURCE_CRT | SCU_MISC_2D_CRT_EN, AST_SCU_MISC1_CTRL);
+#endif
+
+	//Digital vodeo input function pins : 00 disable, 10 24bits mode 888,
+	ast_scu_write((ast_scu_read(AST_SCU_FUN_PIN_CTRL6) &
+			~SCU_FUC_PIN_DIGI_V_OUT_MASK) |
+			SCU_FUC_PIN_DIGI_V_OUT(VIDEO_24BITS), AST_SCU_FUN_PIN_CTRL6);
+
+	//VPI input
+#if 0
+	ast_scu_write(ast_scu_read(AST_SCU_FUN_PIN_CTRL2) |
+			SCU_FUN_PIN_VPIB9 | SCU_FUN_PIN_VPIB8 |
+			SCU_FUN_PIN_VPIB7 | SCU_FUN_PIN_VPIB6 |
+			SCU_FUN_PIN_VPIB5 | SCU_FUN_PIN_VPIB4 |
+			SCU_FUN_PIN_VPIB3 | SCU_FUN_PIN_VPIB2 |
+			SCU_FUN_PIN_VPIB1 | SCU_FUN_PIN_VPIB0 |
+			SCU_FUN_PIN_VPICLK | SCU_FUN_PIN_VPIVS |
+			SCU_FUN_PIN_VPIHS | SCU_FUN_PIN_VPIODD |
+			SCU_FUN_PIN_VPIDE ,AST_SCU_FUN_PIN_CTRL2);
+
+	ast_scu_write(ast_scu_read(AST_SCU_FUN_PIN_CTRL3) |
+			SCU_FUN_PIN_VPIR9 | SCU_FUN_PIN_VPIR8 |
+			SCU_FUN_PIN_VPIR7 | SCU_FUN_PIN_VPIR6 |
+			SCU_FUN_PIN_VPIR5 | SCU_FUN_PIN_VPIR4 |
+			SCU_FUN_PIN_VPIR3 | SCU_FUN_PIN_VPIR2 |
+			SCU_FUN_PIN_VPIR1 | SCU_FUN_PIN_VPIR0 |
+			SCU_FUN_PIN_VPIG9 | SCU_FUN_PIN_VPIG8 |
+			SCU_FUN_PIN_VPIG7 | SCU_FUN_PIN_VPIG6 |
+			SCU_FUN_PIN_VPIG5 | SCU_FUN_PIN_VPIG4 |
+			SCU_FUN_PIN_VPIG3 | SCU_FUN_PIN_VPIG2 |
+			SCU_FUN_PIN_VPIG1 | SCU_FUN_PIN_VPIG0 ,AST_SCU_FUN_PIN_CTRL3);
+#endif
+}
+
+
+extern void
+ast_scu_multi_nic_switch(u8 enable)
+{
+	if(enable) {
+		ast_scu_write((0x1 << 28) | ast_scu_read(AST_SCU_MAC_CLK), AST_SCU_MAC_CLK);
+		ast_scu_write(~(0x1 << 11) & ast_scu_read(AST_SCU_RESET), AST_SCU_RESET);	//A1 ECO
+	} else {
+		ast_scu_write(~(0x1 << 28) & ast_scu_read(AST_SCU_MAC_CLK), AST_SCU_MAC_CLK);
+		ast_scu_write((0x1 << 11) | ast_scu_read(AST_SCU_RESET), AST_SCU_RESET);
+	}
+
+}
+
+extern void
+ast_scu_multi_func_sgpio(void)
+{
+	ast_scu_write(ast_scu_read(AST_SCU_FUN_PIN_CTRL2) |
+			SCU_FUN_PIN_SGPMI |
+			SCU_FUN_PIN_SGPMO |
+			SCU_FUN_PIN_SGPMLD |
+			SCU_FUN_PIN_SGPMCK, AST_SCU_FUN_PIN_CTRL2);
+
+}
+
+
+//***********************************Information ***********************************
+extern u32
+ast_scu_revision_id(void)
+{
+	int i;
+	u32 rev_id = ast_scu_read(AST_SCU_REVISION_ID);
+	for(i=0;i<ARRAY_SIZE(soc_map_table);i++) {
+		if(rev_id == soc_map_table[i].rev_id)
+			break;
+	}
+	if(i == ARRAY_SIZE(soc_map_table))
+		SCUMSG("UnKnow-SOC : %x \n",rev_id);
+	else
+		SCUMSG("SOC : %4s \n",soc_map_table[i].name);
+
+	return rev_id;
+}
+
+
+extern void
+ast_scu_security_info(void)
+{
+	switch((ast_scu_read(AST_SCU_HW_STRAP2) >> 18) & 0x3) {
+		case 1:
+			printf("SEC : DSS Mode \n");
+			break;
+		case 2:
+			printf("SEC : UnKnow \n");
+			break;
+		case 3:
+			printf("SEC : SPI2 Mode \n");
+			break;
+	}
+
+}
+
+extern void
+ast_scu_sys_rest_info(void)
+{
+	u32 rest = ast_scu_read(AST_SCU_SYS_CTRL);
+
+#ifdef CONFIG_ARCH_AST1010
+	if(rest & SCU_SYS_WDT_FULL_FLAG) {
+		SCUMSG("RST : External \n");
+		ast_scu_write(SCU_SYS_WDT_FULL_FLAG, AST_SCU_SYS_CTRL);
+	} else if (rest & SCU_SYS_WDT_SOC_RESET) {
+		SCUMSG("RST : Watchdog - SOC\n");
+		ast_scu_write(SCU_SYS_WDT_SOC_RESET, AST_SCU_SYS_CTRL);
+	} else if (rest & SCU_SYS_PWR_RESET_FLAG) {
+		SCUMSG("RST : Power On \n");
+		ast_scu_write(SCU_SYS_PWR_RESET_FLAG, AST_SCU_SYS_CTRL);
+	} else {
+	}
+#else
+	if(rest & SCU_SYS_EXT_RESET_FLAG) {
+		SCUMSG("RST : External \n");
+		ast_scu_write(SCU_SYS_EXT_RESET_FLAG, AST_SCU_SYS_CTRL);
+	} else if (rest & SCU_SYS_WDT_RESET_FLAG) {
+		SCUMSG("RST : Watchdog \n");
+		ast_scu_write(SCU_SYS_WDT_RESET_FLAG, AST_SCU_SYS_CTRL);
+	} else if (rest & SCU_SYS_PWR_RESET_FLAG) {
+		SCUMSG("RST : Power On \n");
+		ast_scu_write(SCU_SYS_PWR_RESET_FLAG, AST_SCU_SYS_CTRL);
+	} else {
+		SCUMSG("RST : CLK en \n");
+	}
+#endif
+}
+
+
+/*
+* D[15:11] in 0x1E6E2040 is NCSI scratch from U-Boot. D[15:14] = MAC1, D[13:12] = MAC2
+* The meanings of the 2 bits are:
+* 00(0): Dedicated PHY
+* 01(1): ASPEED's EVA + INTEL's NC-SI PHY chip EVA
+* 10(2): ASPEED's MAC is connected to NC-SI PHY chip directly
+* 11: Reserved
+*/
+
+extern u32
+ast_scu_get_phy_config(u8 mac_num)
+{
+	u32 scatch = ast_scu_read(AST_SCU_SOC_SCRATCH0);
+
+	switch(mac_num) {
+		case 0:
+			return (SCU_MAC0_GET_PHY_MODE(scatch));
+			break;
+		case 1:
+			return (SCU_MAC1_GET_PHY_MODE(scatch));
+			break;
+		default:
+			SCUMSG("error mac number \n");
+			break;
+	}
+	return -1;
+}
+
+extern u32
+ast_scu_get_phy_interface(u8 mac_num)
+{
+	u32 trap1 = ast_scu_read(AST_SCU_HW_STRAP1);
+
+	switch(mac_num) {
+		case 0:
+			if(SCU_HW_STRAP_MAC0_RGMII & trap1)
+				return 1;
+			else
+				return 0;
+			break;
+		case 1:
+			if(SCU_HW_STRAP_MAC1_RGMII & trap1)
+				return 1;
+			else
+				return 0;
+			break;
+		default:
+			SCUMSG("error mac number \n");
+			break;
+	}
+	return -1;
+}
+
+extern void
+ast_scu_set_vga_display(u8 enable)
+{
+	if(enable)
+		ast_scu_write(ast_scu_read(AST_SCU_MISC1_CTRL) & ~SCU_MISC_VGA_CRT_DIS, AST_SCU_MISC1_CTRL);
+	else
+		ast_scu_write(ast_scu_read(AST_SCU_MISC1_CTRL) | SCU_MISC_VGA_CRT_DIS, AST_SCU_MISC1_CTRL);
+}
+
+
+extern u8
+ast_scu_get_vga_display(void)
+{
+	if(ast_scu_read(AST_SCU_MISC1_CTRL) & SCU_MISC_VGA_CRT_DIS)
+		return 0;
+	else
+		return 1;
+}
+
+
+extern u32
+ast_scu_get_vga_memsize(void)
+{
+	u32 size=0;
+
+	switch(SCU_HW_STRAP_VGA_SIZE_GET(ast_scu_read(AST_SCU_HW_STRAP1))) {
+		case VGA_8M_DRAM:
+			size = 8*1024*1024;
+			break;
+		case VGA_16M_DRAM:
+			size = 16*1024*1024;
+			break;
+		case VGA_32M_DRAM:
+			size = 32*1024*1024;
+			break;
+		case VGA_64M_DRAM:
+			size = 64*1024*1024;
+			break;
+		default:
+			SCUMSG("error vga size \n");
+			break;
+	}
+	return size;
+}
+
+
+extern u32
+ast_scu_get_soc_dram_base(void)
+{
+	u32 rev_id = ast_scu_read(AST_SCU_REVISION_ID);
+	if((rev_id >> AST_SOC_GEN) > 3)
+		return AST_DRAM_BASE_8;
+	else
+		return AST_DRAM_BASE_4;
+}
+
+extern void
+ast_scu_get_who_init_dram(void)
+{
+	switch(SCU_VGA_DRAM_INIT_MASK(ast_scu_read(AST_SCU_VGA0))) {
+		case 0:
+			printf("DRAM :   init by VBIOS \n");
+			break;
+		case 1:
+			printf("DRAM :   init by SOC \n");
+			break;
+		default:
+			printf("error vga size \n");
+			break;
+	}
+}
+
+extern u8
+ast_scu_adc_trim_read(void)
+{
+	return (ast_scu_read(AST_SCU_OTP1) >> 28);
+}
+
+extern void
+ast_scu_hw_random_enable(u8 enable)
+{
+	if(enable)
+		ast_scu_write(ast_scu_read(AST_SCU_RAMDOM_GEN) | RNG_ENABLE, AST_SCU_RAMDOM_GEN);
+	else
+		ast_scu_write(ast_scu_read(AST_SCU_RAMDOM_GEN) & ~RNG_ENABLE, AST_SCU_RAMDOM_GEN);
+}
+
+extern u32
+ast_scu_hw_random_read(void)
+{
+	return (ast_scu_read(AST_SCU_RAMDOM_DATA));
+}
+
+extern u8
+ast_scu_get_hw_random_type(void)
+{
+	return (RNG_GET_TYPE(ast_scu_read(AST_SCU_RAMDOM_GEN)));
+}
+
+extern void
+ast_scu_set_hw_random_type(u8 type)
+{
+	ast_scu_write(((ast_scu_read(AST_SCU_RAMDOM_GEN) & ~RNG_TYPE_MASK) | RNG_SET_TYPE(type)), AST_SCU_RAMDOM_GEN);
+}
diff --git a/arch/arm/mach-aspeed/ast-sdmc.c b/arch/arm/mach-aspeed/ast-sdmc.c
new file mode 100644
index 000000000000..6ac891532bdb
--- /dev/null
+++ b/arch/arm/mach-aspeed/ast-sdmc.c
@@ -0,0 +1,152 @@
+/********************************************************************************
+* File Name     : arch/arm/mach-aspeed/ast-sdmc.c
+* Author         : Ryan Chen
+* Description   : AST SDRAM Memory Ctrl
+*
+* Copyright (C) 2012-2020  ASPEED Technology Inc.
+* 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
+
+
+*   History      :
+*    1. 2013/03/15 Ryan Chen Create
+*
+********************************************************************************/
+#include <common.h>
+#include <asm/processor.h>
+#include <asm/io.h>
+#include <asm/arch/platform.h>
+
+#include <asm/arch/regs-sdmc.h>
+#include <asm/arch/ast-sdmc.h>
+
+//#define AST_SDMC_LOCK
+//#define AST_SDMC_DEBUG
+
+#ifdef AST_SDMC_DEBUG
+#define SDMCDBUG(fmt, args...) printf("%s() " fmt, __FUNCTION__, ## args)
+#else
+#define SDMCDBUG(fmt, args...)
+#endif
+
+#define SDMCMSG(fmt, args...) printf(fmt, ## args)
+
+static u32 ast_sdmc_base = AST_SDMC_BASE;
+
+static inline u32
+ast_sdmc_read(u32 reg)
+{
+	u32 val;
+
+	val = readl(ast_sdmc_base + reg);
+
+	SDMCDBUG("ast_sdmc_read : reg = 0x%08x, val = 0x%08x\n", reg, val);
+
+	return val;
+}
+
+static inline void
+ast_sdmc_write(u32 val, u32 reg)
+{
+	SDMCDBUG("ast_sdmc_write : reg = 0x%08x, val = 0x%08x\n", reg, val);
+#ifdef CONFIG_AST_SDMC_LOCK
+	//unlock
+	writel(SDMC_PROTECT_UNLOCK, ast_sdmc_base);
+	writel(val, ast_sdmc_base + reg);
+	//lock
+	writel(0xaa,ast_sdmc_base);
+#else
+	writel(SDMC_PROTECT_UNLOCK, ast_sdmc_base);
+
+	writel(val, ast_sdmc_base + reg);
+#endif
+}
+
+//***********************************Information ***********************************
+#ifdef CONFIG_ARCH_AST1010
+extern u32
+ast_sdmc_get_mem_size(void)
+{
+	if(ast_sdmc_read(AST_SDMC_CONFIG) & SDMC_CONFIG_16MB) {
+		return PHYS_SDRAM_12M;
+	} else {
+		return PHYS_SDRAM_8M;
+	}
+}
+#else
+extern u32
+ast_sdmc_get_mem_size(void)
+{
+	u32 size=0;
+	u32 conf = ast_sdmc_read(AST_SDMC_CONFIG);
+
+	if(conf & SDMC_CONFIG_VER_NEW) {
+		switch(SDMC_CONFIG_MEM_GET(conf)) {
+			case 0:
+				size = 128*1024*1024;
+				break;
+			case 1:
+				size = 256*1024*1024;
+				break;
+			case 2:
+				size = 512*1024*1024;
+				break;
+			case 3:
+				size = 1024*1024*1024;
+				break;
+
+			default:
+				SDMCMSG("error ddr size \n");
+				break;
+		}
+
+	} else {
+		switch(SDMC_CONFIG_MEM_GET(conf)) {
+			case 0:
+				size = 64*1024*1024;
+				break;
+			case 1:
+				size = 128*1024*1024;
+				break;
+			case 2:
+				size = 256*1024*1024;
+				break;
+			case 3:
+				size = 512*1024*1024;
+				break;
+
+			default:
+				SDMCMSG("error ddr size \n");
+				break;
+		}
+	}
+	return size;
+}
+#endif
+
+extern u8
+ast_sdmc_get_eec(void)
+{
+	u32 conf = ast_sdmc_read(AST_SDMC_CONFIG);
+	if(conf & SDMC_CONFIG_EEC_EN)
+		return 1;
+	else
+		return 0;
+}
+
+extern u8
+ast_sdmc_get_cache(void)
+{
+	u32 conf = ast_sdmc_read(AST_SDMC_CONFIG);
+	if(conf & SDMC_CONFIG_CACHE_EN)
+		return 1;
+	else
+		return 0;
+}
diff --git a/arch/arm/mach-aspeed/cpuinfo.c b/arch/arm/mach-aspeed/cpuinfo.c
new file mode 100644
index 000000000000..96d2de5a416a
--- /dev/null
+++ b/arch/arm/mach-aspeed/cpuinfo.c
@@ -0,0 +1,49 @@
+/*
+ * This file is released under the terms of GPL v2 and any later version.
+ * See the file COPYING in the root directory of the source tree for details.
+*/
+
+#include <common.h>
+#include <command.h>
+#include <asm/io.h>
+#include <asm/arch/ast_scu.h>
+#include <asm/arch/ast-sdmc.h>
+#include <asm/arch/aspeed.h>
+
+
+#if defined(CONFIG_DISPLAY_CPUINFO)
+int print_cpuinfo(void)
+{
+	char buf[32];
+	ulong size = 0;
+
+	ast_scu_revision_id();
+
+	ast_scu_sys_rest_info();
+
+#ifdef AST_SOC_G5
+	ast_scu_security_info();
+#endif
+
+	printf("PLL :   %4s MHz\n",
+					strmhz(buf, ast_get_clk_source()));
+	printf("CPU :   %4s MHz\n",
+					strmhz(buf, ast_get_h_pll_clk()));
+#ifdef AST_SOC_G5
+	printf("MEM :	%4s MHz, EEC: %s, Cache: %s \n",
+					strmhz(buf, ast_get_m_pll_clk() * 2), ast_sdmc_get_eec() ? "Enable":"Disable",ast_sdmc_get_cache() ?"Enable":"Disable");
+#else
+	printf("MEM :   %4s MHz, EEC:%s \n",
+					strmhz(buf, ast_get_m_pll_clk()), ast_sdmc_get_eec() ? "Enable":"Disable");
+#endif
+	size = ast_scu_get_vga_memsize();
+
+	puts("VGA :    ");
+
+	print_size(size, "\n");
+
+	ast_scu_get_who_init_dram();
+
+	return 0;
+}
+#endif
diff --git a/arch/arm/mach-aspeed/flash.c b/arch/arm/mach-aspeed/flash.c
new file mode 100644
index 000000000000..51db87261d53
--- /dev/null
+++ b/arch/arm/mach-aspeed/flash.c
@@ -0,0 +1,1403 @@
+/*
+ * 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
+ *
+ * History
+ * 01/20/2004 - combined variants of original driver.
+ * 01/22/2004 - Write performance enhancements for parallel chips (Tolunay)
+ * 01/23/2004 - Support for x8/x16 chips (Rune Raknerud)
+ * 01/27/2004 - Little endian support Ed Okerson
+ *
+ * Tested Architectures
+ * Port Width  Chip Width    # of banks	   Flash Chip  Board
+ * 32	       16	     1		   28F128J3    seranoa/eagle
+ * 64	       16	     1		   28F128J3    seranoa/falcon
+ *
+ */
+
+/* The DEBUG define must be before common to enable debugging */
+/* #define DEBUG	*/
+
+#include <common.h>
+#include <asm/processor.h>
+#include <asm/byteorder.h>
+#include <environment.h>
+
+#include <asm/arch/ast_scu.h>
+#include <asm/arch/aspeed.h>
+
+
+/*
+ * This file implements a Common Flash Interface (CFI) driver for U-Boot.
+ * The width of the port and the width of the chips are determined at initialization.
+ * These widths are used to calculate the address for access CFI data structures.
+ * It has been tested on an Intel Strataflash implementation and AMD 29F016D.
+ *
+ * References
+ * JEDEC Standard JESD68 - Common Flash Interface (CFI)
+ * JEDEC Standard JEP137-A Common Flash Interface (CFI) ID Codes
+ * Intel Application Note 646 Common Flash Interface (CFI) and Command Sets
+ * Intel 290667-008 3 Volt Intel StrataFlash Memory datasheet
+ *
+ * TODO
+ *
+ * Use Primary Extended Query table (PRI) and Alternate Algorithm Query
+ * Table (ALT) to determine if protection is available
+ *
+ * Add support for other command sets Use the PRI and ALT to determine command set
+ * Verify erase and program timeouts.
+ */
+
+#define CFI_MFR_MACRONIX		0x00C2
+#define CFI_MFR_MICRON			0x0020
+#define CFI_MFR_WINBOND         	0x00DA
+
+flash_info_t flash_info[CONFIG_SYS_MAX_FLASH_BANKS];		/* FLASH chips info */
+
+/* Support Flash ID */
+#define STM25P64		0x172020
+#define STM25P128		0x182020
+#define N25Q256			0x19ba20
+#define N25Q512			0x20ba20
+#define S25FL064A		0x160201
+#define S25FL128P		0x182001
+#define S25FL256S		0x190201
+#define W25X16			0x1530ef
+#define W25X64			0x1730ef
+#define W25Q64BV		0x1740ef
+#define W25Q128BV		0x1840ef
+#define W25Q256FV		0x1940ef
+#define MX25L1605D		0x1520C2
+#define MX25L12805D		0x1820C2
+#define MX25L25635E		0x1920C2
+#define MX66L51235F		0x1A20C2
+#define SST25VF016B		0x4125bf
+#define SST25VF064C		0x4b25bf
+#define SST25VF040B		0x8d25bf
+#define AT25DF161		0x02461F
+#define AT25DF321		0x01471F
+
+/* SPI Define */
+#define CS0_CTRL			0x10
+#define CS1_CTRL			0x14
+#define CS2_CTRL			0x18
+
+/* for DMA */
+#define REG_FLASH_INTERRUPT_STATUS	0x08
+#define REG_FLASH_DMA_CONTROL		0x80
+#define REG_FLASH_DMA_FLASH_BASE		0x84
+#define REG_FLASH_DMA_DRAM_BASE		0x88
+#define REG_FLASH_DMA_LENGTH			0x8c
+
+#define FLASH_STATUS_DMA_BUSY			0x0000
+#define FLASH_STATUS_DMA_READY		0x0800
+#define FLASH_STATUS_DMA_CLEAR		0x0800
+
+#define FLASH_DMA_ENABLE		0x01
+
+#define CMD_MASK		0xFFFFFFF8
+
+#define NORMALREAD		0x00
+#define FASTREAD		0x01
+#define NORMALWRITE	0x02
+#define USERMODE		0x03
+
+#define CE_LOW			0x00
+#define CE_HIGH			0x04
+
+/* AST2300 only */
+#define IOMODEx1		0x00000000
+#define IOMODEx2		0x20000000
+#define IOMODEx2_dummy		0x30000000
+#define IOMODEx4		0x40000000
+#define IOMODEx4_dummy		0x50000000
+
+#define DUMMY_COMMAND_OUT	0x00008000
+
+/* specificspi */
+#define SpecificSPI_N25Q512	0x00000001
+
+/*-----------------------------------------------------------------------*/
+static u32 ast_spi_calculate_divisor(u32 max_speed_hz)
+{
+	// [0] ->15 : HCLK , HCLK/16
+	u8 SPI_DIV[16] = {16, 7, 14, 6, 13, 5, 12, 4, 11, 3, 10, 2, 9, 1, 8, 0};
+	u32 i, hclk, spi_cdvr=0;
+
+	hclk = ast_get_ahbclk();
+	for(i=1;i<17;i++) {
+		if(max_speed_hz >= (hclk/i)) {
+			spi_cdvr = SPI_DIV[i-1];
+//			printf("hclk = %d , spi_cdvr = %d \n",hclk, spi_cdvr);
+			break;
+		}
+	}
+
+//	printf("hclk is %d, divisor is %d, target :%d , cal speed %d\n", hclk, spi_cdvr, max_speed_hz, hclk/i);
+	return spi_cdvr;
+}
+
+/* create an address based on the offset and the port width  */
+inline uchar *flash_make_addr(flash_info_t * info, flash_sect_t sect, uint offset)
+{
+#ifdef CONFIG_2SPIFLASH
+        if (info->start[0] >= PHYS_FLASH_2)
+	    return ((uchar *) (info->start[sect] + (offset * 1) - (PHYS_FLASH_2 - PHYS_FLASH_2_BASE) ));
+        else
+	    return ((uchar *) (info->start[sect] + (offset * 1)));
+#else
+	return ((uchar *) (info->start[sect] + (offset * 1)));
+#endif
+}
+
+static void reset_flash (flash_info_t * info)
+{
+	ulong ulCtrlData, CtrlOffset = CS0_CTRL;
+
+	switch(info->CE) {
+		case 0:
+			CtrlOffset = CS0_CTRL;
+			break;
+		case 1:
+			ast_scu_multi_func_romcs(1);
+			CtrlOffset = CS1_CTRL;
+			break;
+		case 2:
+			ast_scu_multi_func_romcs(2);
+			CtrlOffset = CS2_CTRL;
+			break;
+	}
+
+
+#if 1
+        ulCtrlData = info->iomode | (info->readcmd << 16) | (info->tCK_Read << 8) | (info->dummybyte << 6) | FASTREAD;
+#else
+        ulCtrlData  = (info->readcmd << 16) | (info->tCK_Read << 8) | (info->dummybyte << 6) | FASTREAD;
+        if (info->dualport)
+            ulCtrlData  |= 0x08;
+#endif
+        *(ulong *) (info->reg_base + CtrlOffset) = ulCtrlData;
+
+}
+
+static void enable_write (flash_info_t * info)
+{
+	ulong base;
+	ulong ulCtrlData, CtrlOffset = CS0_CTRL;
+	uchar jReg;
+
+	switch(info->CE) {
+		case 0:
+			CtrlOffset = CS0_CTRL;
+			break;
+		case 1:
+			ast_scu_multi_func_romcs(1);
+			CtrlOffset = CS1_CTRL;
+			break;
+		case 2:
+			ast_scu_multi_func_romcs(2);
+			CtrlOffset = CS2_CTRL;
+			break;
+	}
+
+	//base = info->start[0];
+	base = (ulong) flash_make_addr(info, 0, 0);
+
+        ulCtrlData  = (info->tCK_Write << 8);
+        ulCtrlData |= CE_LOW | USERMODE;
+        *(ulong *) (info->reg_base + CtrlOffset) = ulCtrlData;
+        udelay(200);
+        *(uchar *) (base) = (uchar) (0x06);
+        udelay(10);
+        ulCtrlData &= CMD_MASK;
+        ulCtrlData |= CE_HIGH | USERMODE;
+        *(ulong *) (info->reg_base + CtrlOffset) = ulCtrlData;
+        udelay(200);
+
+        ulCtrlData &= CMD_MASK;
+        ulCtrlData |= CE_LOW | USERMODE;
+        *(ulong *) (info->reg_base + CtrlOffset) = ulCtrlData;
+        udelay(200);
+        *(uchar *) (base) = (uchar) (0x05);
+        udelay(10);
+        do {
+            jReg = *(volatile uchar *) (base);
+        } while (!(jReg & 0x02));
+        ulCtrlData &= CMD_MASK;
+        ulCtrlData |= CE_HIGH | USERMODE;
+        *(ulong *) (info->reg_base + CtrlOffset) = ulCtrlData;
+        udelay(200);
+
+}
+
+static void write_status_register (flash_info_t * info, uchar data)
+{
+	ulong base;
+	ulong ulCtrlData, CtrlOffset = CS0_CTRL;
+	uchar jReg;
+
+	switch(info->CE) {
+		case 0:
+			CtrlOffset = CS0_CTRL;
+			break;
+		case 1:
+			ast_scu_multi_func_romcs(1);
+			CtrlOffset = CS1_CTRL;
+			break;
+		case 2:
+			ast_scu_multi_func_romcs(2);
+			CtrlOffset = CS2_CTRL;
+			break;
+	}
+
+	//base = info->start[0];
+	base = (ulong) flash_make_addr(info, 0, 0);
+
+        enable_write (info);
+
+        ulCtrlData  = (info->tCK_Write << 8);
+        ulCtrlData |= CE_LOW | USERMODE;
+        *(ulong *) (info->reg_base + CtrlOffset) = ulCtrlData;
+        udelay(200);
+        *(uchar *) (base) = (uchar) (0x01);
+        udelay(10);
+        *(uchar *) (base) = (uchar) (data);
+        ulCtrlData &= CMD_MASK;
+        ulCtrlData |= CE_HIGH | USERMODE;
+        *(ulong *) (info->reg_base + CtrlOffset) = ulCtrlData;
+        udelay(200);
+
+        ulCtrlData &= CMD_MASK;
+        ulCtrlData |= CE_LOW | USERMODE;
+        *(ulong *) (info->reg_base + CtrlOffset) = ulCtrlData;
+        udelay(200);
+        *(uchar *) (base) = (uchar) (0x05);
+        udelay(10);
+        do {
+            jReg = *(volatile uchar *) (base);
+        } while (jReg & 0x01);
+        ulCtrlData &= CMD_MASK;
+        ulCtrlData |= CE_HIGH | USERMODE;
+        *(ulong *) (info->reg_base + CtrlOffset) = ulCtrlData;
+        udelay(200);
+
+}
+
+static void enable4b (flash_info_t * info)
+{
+	ulong base;
+	ulong ulCtrlData, CtrlOffset = CS0_CTRL;
+
+	switch(info->CE) {
+		case 0:
+			CtrlOffset = CS0_CTRL;
+			break;
+		case 1:
+			ast_scu_multi_func_romcs(1);
+			CtrlOffset = CS1_CTRL;
+			break;
+		case 2:
+			ast_scu_multi_func_romcs(2);
+			CtrlOffset = CS2_CTRL;
+			break;
+	}
+
+	//base = info->start[0];
+	base = (ulong) flash_make_addr(info, 0, 0);
+
+        ulCtrlData  = (info->tCK_Write << 8);
+        ulCtrlData |= CE_LOW | USERMODE;
+        *(ulong *) (info->reg_base + CtrlOffset) = ulCtrlData;
+        udelay(200);
+        *(uchar *) (base) = (uchar) (0xb7);
+        ulCtrlData &= CMD_MASK;
+        ulCtrlData |= CE_HIGH | USERMODE;
+        *(ulong *) (info->reg_base + CtrlOffset) = ulCtrlData;
+        udelay(200);
+
+} /* enable4b */
+
+static void enable4b_spansion (flash_info_t * info)
+{
+	ulong base;
+	ulong ulCtrlData, CtrlOffset = CS0_CTRL;
+	uchar jReg;
+
+	switch(info->CE) {
+		case 0:
+			CtrlOffset = CS0_CTRL;
+			break;
+		case 1:
+			ast_scu_multi_func_romcs(1);
+			CtrlOffset = CS1_CTRL;
+			break;
+		case 2:
+			ast_scu_multi_func_romcs(2);
+			CtrlOffset = CS2_CTRL;
+			break;
+	}
+
+	//base = info->start[0];
+	base = (ulong) flash_make_addr(info, 0, 0);
+
+	/* Enable 4B: BAR0 D[7] = 1 */
+	ulCtrlData  = (info->tCK_Write << 8);
+	ulCtrlData |= CE_LOW | USERMODE;
+	*(ulong *) (info->reg_base + CtrlOffset) = ulCtrlData;
+	udelay(200);
+	*(uchar *) (base) = (uchar) (0x17);
+	udelay(10);
+	*(uchar *) (base) = (uchar) (0x80);
+	ulCtrlData &= CMD_MASK;
+	ulCtrlData |= CE_HIGH | USERMODE;
+	*(ulong *) (info->reg_base + CtrlOffset) = ulCtrlData;
+	udelay(200);
+
+	ulCtrlData &= CMD_MASK;
+	ulCtrlData |= CE_LOW | USERMODE;
+	*(ulong *) (info->reg_base + CtrlOffset) = ulCtrlData;
+	udelay(200);
+	*(uchar *) (base) = (uchar) (0x16);
+	udelay(10);
+	do {
+            jReg = *(volatile uchar *) (base);
+	} while (!(jReg & 0x80));
+	ulCtrlData &= CMD_MASK;
+	ulCtrlData |= CE_HIGH | USERMODE;
+	 *(ulong *) (info->reg_base + CtrlOffset) = ulCtrlData;
+	udelay(200);
+
+} /* enable4b_spansion */
+
+static void enable4b_numonyx (flash_info_t * info)
+{
+	ulong base;
+	ulong ulCtrlData, CtrlOffset = CS0_CTRL;
+
+	switch(info->CE) {
+		case 0:
+			CtrlOffset = CS0_CTRL;
+			break;
+		case 1:
+			ast_scu_multi_func_romcs(1);
+			CtrlOffset = CS1_CTRL;
+			break;
+		case 2:
+			ast_scu_multi_func_romcs(2);
+			CtrlOffset = CS2_CTRL;
+			break;
+	}
+
+	//base = info->start[0];
+	base = (ulong) flash_make_addr(info, 0, 0);
+
+	/* Enable Write */
+	enable_write (info);
+
+	/* Enable 4B: CMD:0xB7 */
+	ulCtrlData  = (info->tCK_Write << 8);
+	ulCtrlData |= CE_LOW | USERMODE;
+	*(ulong *) (info->reg_base + CtrlOffset) = ulCtrlData;
+	udelay(200);
+	*(uchar *) (base) = (uchar) (0xB7);
+	udelay(10);
+	ulCtrlData &= CMD_MASK;
+	ulCtrlData |= CE_HIGH | USERMODE;
+	*(ulong *) (info->reg_base + CtrlOffset) = ulCtrlData;
+	udelay(200);
+
+} /* enable4b_numonyx */
+
+/*-----------------------------------------------------------------------
+ */
+static void flash_write_buffer (flash_info_t *info, uchar *src, ulong addr, int len)
+{
+	ulong j, base, offset;
+	ulong ulCtrlData, CtrlOffset = CS0_CTRL;
+	uchar jReg;
+
+	switch(info->CE) {
+		case 0:
+			CtrlOffset = CS0_CTRL;
+			break;
+		case 1:
+			ast_scu_multi_func_romcs(1);
+			CtrlOffset = CS1_CTRL;
+			break;
+		case 2:
+			ast_scu_multi_func_romcs(2);
+			CtrlOffset = CS2_CTRL;
+			break;
+	}
+
+	base = info->start[0];
+	offset = addr - base;
+	base = (ulong) flash_make_addr(info, 0, 0);
+
+        enable_write (info);
+
+        ulCtrlData  = (info->tCK_Write << 8);
+
+        ulCtrlData &= CMD_MASK;
+        ulCtrlData |= CE_LOW | USERMODE;
+        *(ulong *) (info->reg_base + CtrlOffset) = ulCtrlData;
+        udelay(200);
+        *(uchar *) (base) = (uchar) (0x02);
+        udelay(10);
+        if (info->address32)
+        {
+            *(uchar *) (base) = (uchar) ((offset & 0xff000000) >> 24);
+            udelay(10);
+        }
+        *(uchar *) (base) = (uchar) ((offset & 0xff0000) >> 16);
+        udelay(10);
+        *(uchar *) (base) = (uchar) ((offset & 0x00ff00) >> 8);
+        udelay(10);
+        *(uchar *) (base) = (uchar) ((offset & 0x0000ff));
+        udelay(10);
+
+        for (j=0; j<len; j++)
+        {
+            *(uchar *) (base) = *(uchar *) (src++);
+            udelay(10);
+        }
+
+        ulCtrlData &= CMD_MASK;
+        ulCtrlData |= CE_HIGH | USERMODE;
+        *(ulong *) (info->reg_base + CtrlOffset) = ulCtrlData;
+        udelay(200);
+
+        ulCtrlData &= CMD_MASK;
+        ulCtrlData |= CE_LOW | USERMODE;
+        *(ulong *) (info->reg_base + CtrlOffset) = ulCtrlData;
+        udelay(200);
+        *(uchar *) (base) = (uchar) (0x05);
+        udelay(10);
+        do {
+            jReg = *(volatile uchar *) (base);
+        } while ((jReg & 0x01));
+        ulCtrlData &= CMD_MASK;
+        ulCtrlData |= CE_HIGH | USERMODE;
+        *(ulong *) (info->reg_base + CtrlOffset) = ulCtrlData;
+        udelay(200);
+
+        /* RFSR */
+        if (info->specificspi == SpecificSPI_N25Q512)
+        {
+            ulCtrlData &= CMD_MASK;
+            ulCtrlData |= CE_LOW | USERMODE;
+            *(ulong *) (info->reg_base + CtrlOffset) = ulCtrlData;
+            udelay(200);
+            *(uchar *) (base) = (uchar) (0x70);
+            udelay(10);
+            do {
+                jReg = *(volatile uchar *) (base);
+            } while (!(jReg & 0x80));
+            ulCtrlData &= CMD_MASK;
+            ulCtrlData |= CE_HIGH | USERMODE;
+            *(ulong *) (info->reg_base + CtrlOffset) = ulCtrlData;
+            udelay(200);
+        }
+}
+
+/*-----------------------------------------------------------------------
+ *
+ * export functions
+ *
+ */
+
+
+
+#if defined(CFG_ENV_IS_IN_FLASH) || defined(CFG_ENV_ADDR_REDUND) || (CFG_MONITOR_BASE >= CFG_FLASH_BASE)
+static flash_info_t *flash_get_info(ulong base)
+{
+	int i;
+	flash_info_t * info = 0;
+
+	for (i = 0; i < CONFIG_SYS_MAX_FLASH_BANKS; i ++) {
+		info = & flash_info[i];
+		if (info->size && info->start[0] <= base &&
+		    base <= info->start[0] + info->size - 1)
+			break;
+	}
+
+	return i == CONFIG_SYS_MAX_FLASH_BANKS ? 0 : info;
+}
+#endif
+
+/*-----------------------------------------------------------------------
+ */
+int flash_erase (flash_info_t * info, int s_first, int s_last)
+{
+	int rcode = 0;
+	int prot;
+	flash_sect_t sect;
+
+	ulong base, offset;
+	ulong ulCtrlData, CtrlOffset = CS0_CTRL;
+	uchar jReg;
+
+	switch(info->CE) {
+		case 0:
+			CtrlOffset = CS0_CTRL;
+			break;
+		case 1:
+			ast_scu_multi_func_romcs(1);
+			CtrlOffset = CS1_CTRL;
+			break;
+		case 2:
+			ast_scu_multi_func_romcs(2);
+			CtrlOffset = CS2_CTRL;
+			break;
+	}
+
+	if ((s_first < 0) || (s_first > s_last)) {
+		puts ("- no sectors to erase\n");
+		return 1;
+	}
+
+	prot = 0;
+	for (sect = s_first; sect <= s_last; ++sect) {
+		if (info->protect[sect]) {
+			prot++;
+		}
+	}
+	if (prot) {
+		printf ("- Warning: %d protected sectors will not be erased!\n", prot);
+	} else {
+		putc ('\n');
+	}
+
+        ulCtrlData  = (info->tCK_Erase << 8);
+	for (sect = s_first; sect <= s_last; sect++) {
+		if (info->protect[sect] == 0) { /* not protected */
+                        /* start erasing */
+                        enable_write(info);
+
+	                base = info->start[0];
+                        offset = info->start[sect] - base;
+	                base = (ulong) flash_make_addr(info, 0, 0);
+
+                        ulCtrlData &= CMD_MASK;
+                        ulCtrlData |= CE_LOW | USERMODE;
+                        *(ulong *) (info->reg_base + CtrlOffset) = ulCtrlData;
+                        udelay(200);
+                        *(uchar *) (base) = (uchar) (0xd8);
+                        udelay(10);
+                        if (info->address32)
+                        {
+                            *(uchar *) (base) = (uchar) ((offset & 0xff000000) >> 24);
+                            udelay(10);
+                        }
+                        *(uchar *) (base) = (uchar) ((offset & 0xff0000) >> 16);
+                        udelay(10);
+                        *(uchar *) (base) = (uchar) ((offset & 0x00ff00) >> 8);
+                        udelay(10);
+                        *(uchar *) (base) = (uchar) ((offset & 0x0000ff));
+                        udelay(10);
+
+                        ulCtrlData &= CMD_MASK;
+                        ulCtrlData |= CE_HIGH | USERMODE;
+                        *(ulong *) (info->reg_base + CtrlOffset) = ulCtrlData;
+                        udelay(200);
+
+                        ulCtrlData &= CMD_MASK;
+                        ulCtrlData |= CE_LOW | USERMODE;
+                        *(ulong *) (info->reg_base + CtrlOffset) = ulCtrlData;
+                        udelay(200);
+                        *(uchar *) (base) = (uchar) (0x05);
+                        udelay(10);
+                        do {
+                            jReg = *(volatile uchar *) (base);
+                        } while ((jReg & 0x01));
+                        ulCtrlData &= CMD_MASK;
+                        ulCtrlData |= CE_HIGH | USERMODE;
+                        *(ulong *) (info->reg_base + CtrlOffset) = ulCtrlData;
+                        udelay(200);
+
+                        /* RFSR */
+                        if (info->specificspi == SpecificSPI_N25Q512)
+                        {
+                            ulCtrlData &= CMD_MASK;
+                            ulCtrlData |= CE_LOW | USERMODE;
+                            *(ulong *) (info->reg_base + CtrlOffset) = ulCtrlData;
+                            udelay(200);
+                            *(uchar *) (base) = (uchar) (0x70);
+                            udelay(10);
+                            do {
+                                jReg = *(volatile uchar *) (base);
+                            } while (!(jReg & 0x80));
+                            ulCtrlData &= CMD_MASK;
+                            ulCtrlData |= CE_HIGH | USERMODE;
+                            *(ulong *) (info->reg_base + CtrlOffset) = ulCtrlData;
+                            udelay(200);
+                        }
+
+			putc ('.');
+		}
+	}
+	puts (" done\n");
+
+	reset_flash(info);
+
+	return rcode;
+}
+
+void flash_print_info (flash_info_t * info)
+{
+	int i;
+
+	if (info->flash_id == FLASH_UNKNOWN) {
+		printf ("missing or unknown FLASH type\n");
+		return;
+	}
+
+	printf("%lx : CS#%ld: ", info->start[0] , info->CE);
+	switch (info->flash_id & 0xff) {
+		case CFI_MFR_MACRONIX: 	printf ("MACRONIX ");		break;
+		case CFI_MFR_MICRON: 	printf ("MICRON ");		break;
+		case CFI_MFR_WINBOND: 	printf ("WINBOND ");		break;
+		default:		printf ("Unknown Vendor %lx", info->flash_id); break;
+	}
+
+	if (info->size >= (1 << 20)) {
+		i = 20;
+	} else {
+		i = 10;
+	}
+	printf ("  Size: %ld %cB in %d Sectors\n",
+		info->size >> i,
+		(i == 20) ? 'M' : 'k',
+		info->sector_count);
+
+	return;
+}
+
+/*-----------------------------------------------------------------------
+ * Copy memory to flash, returns:
+ * 0 - OK
+ * 1 - write timeout
+ * 2 - Flash not erased
+ */
+int write_buff (flash_info_t * info, uchar * src, ulong addr, ulong cnt)
+{
+	int count;
+	unsigned char pat[] = {'|', '-', '/', '\\'};
+	int patcnt = 0;
+	ulong BufferSize = info->buffersize;
+	/* get lower aligned address */
+	if (addr & (BufferSize - 1))
+	{
+		count = cnt >= BufferSize ? (BufferSize - (addr & 0xff)):cnt;
+		flash_write_buffer (info, src, addr, count);
+		addr+= count;
+		src += count;
+		cnt -= count;
+	}
+
+	/* prog */
+	while (cnt > 0) {
+		count = cnt >= BufferSize ? BufferSize:cnt;
+		flash_write_buffer (info, src, addr, count);
+		addr+= count;
+		src += count;
+		cnt -= count;
+		printf("%c\b", pat[(patcnt++) & 0x03]);
+	}
+
+	reset_flash(info);
+
+	return (0);
+}
+
+static ulong flash_get_size (ulong base, flash_info_t *info)
+{
+	int j;
+	unsigned long sector;
+	int erase_region_size;
+	ulong ulCtrlData, CtrlOffset = CS0_CTRL;
+	ulong ulID;
+	uchar ch[3];
+	ulong reg;
+	ulong WriteClk, EraseClk, ReadClk;
+	ulong vbase;
+
+	info->start[0] = base;
+//	printf("base %x \n",base);
+	vbase = (ulong) flash_make_addr(info, 0, 0);
+
+	switch(info->CE) {
+		case 0:
+			CtrlOffset = CS0_CTRL;
+			break;
+		case 1:
+			ast_scu_multi_func_romcs(1);
+			CtrlOffset = CS1_CTRL;
+			break;
+		case 2:
+			ast_scu_multi_func_romcs(2);
+			CtrlOffset = CS2_CTRL;
+			break;
+	}
+
+	/* Get Flash ID */
+	ulCtrlData  = *(ulong *) (info->reg_base + CtrlOffset) & CMD_MASK;
+	ulCtrlData |= CE_LOW | USERMODE;
+	*(ulong *) (info->reg_base + CtrlOffset) = ulCtrlData;
+	udelay(200);
+	*(uchar *) (vbase) = (uchar) (0x9F);
+	udelay(10);
+	ch[0] = *(volatile uchar *)(vbase);
+	udelay(10);
+	ch[1] = *(volatile uchar *)(vbase);
+	udelay(10);
+	ch[2] = *(volatile uchar *)(vbase);
+	udelay(10);
+	ulCtrlData  = *(ulong *) (info->reg_base + CtrlOffset) & CMD_MASK;
+	ulCtrlData |= CE_HIGH | USERMODE;
+	*(ulong *) (info->reg_base + CtrlOffset) = ulCtrlData;
+	udelay(200);
+	ulID = ((ulong)ch[0]) | ((ulong)ch[1] << 8) | ((ulong)ch[2] << 16) ;
+	info->flash_id = ulID;
+
+//	printf("SPI Flash ID: %x \n", ulID);
+
+	/* init default */
+	info->iomode = IOMODEx1;
+	info->address32 = 0;
+	info->quadport = 0;
+	info->specificspi = 0;
+
+	switch (info->flash_id) {
+		case STM25P64:
+			info->sector_count = 128;
+			info->size = 0x800000;
+			erase_region_size  = 0x10000;
+			info->readcmd = 0x0b;
+			info->dualport = 0;
+			info->dummybyte = 1;
+			info->buffersize = 256;
+			WriteClk = 40;
+			EraseClk = 20;
+			ReadClk  = 40;
+			break;
+
+		case STM25P128:
+			info->sector_count = 64;
+			info->size = 0x1000000;
+			erase_region_size  = 0x40000;
+			info->readcmd = 0x0b;
+			info->dualport = 0;
+			info->dummybyte = 1;
+			info->buffersize = 256;
+			WriteClk = 50;
+			EraseClk = 20;
+			ReadClk  = 50;
+			break;
+
+		case N25Q256:
+			info->sector_count = 256;
+			info->size = 0x1000000;
+			erase_region_size  = 0x10000;
+			info->readcmd = 0x0b;
+			info->dualport = 0;
+			info->dummybyte = 1;
+			info->buffersize = 256;
+			WriteClk = 50;
+			EraseClk = 20;
+			ReadClk  = 50;
+#if	1
+			info->sector_count = 512;
+			info->size = 0x2000000;
+			info->address32 = 1;
+#endif
+			break;
+
+		case N25Q512:
+			info->sector_count = 256;
+			info->size = 0x1000000;
+			erase_region_size  = 0x10000;
+			info->readcmd = 0x0b;
+			info->dualport = 0;
+			info->dummybyte = 1;
+			info->buffersize = 256;
+			info->specificspi = SpecificSPI_N25Q512;
+			WriteClk = 50;
+			EraseClk = 20;
+			ReadClk  = 50;
+#if	1
+			info->sector_count = 1024;
+			info->size = 0x4000000;
+			info->address32 = 1;
+#endif
+			break;
+
+		case W25X16:
+			info->sector_count = 32;
+			info->size = 0x200000;
+			erase_region_size  = 0x10000;
+			info->readcmd = 0x3b;
+			info->dualport = 1;
+			info->dummybyte = 1;
+			info->iomode = IOMODEx2;
+			info->buffersize = 256;
+			WriteClk = 50;
+			EraseClk = 25;
+			ReadClk  = 50;
+			break;
+
+		case W25X64:
+			info->sector_count = 128;
+			info->size = 0x800000;
+			erase_region_size  = 0x10000;
+			info->readcmd = 0x3b;
+			info->dualport = 1;
+			info->dummybyte = 1;
+			info->iomode = IOMODEx2;
+			info->buffersize = 256;
+			WriteClk = 50;
+			EraseClk = 25;
+			ReadClk  = 50;
+			break;
+
+		case W25Q64BV:
+			info->sector_count = 128;
+			info->size = 0x800000;
+			erase_region_size  = 0x10000;
+			info->readcmd = 0x3b;
+			info->dualport = 1;
+			info->dummybyte = 1;
+			info->iomode = IOMODEx2;
+			info->buffersize = 256;
+			WriteClk = 80;
+			EraseClk = 40;
+			ReadClk  = 80;
+			break;
+
+		case W25Q128BV:
+			info->sector_count = 256;
+			info->size = 0x1000000;
+			erase_region_size  = 0x10000;
+			info->readcmd = 0x3b;
+			info->dualport = 1;
+			info->dummybyte = 1;
+			info->iomode = IOMODEx2;
+			info->buffersize = 256;
+			WriteClk = 104;
+			EraseClk = 50;
+			ReadClk  = 104;
+			break;
+
+		case W25Q256FV:
+			info->sector_count = 256;
+			info->size = 0x1000000;
+			erase_region_size  = 0x10000;
+			info->readcmd = 0x0b;
+			info->dualport = 0;
+			info->dummybyte = 1;
+			info->buffersize = 256;
+			WriteClk = 50;
+			EraseClk = 20;
+			ReadClk  = 50;
+#if	1
+			info->sector_count = 512;
+			info->size = 0x2000000;
+			info->address32 = 1;
+#endif
+			break;
+
+		case S25FL064A:
+			info->sector_count = 128;
+			info->size = 0x800000;
+			erase_region_size  = 0x10000;
+			info->readcmd = 0x0b;
+			info->dualport = 0;
+			info->dummybyte = 1;
+			info->buffersize = 256;
+			WriteClk = 50;
+			EraseClk = 25;
+			ReadClk  = 50;
+			break;
+
+		case S25FL128P:
+			info->sector_count = 256;
+			info->size = 0x1000000;
+			erase_region_size  = 0x10000;
+			info->readcmd = 0x0b;
+			info->dualport = 0;
+			info->dummybyte = 1;
+			info->buffersize = 256;
+			WriteClk = 100;
+			EraseClk = 40;
+			ReadClk  = 100;
+			break;
+
+		case S25FL256S:
+			info->sector_count = 256;
+			info->size = 0x1000000;
+			erase_region_size  = 0x10000;
+			info->readcmd = 0x0b;
+			info->dualport = 0;
+			info->dummybyte = 1;
+			info->buffersize = 256;
+			WriteClk = 50;
+			EraseClk = 20;
+			ReadClk  = 50;
+#if	1
+			info->sector_count = 512;
+			info->size = 0x2000000;
+			info->address32 = 1;
+#endif
+			break;
+
+		case MX25L25635E:
+			info->sector_count = 256;
+			info->size = 0x1000000;
+			erase_region_size  = 0x10000;
+			info->readcmd = 0x0b;
+			info->dualport = 0;
+			info->dummybyte = 1;
+			info->buffersize = 256;
+			WriteClk = 50;
+			EraseClk = 20;
+			ReadClk  = 50;
+#if	1
+			info->sector_count = 512;
+			info->size = 0x2000000;
+			info->address32 = 1;
+#if	defined(CONFIG_FLASH_SPIx2_Dummy)
+			info->readcmd = 0xbb;
+			info->dummybyte = 1;
+			info->dualport = 1;
+			info->iomode = IOMODEx2_dummy;
+#elif	defined(CONFIG_FLASH_SPIx4_Dummy)
+			info->readcmd = 0xeb;
+			info->dummybyte = 3;
+			info->dualport = 0;
+			info->iomode = IOMODEx4_dummy;
+			info->quadport = 1;
+			info->dummydata = 0xaa;
+#endif
+#endif
+			break;
+
+		case MX66L51235F:
+			erase_region_size  = 0x10000;
+			info->readcmd = 0x0b;
+			info->dualport = 0;
+			info->dummybyte = 1;
+			info->buffersize = 512;
+			WriteClk = 50;
+			EraseClk = 20;
+			ReadClk  = 50;
+#if	1
+			info->sector_count = 1024;
+			info->size = 0x4000000;
+			info->address32 = 1;
+#if	defined(CONFIG_FLASH_SPIx2_Dummy)
+			info->readcmd = 0xbb;
+			info->dummybyte = 1;
+			info->dualport = 1;
+			info->iomode = IOMODEx2_dummy;
+#elif	defined(CONFIG_FLASH_SPIx4_Dummy)
+			info->readcmd = 0xeb;
+			info->dummybyte = 3;
+			info->dualport = 0;
+			info->iomode = IOMODEx4_dummy;
+			info->quadport = 1;
+			info->dummydata = 0xaa;
+#endif
+#endif
+			break;
+
+		case MX25L12805D:
+			info->sector_count = 256;
+			info->size = 0x1000000;
+			erase_region_size  = 0x10000;
+			info->readcmd = 0x0b;
+			info->dualport = 0;
+			info->dummybyte = 1;
+			info->buffersize = 256;
+
+			WriteClk = 50;
+			EraseClk = 20;
+			ReadClk  = 50;
+
+#if	1
+#if	defined(CONFIG_FLASH_SPIx2_Dummy)
+			info->readcmd = 0xbb;
+			info->dummybyte = 1;
+			info->dualport = 1;
+			info->iomode = IOMODEx2_dummy;
+#elif	defined(CONFIG_FLASH_SPIx4_Dummy)
+			info->readcmd = 0xeb;
+			info->dummybyte = 3;
+			info->dualport = 0;
+			info->iomode = IOMODEx4_dummy;
+			info->quadport = 1;
+			info->dummydata = 0xaa;
+#endif
+#endif
+			break;
+
+		case MX25L1605D:
+			info->sector_count = 32;
+			info->size = 0x200000;
+			erase_region_size  = 0x10000;
+			info->readcmd = 0x0b;
+			info->dualport = 0;
+			info->dummybyte = 1;
+			info->buffersize = 256;
+			WriteClk = 50;
+			EraseClk = 20;
+			ReadClk  = 50;
+			break;
+
+		case SST25VF016B:
+			info->sector_count = 32;
+			info->size = 0x200000;
+			erase_region_size  = 0x10000;
+			info->readcmd = 0x0b;
+			info->dualport = 0;
+			info->dummybyte = 1;
+			info->buffersize = 1;
+			WriteClk = 50;
+			EraseClk = 25;
+			ReadClk  = 50;
+			break;
+
+		case SST25VF064C:
+			info->sector_count = 128;
+			info->size = 0x800000;
+			erase_region_size  = 0x10000;
+			info->readcmd = 0x0b;
+			info->dualport = 0;
+			info->dummybyte = 1;
+			info->buffersize = 1;
+			WriteClk = 50;
+			EraseClk = 25;
+			ReadClk  = 50;
+			break;
+
+		case SST25VF040B:
+			info->sector_count = 8;
+			info->size = 0x80000;
+			erase_region_size  = 0x10000;
+			info->readcmd = 0x0b;
+			info->dualport = 0;
+			info->dummybyte = 1;
+			info->buffersize = 1;
+			WriteClk = 50;
+			EraseClk = 25;
+			ReadClk  = 50;
+			break;
+
+		case AT25DF161:
+			info->sector_count = 32;
+			info->size = 0x200000;
+			erase_region_size  = 0x10000;
+			info->readcmd = 0x0b;
+			info->dualport = 0;
+			info->dummybyte = 1;
+			info->buffersize = 1;
+			WriteClk = 50;
+			EraseClk = 25;
+			ReadClk  = 50;
+			break;
+
+		case AT25DF321:
+			info->sector_count = 32;
+			info->size = 0x400000;
+			erase_region_size  = 0x10000;
+			info->readcmd = 0x0b;
+			info->dualport = 0;
+			info->dummybyte = 1;
+			info->buffersize = 1;
+			WriteClk = 50;
+			EraseClk = 25;
+			ReadClk  = 50;
+			break;
+
+		default:	/* use JEDEC ID */
+			printf("Unsupported SPI Flash!! 0x%08lx\n", info->flash_id);
+			erase_region_size  = 0x10000;
+			info->readcmd = 0x0b;
+			info->dualport  = 0;
+			info->dummybyte = 1;
+			info->buffersize = 1;
+			WriteClk = 50;
+			EraseClk = 25;
+			ReadClk  = 50;
+			if ((info->flash_id & 0xFF) == 0x1F) {
+			/* Atmel */
+				switch (info->flash_id & 0x001F00) {
+					case 0x000400:
+						info->sector_count = 8;
+						info->size = 0x80000;
+						break;
+					case 0x000500:
+						info->sector_count = 16;
+						info->size = 0x100000;
+						break;
+					case 0x000600:
+						info->sector_count = 32;
+						info->size = 0x200000;
+						break;
+					case 0x000700:
+						info->sector_count = 64;
+						info->size = 0x400000;
+						break;
+					case 0x000800:
+						info->sector_count = 128;
+						info->size = 0x800000;
+						break;
+					case 0x000900:
+						info->sector_count = 256;
+						info->size = 0x1000000;
+						break;
+					default:
+						printf("Can't support this SPI Flash!! \n");
+						return 0;
+				}
+			} else {
+				/* JDEC */
+				switch (info->flash_id & 0xFF0000)
+				{
+					case 0x120000:
+						info->sector_count = 4;
+						info->size = 0x40000;
+						break;
+					case 0x130000:
+						info->sector_count = 8;
+						info->size = 0x80000;
+						break;
+					case 0x140000:
+						info->sector_count =16;
+						info->size = 0x100000;
+						break;
+					case 0x150000:
+						info->sector_count =32;
+						info->size = 0x200000;
+						break;
+					case 0x160000:
+						info->sector_count =64;
+						info->size = 0x400000;
+						break;
+					case 0x170000:
+						info->sector_count =128;
+						info->size = 0x800000;
+						break;
+					case 0x180000:
+						info->sector_count =256;
+						info->size = 0x1000000;
+						break;
+					case 0x190000:
+						info->sector_count =256;
+						info->size = 0x1000000;
+#if	1
+						info->sector_count = 512;
+						info->size = 0x2000000;
+						info->address32 = 1;
+#if	defined(CONFIG_FLASH_SPIx2_Dummy)
+						info->readcmd = 0xbb;
+						info->dummybyte = 1;
+						info->dualport = 1;
+						info->iomode = IOMODEx2_dummy;
+#elif	defined(CONFIG_FLASH_SPIx4_Dummy)
+						info->readcmd = 0xeb;
+						info->dummybyte = 3;
+						info->dualport = 0;
+						info->iomode = IOMODEx4_dummy;
+						info->quadport = 1;
+						info->dummydata = 0xaa;
+#endif
+#endif
+						break;
+
+					case 0x200000:
+						info->sector_count =256;
+						info->size = 0x1000000;
+						if ((info->flash_id & 0xFF) == 0x20)	/* numonyx */
+						info->specificspi = SpecificSPI_N25Q512;
+#if	1
+						info->sector_count = 1024;
+						info->size = 0x4000000;
+						info->address32 = 1;
+#if	defined(CONFIG_FLASH_SPIx2_Dummy)
+						info->readcmd = 0xbb;
+						info->dummybyte = 1;
+						info->dualport = 1;
+						info->iomode = IOMODEx2_dummy;
+#elif	defined(CONFIG_FLASH_SPIx4_Dummy)
+						info->readcmd = 0xeb;
+						info->dummybyte = 3;
+						info->dualport = 0;
+						info->iomode = IOMODEx4_dummy;
+						info->quadport = 1;
+						info->dummydata = 0xaa;
+#endif
+#endif
+						break;
+
+					default:
+						printf("Can't support this SPI Flash!! \n");
+						return 0;
+				}
+			} /* JDEC */
+	}
+
+	sector = base;
+	for (j = 0; j < info->sector_count; j++) {
+
+		info->start[j] = sector;
+		sector += erase_region_size;
+		info->protect[j] = 0; /* default: not protected */
+	}
+
+	/* limit Max SPI CLK to 50MHz (Datasheet v1.2) */
+	if (WriteClk > 50) WriteClk = 50;
+	if (EraseClk > 50) EraseClk = 50;
+	if (ReadClk > 50)  ReadClk  = 50;
+
+	info->tCK_Write = ast_spi_calculate_divisor(WriteClk*1000000);
+	info->tCK_Erase = ast_spi_calculate_divisor(EraseClk*1000000);
+	info->tCK_Read = ast_spi_calculate_divisor(ReadClk*1000000);
+
+	/* unprotect flash */
+	write_status_register(info, 0);
+
+	if (info->quadport)
+		write_status_register(info, 0x40);	/* enable QE */
+
+	if (info->address32) {
+#ifndef AST_SOC_G5
+		reg = *((volatile ulong*) 0x1e6e2070);	/* set H/W Trappings */
+		reg |= 0x10;
+		*((volatile ulong*) 0x1e6e2070) = reg;
+#endif
+		reg  = *((volatile ulong*) (info->reg_base + 0x4));	/* enable 32b control bit*/
+		reg |= (0x01 << info->CE);
+		*((volatile ulong*) (info->reg_base + 0x4)) = reg;
+
+		/* set flash chips to 32bits addressing mode */
+		if ((info->flash_id & 0xFF) == 0x01)	/* Spansion */
+			enable4b_spansion(info);
+		else if ((info->flash_id & 0xFF) == 0x20)	/* Numonyx */
+			enable4b_numonyx(info);
+		else /* MXIC, Winbond */
+			enable4b(info);
+	}
+
+	reset_flash(info);
+//	printf("%08x \n", info->size);
+	return (info->size);
+}
+
+/*-----------------------------------------------------------------------*/
+unsigned long flash_init (void)
+{
+	unsigned long size = 0;
+	int i;
+
+	*((volatile ulong*) AST_FMC_BASE) |= 0x800f0000;	/* enable Flash Write */
+
+	/* Init: FMC  */
+	/* BANK 0 : FMC CS0 , 1: FMC CS1, */
+	for (i = 0; i < CONFIG_FMC_CS; ++i) {
+		flash_info[i].sysspi = 0;
+		flash_info[i].reg_base = AST_FMC_BASE;
+		flash_info[i].flash_id = FLASH_UNKNOWN;
+		flash_info[i].CE = i;
+		switch(i) {
+			case 0:
+				size += flash_info[i].size = flash_get_size(AST_FMC_CS0_BASE, &flash_info[i]);
+				break;
+			case 1:
+				size += flash_info[i].size = flash_get_size(AST_FMC_CS1_BASE, &flash_info[i]);
+				break;
+			default:
+				printf("TODO ~~~~ \n");
+				break;
+		}
+		if (flash_info[i].flash_id == FLASH_UNKNOWN) {
+			printf ("## Unknown FLASH on Bank %d - Size = 0x%08lx = %ld MB\n",
+				i, flash_info[i].size, flash_info[i].size << 20);
+		}
+	}
+
+	/* BANK 2:SYSSPI CS0 */
+#ifdef CONFIG_SPI0_CS
+	//pin switch by trap[13:12]	-- [0:1] Enable SPI Master
+	ast_scu_spi_master(1);	/* enable SPI master */
+	*((volatile ulong*) AST_FMC_SPI0_BASE) |= 0x10000;	/* enable Flash Write */
+	flash_info[CONFIG_FMC_CS].sysspi = 1;
+	flash_info[CONFIG_FMC_CS].reg_base = AST_FMC_SPI0_BASE;
+	flash_info[CONFIG_FMC_CS].flash_id = FLASH_UNKNOWN;
+	flash_info[CONFIG_FMC_CS].CE = 0;
+	size += flash_info[CONFIG_FMC_CS].size = flash_get_size(AST_SPI0_CS0_BASE, &flash_info[CONFIG_FMC_CS]);
+	if (flash_info[2].flash_id == FLASH_UNKNOWN) {
+		printf ("## Unknown FLASH on Bank 2 SYS SPI - Size = 0x%08lx = %ld MB\n",
+			flash_info[CONFIG_FMC_CS].size, flash_info[CONFIG_FMC_CS].size << 20);
+	}
+#endif
+
+	/* Monitor protection ON by default */
+#if (CONFIG_MONITOR_BASE >= AST_FMC_CS0_BASE)
+	flash_protect (FLAG_PROTECT_SET,
+		       CONFIG_MONITOR_BASE,
+		       CONFIG_MONITOR_BASE + monitor_flash_len  - 1,
+		       flash_get_info(CONFIG_MONITOR_BASE));
+#endif
+
+	/* Environment protection ON by default */
+#ifdef CONFIG_ENV_IS_IN_FLASH
+	flash_protect (FLAG_PROTECT_SET,
+		       CONFIG_ENV_ADDR,
+		       CONFIG_ENV_ADDR + CONFIG_ENV_SECT_SIZE - 1,
+		       flash_get_info(CONFIG_ENV_ADDR));
+#endif
+
+	/* Redundant environment protection ON by default */
+#ifdef CONFIG_ENV_ADDR_REDUND
+	flash_protect (FLAG_PROTECT_SET,
+		       CONFIG_ENV_ADDR_REDUND,
+		       CONFIG_ENV_ADDR_REDUND + CONFIG_ENV_SIZE_REDUND - 1,
+		       flash_get_info(CONFIG_ENV_ADDR_REDUND));
+#endif
+
+	return (size);
+}
+
+void memmove_dma(void * dest,const void *src,size_t count)
+{
+	ulong count_align, poll_time, data;
+
+	count_align = (count + 3) & 0xFFFFFFFC;	/* 4-bytes align */
+        poll_time = 100;			/* set 100 us as default */
+
+        /* force end of burst read */
+	*(volatile ulong *) (AST_FMC_BASE + CS0_CTRL) |= CE_HIGH;
+	*(volatile ulong *) (AST_FMC_BASE + CS0_CTRL) &= ~CE_HIGH;
+
+	*(ulong *) (AST_FMC_BASE + REG_FLASH_DMA_CONTROL) = (ulong) (~FLASH_DMA_ENABLE);
+	*(ulong *) (AST_FMC_BASE + REG_FLASH_DMA_FLASH_BASE) = (ulong *) (src);
+	*(ulong *) (AST_FMC_BASE + REG_FLASH_DMA_DRAM_BASE) = (ulong *) (dest);
+	*(ulong *) (AST_FMC_BASE + REG_FLASH_DMA_LENGTH) = (ulong) (count_align);
+	*(ulong *) (AST_FMC_BASE + REG_FLASH_DMA_CONTROL) = (ulong) (FLASH_DMA_ENABLE);
+
+	/* wait poll */
+	do {
+		udelay(poll_time);
+		data = *(ulong *) (AST_FMC_BASE + REG_FLASH_INTERRUPT_STATUS);
+	} while (!(data & FLASH_STATUS_DMA_READY));
+
+	/* clear status */
+	*(ulong *) (AST_FMC_BASE + REG_FLASH_INTERRUPT_STATUS) |= FLASH_STATUS_DMA_CLEAR;
+}
diff --git a/arch/arm/mach-aspeed/reset.c b/arch/arm/mach-aspeed/reset.c
new file mode 100644
index 000000000000..b4d8c40623b4
--- /dev/null
+++ b/arch/arm/mach-aspeed/reset.c
@@ -0,0 +1,18 @@
+/*
+ * This file is released under the terms of GPL v2 and any later version.
+ * See the file COPYING in the root directory of the source tree for details.
+*/
+
+#include <common.h>
+#include <asm/io.h>
+#include <asm/arch/platform.h>
+
+void reset_cpu(ulong addr)
+{
+	__raw_writel(0x10 , AST_WDT_BASE+0x04);
+	__raw_writel(0x4755, AST_WDT_BASE+0x08);
+	__raw_writel(0x3, AST_WDT_BASE+0x0c);
+
+	while (1)
+	/*nothing*/;
+}
diff --git a/arch/arm/mach-aspeed/timer.c b/arch/arm/mach-aspeed/timer.c
new file mode 100644
index 000000000000..8960fe715fd1
--- /dev/null
+++ b/arch/arm/mach-aspeed/timer.c
@@ -0,0 +1,147 @@
+/*
+ * Copyright (C) 2012-2020  ASPEED Technology Inc.
+ * Ryan Chen <ryan_chen@aspeedtech.com>
+ *
+ * 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 <asm/arch/platform.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#define TIMER_LOAD_VAL 0xffffffff
+
+/* macro to read the 32 bit timer */
+#define READ_TIMER (*(volatile ulong *)(AST_TIMER_BASE))
+
+static ulong timestamp;
+static ulong lastdec;
+
+void reset_timer_masked (void)
+{
+	/* reset time */
+	lastdec = READ_TIMER;  /* capure current decrementer value time */
+	timestamp = 0;	       /* start "advancing" time stamp from 0 */
+}
+
+int timer_init (void)
+{
+	*(volatile ulong *)(AST_TIMER_BASE + 4)    = TIMER_LOAD_VAL;
+	*(volatile ulong *)(AST_TIMER_BASE + 0x30) = 0x3;		/* enable timer1 */
+
+	/* init the timestamp and lastdec value */
+	reset_timer_masked();
+
+	return 0;
+}
+
+/*
+ * timer without interrupts
+ */
+ulong get_timer (ulong base)
+{
+	return get_timer_masked () - base;
+}
+
+/* delay x useconds AND preserve advance timestamp value */
+void __udelay (unsigned long usec)
+{
+	ulong tmo, tmp;
+
+	if(usec >= 1000){		/* if "big" number, spread normalization to seconds */
+		tmo = usec / 1000;	/* start to normalize for usec to ticks per sec */
+		tmo *= CONFIG_SYS_HZ;		/* find number of "ticks" to wait to achieve target */
+		tmo /= 1000;		/* finish normalize. */
+	}else{				/* else small number, don't kill it prior to HZ multiply */
+		tmo = usec * CONFIG_SYS_HZ;
+		tmo /= (1000*1000);
+	}
+
+	tmp = get_timer (0);		/* get current timestamp */
+	if( (tmo + tmp + 1) < tmp )	/* if setting this fordward will roll time stamp */
+		reset_timer_masked ();	/* reset "advancing" timestamp to 0, set lastdec value */
+	else
+		tmo += tmp;		/* else, set advancing stamp wake up time */
+
+	while (get_timer_masked () < tmo)/* loop till event */
+		/*NOP*/;
+}
+
+ulong get_timer_masked (void)
+{
+	ulong now = READ_TIMER;		/* current tick value */
+
+	if (lastdec >= now) {		/* normal mode (non roll) */
+		/* normal mode */
+		timestamp += lastdec - now; /* move stamp fordward with absoulte diff ticks */
+	} else {			/* we have overflow of the count down timer */
+		/* nts = ts + ld + (TLV - now)
+		 * ts=old stamp, ld=time that passed before passing through -1
+		 * (TLV-now) amount of time after passing though -1
+		 * nts = new "advancing time stamp"...it could also roll and cause problems.
+		 */
+		timestamp += lastdec + TIMER_LOAD_VAL - now;
+	}
+	lastdec = now;
+
+	return timestamp;
+}
+
+/* waits specified delay value and resets timestamp */
+void udelay_masked (unsigned long usec)
+{
+	ulong tmo;
+	ulong endtime;
+	signed long diff;
+
+	if (usec >= 1000) {		/* if "big" number, spread normalization to seconds */
+		tmo = usec / 1000;	/* start to normalize for usec to ticks per sec */
+		tmo *= CONFIG_SYS_HZ;		/* find number of "ticks" to wait to achieve target */
+		tmo /= 1000;		/* finish normalize. */
+	} else {			/* else small number, don't kill it prior to HZ multiply */
+		tmo = usec * CONFIG_SYS_HZ;
+		tmo /= (1000*1000);
+	}
+
+	endtime = get_timer_masked () + tmo;
+
+	do {
+		ulong now = get_timer_masked ();
+		diff = endtime - now;
+	} while (diff >= 0);
+}
+
+/*
+ * This function is derived from PowerPC code (read timebase as long long).
+ * On ARM it just returns the timer value.
+ */
+unsigned long long get_ticks(void)
+{
+	return get_timer(0);
+}
+
+/*
+ * This function is derived from PowerPC code (timebase clock frequency).
+ * On ARM it returns the number of timer ticks per second.
+ */
+ulong get_tbclk (void)
+{
+	ulong tbclk;
+
+	tbclk = CONFIG_SYS_HZ;
+	return tbclk;
+}
diff --git a/board/aspeed/ast-g5/Kconfig b/board/aspeed/ast-g5/Kconfig
new file mode 100644
index 000000000000..1ef0ae8d9052
--- /dev/null
+++ b/board/aspeed/ast-g5/Kconfig
@@ -0,0 +1,18 @@
+if TARGET_AST_G5
+
+config SYS_CPU
+	default "arm1176"
+
+config SYS_BOARD
+	default "ast-g5"
+
+config SYS_VENDOR
+	default "aspeed"
+
+config SYS_SOC
+	default "aspeed"
+
+config SYS_CONFIG_NAME
+	default "ast-g5"
+
+endif
diff --git a/board/aspeed/ast-g5/Makefile b/board/aspeed/ast-g5/Makefile
new file mode 100644
index 000000000000..c2881154b237
--- /dev/null
+++ b/board/aspeed/ast-g5/Makefile
@@ -0,0 +1,30 @@
+#
+# (C) Copyright 2000-2006
+# 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
+#
+
+obj-y   = ast-g5.o
+
+ifeq ($(CONFIG_FPGA_ASPEED),y)
+obj-y   += platform_fpga.o
+else
+obj-y   += platform.o
+endif
diff --git a/board/aspeed/ast-g5/ast-g5.c b/board/aspeed/ast-g5/ast-g5.c
new file mode 100644
index 000000000000..4643ef37c13c
--- /dev/null
+++ b/board/aspeed/ast-g5/ast-g5.c
@@ -0,0 +1,86 @@
+/*
+ * (C) Copyright 2002
+ * Sysgo Real-Time Solutions, GmbH <www.elinos.com>
+ * Marius Groeger <mgroeger@sysgo.de>
+ *
+ * (C) Copyright 2002
+ * David Mueller, ELSOFT AG, <d.mueller@elsoft.ch>
+ *
+ * (C) Copyright 2003
+ * Texas Instruments, <www.ti.com>
+ * Kshitij Gupta <Kshitij@ti.com>
+ *
+ * (C) Copyright 2004
+ * ARM Ltd.
+ * Philippe Robin, <philippe.robin@arm.com>
+ *
+ * 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 <netdev.h>
+#include <asm/arch/ast_scu.h>
+#include <asm/arch/ast-sdmc.h>
+#include <asm/io.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#if defined(CONFIG_SHOW_BOOT_PROGRESS)
+void show_boot_progress(int progress)
+{
+    printf("Boot reached stage %d\n", progress);
+}
+#endif
+
+int board_init (void)
+{
+	/* adress of boot parameters */
+	gd->bd->bi_boot_params = CONFIG_SYS_SDRAM_BASE + 0x100;
+	gd->flags = 0;
+	return 0;
+}
+
+
+int misc_init_r (void)
+{
+	return 0;
+
+}
+
+/******************************
+ Routine:
+ Description:
+******************************/
+int dram_init (void)
+{
+	/* dram_init must store complete ramsize in gd->ram_size */
+	u32 vga = ast_scu_get_vga_memsize();
+	u32 dram = ast_sdmc_get_mem_size();
+	gd->ram_size = (dram - vga);
+
+	return 0;
+
+}
+
+#ifdef CONFIG_CMD_NET
+int board_eth_init(bd_t *bd)
+{
+        return ftgmac100_initialize(bd);
+}
+#endif
diff --git a/board/aspeed/ast-g5/platform.S b/board/aspeed/ast-g5/platform.S
new file mode 100644
index 000000000000..4dbdbf21be1f
--- /dev/null
+++ b/board/aspeed/ast-g5/platform.S
@@ -0,0 +1,1985 @@
+/*
+ *  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
+ */
+/*
+ * Board specific setup info
+ *
+ ******************************************************************************
+ * ASPEED Technology Inc.
+ * AST25x0 DDR3/DDR4 SDRAM controller initialization sequence
+ *
+ * Gary Hsu, <gary_hsu@aspeedtech.com>
+ *
+ * Version     : 9
+ * Release date: 2016.02.19
+ *
+ * Change List :
+ * V2|2014.07.25 : 1. Modify HPLL config sequence
+ * V2|2014.07.30 : 1. Modify DDR3 AC parameters table
+ *   |             2. Turn on ZQCS mode
+ * V2|2014.08.13 : 1. Add disable XDMA
+ * V2|2014.09.09 : 1. Disable CKE dynamic power down
+ * V2|2014.10.31 : 1. Enable VGA wide screen support (SCU40[0]=1)
+ * V2|2015.03.26 : 1. Revise AC timing table
+ *   |             2. Add check code to bypass A0 patch
+ *   |             3. Add MPLL parameter of A1
+ *   |             4. Set X-DMA into VGA memory domain
+ * V2|2015.04.24 : 1. Add disabling all DRAM requests during PHY init
+ *   |             2. Set MCR1C & MCR38
+ * V3|2015.05.13 : 1. Modify DDR4 PHY Vref training algorithm
+ *   |             2. Enable CKE dynamic power down
+ * V4|2015.06.15 : 1. Add MAC timing setting
+ * V5|2015.07.09 : 1. Modify MHCLK divider ratio
+ *   |             2. Add DDR read margin report
+ * V6|2015.08.13 : 1. Disable MMC password before exit
+ * V6|2015.08.24 : 1. Fix SCU160 parameter value for CLKIN=25MHz condition
+ * V7|2015.09.18 : 1. Clear AHB bus lock condition at power up time
+ *   |             2. Add reset MMC controller to solve init DRAM again during VGA ON
+ * V7|2015.09.22 : 1. Add watchdog full reset for resolving reset incomplete issue at fast reset condition
+ *   |             2. Add DRAM stress test after train complete, and redo DRAM initial if stress fail
+ *   |             3. Enable JTAG master mode
+ *   |             4. Add DDR4 Vref trainig retry timeout
+ * V8|2015.11.02 : 1. Clear software strap flag before doing watchdog full reset
+ *   |2015.12.10 : 1. Add USB PHY initial code
+ *   |2016.01.27 : 1. Modify the first reset from full chip reset to SOC reset
+ *   |             2. Remove HPLL/MPLL patch code for revision A0
+ *   |             3. Move the reset_mmc code to be after MPLL initialized
+ * V9|2016.02.19 : 1. Remove definietion "CONFIG_FIRMWARE_2ND_BOOT"
+ *
+ * Optional define variable
+ * 1. DRAM Speed             //
+ *    CONFIG_DRAM_1333       //
+ *    CONFIG_DRAM_1600       // (default)
+ * 2. ECC Function enable
+ *    CONFIG_DRAM_ECC        // define to enable ECC function
+ *    CONFIG_DRAM_ECC_SIZE   // define the ECC protected memory size
+ * 3. UART5 message output   //
+ *    CONFIG_DRAM_UART_38400 // set the UART baud rate to 38400, default is 115200
+ * 4. DRAM Type
+ *    CONFIG_DDR3_8GSTACK    // DDR3 8Gbit Stack die
+ *    CONFIG_DDR4_4GX8       // DDR4 4Gbit X8 dual part
+ * 5. Firmware 2nd boot flash
+ *    CONFIG_FIRMWARE_2ND_BOOT (Removed)
+ ******************************************************************************
+ */
+
+#include <config.h>
+#include <version.h>
+
+/******************************************************************************
+  r4 : return program counter
+  r5 : DDR speed timing table base address
+  Free registers:
+  r0, r1, r2, r3, r6, r7, r8, r9, r10, r11
+ ******************************************************************************/
+#define ASTMMC_INIT_VER      0x09                @ 8bit verison number
+#define ASTMMC_INIT_DATE     0x20160219          @ Release date
+
+#define ASTMMC_REGIDX_010    0x00
+#define ASTMMC_REGIDX_014    0x04
+#define ASTMMC_REGIDX_018    0x08
+#define ASTMMC_REGIDX_020    0x0C
+#define ASTMMC_REGIDX_024    0x10
+#define ASTMMC_REGIDX_02C    0x14
+#define ASTMMC_REGIDX_030    0x18
+#define ASTMMC_REGIDX_214    0x1C
+#define ASTMMC_REGIDX_2E0    0x20
+#define ASTMMC_REGIDX_2E4    0x24
+#define ASTMMC_REGIDX_2E8    0x28
+#define ASTMMC_REGIDX_2EC    0x2C
+#define ASTMMC_REGIDX_2F0    0x30
+#define ASTMMC_REGIDX_2F4    0x34
+#define ASTMMC_REGIDX_2F8    0x38
+#define ASTMMC_REGIDX_RFC    0x3C
+#define ASTMMC_REGIDX_PLL    0x40
+
+TIME_TABLE_DDR3_1333:
+    .word   0x53503C37       @ 0x010
+    .word   0xF858D47F       @ 0x014
+    .word   0x00010000       @ 0x018
+    .word   0x00000000       @ 0x020
+    .word   0x00000000       @ 0x024
+    .word   0x02101C60       @ 0x02C
+    .word   0x00000040       @ 0x030
+    .word   0x00000020       @ 0x214
+    .word   0x02001000       @ 0x2E0
+    .word   0x0C000085       @ 0x2E4
+    .word   0x000BA018       @ 0x2E8
+    .word   0x2CB92104       @ 0x2EC
+    .word   0x07090407       @ 0x2F0
+    .word   0x81000700       @ 0x2F4
+    .word   0x0C400800       @ 0x2F8
+    .word   0x7F5E3A27       @ tRFC
+    .word   0x00005B80       @ PLL
+TIME_TABLE_DDR3_1600:
+    .word   0x64604D38       @ 0x010
+    .word   0x29690599       @ 0x014
+    .word   0x00000300       @ 0x018
+    .word   0x00000000       @ 0x020
+    .word   0x00000000       @ 0x024
+    .word   0x02181E70       @ 0x02C
+    .word   0x00000040       @ 0x030
+    .word   0x00000024       @ 0x214
+    .word   0x02001300       @ 0x2E0
+    .word   0x0E0000A0       @ 0x2E4
+    .word   0x000E001B       @ 0x2E8
+    .word   0x35B8C105       @ 0x2EC
+    .word   0x08090408       @ 0x2F0
+    .word   0x9B000800       @ 0x2F4
+    .word   0x0E400A00       @ 0x2F8
+    .word   0x9971452F       @ tRFC
+    .word   0x000071C1       @ PLL
+
+TIME_TABLE_DDR4_1333:
+    .word   0x53503D26       @ 0x010
+    .word   0xE878D87F       @ 0x014
+    .word   0x00019000       @ 0x018
+    .word   0x08000000       @ 0x020
+    .word   0x00000400       @ 0x024
+    .word   0x00000200       @ 0x02C
+    .word   0x00000101       @ 0x030
+    .word   0x00000020       @ 0x214
+    .word   0x03002200       @ 0x2E0
+    .word   0x0C000085       @ 0x2E4
+    .word   0x000BA01A       @ 0x2E8
+    .word   0x2CB92106       @ 0x2EC
+    .word   0x07060606       @ 0x2F0
+    .word   0x81000700       @ 0x2F4
+    .word   0x0C400800       @ 0x2F8
+    .word   0x7F5E3A3A       @ tRFC
+    .word   0x00005B80       @ PLL
+TIME_TABLE_DDR4_1600:
+    .word   0x63604E37       @ 0x010
+    .word   0xE97AFA99       @ 0x014
+    .word   0x00019000       @ 0x018
+    .word   0x08000000       @ 0x020
+    .word   0x00000400       @ 0x024
+    .word   0x00000410       @ 0x02C
+    .word   0x00000101       @ 0x030
+    .word   0x00000024       @ 0x214
+    .word   0x03002900       @ 0x2E0
+    .word   0x0E0000A0       @ 0x2E4
+    .word   0x000E001C       @ 0x2E8
+    .word   0x35B8C106       @ 0x2EC
+    .word   0x08080607       @ 0x2F0
+    .word   0x9B000900       @ 0x2F4
+    .word   0x0E400A00       @ 0x2F8
+    .word   0x99714545       @ tRFC
+    .word   0x000071C1       @ PLL
+
+    .macro init_delay_timer
+    ldr   r0, =0x1e782024                        @ Set Timer3 Reload
+    str   r2, [r0]
+
+    ldr   r0, =0x1e6c0038                        @ Clear Timer3 ISR
+    ldr   r1, =0x00040000
+    str   r1, [r0]
+
+    ldr   r0, =0x1e782030                        @ Enable Timer3
+    mov   r2, #7
+    mov   r1, r2, lsl #8
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6c0090                        @ Check ISR for Timer3 timeout
+    .endm
+
+    .macro check_delay_timer
+    ldr   r1, [r0]
+    bic   r1, r1, #0xFFFBFFFF
+    mov   r2, r1, lsr #18
+    cmp   r2, #0x01
+    .endm
+
+    .macro clear_delay_timer
+    ldr   r0, =0x1e78203C                        @ Disable Timer3
+    mov   r2, #0xF
+    mov   r1, r2, lsl #8
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6c0038                        @ Clear Timer3 ISR
+    ldr   r1, =0x00040000
+    str   r1, [r0]
+    .endm
+
+    .macro init_spi_checksum
+    ldr   r0, =0x1e620084
+    ldr   r1, =0x20010000
+    str   r1, [r0]
+    ldr   r0, =0x1e62008C
+    ldr   r1, =0x20000200
+    str   r1, [r0]
+    ldr   r0, =0x1e620080
+    ldr   r1, =0x0000000D
+    orr   r2, r2, r7
+    orr   r1, r1, r2, lsl #8
+    and   r2, r6, #0xF
+    orr   r1, r1, r2, lsl #4
+    str   r1, [r0]
+    ldr   r0, =0x1e620008
+    ldr   r2, =0x00000800
+    .endm
+
+    .macro print_hex_char
+    and   r1, r1, #0xF
+    cmp   r1, #9
+    addgt r1, r1, #0x37
+    addle r1, r1, #0x30
+    str   r1, [r0]
+    .endm
+
+/******************************************************************************
+ Calibration Macro End
+ ******************************************************************************/
+
+.globl lowlevel_init
+lowlevel_init:
+
+init_dram:
+    /* save lr */
+    mov   r4, lr
+
+    /* Clear AHB bus lock condition */
+    ldr   r0, =0x1e600000
+    ldr   r1, =0xAEED1A03
+    str   r1, [r0]
+    ldr   r0, =0x1e600084
+    ldr   r1, =0x00010000
+    str   r1, [r0]
+    add   r0, r0, #0x4
+    mov   r1, #0x0
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e2000
+    ldr   r1, =0x1688a8a8
+    str   r1, [r0]
+
+    /* Reset again */
+    ldr   r0, =0x1e6e2070                        @ check fast reset flag
+    ldr   r2, =0x08000000
+    ldr   r1, [r0]
+    tst   r1, r2
+    beq   bypass_first_reset
+
+    ldr   r0, =0x1e785010
+    ldr   r3, [r0]
+    cmp   r3, #0x0
+    beq   start_first_reset
+    add   r0, r0, #0x04
+    mov   r3, #0x77
+    str   r3, [r0]
+    ldr   r0, =0x1e720004
+    str   r1, [r0]
+    add   r0, r0, #0x04
+    str   r1, [r0]
+    add   r0, r0, #0x04
+    str   r1, [r0]
+    ldr   r0, =0x1e6e207c                        @ clear fast reset flag
+    str   r2, [r0]
+    ldr   r0, =0x1e6e203c                        @ clear watchdog reset flag
+    ldr   r1, [r0]
+    and   r1, r1, #0x01
+    str   r1, [r0]
+    b     bypass_first_reset
+
+start_first_reset:
+    ldr   r0, =0x1e62009c                        @ clear software strap flag for doing again after reset
+    ldr   r1, =0xAEEDFC20
+    str   r1, [r0]
+    ldr   r0, =0x1e785004
+    ldr   r1, =0x00000001
+    str   r1, [r0]
+    ldr   r0, =0x1e785008
+    ldr   r1, =0x00004755
+    str   r1, [r0]
+    ldr   r0, =0x1e78500c                        @ enable soc reset
+    ldr   r1, =0x00000013
+    str   r1, [r0]
+wait_first_reset:
+    b     wait_first_reset
+
+bypass_first_reset:
+    /* Enable Timer separate clear mode */
+    ldr   r0, =0x1e782038
+    mov   r1, #0xAE
+    str   r1, [r0]
+
+/* Test - DRAM initial time */
+    ldr   r0, =0x1e78203c
+    ldr   r1, =0x0000F000
+    str   r1, [r0]
+
+    ldr   r0, =0x1e782044
+    ldr   r1, =0xFFFFFFFF
+    str   r1, [r0]
+
+    ldr   r0, =0x1e782030
+    mov   r2, #3
+    mov   r1, r2, lsl #12
+    str   r1, [r0]
+/* Test - DRAM initial time */
+
+    /*Set Scratch register Bit 7 before initialize*/
+    ldr   r0, =0x1e6e2000
+    ldr   r1, =0x1688a8a8
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e2040
+    ldr   r1, [r0]
+    orr   r1, r1, #0x80
+    str   r1, [r0]
+
+    /* Configure USB ports to the correct pin state */
+    ldr   r0, =0x1e6e200c
+    ldr   r2, =0x00004000
+    ldr   r1, [r0]
+    orr   r1, r1, r2
+    str   r1, [r0]
+    ldr   r0, =0x1e6e2070
+    ldr   r2, =0x00800000
+    ldr   r1, [r0]
+    tst   r1, r2
+    beq   bypass_USB_init
+    ldr   r0, =0x1e6e207c
+    str   r2, [r0]
+
+    /* Delay about 1ms */
+    clear_delay_timer
+    ldr   r2, =0x000003E8                        @ Set Timer3 Reload = 1 ms
+    init_delay_timer
+wait_usb_init:
+    check_delay_timer
+    bne   wait_usb_init
+    clear_delay_timer
+    /* end delay 1ms */
+
+    ldr   r0, =0x1e6e2070
+    ldr   r1, =0x00800000
+    str   r1, [r0]
+
+bypass_USB_init:
+    /* Enable AXI_P */
+    ldr   r0, =0x00000016
+    mrc   p15, 0, r1, c15, c2, 4
+    mcr   p15, 0, r0, c15, c2, 4
+
+/******************************************************************************
+ Disable WDT2 for 2nd boot function
+ ******************************************************************************/
+/*
+#ifndef CONFIG_FIRMWARE_2ND_BOOT
+    ldr   r0, =0x1e78502c
+    mov   r1, #0
+    str   r1, [r0]
+#endif
+*/
+/******************************************************************************
+ Disable WDT3 for SPI Address mode (3 or 4 bytes) detection function
+ ******************************************************************************/
+    ldr   r0, =0x1e78504c
+    mov   r1, #0
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0000
+    ldr   r1, =0xFC600309
+    str   r1, [r0]
+
+    /* Check Scratch Register Bit 6 */
+    ldr   r0, =0x1e6e2040
+    ldr   r1, [r0]
+    bic   r1, r1, #0xFFFFFFBF
+    mov   r2, r1, lsr #6
+    cmp   r2, #0x01
+    beq   platform_exit
+
+    /* Disable VGA display */
+    ldr   r0, =0x1e6e202c
+    ldr   r1, [r0]
+    orr   r1, r1, #0x40
+    str   r1, [r0]
+
+    /* Set M-PLL */
+#if   defined (CONFIG_DRAM_1333)
+    ldr   r2, =0xC48066C0                        @ load PLL parameter for 24Mhz CLKIN (330)
+#else
+    ldr   r2, =0x93002400                        @ load PLL parameter for 24Mhz CLKIN (396)
+#endif
+
+    ldr   r0, =0x1e6e2070                        @ Check CLKIN = 25MHz
+    ldr   r1, [r0]
+    mov   r1, r1, lsr #23
+    tst   r1, #0x01
+    beq   set_MPLL
+#if   defined (CONFIG_DRAM_1333)
+    ldr   r2, =0xC4806680                        @ load PLL parameter for 25Mhz CLKIN (331)
+#else
+    ldr   r2, =0x930023E0                        @ load PLL parameter for 25Mhz CLKIN (400)
+#endif
+    ldr   r0, =0x1e6e2160                        @ set 24M Jitter divider (HPLL=825MHz)
+    ldr   r1, =0x00011320
+    str   r1, [r0]
+
+set_MPLL:
+    ldr   r0, =0x1e6e2020                        @ M-PLL (DDR SDRAM) Frequency
+    str   r2, [r0]
+
+    clear_delay_timer
+
+    /* Delay about 3ms */
+    ldr   r2, =0x00000BB8                        @ Set Timer3 Reload = 3 ms
+    init_delay_timer
+wait_mpll_init:
+    check_delay_timer
+    bne   wait_mpll_init
+    clear_delay_timer
+    /* end delay 3ms */
+
+    /* Reset MMC */
+reset_mmc:
+    ldr   r0, =0x1e78505c
+    ldr   r1, =0x00000004
+    str   r1, [r0]
+    ldr   r0, =0x1e785044
+    ldr   r1, =0x00000001
+    str   r1, [r0]
+    ldr   r0, =0x1e785048
+    ldr   r1, =0x00004755
+    str   r1, [r0]
+    ldr   r0, =0x1e78504c
+    ldr   r1, =0x00000013
+    str   r1, [r0]
+wait_mmc_reset:
+    ldr   r1, [r0]
+    tst   r1, #0x02
+    bne   wait_mmc_reset
+
+    ldr   r0, =0x1e78505c
+    ldr   r1, =0x023FFFF3
+    str   r1, [r0]
+    ldr   r0, =0x1e785044
+    ldr   r1, =0x000F4240
+    str   r1, [r0]
+    ldr   r0, =0x1e785048
+    ldr   r1, =0x00004755
+    str   r1, [r0]
+    ldr   r0, =0x1e785054
+    ldr   r1, =0x00000077
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0000
+    ldr   r1, =0xFC600309
+wait_mmc_reset_done:
+    str   r1, [r0]
+    ldr   r2, [r0]
+    cmp   r2, #0x1
+    bne   wait_mmc_reset_done
+
+    ldr   r0, =0x1e6e0034                        @ disable MMC request
+    ldr   r1, =0x00020000
+    str   r1, [r0]
+
+/* Debug - UART console message */
+    ldr   r0, =0x1e78400c
+    mov   r1, #0x83
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e202c
+    ldr   r2, [r0]
+    mov   r2, r2, lsr #12
+    tst   r2, #0x01
+    ldr   r0, =0x1e784000
+    moveq r1, #0x0D                              @ Baudrate 115200
+    movne r1, #0x01                              @ Baudrate 115200, div13
+#ifdef CONFIG_DRAM_UART_38400
+    moveq r1, #0x27                              @ Baudrate 38400
+    movne r1, #0x03                              @ Baudrate 38400 , div13
+#endif
+    str   r1, [r0]
+
+    ldr   r0, =0x1e784004
+    mov   r1, #0x00
+    str   r1, [r0]
+
+    ldr   r0, =0x1e78400c
+    mov   r1, #0x03
+    str   r1, [r0]
+
+    ldr   r0, =0x1e784008
+    mov   r1, #0x07
+    str   r1, [r0]
+
+    ldr   r0, =0x1e784000
+    mov   r1, #0x0D                              @ '\r'
+    str   r1, [r0]
+    mov   r1, #0x0A                              @ '\n'
+    str   r1, [r0]
+    mov   r1, #0x44                              @ 'D'
+    str   r1, [r0]
+    mov   r1, #0x52                              @ 'R'
+    str   r1, [r0]
+    mov   r1, #0x41                              @ 'A'
+    str   r1, [r0]
+    mov   r1, #0x4D                              @ 'M'
+    str   r1, [r0]
+    mov   r1, #0x20                              @ ' '
+    str   r1, [r0]
+    mov   r1, #0x49                              @ 'I'
+    str   r1, [r0]
+    mov   r1, #0x6E                              @ 'n'
+    str   r1, [r0]
+    mov   r1, #0x69                              @ 'i'
+    str   r1, [r0]
+    mov   r1, #0x74                              @ 't'
+    str   r1, [r0]
+    mov   r1, #0x2D                              @ '-'
+    str   r1, [r0]
+    mov   r1, #0x56                              @ 'V'
+    str   r1, [r0]
+    mov   r1, #ASTMMC_INIT_VER
+    mov   r1, r1, lsr #4
+    print_hex_char
+    mov   r1, #ASTMMC_INIT_VER
+    print_hex_char
+    mov   r1, #0x2D                              @ '-'
+    str   r1, [r0]
+    ldr   r0, =0x1e784014
+wait_print:
+    ldr   r1, [r0]
+    tst   r1, #0x40
+    beq   wait_print
+    ldr   r0, =0x1e784000
+    mov   r1, #0x44                              @ 'D'
+    str   r1, [r0]
+    mov   r1, #0x44                              @ 'D'
+    str   r1, [r0]
+    mov   r1, #0x52                              @ 'R'
+    str   r1, [r0]
+/* Debug - UART console message */
+
+/******************************************************************************
+ Init DRAM common registers
+ ******************************************************************************/
+    ldr   r0, =0x1e6e0034                        @ disable SDRAM reset
+    ldr   r1, =0x00020080
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0008
+    ldr   r1, =0x2003000F                        /* VGA */
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0038                        @ disable all DRAM requests except CPU during PHY init
+    ldr   r1, =0xFFFFEBFF
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0040
+    ldr   r1, =0x88448844
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0044
+    ldr   r1, =0x24422288
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0048
+    ldr   r1, =0x22222222
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e004c
+    ldr   r1, =0x22222222
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0050
+    ldr   r1, =0x80000000
+    str   r1, [r0]
+
+    ldr   r1, =0x00000000
+    ldr   r0, =0x1e6e0208                        @ PHY Setting
+    str   r1, [r0]
+    ldr   r0, =0x1e6e0218
+    str   r1, [r0]
+    ldr   r0, =0x1e6e0220
+    str   r1, [r0]
+    ldr   r0, =0x1e6e0228
+    str   r1, [r0]
+    ldr   r0, =0x1e6e0230
+    str   r1, [r0]
+    ldr   r0, =0x1e6e02a8
+    str   r1, [r0]
+    ldr   r0, =0x1e6e02b0
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0240
+    ldr   r1, =0x86000000
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0244
+    ldr   r1, =0x00008600
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0248
+    ldr   r1, =0x80000000
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e024c
+    ldr   r1, =0x80808080
+    str   r1, [r0]
+
+    /* Check DRAM Type by H/W Trapping */
+    ldr   r0, =0x1e6e2070
+    ldr   r1, [r0]
+    ldr   r2, =0x01000000                        @ bit[24]=1 => DDR4
+    tst   r1, r2
+    bne   ddr4_init
+    b     ddr3_init
+.LTORG
+
+/******************************************************************************
+ DDR3 Init
+ ******************************************************************************/
+ddr3_init:
+/* Debug - UART console message */
+    ldr   r0, =0x1e784000
+    mov   r1, #0x33                              @ '3'
+    str   r1, [r0]
+    mov   r1, #0x0D                              @ '\r'
+    str   r1, [r0]
+    mov   r1, #0x0A                              @ '\n'
+    str   r1, [r0]
+/* Debug - UART console message */
+
+#if   defined (CONFIG_DRAM_1333)
+    adrl  r5, TIME_TABLE_DDR3_1333               @ Init DRAM parameter table
+#else
+    adrl  r5, TIME_TABLE_DDR3_1600
+#endif
+
+    ldr   r0, =0x1e6e0004
+#ifdef CONFIG_DDR3_8GSTACK
+    ldr   r1, =0x00000323                        @ Init to 8GB stack
+#else
+    ldr   r1, =0x00000303                        @ Init to 8GB
+#endif
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0010
+    ldr   r1, [r5, #ASTMMC_REGIDX_010]
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0014
+    ldr   r1, [r5, #ASTMMC_REGIDX_014]
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0018
+    ldr   r1, [r5, #ASTMMC_REGIDX_018]
+    str   r1, [r0]
+
+    /* DRAM Mode Register Setting */
+    ldr   r0, =0x1e6e0020                        @ MRS_4/6
+    ldr   r1, [r5, #ASTMMC_REGIDX_020]
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0024                        @ MRS_5
+    ldr   r1, [r5, #ASTMMC_REGIDX_024]
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e002c                        @ MRS_0/2
+    ldr   r1, [r5, #ASTMMC_REGIDX_02C]
+    mov   r2, #0x1
+    orr   r1, r1, r2, lsl #8
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0030                        @ MRS_1/3
+    ldr   r1, [r5, #ASTMMC_REGIDX_030]
+    str   r1, [r0]
+
+    /* Start DDR PHY Setting */
+    ldr   r0, =0x1e6e0200
+    ldr   r1, =0x02492AAE
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0204
+#ifdef CONFIG_DDR3_8GSTACK
+    ldr   r1, =0x10001001
+#else
+    ldr   r1, =0x00001001
+#endif
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e020c
+    ldr   r1, =0x55E00B0B
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0210
+    ldr   r1, =0x20000000
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0214
+    ldr   r1, [r5, #ASTMMC_REGIDX_214]
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e02e0
+    ldr   r1, [r5, #ASTMMC_REGIDX_2E0]
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e02e4
+    ldr   r1, [r5, #ASTMMC_REGIDX_2E4]
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e02e8
+    ldr   r1, [r5, #ASTMMC_REGIDX_2E8]
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e02ec
+    ldr   r1, [r5, #ASTMMC_REGIDX_2EC]
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e02f0
+    ldr   r1, [r5, #ASTMMC_REGIDX_2F0]
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e02f4
+    ldr   r1, [r5, #ASTMMC_REGIDX_2F4]
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e02f8
+    ldr   r1, [r5, #ASTMMC_REGIDX_2F8]
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0290
+    ldr   r1, =0x00100008
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e02c0
+    ldr   r1, =0x00000006
+    str   r1, [r0]
+
+    /* Controller Setting */
+    ldr   r0, =0x1e6e0060                        @ Fire DDRPHY Init
+    ldr   r1, =0x00000005
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0034
+    ldr   r1, =0x00020091
+    str   r1, [r0]
+
+/* Debug - UART console message */
+    ldr   r0, =0x1e784000
+    mov   r1, #0x30                              @ '0'
+    str   r1, [r0]
+/* Debug - UART console message */
+
+    ldr   r0, =0x1e6e0120
+    mov   r1, #0x00
+    str   r1, [r0]
+    b     ddr_phy_init_process
+
+ddr3_phyinit_done:
+
+/* Debug - UART console message */
+    ldr   r0, =0x1e784000
+    mov   r1, #0x31                              @ '1'
+    str   r1, [r0]
+/* Debug - UART console message */
+
+    ldr   r0, =0x1e6e000c
+    ldr   r1, =0x00000040
+    str   r1, [r0]
+
+#ifdef CONFIG_DDR3_8GSTACK
+    ldr   r0, =0x1e6e0028
+    ldr   r1, =0x00000025
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0028
+    ldr   r1, =0x00000027
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0028
+    ldr   r1, =0x00000023
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0028
+    ldr   r1, =0x00000021
+    str   r1, [r0]
+#endif
+
+    ldr   r0, =0x1e6e0028
+    ldr   r1, =0x00000005
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0028
+    ldr   r1, =0x00000007
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0028
+    ldr   r1, =0x00000003
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0028
+    ldr   r1, =0x00000011
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e000c
+    ldr   r1, =0x00005C41
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0034
+    ldr   r2, =0x70000000
+ddr3_check_dllrdy:
+    ldr   r1, [r0]
+    tst   r1, r2
+    bne   ddr3_check_dllrdy
+
+    ldr   r0, =0x1e6e000c
+    ldr   r1, =0x42AA5C81
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0034
+    ldr   r1, =0x0001AF93
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0120                        @ VGA Compatible Mode
+    ldr   r1, [r5, #ASTMMC_REGIDX_PLL]
+    str   r1, [r0]
+
+    b     Calibration_End
+.LTORG
+/******************************************************************************
+ End DDR3 Init
+ ******************************************************************************/
+/******************************************************************************
+ DDR4 Init
+ ******************************************************************************/
+ddr4_init:
+/* Debug - UART console message */
+    ldr   r0, =0x1e784000
+    mov   r1, #0x34                              @ '4'
+    str   r1, [r0]
+    mov   r1, #0x0D                              @ '\r'
+    str   r1, [r0]
+    mov   r1, #0x0A                              @ '\n'
+    str   r1, [r0]
+/* Debug - UART console message */
+
+#if   defined (CONFIG_DRAM_1333)
+    adrl  r5, TIME_TABLE_DDR4_1333               @ Init DRAM parameter table
+#else
+    adrl  r5, TIME_TABLE_DDR4_1600
+#endif
+
+    ldr   r0, =0x1e6e0004
+#ifdef CONFIG_DDR4_4GX8
+    ldr   r1, =0x00002313                        @ Init to 8GB
+#else
+    ldr   r1, =0x00000313                        @ Init to 8GB
+#endif
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0010
+    ldr   r1, [r5, #ASTMMC_REGIDX_010]
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0014
+    ldr   r1, [r5, #ASTMMC_REGIDX_014]
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0018
+    ldr   r1, [r5, #ASTMMC_REGIDX_018]
+    str   r1, [r0]
+
+    /* DRAM Mode Register Setting */
+    ldr   r0, =0x1e6e0020                        @ MRS_4/6
+    ldr   r1, [r5, #ASTMMC_REGIDX_020]
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0024                        @ MRS_5
+    ldr   r1, [r5, #ASTMMC_REGIDX_024]
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e002c                        @ MRS_0/2
+    ldr   r1, [r5, #ASTMMC_REGIDX_02C]
+    mov   r2, #0x1
+    orr   r1, r1, r2, lsl #8
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0030                        @ MRS_1/3
+    ldr   r1, [r5, #ASTMMC_REGIDX_030]
+    str   r1, [r0]
+
+    /* Start DDR PHY Setting */
+    ldr   r0, =0x1e6e0200
+    ldr   r1, =0x42492AAE
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0204
+    ldr   r1, =0x09002000
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e020c
+    ldr   r1, =0x55E00B0B
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0210
+    ldr   r1, =0x20000000
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0214
+    ldr   r1, [r5, #ASTMMC_REGIDX_214]
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e02e0
+    ldr   r1, [r5, #ASTMMC_REGIDX_2E0]
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e02e4
+    ldr   r1, [r5, #ASTMMC_REGIDX_2E4]
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e02e8
+    ldr   r1, [r5, #ASTMMC_REGIDX_2E8]
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e02ec
+    ldr   r1, [r5, #ASTMMC_REGIDX_2EC]
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e02f0
+    ldr   r1, [r5, #ASTMMC_REGIDX_2F0]
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e02f4
+    ldr   r1, [r5, #ASTMMC_REGIDX_2F4]
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e02f8
+    ldr   r1, [r5, #ASTMMC_REGIDX_2F8]
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0290
+    ldr   r1, =0x00100008
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e02c4
+    ldr   r1, =0x3C183C3C
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e02c8
+    ldr   r1, =0x00631E0E
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0034
+    ldr   r1, =0x0001A991
+    str   r1, [r0]
+
+/* Debug - UART console message */
+    ldr   r0, =0x1e784000
+    mov   r1, #0x30                              @ '0'
+    str   r1, [r0]
+/* Debug - UART console message */
+
+    /********************************************
+     PHY Vref Scan
+     r6 : recorded vref value
+     r7 : max read eye pass window
+     r8 : passcnt
+     r9 : CBRtest result
+     r10: loopcnt
+     r11: free
+    ********************************************/
+    ldr   r0, =0x1e720000                        @ retry count
+    mov   r1, #0x5
+    str   r1, [r0]
+ddr4_vref_phy_cal_start:
+    mov   r7, #0x0
+    mov   r8, #0x0
+    mov   r10, #0x3F
+
+    ldr   r0, =0x1e720000
+    ldr   r1, [r0]
+    subs  r1, r1, #0x01
+    beq   ddr_test_fail
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0120
+    ldr   r1, =0x00000001
+    str   r1, [r0]
+
+/* Debug - UART console message */
+    ldr   r0, =0x1e784000
+    mov   r1, #0x61                              @ 'a'
+    str   r1, [r0]
+/* Debug - UART console message */
+
+    ldr   r0, =0x1e6e02c0
+    ldr   r1, =0x00001C06
+    str   r1, [r0]
+
+ddr4_vref_phy_loop:
+    ldr   r0, =0x1e6e0060
+    ldr   r1, =0x00000000
+    str   r1, [r0]
+
+    add   r10, r10, #0x01
+    cmp   r10, #0x80
+    beq   ddr4_vref_phy_test_fail                @ no valid margin and retry
+
+    ldr   r0, =0x1e6e02cc
+    orr   r1, r10, r10, lsl #8
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0060
+    ldr   r1, =0x00000005
+    str   r1, [r0]
+    b     ddr_phy_init_process
+
+ddr4_vref_phy_phyinit_done:
+
+    b     cbr_test_start
+
+ddr4_vref_phy_cbrtest_done:
+    cmp   r9, #0x01
+    bne   ddr4_vref_phy_test_fail
+    add   r8, r8, #0x01
+    ldr   r0, =0x1e6e03d0                        @ read eye pass window
+    ldr   r1, [r0]
+    mov   r2, r1, lsr #8                         @ r2 = DQH
+    and   r1, r1, #0xFF                          @ r1 = DQL
+    cmp   r1, r2
+    movgt r1, r2                                 @ r1 = smaller one
+    cmp   r1, r7
+    movgt r6, r10
+    movgt r7, r1
+    b     ddr4_vref_phy_loop
+
+ddr4_vref_phy_test_fail:
+    cmp   r8, #0x0
+    bne   ddr4_vref_phy_loop_end
+    cmp   r10, #0x80
+    beq   ddr4_vref_phy_cal_start
+    b     ddr4_vref_phy_loop
+
+ddr4_vref_phy_loop_end:
+    ldr   r0, =0x1e6e02cc
+    orr   r1, r6, r6, lsl #8
+    str   r1, [r0]
+
+    /********************************************
+     DDR Vref Scan
+     r6 : min
+     r7 : max
+     r8 : passcnt
+     r9 : CBRtest result
+     r10: loopcnt
+     r11: free
+    ********************************************/
+    ldr   r0, =0x1e720000                        @ retry count
+    mov   r1, #0x5
+    str   r1, [r0]
+ddr4_vref_ddr_cal_start:
+    mov   r6, #0xFF
+    mov   r7, #0x0
+    mov   r8, #0x0
+    mov   r10, #0x0
+
+    ldr   r0, =0x1e720000
+    ldr   r1, [r0]
+    subs  r1, r1, #0x01
+    beq   ddr_test_fail
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0120
+    ldr   r1, =0x00000002
+    str   r1, [r0]
+
+/* Debug - UART console message */
+    ldr   r0, =0x1e784000
+    mov   r1, #0x62                              @ 'b'
+    str   r1, [r0]
+/* Debug - UART console message */
+
+ddr4_vref_ddr_loop:
+    ldr   r0, =0x1e6e0060
+    ldr   r1, =0x00000000
+    str   r1, [r0]
+
+    add   r10, r10, #0x01
+    cmp   r10, #0x40
+    beq   ddr4_vref_ddr_test_fail                @ no valid margin and retry
+
+    ldr   r0, =0x1e6e02c0
+    mov   r1, #0x06
+    orr   r1, r1, r10, lsl #8
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0060
+    ldr   r1, =0x00000005
+    str   r1, [r0]
+    b     ddr_phy_init_process
+
+ddr4_vref_ddr_phyinit_done:
+
+    b     cbr_test_start
+
+ddr4_vref_ddr_cbrtest_done:
+    cmp   r9, #0x01
+    bne   ddr4_vref_ddr_test_fail
+    add   r8, r8, #0x01
+    cmp   r6, r10
+    movgt r6, r10
+    cmp   r7, r10
+    movlt r7, r10
+    b     ddr4_vref_ddr_loop
+
+ddr4_vref_ddr_test_fail:
+    cmp   r8, #0x0
+    bne   ddr4_vref_ddr_loop_end
+    cmp   r10, #0x40
+    beq   ddr4_vref_ddr_cal_start
+    b     ddr4_vref_ddr_loop
+
+ddr4_vref_ddr_loop_end:
+    ldr   r0, =0x1e6e0060
+    ldr   r1, =0x00000000
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e02c0
+    add   r1, r6, r7
+    add   r1, r1, #0x01
+    mov   r2, r1, lsr #1
+    mov   r1, r2, lsl #8
+    orr   r1, r1, #0x06
+    str   r1, [r0]
+
+/* Debug - UART console message */
+    ldr   r0, =0x1e784000
+    mov   r1, #0x63                              @ 'c'
+    str   r1, [r0]
+/* Debug - UART console message */
+
+    ldr   r0, =0x1e6e0120
+    ldr   r1, =0x00000003
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0060                        @ Fire DDRPHY Init
+    ldr   r1, =0x00000005
+    str   r1, [r0]
+    b     ddr_phy_init_process
+
+ddr4_phyinit_done:
+    /*******************************************/
+/* Debug - UART console message */
+    ldr   r0, =0x1e784000
+    mov   r1, #0x31                              @ '1'
+    str   r1, [r0]
+/* Debug - UART console message */
+
+    ldr   r0, =0x1e6e000c
+    ldr   r1, =0x42AA5C81
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0034
+    ldr   r1, =0x0001AF93
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0120                        @ VGA Compatible Mode
+    ldr   r1, [r5, #ASTMMC_REGIDX_PLL]
+    str   r1, [r0]
+
+    b     Calibration_End
+
+.LTORG
+/******************************************************************************
+ End DDR4 Init
+ ******************************************************************************/
+/******************************************************************************
+ Global Process
+ ******************************************************************************/
+    /********************************************
+     DDRPHY Init Process
+    ********************************************/
+ddr_phy_init_process:
+    clear_delay_timer
+    /* Wait DDR PHY init done - timeout 300 ms */
+    ldr   r2, =0x000493E0                        @ Set Timer3 Reload = 300 ms
+    init_delay_timer
+    ldr   r3, =0x1e6e0060
+ddr_phy_init:
+    check_delay_timer
+    beq   ddr_phy_init_timeout
+    ldr   r1, [r3]
+    tst   r1, #0x01
+    bne   ddr_phy_init
+
+    /* Check DDR PHY init status */
+    ldr   r0, =0x1e6e0300
+    ldr   r2, =0x000A0000
+    ldr   r1, [r0]
+    tst   r1, r2
+    beq   ddr_phy_init_success
+
+ddr_phy_init_timeout:
+    ldr   r0, =0x1e6e0060                        @ Reset PHY
+    mov   r1, #0x00
+    str   r1, [r0]
+
+/* Debug - UART console message */
+    ldr   r0, =0x1e784000
+    mov   r1, #0x2E                              @ '.'
+    str   r1, [r0]
+/* Debug - UART console message */
+
+    clear_delay_timer
+    /* Delay about 10us */
+    ldr   r2, =0x0000000A                        @ Set Timer3 Reload = 10 us
+    init_delay_timer
+ddr_phy_init_delay_0:
+    check_delay_timer
+    bne   ddr_phy_init_delay_0
+    clear_delay_timer
+    /* end delay 10us */
+
+    ldr   r0, =0x1e6e0060                        @ Fire PHY Init
+    mov   r1, #0x05
+    str   r1, [r0]
+    b     ddr_phy_init_process
+
+ddr_phy_init_success:
+    clear_delay_timer
+    ldr   r0, =0x1e6e0060
+    mov   r1, #0x06
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0120
+    ldr   r1, [r0]
+    cmp   r1, #0
+    beq   ddr3_phyinit_done
+    cmp   r1, #1
+    beq   ddr4_vref_phy_phyinit_done
+    cmp   r1, #2
+    beq   ddr4_vref_ddr_phyinit_done
+    b     ddr4_phyinit_done
+
+    /********************************************
+     CBRTest
+    ********************************************/
+cbr_test_start:
+    ldr   r0, =0x1e6e000c
+    ldr   r1, =0x00005C01
+    str   r1, [r0]
+    ldr   r0, =0x1e6e0074
+    ldr   r1, =0x0000FFFF                        @ test size = 64KB
+    str   r1, [r0]
+    ldr   r0, =0x1e6e007c
+    ldr   r1, =0xFF00FF00
+    str   r1, [r0]
+
+cbr_test_single:
+    ldr   r0, =0x1e6e0070
+    ldr   r1, =0x00000000
+    str   r1, [r0]
+    ldr   r1, =0x00000085
+    str   r1, [r0]
+    ldr   r3, =0x3000
+    ldr   r11, =0x50000
+cbr_wait_engine_idle_0:
+    subs  r11, r11, #1
+    beq   cbr_test_fail
+    ldr   r2, [r0]
+    tst   r2, r3                                 @ D[12] = idle bit
+    beq   cbr_wait_engine_idle_0
+
+    ldr   r0, =0x1e6e0070                        @ read fail bit status
+    ldr   r3, =0x2000
+    ldr   r2, [r0]
+    tst   r2, r3                                 @ D[13] = fail bit
+    bne   cbr_test_fail
+
+cbr_test_burst:
+    mov   r1, #0x00                              @ initialize loop index, r1 is loop index
+cbr_test_burst_loop:
+    ldr   r0, =0x1e6e0070
+    ldr   r2, =0x00000000
+    str   r2, [r0]
+    mov   r2, r1, lsl #3
+    orr   r2, r2, #0xC1                          @ test command = 0xC1 | (datagen << 3)
+    str   r2, [r0]
+    ldr   r3, =0x3000
+    ldr   r11, =0x20000
+cbr_wait_engine_idle_1:
+    subs  r11, r11, #1
+    beq   cbr_test_fail
+    ldr   r2, [r0]
+    tst   r2, r3                                 @ D[12] = idle bit
+    beq   cbr_wait_engine_idle_1
+
+    ldr   r0, =0x1e6e0070                        @ read fail bit status
+    ldr   r3, =0x2000
+    ldr   r2, [r0]
+    tst   r2, r3                                 @ D[13] = fail bit
+    bne   cbr_test_fail
+
+    add   r1, r1, #1                             @ increase the test mode index
+    cmp   r1, #0x04                              @ test 4 modes
+    bne   cbr_test_burst_loop
+
+    ldr   r0, =0x1e6e0070
+    ldr   r1, =0x00000000
+    str   r1, [r0]
+    mov   r9, #0x1
+    b     cbr_test_pattern_end                   @ CBRTest() return(1)
+
+cbr_test_fail:
+    ldr   r0, =0x1e6e0070
+    ldr   r1, =0x00000000
+    str   r1, [r0]
+    mov   r9, #0x0                               @ CBRTest() return(0)
+
+cbr_test_pattern_end:
+    ldr   r0, =0x1e6e000c
+    ldr   r1, =0x00000000
+    str   r1, [r0]
+    ldr   r0, =0x1e6e0120
+    ldr   r1, [r0]
+    cmp   r1, #1
+    beq   ddr4_vref_phy_cbrtest_done
+    b     ddr4_vref_ddr_cbrtest_done
+
+.LTORG
+/******************************************************************************
+ Other features configuration
+ *****************************************************************************/
+Calibration_End:
+    /*******************************
+     Check DRAM Size
+     1Gb : 0x80000000 ~ 0x87FFFFFF
+     2Gb : 0x80000000 ~ 0x8FFFFFFF
+     4Gb : 0x80000000 ~ 0x9FFFFFFF
+     8Gb : 0x80000000 ~ 0xBFFFFFFF
+    *******************************/
+    ldr   r0, =0x1e6e0004
+    ldr   r6, [r0]
+    bic   r6, r6, #0x00000003                    @ record MCR04
+    ldr   r7, [r5, #ASTMMC_REGIDX_RFC]
+
+check_dram_size:
+    ldr   r0, =0xA0100000
+    ldr   r1, =0x41424344
+    str   r1, [r0]
+    ldr   r0, =0x90100000
+    ldr   r1, =0x35363738
+    str   r1, [r0]
+    ldr   r0, =0x88100000
+    ldr   r1, =0x292A2B2C
+    str   r1, [r0]
+    ldr   r0, =0x80100000
+    ldr   r1, =0x1D1E1F10
+    str   r1, [r0]
+    ldr   r0, =0xA0100000
+    ldr   r1, =0x41424344
+    ldr   r2, [r0]
+    cmp   r2, r1                                 @ == 8Gbit
+    orreq r6, r6, #0x03
+    moveq r7, r7, lsr #24
+    mov   r3, #0x38                              @ '8'
+    beq   check_dram_size_end
+    ldr   r0, =0x90100000
+    ldr   r1, =0x35363738
+    ldr   r2, [r0]
+    cmp   r2, r1                                 @ == 4Gbit
+    orreq r6, r6, #0x02
+    moveq r7, r7, lsr #16
+    mov   r3, #0x34                              @ '4'
+    beq   check_dram_size_end
+    ldr   r0, =0x88100000
+    ldr   r1, =0x292A2B2C
+    ldr   r2, [r0]
+    cmp   r2, r1                                 @ == 2Gbit
+    orreq r6, r6, #0x01
+    moveq r7, r7, lsr #8
+    mov   r3, #0x32                              @ '2'
+    beq   check_dram_size_end
+    mov   r3, #0x31                              @ '1'
+
+check_dram_size_end:
+    ldr   r0, =0x1e6e0004
+    str   r6, [r0]
+    ldr   r0, =0x1e6e0014
+    ldr   r1, [r0]
+    bic   r1, r1, #0x000000FF
+    and   r7, r7, #0xFF
+    orr   r1, r1, r7
+    str   r1, [r0]
+
+    /* Version Number */
+    ldr   r0, =0x1e6e0004
+    ldr   r1, [r0]
+    mov   r2, #ASTMMC_INIT_VER
+    orr   r1, r1, r2, lsl #20
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0088
+    ldr   r1, =ASTMMC_INIT_DATE
+    str   r1, [r0]
+
+/* Debug - UART console message */
+    ldr   r0, =0x1e784000
+    mov   r1, #0x2D                              @ '-'
+    str   r1, [r0]
+    str   r3, [r0]
+    mov   r1, #0x47                              @ 'G'
+    str   r1, [r0]
+    mov   r1, #0x62                              @ 'b'
+    str   r1, [r0]
+    mov   r1, #0x2D                              @ '-'
+    str   r1, [r0]
+/* Debug - UART console message */
+
+    /* Enable DRAM Cache */
+    ldr   r0, =0x1e6e0004
+    ldr   r1, [r0]
+    mov   r2, #1
+    orr   r2, r1, r2, lsl #12
+    str   r2, [r0]
+    ldr   r3, =0x00080000
+dram_cache_init:
+    ldr   r2, [r0]
+    tst   r2, r3
+    beq   dram_cache_init
+    mov   r2, #1
+    orr   r1, r1, r2, lsl #10
+    str   r1, [r0]
+
+    /* Set DRAM requests threshold */
+    ldr   r0, =0x1e6e001c
+    ldr   r1, =0x00000008
+    str   r1, [r0]
+    ldr   r0, =0x1e6e0038
+    ldr   r1, =0xFFFFFF00
+    str   r1, [r0]
+
+    /********************************************
+     DDRTest
+    ********************************************/
+ddr_test_start:
+    ldr   r0, =0x1e6e0074
+    ldr   r1, =0x0000FFFF                        @ test size = 64KB
+    str   r1, [r0]
+    ldr   r0, =0x1e6e007c
+    ldr   r1, =0xFF00FF00
+    str   r1, [r0]
+
+ddr_test_burst:
+    mov   r1, #0x00                              @ initialize loop index, r1 is loop index
+ddr_test_burst_loop:
+    ldr   r0, =0x1e6e0070
+    ldr   r2, =0x00000000
+    str   r2, [r0]
+    mov   r2, r1, lsl #3
+    orr   r2, r2, #0xC1                          @ test command = 0xC1 | (datagen << 3)
+    str   r2, [r0]
+    ldr   r3, =0x3000
+    ldr   r11, =0x20000
+ddr_wait_engine_idle_1:
+    subs  r11, r11, #1
+    beq   ddr_test_fail
+    ldr   r2, [r0]
+    tst   r2, r3                                 @ D[12] = idle bit
+    beq   ddr_wait_engine_idle_1
+
+    ldr   r0, =0x1e6e0070                        @ read fail bit status
+    ldr   r3, =0x2000
+    ldr   r2, [r0]
+    tst   r2, r3                                 @ D[13] = fail bit
+    bne   ddr_test_fail
+
+    add   r1, r1, #1                             @ increase the test mode index
+    cmp   r1, #0x01                              @ test 1 modes
+    bne   ddr_test_burst_loop
+
+    ldr   r0, =0x1e6e0070
+    ldr   r1, =0x00000000
+    str   r1, [r0]
+    b     set_scratch                            @ CBRTest() return(1)
+
+ddr_test_fail:
+/* Debug - UART console message */
+    ldr   r0, =0x1e784000
+    mov   r1, #0x46                              @ 'F'
+    str   r1, [r0]
+    mov   r1, #0x61                              @ 'a'
+    str   r1, [r0]
+    mov   r1, #0x69                              @ 'i'
+    str   r1, [r0]
+    mov   r1, #0x6C                              @ 'l'
+    str   r1, [r0]
+    mov   r1, #0x0D                              @ '\r'
+    str   r1, [r0]
+    mov   r1, #0x0A                              @ '\n'
+    str   r1, [r0]
+    ldr   r0, =0x1e784014
+wait_print_0:
+    ldr   r1, [r0]
+    tst   r1, #0x40
+    beq   wait_print_0
+/* Debug - UART console message */
+    b     reset_mmc
+
+set_scratch:
+    /*Set Scratch register Bit 6 after ddr initial finished */
+    ldr   r0, =0x1e6e2040
+    ldr   r1, [r0]
+    orr   r1, r1, #0x41
+    str   r1, [r0]
+
+/* Debug - UART console message */
+    ldr   r0, =0x1e784000
+    mov   r1, #0x44                              @ 'D'
+    str   r1, [r0]
+    mov   r1, #0x6F                              @ 'o'
+    str   r1, [r0]
+    mov   r1, #0x6E                              @ 'n'
+    str   r1, [r0]
+    mov   r1, #0x65                              @ 'e'
+    str   r1, [r0]
+    mov   r1, #0x0D                              @ '\r'
+    str   r1, [r0]
+    mov   r1, #0x0A                              @ '\n'
+    str   r1, [r0]
+/* Debug - UART console message */
+
+    /* Enable VGA display */
+    ldr   r0, =0x1e6e202c
+    ldr   r1, [r0]
+    bic   r1, r1, #0x40
+    str   r1, [r0]
+
+/* Debug - UART console message */
+   /* Print PHY timing information */
+    ldr   r0, =0x1e784014
+wait_print_1:
+    ldr   r1, [r0]
+    tst   r1, #0x40
+    beq   wait_print_1
+
+    ldr   r0, =0x1e784000
+    mov   r1, #0x52                              @ 'R'
+    str   r1, [r0]
+    mov   r1, #0x65                              @ 'e'
+    str   r1, [r0]
+    mov   r1, #0x61                              @ 'a'
+    str   r1, [r0]
+    mov   r1, #0x64                              @ 'd'
+    str   r1, [r0]
+    mov   r1, #0x20                              @ ' '
+    str   r1, [r0]
+    mov   r1, #0x6D                              @ 'm'
+    str   r1, [r0]
+    mov   r1, #0x61                              @ 'a'
+    str   r1, [r0]
+    mov   r1, #0x72                              @ 'r'
+    str   r1, [r0]
+    mov   r1, #0x67                              @ 'g'
+    str   r1, [r0]
+    mov   r1, #0x69                              @ 'i'
+    str   r1, [r0]
+    mov   r1, #0x6E                              @ 'n'
+    str   r1, [r0]
+    mov   r1, #0x2D                              @ '-'
+    str   r1, [r0]
+    mov   r1, #0x44                              @ 'D'
+    str   r1, [r0]
+    mov   r1, #0x4C                              @ 'L'
+    str   r1, [r0]
+    mov   r1, #0x3A                              @ ':'
+    str   r1, [r0]
+
+    ldr   r0, =0x1e784014
+wait_print_2:
+    ldr   r1, [r0]
+    tst   r1, #0x40
+    beq   wait_print_2
+
+    ldr   r7, =0x000001FE                        @ divide by 510
+    mov   r8, #10                                @ multiply by 10
+print_DQL_eye_margin:
+    ldr   r0, =0x1e6e03d0
+    ldr   r2, [r0]
+    and   r2, r2, #0xFF
+    ldr   r0, =0x1e784000
+    mov   r1, #0x30                              @ '0'
+    str   r1, [r0]
+    mov   r1, #0x2E                              @ '.'
+    str   r1, [r0]
+    mov   r3, #0x4                               @ print 4 digits
+print_DQL_div_loop:
+    mul   r2, r8, r2
+    cmp   r2, r7
+    blt   print_DQL_div_0
+    mov   r6, #0x0
+print_DQL_div_digit:
+    sub   r2, r2, r7
+    add   r6, r6, #0x1
+    cmp   r2, r7
+    bge   print_DQL_div_digit
+    b     print_DQL_div_n
+
+print_DQL_div_0:
+    mov   r1, #0x30                              @ '0'
+    str   r1, [r0]
+    b     print_DQL_next
+print_DQL_div_n:
+    add   r1, r6, #0x30                          @ print n
+    str   r1, [r0]
+print_DQL_next:
+    subs  r3, r3, #1
+    beq   print_DQH_eye_margin
+    cmp   r2, #0x0
+    beq   print_DQH_eye_margin
+    b     print_DQL_div_loop
+
+print_DQH_eye_margin:
+    mov   r1, #0x2F                              @ '/'
+    str   r1, [r0]
+    mov   r1, #0x44                              @ 'D'
+    str   r1, [r0]
+    mov   r1, #0x48                              @ 'H'
+    str   r1, [r0]
+    mov   r1, #0x3A                              @ ':'
+    str   r1, [r0]
+
+    ldr   r0, =0x1e784014
+wait_print_3:
+    ldr   r1, [r0]
+    tst   r1, #0x40
+    beq   wait_print_3
+
+    ldr   r0, =0x1e6e03d0
+    ldr   r2, [r0]
+    mov   r2, r2, lsr #8
+    and   r2, r2, #0xFF
+    ldr   r0, =0x1e784000
+    mov   r1, #0x30                              @ '0'
+    str   r1, [r0]
+    mov   r1, #0x2E                              @ '.'
+    str   r1, [r0]
+    mov   r3, #0x4                               @ print 4 digits
+print_DQH_div_loop:
+    mul   r2, r8, r2
+    cmp   r2, r7
+    blt   print_DQH_div_0
+    mov   r6, #0x0
+print_DQH_div_digit:
+    sub   r2, r2, r7
+    add   r6, r6, #0x1
+    cmp   r2, r7
+    bge   print_DQH_div_digit
+    b     print_DQH_div_n
+
+print_DQH_div_0:
+    mov   r1, #0x30                              @ '0'
+    str   r1, [r0]
+    b     print_DQH_next
+print_DQH_div_n:
+    add   r1, r6, #0x30                          @ print n
+    str   r1, [r0]
+print_DQH_next:
+    subs  r3, r3, #1
+    beq   print_DQ_eye_margin_last
+    cmp   r2, #0x0
+    beq   print_DQ_eye_margin_last
+    b     print_DQH_div_loop
+
+print_DQ_eye_margin_last:
+    mov   r1, #0x20                              @ ' '
+    str   r1, [r0]
+    mov   r1, #0x43                              @ 'C'
+    str   r1, [r0]
+    mov   r1, #0x4B                              @ 'K'
+    str   r1, [r0]
+
+    ldr   r0, =0x1e784014
+wait_print_4:
+    ldr   r1, [r0]
+    tst   r1, #0x40
+    beq   wait_print_4
+
+    ldr   r0, =0x1e784000
+    mov   r1, #0x20                              @ ' '
+    str   r1, [r0]
+    mov   r1, #0x28                              @ '('
+    str   r1, [r0]
+    mov   r1, #0x6D                              @ 'm'
+    str   r1, [r0]
+    mov   r1, #0x69                              @ 'i'
+    str   r1, [r0]
+    mov   r1, #0x6E                              @ 'n'
+    str   r1, [r0]
+    mov   r1, #0x3A                              @ ':'
+    str   r1, [r0]
+    mov   r1, #0x30                              @ '0'
+    str   r1, [r0]
+    mov   r1, #0x2E                              @ '.'
+    str   r1, [r0]
+    mov   r1, #0x33                              @ '3'
+    str   r1, [r0]
+    mov   r1, #0x35                              @ '5'
+    str   r1, [r0]
+    mov   r1, #0x29                              @ ')'
+    str   r1, [r0]
+    mov   r1, #0x0D                              @ '\r'
+    str   r1, [r0]
+    mov   r1, #0x0A                              @ '\n'
+    str   r1, [r0]
+/* Debug - UART console message */
+
+platform_exit:
+#ifdef CONFIG_DRAM_ECC
+    ldr   r0, =0x1e6e0004
+    ldr   r1, [r0]
+    orr   r1, r1, #0x80
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0054
+    ldr   r1, =CONFIG_DRAM_ECC_SIZE              /* ECC protected memory size */
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e007C
+    ldr   r1, =0x00000000
+    str   r1, [r0]
+    ldr   r0, =0x1e6e0074
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0070
+    ldr   r1, =0x00000221
+    str   r1, [r0]
+
+    ldr   r2, =0x00001000
+ECC_Init_Flag:
+    ldr   r1, [r0]
+    tst   r1, r2                                 @ D[12] = 1, Done
+    beq   ECC_Init_Flag
+
+    ldr   r1, =0x00000000
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0050
+    ldr   r1, =0x80000000
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0050
+    ldr   r1, =0x00000000
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0070
+    ldr   r1, =0x00000400                        @ Enable ECC auto-scrubbing
+    str   r1, [r0]
+#endif
+
+/******************************************************************************
+ SPI Timing Calibration
+ ******************************************************************************/
+    mov   r2, #0x0
+    mov   r6, #0x0
+    mov   r7, #0x0
+    init_spi_checksum
+spi_checksum_wait_0:
+    ldr   r1, [r0]
+    tst   r1, r2
+    beq   spi_checksum_wait_0
+    ldr   r0, =0x1e620090
+    ldr   r5, [r0]                               @ record golden checksum
+    ldr   r0, =0x1e620080
+    mov   r1, #0x0
+    str   r1, [r0]
+
+    ldr   r0, =0x1e620010                        @ set to fast read mode
+    ldr   r1, =0x000B0041
+    str   r1, [r0]
+
+    ldr   r6, =0x00F7E6D0                        @ Init spiclk loop
+    mov   r8, #0x0                               @ Init delay record
+
+spi_cbr_next_clkrate:
+    mov   r6, r6, lsr #0x4
+    cmp   r6, #0x0
+    beq   spi_cbr_end
+
+    mov   r7, #0x0                               @ Init delay loop
+    mov   r8, r8, lsl #4
+
+spi_cbr_next_delay_s:
+    mov   r2, #0x8
+    init_spi_checksum
+spi_checksum_wait_1:
+    ldr   r1, [r0]
+    tst   r1, r2
+    beq   spi_checksum_wait_1
+    ldr   r0, =0x1e620090
+    ldr   r2, [r0]                               @ read checksum
+    ldr   r0, =0x1e620080
+    mov   r1, #0x0
+    str   r1, [r0]
+    cmp   r2, r5
+    bne   spi_cbr_next_delay_e
+
+    mov   r2, #0x0
+    init_spi_checksum
+spi_checksum_wait_2:
+    ldr   r1, [r0]
+    tst   r1, r2
+    beq   spi_checksum_wait_2
+    ldr   r0, =0x1e620090
+    ldr   r2, [r0]                               @ read checksum
+    ldr   r0, =0x1e620080
+    mov   r1, #0x0
+    str   r1, [r0]
+    cmp   r2, r5
+    bne   spi_cbr_next_delay_e
+
+    orr   r8, r8, r7                             @ record passed delay
+    b     spi_cbr_next_clkrate
+
+spi_cbr_next_delay_e:
+    add   r7, r7, #0x1
+    cmp   r7, #0x6
+    blt   spi_cbr_next_delay_s
+    b     spi_cbr_next_clkrate
+
+spi_cbr_end:
+    ldr   r0, =0x1e620094
+    str   r8, [r0]
+    ldr   r0, =0x1e620010
+    mov   r1, #0x0
+    str   r1, [r0]
+
+/******************************************************************************
+ Miscellaneous Setting
+ ******************************************************************************/
+    /* Set UART DMA as AHB high priority master */
+    ldr   r0, =0x1e600000
+    ldr   r1, =0xAEED1A03
+    str   r1, [r0]
+
+    ldr   r0, =0x1e600080
+    ldr   r2, =0x100
+    ldr   r1, [r0]
+    orr   r1, r1, r2
+    str   r1, [r0]
+
+    /* Enable UART3/4 clock and disable LHCLK */
+    ldr   r0, =0x1e6e200c
+    ldr   r1, [r0]
+    ldr   r2, =0xF9FFFFFF
+    and   r1, r1, r2
+    ldr   r2, =0x10000000
+    orr   r1, r1, r2
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e2008                        @ Set Video ECLK phase
+    ldr   r1, [r0]
+    ldr   r2, =0x0ffffff3
+    and   r1, r1, r2
+    str   r1, [r0]
+
+    ldr r0, =0x1e6e2004                          @ Enable JTAG Master, solve ARM stucked by JTAG issue
+    ldr r1, [r0]
+    bic r1, r1, #0x00400000
+    str r1, [r0]
+
+/******************************************************************************
+ Configure MAC timing
+ ******************************************************************************/
+    /* Enable D2PLL and set to 250MHz */
+    ldr   r0, =0x1e6e213c
+    ldr   r1, =0x00000585                        @ Reset D2PLL
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e202c
+    ldr   r1, [r0]
+    bic   r1, r1, #0x10                          @ Enable D2PLL
+    ldr   r2, =0x00200000                        @ Set CRT = 40MHz
+    orr   r1, r1, r2
+    str   r1, [r0]
+
+    ldr   r2, =0x8E00A17C                        @ Set to 250MHz
+
+    ldr   r0, =0x1e6e2070                        @ Check CLKIN = 25MHz
+    ldr   r1, [r0]
+    mov   r1, r1, lsr #23
+    tst   r1, #0x01
+    beq   set_D2PLL
+    ldr   r2, =0x8E00A177
+
+set_D2PLL:
+    ldr   r0, =0x1e6e201c
+    str   r2, [r0]
+    ldr   r0, =0x1e6e213c                        @ Enable D2PLL
+    ldr   r1, =0x00000580
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e204c
+    ldr   r1, [r0]
+    bic   r1, r1, #0xFF0000
+    ldr   r2, =0x00040000                        @ Set divider ratio
+    orr   r1, r1, r2
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e2048                        @ Set MAC interface delay timing = 1G
+    ldr   r1, =0x80082208                        @ Select internal 125MHz
+    str   r1, [r0]
+    ldr   r0, =0x1e6e20b8                        @ Set MAC interface delay timing = 100M
+    str   r1, [r0]
+    ldr   r0, =0x1e6e20bc                        @ Set MAC interface delay timing = 10M
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e2070                        @ Set MAC AHB bus clock
+    ldr   r1, [r0]
+    mov   r2, #0x04                              @ Default RMII, set MHCLK = HPLL/10
+    tst   r1, #0xC0
+    movne r2, #0x02                              @ if RGMII,     set MHCLK = HPLL/6
+    ldr   r0, =0x1e6e2008
+    ldr   r1, [r0]
+    bic   r1, r1, #0x00070000
+    orr   r1, r1, r2, lsl #16
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e21dc                        @ Set MAC duty
+    ldr   r1, =0x00666400
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e2090                        @ Enable MAC interface pull low
+    ldr   r1, [r0]
+    bic   r1, r1, #0x0000F000
+    str   r1, [r0]
+
+/* Test - DRAM initial time */
+    ldr   r0, =0x1e782040
+    ldr   r1, [r0]
+    ldr   r0, =0xFFFFFFFF
+    sub   r1, r0, r1
+    ldr   r0, =0x1e6e008c
+    str   r1, [r0]
+    ldr   r0, =0x1e78203c
+    ldr   r1, =0x0000F000
+    str   r1, [r0]
+/* Test - DRAM initial time */
+
+    ldr   r0, =0x1e6e0000                        @ disable MMC password
+    mov   r1, #0x0
+    str   r1, [r0]
+
+    /* Disable Timer separate mode */
+    ldr   r0, =0x1e782038
+    ldr   r1, =0xEA
+    str   r1, [r0]
+
+    /* restore lr */
+    mov   lr, r4
+
+    /* back to arch calling code */
+    mov   pc, lr
diff --git a/board/aspeed/ast-g5/platform_armsim2.S b/board/aspeed/ast-g5/platform_armsim2.S
new file mode 100644
index 000000000000..d1c253dcfa68
--- /dev/null
+++ b/board/aspeed/ast-g5/platform_armsim2.S
@@ -0,0 +1,451 @@
+/*
+ * Board specific setup info
+ *
+ * (C) Copyright 2003, ARM Ltd.
+ * Philippe Robin, <philippe.robin@arm.com>
+ *
+ * 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
+ *
+ ******************************************************************************
+ * ARM11 Simulation
+ *
+ ******************************************************************************
+ */
+
+#include <config.h>
+#include <version.h>
+/******************************************************************************
+ Calibration Macro Start
+ Usable registers:
+  r0, r1, r2, r3, r5, r6, r7, r8, r9, r10, r11
+ ******************************************************************************/
+    .macro init_delay_timer
+    ldr r0, =0x1e782024                          @ Set Timer3 Reload
+    str r2, [r0]
+
+    ldr r0, =0x1e6c0038                          @ Clear Timer3 ISR
+    ldr r1, =0x00040000
+    str r1, [r0]
+
+    ldr r0, =0x1e782030                          @ Enable Timer3
+    ldr r1, [r0]
+    mov r2, #7
+    orr r1, r1, r2, lsl #8
+    str r1, [r0]
+
+    ldr r0, =0x1e6c0090                          @ Check ISR for Timer3 timeout
+    .endm
+
+    .macro check_delay_timer
+    ldr r1, [r0]
+    bic r1, r1, #0xFFFBFFFF
+    mov r2, r1, lsr #18
+    cmp r2, #0x01
+    .endm
+
+    .macro clear_delay_timer
+    ldr r0, =0x1e78203C                          @ Disable Timer3
+    mov r2, #0xF
+    mov r1, r2, lsl #8
+    str r1, [r0]
+
+    ldr r0, =0x1e6c0038                          @ Clear Timer3 ISR
+    ldr r1, =0x00040000
+    str r1, [r0]
+    .endm
+
+/******************************************************************************
+ Calibration Macro End
+ ******************************************************************************/
+.globl lowlevel_init
+lowlevel_init:
+
+init_dram:
+    /* save lr */
+    mov r4, lr
+
+    /*Set Scratch register Bit 7 before initialize*/
+    ldr r0, =0x1e6e2000
+    ldr r1, =0x1688a8a8
+    str r1, [r0]
+
+    ldr r0, =0x1e6e2040
+    ldr r1, [r0]
+    orr r1, r1, #0x80
+    str r1, [r0]
+
+/******************************************************************************
+ Disable WDT3 for SPI Address mode detection function
+ ******************************************************************************/
+    ldr   r0, =0x1e78504c
+    mov   r1, #0
+    str   r1, [r0]
+/******************************************************************************
+ Disable WDT2 for 2nd boot function
+ ******************************************************************************/
+    ldr   r0, =0x1e78502c
+    mov   r1, #0
+    str   r1, [r0]
+
+    /* Check Scratch Register Bit 6 */
+    ldr r0, =0x1e6e2040
+    ldr r1, [r0]
+    bic r1, r1, #0xFFFFFFBF
+    mov r2, r1, lsr #6
+    cmp r2, #0x01
+    beq platform_exit
+
+set_MPLL:
+    ldr r0, =0x1e6e2020                          @ M-PLL (DDR SDRAM) Frequency
+    ldr r1, =0x63002400
+    str r1, [r0]
+
+    ldr r0, =0x1e780000
+    ldr r1, =0x00000000
+    str r1, [r0]
+
+    ldr r0, =0x1e780004
+    ldr r1, =0xFFFFFFFF
+    str r1, [r0]
+
+    /* Enable Timer separate clear mode */
+    ldr   r0, =0x1e782038
+    mov   r1, #0xAE
+    str   r1, [r0]
+    clear_delay_timer
+
+    /* Delay about 100us */
+    ldr   r2, =0x0000000A                        @ Set Timer3 Reload = 10 us
+    init_delay_timer
+delay_0:
+    check_delay_timer
+    bne   delay_0
+    clear_delay_timer
+    /* end delay 10us */
+
+    /* Enable AXI_P */
+    ldr   r0, =0x00000016
+    mrc   p15, 0, r1, c15, c2, 4
+    mcr   p15, 0, r0, c15, c2, 4
+
+/******************************************************************************
+ Init DRAM common registers
+ ******************************************************************************/
+    ldr r0, =0x1e6e0000
+    ldr r1, =0xfc600309
+    str r1, [r0]
+
+    ldr r0, =0x1e6e0020
+    ldr r1, =0x00000000
+    str r1, [r0]
+
+    ldr r0, =0x1e6e0024
+    ldr r1, =0x00000000
+    str r1, [r0]
+
+    ldr r0, =0x1e6e002c
+    ldr r1, =0x00181D60
+    str r1, [r0]
+
+    ldr r0, =0x1e6e0030
+    ldr r1, =0x00000040
+    str r1, [r0]
+
+    ldr r0, =0x1e6e0208
+    ldr r1, =0x00000000
+    str r1, [r0]
+
+    ldr r0, =0x1e6e0218
+    ldr r1, =0x00000000
+    str r1, [r0]
+
+    ldr r0, =0x1e6e0220
+    ldr r1, =0x00000000
+    str r1, [r0]
+
+    ldr r0, =0x1e6e0228
+    ldr r1, =0x00000000
+    str r1, [r0]
+
+    ldr r0, =0x1e6e0230
+    ldr r1, =0x00000000
+    str r1, [r0]
+
+    ldr r0, =0x1e6e02a8
+    ldr r1, =0x00000000
+    str r1, [r0]
+
+    ldr r0, =0x1e6e02b0
+    ldr r1, =0x00000000
+    str r1, [r0]
+
+    ldr r0, =0x1e6e0200
+    ldr r1, =0x02492AAE
+    str r1, [r0]
+
+    ldr r0, =0x1e6e0204
+    ldr r1, =0x00000801
+    str r1, [r0]
+
+    ldr r0, =0x1e6e020c
+    ldr r1, =0x55E00A0A
+    str r1, [r0]
+
+    ldr r0, =0x1e6e0210
+    ldr r1, =0x20000000
+    str r1, [r0]
+
+    ldr r0, =0x1e6e0214
+    ldr r1, =0x00000024
+    str r1, [r0]
+
+    ldr r0, =0x1e6e0240
+    ldr r1, =0x86000000
+    str r1, [r0]
+
+    ldr r0, =0x1e6e0244
+    ldr r1, =0x00008600
+    str r1, [r0]
+
+    ldr r0, =0x1e6e0248
+    ldr r1, =0x80000000
+    str r1, [r0]
+
+    ldr r0, =0x1e6e024c
+    ldr r1, =0x80808080
+    str r1, [r0]
+
+    ldr r0, =0x1e6e02e0
+    ldr r1, =0x01000600
+    str r1, [r0]
+
+    ldr r0, =0x1e6e02e4
+    ldr r1, =0x05000091
+    str r1, [r0]
+
+    ldr r0, =0x1e6e02e8
+    ldr r1, =0x000F800C
+    str r1, [r0]
+
+    ldr r0, =0x1e6e02ec
+    ldr r1, =0x00258105
+    str r1, [r0]
+
+    ldr r0, =0x1e6e02f0
+    ldr r1, =0x03040403
+    str r1, [r0]
+
+    ldr r0, =0x1e6e02f4
+    ldr r1, =0x8D000700
+    str r1, [r0]
+
+    ldr r0, =0x1e6e02f8
+    ldr r1, =0x05400A00
+    str r1, [r0]
+
+    ldr r0, =0x1e6e0290
+    ldr r1, =0x00100018
+    str r1, [r0]
+
+    ldr r0, =0x1e6e02c0
+    ldr r1, =0x00000006
+    str r1, [r0]
+
+    ldr r0, =0x1e6e0060
+    ldr r1, =0x00000005
+    str r1, [r0]
+
+    ldr r0, =0x1e6e0004
+    ldr r1, =0x00000000
+    str r1, [r0]
+
+    ldr r0, =0x1e6e0010
+    ldr r1, =0x43403C38
+    str r1, [r0]
+
+    ldr r0, =0x1e6e0014
+    ldr r1, =0x0568E32B
+    str r1, [r0]
+
+    ldr r0, =0x1e6e0018
+    ldr r1, =0x00000200
+    str r1, [r0]
+
+    ldr r0, =0x1e6e0008
+    ldr r1, =0x00000000
+    str r1, [r0]
+
+    ldr r0, =0x1e6e0038
+    ldr r1, =0x00000000
+    str r1, [r0]
+
+    ldr r0, =0x1e6e003c
+    ldr r1, =0xFFFFFFF0
+    str r1, [r0]
+
+    ldr r0, =0x1e6e0040
+    ldr r1, =0x88888888
+    str r1, [r0]
+
+    ldr r0, =0x1e6e0044
+    ldr r1, =0x88888888
+    str r1, [r0]
+
+    ldr r0, =0x1e6e0048
+    ldr r1, =0x88888888
+    str r1, [r0]
+
+    ldr r0, =0x1e6e004c
+    ldr r1, =0x88888888
+    str r1, [r0]
+
+    ldr r0, =0x1e6e0070
+    ldr r1, =0x00000400
+    str r1, [r0]
+
+    ldr r0, =0x1e6e0074
+    ldr r1, =0x00000000
+    str r1, [r0]
+
+    ldr r0, =0x1e6e0078
+    ldr r1, =0x00000000
+    str r1, [r0]
+
+    ldr r0, =0x1e6e007c
+    ldr r1, =0x00000000
+    str r1, [r0]
+
+    ldr r0, =0x1e6e0034
+    ldr r1, =0x00000081
+    str r1, [r0]
+
+    ldr r0, =0x1e6e0004
+    ldr r1, =0x00001000
+    ldr r2, [r0]
+    orr r1, r1, r2
+    str r1, [r0]
+
+    ldr r1, =0x00080000
+wait_cache_init:
+    ldr r2, [r0]
+    tst r1, r2
+    beq wait_cache_init
+
+    ldr r0, =0x1e780000
+    ldr r1, =0x00000001
+    str r1, [r0]
+
+    ldr r0, =0x1e6e0060
+wait_ddrphy_init:
+    ldr r1, [r0]
+    tst r1, #0x01
+    bne wait_ddrphy_init
+    ldr r1, =0x00000006
+    str r1, [r0]
+
+    ldr r0, =0x1e780000
+    ldr r1, =0x00000002
+    str r1, [r0]
+
+    ldr r0, =0x1e6e0034
+    ldr r1, =0x00000091
+    str r1, [r0]
+
+    ldr r0, =0x1e6e000c
+    ldr r1, =0x00000040
+    str r1, [r0]
+
+    /* Delay about 400us */
+    ldr   r2, =0x00000002                        @ Set Timer3 Reload = 400 us
+    init_delay_timer
+delay_1:
+    check_delay_timer
+    bne   delay_1
+    clear_delay_timer
+    /* end delay 400us */
+
+    ldr r0, =0x1e6e002c
+    ldr r1, =0x00181D60
+    str r1, [r0]
+
+    ldr r0, =0x1e6e0030
+    ldr r1, =0x00000040
+    str r1, [r0]
+
+    ldr r0, =0x1e6e0028
+    ldr r1, =0x00000005
+    str r1, [r0]
+    ldr r1, =0x00000007
+    str r1, [r0]
+    ldr r1, =0x00000003
+    str r1, [r0]
+    ldr r1, =0x00000011
+    str r1, [r0]
+
+    ldr r0, =0x1e6e000c
+    ldr r1, =0x00005A01
+    str r1, [r0]
+
+    /* Delay about 1us */
+    ldr   r2, =0x00000001                        @ Set Timer3 Reload = 1 us
+    init_delay_timer
+delay_2:
+    check_delay_timer
+    bne   delay_2
+    clear_delay_timer
+    /* end delay 1us */
+
+    ldr r0, =0x1e6e000c
+    ldr r1, =0x00002048
+    str r1, [r0]
+
+    ldr r0, =0x1e6e0034
+    ldr r1, =0x70000000
+wait_ddrdll_reset:
+    ldr r2, [r0]
+    tst r1, r2
+    bne wait_ddrdll_reset
+
+    ldr r0, =0x1e6e002c
+    ldr r1, =0x00181C60
+    str r1, [r0]
+
+    ldr r0, =0x1e6e0028
+    ldr r1, =0x00000001
+    str r1, [r0]
+
+    ldr r0, =0x1e6e000c
+    ldr r1, =0x00005C01
+    str r1, [r0]
+
+    ldr r0, =0x1e6e0034
+    ldr r1, =0x0001AF93
+    str r1, [r0]
+
+    ldr r0, =0x1e780000
+    ldr r1, =0x00000004
+    str r1, [r0]
+
+platform_exit:
+
+    /* restore lr */
+    mov   lr, r4
+
+    /* back to arch calling code */
+    mov   pc, lr
diff --git a/board/aspeed/ast-g5/platform_fpga.S b/board/aspeed/ast-g5/platform_fpga.S
new file mode 100644
index 000000000000..2a730f962073
--- /dev/null
+++ b/board/aspeed/ast-g5/platform_fpga.S
@@ -0,0 +1,822 @@
+/*
+ * Board specific setup info
+ *
+ ******************************************************************************
+ * ASPEED Technology Inc.
+ * AST2500 FPGA DDR3 SDRAM controller initialization and calibration sequence
+ *
+ * Gary Hsu, <gary_hsu@aspeedtech.com>
+ *
+ * Release date:
+ *
+ * Optional define variable
+ ******************************************************************************
+ */
+
+#include <config.h>
+#include <version.h>
+
+/******************************************************************************
+ Calibration Macro Start
+ Usable registers:
+  r0, r1, r2, r3, r5, r6, r7, r8, r9, r10, r11
+ ******************************************************************************/
+/* PATTERN_TABLE,
+   init_delay_timer,
+   check_delay_timer,
+   clear_delay_timer,
+   record_pll_pass_range,
+   record_pll_pass_range_h,
+   are for DRAM calibration */
+
+PATTERN_TABLE:
+    .word   0xff00ff00
+    .word   0xcc33cc33
+    .word   0xaa55aa55
+    .word   0x88778877
+    .word   0x92cc4d6e       @ 5
+    .word   0x543d3cde
+    .word   0xf1e843c7
+    .word   0x7c61d253
+    .word   0x00000000       @ 8
+
+    .macro init_delay_timer
+    ldr r0, =0x1e782024                          @ Set Timer3 Reload
+    str r2, [r0]
+
+    ldr r0, =0x1e6c0038                          @ Clear Timer3 ISR
+    ldr r1, =0x00040000
+    str r1, [r0]
+
+    ldr r0, =0x1e782030                          @ Enable Timer3
+    mov r2, #7
+    mov r1, r2, lsl #8
+    str r1, [r0]
+
+    ldr r0, =0x1e6c0090                          @ Check ISR for Timer3 timeout
+    .endm
+
+    .macro check_delay_timer
+    ldr r1, [r0]
+    bic r1, r1, #0xFFFBFFFF
+    mov r2, r1, lsr #18
+    cmp r2, #0x01
+    .endm
+
+    .macro clear_delay_timer
+    ldr r0, =0x1e78203C                          @ Disable Timer3
+    mov r2, #0xF
+    mov r1, r2, lsl #8
+    str r1, [r0]
+
+    ldr r0, =0x1e6c0038                          @ Clear Timer3 ISR
+    ldr r1, =0x00040000
+    str r1, [r0]
+    .endm
+
+    .macro record_pll_pass_range
+    ldr                 r1, [r0]
+    bic                 r2, r1, #0xFFFFFF00
+    cmp                 r2, r3                   @ record min
+    bicgt               r1, r1, #0x000000FF
+    orrgt               r1, r1, r3
+    bic                 r2, r1, #0xFFFF00FF
+    cmp                 r3, r2, lsr #8           @ record max
+    bicgt               r1, r1, #0x0000FF00
+    orrgt               r1, r1, r3, lsl #8
+    str                 r1, [r0]
+    .endm
+
+    .macro record_pll_pass_range_h
+    ldr                 r1, [r0]
+    bic                 r2, r1, #0xFF00FFFF
+    mov                 r2, r2, lsr #16
+    cmp                 r2, r3                   @ record min
+    bicgt               r1, r1, #0x00FF0000
+    orrgt               r1, r1, r3, lsl #16
+    bic                 r2, r1, #0x00FFFFFF
+    cmp                 r3, r2, lsr #24          @ record max
+    bicgt               r1, r1, #0xFF000000
+    orrgt               r1, r1, r3, lsl #24
+    str                 r1, [r0]
+    .endm
+
+/******************************************************************************
+ Calibration Macro End
+ ******************************************************************************/
+
+.globl lowlevel_init
+lowlevel_init:
+
+    /* save lr */
+    mov   r4, lr
+
+    /*Set Scratch register Bit 7 before initialize*/
+    ldr r0, =0x1e6e2000
+    ldr r1, =0x1688a8a8
+    str r1, [r0]
+
+    ldr r0, =0x1e6e2040
+    ldr r1, [r0]
+    orr r1, r1, #0x80
+    str r1, [r0]
+
+/******************************************************************************
+ Disable WDT3 for SPI Address mode detection function
+ ******************************************************************************/
+    ldr   r0, =0x1e78504c
+    mov   r1, #0
+    str   r1, [r0]
+/******************************************************************************
+ Disable WDT2 for 2nd boot function
+ ******************************************************************************/
+    ldr   r0, =0x1e78502c
+    mov   r1, #0
+    str   r1, [r0]
+
+#if (CONFIG_AST_FPGA_VER == 4)
+init_arm11:
+    /* Start of ES40004A PLL init */
+    /* Step 1. Program PLL_config and keep power down */
+    ldr   r0, =0x33000000
+    ldr   r1, =0x01000000
+    str   r1, [r0]
+    ldr   r1, =0x0102001A                        @ 324 MHz
+    str   r1, [r0]
+
+    /* Step 2. Wait 1us for PLL initialization */
+    ldr   r2, =0x00000100
+delay_ES40004A_pll_init:
+    subs  r2, r2, #1
+    bne   delay_ES40004A_pll_init
+
+    /* Step 3. Program PLL_config to exit Power down */
+    ldr   r1, =0x0002001A
+    str   r1, [r0]
+
+    /* Step 4. Check pll_ld = 1?. Read PLL_config, check bit 27. */
+    ldr   r2, =0x08000000                        @ bit[27] PLL lock detection
+check_pll_ld:
+    ldr   r1, [r0]
+    tst   r1, r2
+    beq   check_pll_ld
+
+    /* Step 5. Program aclk_div */
+    ldr   r0, =0x33000004
+    ldr   r1, =0x00000007                        @ CPU/AXI = 8/1
+    str   r1, [r0]
+
+    /* Step 6. Program set_pll */
+    ldr   r1, =0x00010007
+    str   r1, [r0]
+    /* End of ES40004A PLL init */
+#endif
+
+    /* Check Scratch Register Bit 6 */
+    ldr r0, =0x1e6e2040
+    ldr r1, [r0]
+    bic r1, r1, #0xFFFFFFBF
+    mov r2, r1, lsr #6
+    cmp r2, #0x01
+    beq platform_exit
+
+/* Debug - UART console message */
+    ldr   r0, =0x1e78400c
+    mov   r1, #0x83
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e202c
+    ldr   r2, [r0]
+    mov   r2, r2, lsr #12
+    tst   r2, #0x01
+    ldr   r0, =0x1e784000
+    moveq r1, #0x0D                              @ Baudrate 115200
+    movne r1, #0x01                              @ Baudrate 115200, div13
+#if defined(CONFIG_DRAM_UART_38400)
+    moveq r1, #0x27                              @ Baudrate 38400
+    movne r1, #0x03                              @ Baudrate 38400 , div13
+#endif
+    str   r1, [r0]
+
+    ldr   r0, =0x1e784004
+    mov   r1, #0x00
+    str   r1, [r0]
+
+    ldr   r0, =0x1e78400c
+    mov   r1, #0x03
+    str   r1, [r0]
+
+    ldr   r0, =0x1e784008
+    mov   r1, #0x07
+    str   r1, [r0]
+
+    ldr   r0, =0x1e784000
+    mov   r1, #0x0D                              @ '\r'
+    str   r1, [r0]
+    mov   r1, #0x0A                              @ '\n'
+    str   r1, [r0]
+    mov   r1, #0x44                              @ 'D'
+    str   r1, [r0]
+    mov   r1, #0x52                              @ 'R'
+    str   r1, [r0]
+    mov   r1, #0x41                              @ 'A'
+    str   r1, [r0]
+    mov   r1, #0x4D                              @ 'M'
+    str   r1, [r0]
+    mov   r1, #0x20                              @ ' '
+    str   r1, [r0]
+    mov   r1, #0x49                              @ 'I'
+    str   r1, [r0]
+    mov   r1, #0x6E                              @ 'n'
+    str   r1, [r0]
+    mov   r1, #0x69                              @ 'i'
+    str   r1, [r0]
+    mov   r1, #0x74                              @ 't'
+    str   r1, [r0]
+    mov   r1, #0x2D                              @ '-'
+    str   r1, [r0]
+    mov   r1, #0x44                              @ 'D'
+    str   r1, [r0]
+    mov   r1, #0x44                              @ 'D'
+    str   r1, [r0]
+    mov   r1, #0x52                              @ 'R'
+    str   r1, [r0]
+/* Debug - UART console message */
+
+    /* Enable Timer separate clear mode */
+    ldr   r0, =0x1e782038
+    mov   r1, #0xAE
+    str   r1, [r0]
+    clear_delay_timer
+
+    /* Delay about 100us */
+    ldr   r2, =0x00000064                        @ Set Timer3 Reload = 100 us
+    init_delay_timer
+delay_0:
+    check_delay_timer
+    bne   delay_0
+    clear_delay_timer
+    /* end delay 100us */
+/**************************************************************************************************/
+/**************************************************************************************************/
+/* Debug - UART console message */
+    ldr   r0, =0x1e784000
+    mov   r1, #0x33                              @ '3'
+    str   r1, [r0]
+    mov   r1, #0x2D                              @ '-'
+    str   r1, [r0]
+    mov   r1, #0x46                              @ 'F'
+    str   r1, [r0]
+    mov   r1, #0x50                              @ 'P'
+    str   r1, [r0]
+    mov   r1, #0x47                              @ 'G'
+    str   r1, [r0]
+    mov   r1, #0x41                              @ 'A'
+    str   r1, [r0]
+    mov   r1, #0x0D                              @ '\r'
+    str   r1, [r0]
+    mov   r1, #0x0A                              @ '\n'
+    str   r1, [r0]
+/* Debug - UART console message */
+
+    ldr   r0, =0x1e6e0000
+    ldr   r1, =0xfc600309
+    str   r1, [r0]
+
+    /* Reset MMC */
+    ldr   r1, =0x00000000
+    ldr   r0, =0x1e6e0004
+    ldr   r2, =0x1e6e00A0
+reset_mmc:
+    str   r1, [r0]
+    add   r0, r0, #4
+    cmp   r2, r0
+    bge   reset_mmc
+
+    ldr   r0, =0x1e6e0034                        @ disable SDRAM reset
+    ldr   r1, =0x00000080
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0004
+    ldr   r1, =0x00000107
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0008
+    ldr   r1, =0x2001000F
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0010
+    ldr   r1, =0x12102725
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0014
+    ldr   r1, =0x52344420
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0018
+    ldr   r1, =0x00010000
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0038
+    ldr   r1, =0x00000000
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e003C
+    ldr   r1, =0x00000000
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0040
+    ldr   r1, =0x88888888
+    str   r1, [r0]
+    add   r0, r0, #0x04
+    str   r1, [r0]
+    add   r0, r0, #0x04
+    str   r1, [r0]
+    add   r0, r0, #0x04
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0034
+    ldr   r1, =0x00000081
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e000C
+    ldr   r1, =0x00000040
+    str   r1, [r0]
+
+    /* Delay about 400us */
+    ldr   r2, =0x00000190                        @ Set Timer3 Reload = 400 us
+    init_delay_timer
+delay_1:
+    check_delay_timer
+    bne   delay_1
+    clear_delay_timer
+    /* end delay 400us */
+
+    ldr   r0, =0x1e6e002C
+    ldr   r1, =0x04001320
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0030
+    ldr   r1, =0x00000041
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0028
+    ldr   r1, =0x00000005
+    str   r1, [r0]
+    ldr   r1, =0x00000007
+    str   r1, [r0]
+    ldr   r1, =0x00000003
+    str   r1, [r0]
+    ldr   r1, =0x00000001
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e002C
+    ldr   r1, =0x04001220
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e000C
+    ldr   r1, =0x00005C48
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0028
+    ldr   r1, =0x00000001
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e000C
+    ldr   r1, =0x00005C01
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0034
+    ldr   r1, =0x00008081
+    str   r1, [r0]
+
+/******************************************************************************
+ CBR Start
+ *****************************************************************************/
+/* Debug - UART console message */
+    ldr r0, =0x1e784000
+    mov r1, #0x43                                @ 'C'
+    str r1, [r0]
+    mov r1, #0x42                                @ 'B'
+    str r1, [r0]
+    mov r1, #0x52                                @ 'R'
+    str r1, [r0]
+/* Debug - UART console message */
+
+CBR_START:
+/* Debug - UART console message */
+    ldr r0, =0x1e784000
+    mov r1, #0x23                                @ '#'
+    str r1, [r0]
+/* Debug - UART console message */
+    /* Calibrate PLL Read clock phase */
+    /* Reset PLL */
+    ldr   r0, =0x1e6e2050
+    ldr   r1, =0x00000026
+    str   r1, [r0]
+    mov   r1, #0x00
+    add   r0, r0, #0x04
+    str   r1, [r0]
+    add   r0, r0, #0x04
+    str   r1, [r0]
+    add   r0, r0, #0x04
+    str   r1, [r0]
+    add   r0, r0, #0x04
+    str   r1, [r0]
+    add   r0, r0, #0x04
+    str   r1, [r0]
+    add   r0, r0, #0x04
+    str   r1, [r0]
+    ldr   r1, =0xAD000000
+    add   r0, r0, #0x04
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e204C
+check_pll_reset_done_1:
+    ldr   r1, [r0]
+    mov   r1, r1, lsr #24
+    and   r1, r1, #0x0F
+    cmp   r1, #0x00
+    beq   check_pll_reset_done_1
+
+    ldr   r0, =0x1e6e206C
+    ldr   r1, =0xDA000000
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e204C
+check_pll_reset_clear_1:
+    ldr   r1, [r0]
+    mov   r1, r1, lsr #24
+    and   r1, r1, #0x0F
+    cmp   r1, #0x00
+    bne   check_pll_reset_clear_1
+
+    mov   r6, #0x00                              @ init pass count
+    mov   r7, #0x01                              @ init PLL parameter index
+    ldr   r1, =0x000000ff
+    ldr   r0, =0x1e6e0088                        @ init dllmax,dllmin
+    str   r1, [r0]
+
+/****************************
+ PLL delay margin test loop
+ ***************************/
+cbr_next_pll_parameter:
+    ldr   r2, =0xFF                              @ parameter's max is to 0xFF
+    cmp   r7, r2
+    bge   CBR_END
+    add   r7, r7, #0x01
+
+    /* Phase shift */
+    ldr   r0, =0x1e6e2050
+    ldr   r1, =0x00000016
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e206C
+    ldr   r1, =0xAD000000
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e204C
+check_pll_phase_done_1:
+    ldr   r1, [r0]
+    mov   r1, r1, lsr #24
+    and   r1, r1, #0x0F
+    cmp   r1, #0x00
+    beq   check_pll_phase_done_1
+
+    ldr   r0, =0x1e6e206C
+    ldr   r1, =0xDA000000
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0074                        @ set the testing DRAM size = 16KB
+    ldr   r1, =0x00003FFF
+    str   r1, [r0]
+
+/* CBRScan() start */
+    mov   r9, #0x01                              @ init test status
+    adrl  r5, PATTERN_TABLE                      @ init pattern table index
+/****************************
+ Test pattern iteration loop
+ ***************************/
+cbr_next_test_pattern:
+    mov   r10, #3                                @ set the retry loop of each pattern
+    ldr   r1, [r5]                               @ load test pattern
+    ldr   r0, =0x1e6e007c
+    str   r1, [r0]
+    cmp   r1, #0x00                              @ the last data in pattern is 0x00
+    bne   cbr_test_single
+
+cbr_test_pattern_end:
+    cmp   r9, #0x00
+    bne   cbr_test_pass_dql
+    cmp   r6, #10
+    bge   CBR_END
+    b     cbr_next_pll_parameter                 @ CBRScan() end and test result fail, go to next step
+
+cbr_test_pass_dql:
+    and   r3, r7, #0xFF
+    sub   r3, r3, #0x01                          @ we add one after loop check so we need to decrease 1
+    add   r6, r6, #0x01                          @ increment pass count
+
+    ldr   r0, =0x1e6e0088
+    record_pll_pass_range
+    b     cbr_next_pll_parameter
+
+/****************************
+ Test fail retry loop
+ ***************************/
+cbr_pattern_fail_retry:
+
+/* CBRTest() start */
+cbr_test_single:
+    ldr   r0, =0x1e6e0070
+    ldr   r1, =0x00000000
+    str   r1, [r0]
+    ldr   r1, =0x00000005
+    str   r1, [r0]
+    ldr   r3, =0x1000
+    ldr   r8, =0x10000
+cbr_wait_engine_idle_0:
+    subs  r8, r8, #1
+    beq   cbr_test_single_end
+    ldr   r2, [r0]
+    tst   r2, r3                                 @ D[12] = idle bit
+    beq   cbr_wait_engine_idle_0
+
+cbr_test_single_end:
+    ldr   r0, =0x1e6e0070                        @ read fail bit status
+    ldr   r3, =0x2000
+    ldr   r2, [r0]
+    tst   r2, r3
+    bne   cbr_test_fail
+
+cbr_test_burst:
+    ldr   r0, =0x1e6e0070
+    ldr   r2, =0x00000000
+    str   r2, [r0]
+    mov   r2, #0xC1
+    str   r2, [r0]
+    ldr   r3, =0x1000
+    ldr   r8, =0x10000
+cbr_wait_engine_idle_1:
+    subs  r8, r8, #1
+    beq   cbr_test_burst_end
+    ldr   r2, [r0]
+    tst   r2, r3                                 @ D[12] = idle bit
+    beq   cbr_wait_engine_idle_1
+
+cbr_test_burst_end:
+    ldr   r0, =0x1e6e0070                        @ read fail bit status
+    ldr   r3, =0x2000
+    ldr   r2, [r0]
+    tst   r2, r3
+    bne   cbr_test_fail
+    b     cbr_next_test_burst_mode
+/* CBRTest() end */
+
+cbr_test_fail:
+    subs  r10, r10, #1
+    bne   cbr_pattern_fail_retry
+    mov   r9, #0x00
+    b     cbr_test_pattern_end                   @ CBRScan() return(0)
+
+cbr_next_test_burst_mode:
+    add   r5, r5, #0x04                          @ increase the test pattern index
+    b     cbr_next_test_pattern
+
+CBR_END:
+    ldr   r0, =0x1e6e0070
+    ldr   r1, =0x00000000
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0088                        @ check PLL margin
+    ldr   r1, [r0]
+    mov   r2, r1, lsr #8
+    and   r2, r2, #0xFF                          @ get dllmax
+    and   r1, r1, #0xFF                          @ get dllmin
+    subs  r5, r2, r1                             @ dllmax - dllmin
+    bmi   CBR_START                              @ no valid margin found, retry again
+    cmp   r5, #10                                @ (dllmax - dllmin) < 10
+    blt   CBR_START                              @ no enough margin found, retry again
+    add   r2, r1, r2                             @ (dllmin[1] + dllmax[1] + 1) >> 1
+    add   r2, r2, #0x01
+    mov   r5, r2, lsr #1
+    ldr   r0, =0x1e6e008c
+    str   r5, [r0]                               @ store the dll search result
+
+    /* Reset PLL */
+    ldr   r0, =0x1e6e0034
+    ldr   r1, =0x00008080
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e2050
+    ldr   r1, =0x00000026
+    str   r1, [r0]
+    ldr   r0, =0x1e6e206C
+    ldr   r1, =0xAD000000
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e204C
+check_pll_reset_done_2:
+    ldr   r1, [r0]
+    mov   r1, r1, lsr #24
+    and   r1, r1, #0x0F
+    cmp   r1, #0x00
+    beq   check_pll_reset_done_2
+
+    ldr   r0, =0x1e6e206C
+    ldr   r1, =0xDA000000
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e204C
+check_pll_reset_clear_2:
+    ldr   r1, [r0]
+    mov   r1, r1, lsr #24
+    and   r1, r1, #0x0F
+    cmp   r1, #0x00
+    bne   check_pll_reset_clear_2
+
+    /* Phase shift */
+    ldr   r0, =0x1e6e2050
+    ldr   r1, =0x00000016
+    orr   r1, r1, r5, lsl #8
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e206C
+    ldr   r1, =0xAD000000
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e204C
+check_pll_phase_done_2:
+    ldr   r1, [r0]
+    mov   r1, r1, lsr #24
+    and   r1, r1, #0x0F
+    cmp   r1, #0x00
+    beq   check_pll_phase_done_2
+
+    ldr   r0, =0x1e6e206C
+    ldr   r1, =0xDA000000
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0034
+    ldr   r1, =0x00008083
+    str   r1, [r0]
+
+/******************************************************************************
+ CBR Finish
+ *****************************************************************************/
+/******************************************************************************
+ Check DRAM Size
+ 1Gb : 0x80000000 ~ 0x87FFFFFF
+ 2Gb : 0x80000000 ~ 0x8FFFFFFF
+ 4Gb : 0x80000000 ~ 0x9FFFFFFF
+ 8Gb : 0x80000000 ~ 0xBFFFFFFF
+ *****************************************************************************/
+    ldr   r0, =0x1e6e0004
+    ldr   r5, [r0]
+    bic   r5, r5, #0x00000003                    @ record MCR04
+    orr   r1, r5, #0x23
+    str   r1, [r0]                               @ set to 8Gbit
+    ldr   r6, =0x0020100B
+
+check_dram_size:
+    ldr   r0, =0xA0100000
+    ldr   r1, =0x41424344
+    str   r1, [r0]
+    ldr   r0, =0x90100000
+    ldr   r1, =0x35363738
+    str   r1, [r0]
+    ldr   r0, =0x88100000
+    ldr   r1, =0x292A2B2C
+    str   r1, [r0]
+    ldr   r0, =0x80100000
+    ldr   r1, =0x1D1E1F10
+    str   r1, [r0]
+    ldr   r0, =0xA0100000
+    ldr   r1, =0x41424344
+    ldr   r2, [r0]
+    cmp   r2, r1                                 @ == 8Gbit
+    orreq r5, r5, #0x23
+    moveq r6, r6, lsr #16
+    beq   check_dram_size_end
+    ldr   r0, =0x90100000
+    ldr   r1, =0x35363738
+    ldr   r2, [r0]
+    cmp   r2, r1                                 @ == 4Gbit
+    orreq r5, r5, #0x02
+    moveq r6, r6, lsr #16
+    beq   check_dram_size_end
+    ldr   r0, =0x88100000
+    ldr   r1, =0x292A2B2C
+    ldr   r2, [r0]
+    cmp   r2, r1                                 @ == 2Gbit
+    orreq r5, r5, #0x01
+    moveq r6, r6, lsr #8
+    beq   check_dram_size_end
+
+check_dram_size_end:
+    ldr   r0, =0x1e6e0004
+    str   r5, [r0]
+    ldr   r0, =0x1e6e0014
+    ldr   r1, [r0]
+    bic   r1, r1, #0x000000FF
+    and   r6, r6, #0xFF
+    orr   r1, r1, r6
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0120                        @ VGA Compatible Mode
+    ldr   r1, =0x000050C0                        @ 408 MHz
+    str   r1, [r0]
+
+    /* Enable DRAM Cache */
+    ldr   r0, =0x1e6e0004
+    ldr   r1, [r0]
+    mov   r2, #1
+    orr   r2, r1, r2, lsl #12
+    ldr   r3, =0x00080000
+    str   r2, [r0]
+dram_cache_init:
+    ldr   r2, [r0]
+    tst   r2, r3
+    beq   dram_cache_init
+    mov   r2, #1
+    orr   r1, r1, r2, lsl #10
+    str   r1, [r0]
+
+    /* Enable DRAM ECC */
+    orr   r1, r1, r2, lsl #7
+    str   r1, [r0]
+    ldr   r0, =0x1e6e0050
+    ldr   r1, =0x80000000
+    str   r1, [r0]
+    ldr   r1, =0x00000000
+    str   r1, [r0]
+    ldr   r0, =0x1e6e0054
+    ldr   r1, =0x05FFFFFF                        @ set ECC size = 96MB
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0074
+    ldr   r1, =0x00000000
+    str   r1, [r0]
+    ldr   r0, =0x1e6e007C
+    str   r1, [r0]
+    ldr   r0, =0x1e6e0070
+    ldr   r1, =0x00000221
+    ldr   r2, =0x00001000
+    str   r1, [r0]
+dram_ecc_init:
+    ldr   r1, [r0]
+    tst   r1, r2
+    beq   dram_ecc_init
+    ldr   r1, =0x00000400
+    str   r1, [r0]
+
+/******************************************************************************
+ Version Number
+ *****************************************************************************/
+    ldr   r0, =0x1e6e0004
+    ldr   r1, [r0]
+    mov   r2, #0x01
+    orr   r1, r1, r2, lsl #20
+    str   r1, [r0]
+
+/******************************************************************************
+ Calibration Code End
+ ******************************************************************************/
+/* Debug - UART console message */
+    ldr   r0, =0x1e784000
+    mov   r1, #0x44                              @ 'D'
+    str   r1, [r0]
+    mov   r1, #0x6F                              @ 'o'
+    str   r1, [r0]
+    mov   r1, #0x6E                              @ 'n'
+    str   r1, [r0]
+    mov   r1, #0x65                              @ 'e'
+    str   r1, [r0]
+    mov   r1, #0x0D                              @ '\r'
+    str   r1, [r0]
+    mov   r1, #0x0A                              @ '\n'
+    str   r1, [r0]
+/* Debug - UART console message */
+
+platform_exit:
+
+    ldr   r0, =0x1e6e2004                        @ enable CPUI DRAM request for ARM9
+    ldr   r1, [r0]
+    bic   r1, r1, #0x00020000
+    str   r1, [r0]
+
+    ldr r0, =0x1e6e2040
+    ldr r1, [r0]
+    orr r1, r1, #0xC0
+    str r1, [r0]
+
+    ldr r0, =0x1e6e2070
+    ldr r1, [r0]
+    orr r1, r1, #0x20
+    str r1, [r0]
+
+    /* restore lr */
+    mov   lr, r4
+
+    /* back to arch calling code */
+    mov   pc, lr
diff --git a/board/aspeed/ast-g5/platform_fpga_ecc.S b/board/aspeed/ast-g5/platform_fpga_ecc.S
new file mode 100644
index 000000000000..50832bcaf521
--- /dev/null
+++ b/board/aspeed/ast-g5/platform_fpga_ecc.S
@@ -0,0 +1,843 @@
+/*
+ * Board specific setup info
+ *
+ * (C) Copyright 2003, ARM Ltd.
+ * Philippe Robin, <philippe.robin@arm.com>
+ *
+ * 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
+ *
+ ******************************************************************************
+ * ASPEED Technology Inc.
+ * AST2500 FPGA DDR3 SDRAM controller initialization and calibration sequence
+ *
+ * Gary Hsu, <gary_hsu@aspeedtech.com>
+ *
+ * Release date:
+ *
+ * Optional define variable
+ ******************************************************************************
+ */
+
+#include <config.h>
+#include <version.h>
+
+/******************************************************************************
+ Calibration Macro Start
+ Usable registers:
+  r0, r1, r2, r3, r5, r6, r7, r8, r9, r10, r11
+ ******************************************************************************/
+/* PATTERN_TABLE,
+   init_delay_timer,
+   check_delay_timer,
+   clear_delay_timer,
+   record_pll_pass_range,
+   record_pll_pass_range_h,
+   are for DRAM calibration */
+
+PATTERN_TABLE:
+    .word   0xff00ff00
+    .word   0xcc33cc33
+    .word   0xaa55aa55
+    .word   0x88778877
+    .word   0x92cc4d6e       @ 5
+    .word   0x543d3cde
+    .word   0xf1e843c7
+    .word   0x7c61d253
+    .word   0x00000000       @ 8
+
+    .macro init_delay_timer
+    ldr r0, =0x1e782024                          @ Set Timer3 Reload
+    str r2, [r0]
+
+    ldr r0, =0x1e6c0038                          @ Clear Timer3 ISR
+    ldr r1, =0x00040000
+    str r1, [r0]
+
+    ldr r0, =0x1e782030                          @ Enable Timer3
+    mov r2, #7
+    mov r1, r2, lsl #8
+    str r1, [r0]
+
+    ldr r0, =0x1e6c0090                          @ Check ISR for Timer3 timeout
+    .endm
+
+    .macro check_delay_timer
+    ldr r1, [r0]
+    bic r1, r1, #0xFFFBFFFF
+    mov r2, r1, lsr #18
+    cmp r2, #0x01
+    .endm
+
+    .macro clear_delay_timer
+    ldr r0, =0x1e78203C                          @ Disable Timer3
+    mov r2, #0xF
+    mov r1, r2, lsl #8
+    str r1, [r0]
+
+    ldr r0, =0x1e6c0038                          @ Clear Timer3 ISR
+    ldr r1, =0x00040000
+    str r1, [r0]
+    .endm
+
+    .macro record_pll_pass_range
+    ldr                 r1, [r0]
+    bic                 r2, r1, #0xFFFFFF00
+    cmp                 r2, r3                   @ record min
+    bicgt               r1, r1, #0x000000FF
+    orrgt               r1, r1, r3
+    bic                 r2, r1, #0xFFFF00FF
+    cmp                 r3, r2, lsr #8           @ record max
+    bicgt               r1, r1, #0x0000FF00
+    orrgt               r1, r1, r3, lsl #8
+    str                 r1, [r0]
+    .endm
+
+    .macro record_pll_pass_range_h
+    ldr                 r1, [r0]
+    bic                 r2, r1, #0xFF00FFFF
+    mov                 r2, r2, lsr #16
+    cmp                 r2, r3                   @ record min
+    bicgt               r1, r1, #0x00FF0000
+    orrgt               r1, r1, r3, lsl #16
+    bic                 r2, r1, #0x00FFFFFF
+    cmp                 r3, r2, lsr #24          @ record max
+    bicgt               r1, r1, #0xFF000000
+    orrgt               r1, r1, r3, lsl #24
+    str                 r1, [r0]
+    .endm
+
+/******************************************************************************
+ Calibration Macro End
+ ******************************************************************************/
+
+.globl lowlevel_init
+lowlevel_init:
+
+    /* save lr */
+    mov   r4, lr
+
+    /*Set Scratch register Bit 7 before initialize*/
+    ldr r0, =0x1e6e2000
+    ldr r1, =0x1688a8a8
+    str r1, [r0]
+
+    ldr r0, =0x1e6e2040
+    ldr r1, [r0]
+    orr r1, r1, #0x80
+    str r1, [r0]
+
+/******************************************************************************
+ Disable WDT3 for SPI Address mode detection function
+ ******************************************************************************/
+    ldr   r0, =0x1e78504c
+    mov   r1, #0
+    str   r1, [r0]
+/******************************************************************************
+ Disable WDT2 for 2nd boot function
+ ******************************************************************************/
+    ldr   r0, =0x1e78502c
+    mov   r1, #0
+    str   r1, [r0]
+
+#if (CONFIG_AST_FPGA_VER == 4)
+init_arm11:
+    /* Start of ES40004A PLL init */
+    /* Step 1. Program PLL_config and keep power down */
+    ldr   r0, =0x33000000
+    ldr   r1, =0x01000000
+    str   r1, [r0]
+    ldr   r1, =0x0102001A                        @ 324 MHz
+    str   r1, [r0]
+
+    /* Step 2. Wait 1us for PLL initialization */
+    ldr   r2, =0x00000100
+delay_ES40004A_pll_init:
+    subs  r2, r2, #1
+    bne   delay_ES40004A_pll_init
+
+    /* Step 3. Program PLL_config to exit Power down */
+    ldr   r1, =0x0002001A
+    str   r1, [r0]
+
+    /* Step 4. Check pll_ld = 1?. Read PLL_config, check bit 27. */
+    ldr   r2, =0x08000000                        @ bit[27] PLL lock detection
+check_pll_ld:
+    ldr   r1, [r0]
+    tst   r1, r2
+    beq   check_pll_ld
+
+    /* Step 5. Program aclk_div */
+    ldr   r0, =0x33000004
+    ldr   r1, =0x00000007                        @ CPU/AXI = 8/1
+    str   r1, [r0]
+
+    /* Step 6. Program set_pll */
+    ldr   r1, =0x00010007
+    str   r1, [r0]
+    /* End of ES40004A PLL init */
+#endif
+
+    /* Check Scratch Register Bit 6 */
+    ldr r0, =0x1e6e2040
+    ldr r1, [r0]
+    bic r1, r1, #0xFFFFFFBF
+    mov r2, r1, lsr #6
+    cmp r2, #0x01
+    beq platform_exit
+
+/* Debug - UART console message */
+    ldr   r0, =0x1e78400c
+    mov   r1, #0x83
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e202c
+    ldr   r2, [r0]
+    mov   r2, r2, lsr #12
+    tst   r2, #0x01
+    ldr   r0, =0x1e784000
+    moveq r1, #0x0D                              @ Baudrate 115200
+    movne r1, #0x01                              @ Baudrate 115200, div13
+#if defined(CONFIG_DRAM_UART_38400)
+    moveq r1, #0x27                              @ Baudrate 38400
+    movne r1, #0x03                              @ Baudrate 38400 , div13
+#endif
+    str   r1, [r0]
+
+    ldr   r0, =0x1e784004
+    mov   r1, #0x00
+    str   r1, [r0]
+
+    ldr   r0, =0x1e78400c
+    mov   r1, #0x03
+    str   r1, [r0]
+
+    ldr   r0, =0x1e784008
+    mov   r1, #0x07
+    str   r1, [r0]
+
+    ldr   r0, =0x1e784000
+    mov   r1, #0x0D                              @ '\r'
+    str   r1, [r0]
+    mov   r1, #0x0A                              @ '\n'
+    str   r1, [r0]
+    mov   r1, #0x44                              @ 'D'
+    str   r1, [r0]
+    mov   r1, #0x52                              @ 'R'
+    str   r1, [r0]
+    mov   r1, #0x41                              @ 'A'
+    str   r1, [r0]
+    mov   r1, #0x4D                              @ 'M'
+    str   r1, [r0]
+    mov   r1, #0x20                              @ ' '
+    str   r1, [r0]
+    mov   r1, #0x49                              @ 'I'
+    str   r1, [r0]
+    mov   r1, #0x6E                              @ 'n'
+    str   r1, [r0]
+    mov   r1, #0x69                              @ 'i'
+    str   r1, [r0]
+    mov   r1, #0x74                              @ 't'
+    str   r1, [r0]
+    mov   r1, #0x2D                              @ '-'
+    str   r1, [r0]
+    mov   r1, #0x44                              @ 'D'
+    str   r1, [r0]
+    mov   r1, #0x44                              @ 'D'
+    str   r1, [r0]
+    mov   r1, #0x52                              @ 'R'
+    str   r1, [r0]
+/* Debug - UART console message */
+
+    /* Enable Timer separate clear mode */
+    ldr   r0, =0x1e782038
+    mov   r1, #0xAE
+    str   r1, [r0]
+    clear_delay_timer
+
+    /* Delay about 100us */
+    ldr   r2, =0x00000064                        @ Set Timer3 Reload = 100 us
+    init_delay_timer
+delay_0:
+    check_delay_timer
+    bne   delay_0
+    clear_delay_timer
+    /* end delay 100us */
+/**************************************************************************************************/
+/**************************************************************************************************/
+/* Debug - UART console message */
+    ldr   r0, =0x1e784000
+    mov   r1, #0x33                              @ '3'
+    str   r1, [r0]
+    mov   r1, #0x2D                              @ '-'
+    str   r1, [r0]
+    mov   r1, #0x46                              @ 'F'
+    str   r1, [r0]
+    mov   r1, #0x50                              @ 'P'
+    str   r1, [r0]
+    mov   r1, #0x47                              @ 'G'
+    str   r1, [r0]
+    mov   r1, #0x41                              @ 'A'
+    str   r1, [r0]
+    mov   r1, #0x0D                              @ '\r'
+    str   r1, [r0]
+    mov   r1, #0x0A                              @ '\n'
+    str   r1, [r0]
+/* Debug - UART console message */
+
+    ldr   r0, =0x1e6e0000
+    ldr   r1, =0xfc600309
+    str   r1, [r0]
+
+    /* Reset MMC */
+    ldr   r1, =0x00000000
+    ldr   r0, =0x1e6e0004
+    ldr   r2, =0x1e6e00A0
+reset_mmc:
+    str   r1, [r0]
+    add   r0, r0, #4
+    cmp   r2, r0
+    bge   reset_mmc
+
+    ldr   r0, =0x1e6e0034                        @ disable SDRAM reset
+    ldr   r1, =0x00000080
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0004
+    ldr   r1, =0x00000107
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0008
+    ldr   r1, =0x2001000F
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0010
+    ldr   r1, =0x12102725
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0014
+    ldr   r1, =0x52344420
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0018
+    ldr   r1, =0x00010000
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0038
+    ldr   r1, =0x00000000
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e003C
+    ldr   r1, =0x00000000
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0040
+    ldr   r1, =0x88888888
+    str   r1, [r0]
+    add   r0, r0, #0x04
+    str   r1, [r0]
+    add   r0, r0, #0x04
+    str   r1, [r0]
+    add   r0, r0, #0x04
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0034
+    ldr   r1, =0x00000081
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e000C
+    ldr   r1, =0x00000040
+    str   r1, [r0]
+
+    /* Delay about 400us */
+    ldr   r2, =0x00000190                        @ Set Timer3 Reload = 400 us
+    init_delay_timer
+delay_1:
+    check_delay_timer
+    bne   delay_1
+    clear_delay_timer
+    /* end delay 400us */
+
+    ldr   r0, =0x1e6e002C
+    ldr   r1, =0x04001320
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0030
+    ldr   r1, =0x00000041
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0028
+    ldr   r1, =0x00000005
+    str   r1, [r0]
+    ldr   r1, =0x00000007
+    str   r1, [r0]
+    ldr   r1, =0x00000003
+    str   r1, [r0]
+    ldr   r1, =0x00000001
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e002C
+    ldr   r1, =0x04001220
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e000C
+    ldr   r1, =0x00005C48
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0028
+    ldr   r1, =0x00000001
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e000C
+    ldr   r1, =0x00005C01
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0034
+    ldr   r1, =0x00008081
+    str   r1, [r0]
+
+/******************************************************************************
+ CBR Start
+ *****************************************************************************/
+/* Debug - UART console message */
+    ldr r0, =0x1e784000
+    mov r1, #0x43                                @ 'C'
+    str r1, [r0]
+    mov r1, #0x42                                @ 'B'
+    str r1, [r0]
+    mov r1, #0x52                                @ 'R'
+    str r1, [r0]
+/* Debug - UART console message */
+
+CBR_START:
+/* Debug - UART console message */
+    ldr r0, =0x1e784000
+    mov r1, #0x23                                @ '#'
+    str r1, [r0]
+/* Debug - UART console message */
+    /* Calibrate PLL Read clock phase */
+    /* Reset PLL */
+    ldr   r0, =0x1e6e2050
+    ldr   r1, =0x00000026
+    str   r1, [r0]
+    mov   r1, #0x00
+    add   r0, r0, #0x04
+    str   r1, [r0]
+    add   r0, r0, #0x04
+    str   r1, [r0]
+    add   r0, r0, #0x04
+    str   r1, [r0]
+    add   r0, r0, #0x04
+    str   r1, [r0]
+    add   r0, r0, #0x04
+    str   r1, [r0]
+    add   r0, r0, #0x04
+    str   r1, [r0]
+    ldr   r1, =0xAD000000
+    add   r0, r0, #0x04
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e204C
+check_pll_reset_done_1:
+    ldr   r1, [r0]
+    mov   r1, r1, lsr #24
+    and   r1, r1, #0x0F
+    cmp   r1, #0x00
+    beq   check_pll_reset_done_1
+
+    ldr   r0, =0x1e6e206C
+    ldr   r1, =0xDA000000
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e204C
+check_pll_reset_clear_1:
+    ldr   r1, [r0]
+    mov   r1, r1, lsr #24
+    and   r1, r1, #0x0F
+    cmp   r1, #0x00
+    bne   check_pll_reset_clear_1
+
+    mov   r6, #0x00                              @ init pass count
+    mov   r7, #0x01                              @ init PLL parameter index
+    ldr   r1, =0x000000ff
+    ldr   r0, =0x1e6e0088                        @ init dllmax,dllmin
+    str   r1, [r0]
+
+/****************************
+ PLL delay margin test loop
+ ***************************/
+cbr_next_pll_parameter:
+    ldr   r2, =0xFF                              @ parameter's max is to 0xFF
+    cmp   r7, r2
+    bge   CBR_END
+    add   r7, r7, #0x01
+
+    /* Phase shift */
+    ldr   r0, =0x1e6e2050
+    ldr   r1, =0x00000016
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e206C
+    ldr   r1, =0xAD000000
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e204C
+check_pll_phase_done_1:
+    ldr   r1, [r0]
+    mov   r1, r1, lsr #24
+    and   r1, r1, #0x0F
+    cmp   r1, #0x00
+    beq   check_pll_phase_done_1
+
+    ldr   r0, =0x1e6e206C
+    ldr   r1, =0xDA000000
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0074                        @ set the testing DRAM size = 16KB
+    ldr   r1, =0x00003FFF
+    str   r1, [r0]
+
+/* CBRScan() start */
+    mov   r9, #0x01                              @ init test status
+    adrl  r5, PATTERN_TABLE                      @ init pattern table index
+/****************************
+ Test pattern iteration loop
+ ***************************/
+cbr_next_test_pattern:
+    mov   r10, #3                                @ set the retry loop of each pattern
+    ldr   r1, [r5]                               @ load test pattern
+    ldr   r0, =0x1e6e007c
+    str   r1, [r0]
+    cmp   r1, #0x00                              @ the last data in pattern is 0x00
+    bne   cbr_test_single
+
+cbr_test_pattern_end:
+    cmp   r9, #0x00
+    bne   cbr_test_pass_dql
+    cmp   r6, #10
+    bge   CBR_END
+    b     cbr_next_pll_parameter                 @ CBRScan() end and test result fail, go to next step
+
+cbr_test_pass_dql:
+    and   r3, r7, #0xFF
+    sub   r3, r3, #0x01                          @ we add one after loop check so we need to decrease 1
+    add   r6, r6, #0x01                          @ increment pass count
+
+    ldr   r0, =0x1e6e0088
+    record_pll_pass_range
+    b     cbr_next_pll_parameter
+
+/****************************
+ Test fail retry loop
+ ***************************/
+cbr_pattern_fail_retry:
+
+/* CBRTest() start */
+cbr_test_single:
+    ldr   r0, =0x1e6e0070
+    ldr   r1, =0x00000000
+    str   r1, [r0]
+    ldr   r1, =0x00000005
+    str   r1, [r0]
+    ldr   r3, =0x1000
+    ldr   r8, =0x10000
+cbr_wait_engine_idle_0:
+    subs  r8, r8, #1
+    beq   cbr_test_single_end
+    ldr   r2, [r0]
+    tst   r2, r3                                 @ D[12] = idle bit
+    beq   cbr_wait_engine_idle_0
+
+cbr_test_single_end:
+    ldr   r0, =0x1e6e0070                        @ read fail bit status
+    ldr   r3, =0x2000
+    ldr   r2, [r0]
+    tst   r2, r3
+    bne   cbr_test_fail
+
+cbr_test_burst:
+    ldr   r0, =0x1e6e0070
+    ldr   r2, =0x00000000
+    str   r2, [r0]
+    mov   r2, #0xC1
+    str   r2, [r0]
+    ldr   r3, =0x1000
+    ldr   r8, =0x10000
+cbr_wait_engine_idle_1:
+    subs  r8, r8, #1
+    beq   cbr_test_burst_end
+    ldr   r2, [r0]
+    tst   r2, r3                                 @ D[12] = idle bit
+    beq   cbr_wait_engine_idle_1
+
+cbr_test_burst_end:
+    ldr   r0, =0x1e6e0070                        @ read fail bit status
+    ldr   r3, =0x2000
+    ldr   r2, [r0]
+    tst   r2, r3
+    bne   cbr_test_fail
+    b     cbr_next_test_burst_mode
+/* CBRTest() end */
+
+cbr_test_fail:
+    subs  r10, r10, #1
+    bne   cbr_pattern_fail_retry
+    mov   r9, #0x00
+    b     cbr_test_pattern_end                   @ CBRScan() return(0)
+
+cbr_next_test_burst_mode:
+    add   r5, r5, #0x04                          @ increase the test pattern index
+    b     cbr_next_test_pattern
+
+CBR_END:
+    ldr   r0, =0x1e6e0070
+    ldr   r1, =0x00000000
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0088                        @ check PLL margin
+    ldr   r1, [r0]
+    mov   r2, r1, lsr #8
+    and   r2, r2, #0xFF                          @ get dllmax
+    and   r1, r1, #0xFF                          @ get dllmin
+    subs  r5, r2, r1                             @ dllmax - dllmin
+    bmi   CBR_START                              @ no valid margin found, retry again
+    cmp   r5, #10                                @ (dllmax - dllmin) < 10
+    blt   CBR_START                              @ no enough margin found, retry again
+    add   r2, r1, r2                             @ (dllmin[1] + dllmax[1] + 1) >> 1
+    add   r2, r2, #0x01
+    mov   r5, r2, lsr #1
+    ldr   r0, =0x1e6e008c
+    str   r5, [r0]                               @ store the dll search result
+
+    /* Reset PLL */
+    ldr   r0, =0x1e6e0034
+    ldr   r1, =0x00008080
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e2050
+    ldr   r1, =0x00000026
+    str   r1, [r0]
+    ldr   r0, =0x1e6e206C
+    ldr   r1, =0xAD000000
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e204C
+check_pll_reset_done_2:
+    ldr   r1, [r0]
+    mov   r1, r1, lsr #24
+    and   r1, r1, #0x0F
+    cmp   r1, #0x00
+    beq   check_pll_reset_done_2
+
+    ldr   r0, =0x1e6e206C
+    ldr   r1, =0xDA000000
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e204C
+check_pll_reset_clear_2:
+    ldr   r1, [r0]
+    mov   r1, r1, lsr #24
+    and   r1, r1, #0x0F
+    cmp   r1, #0x00
+    bne   check_pll_reset_clear_2
+
+    /* Phase shift */
+    ldr   r0, =0x1e6e2050
+    ldr   r1, =0x00000016
+    orr   r1, r1, r5, lsl #8
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e206C
+    ldr   r1, =0xAD000000
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e204C
+check_pll_phase_done_2:
+    ldr   r1, [r0]
+    mov   r1, r1, lsr #24
+    and   r1, r1, #0x0F
+    cmp   r1, #0x00
+    beq   check_pll_phase_done_2
+
+    ldr   r0, =0x1e6e206C
+    ldr   r1, =0xDA000000
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0034
+    ldr   r1, =0x00008083
+    str   r1, [r0]
+
+/******************************************************************************
+ CBR Finish
+ *****************************************************************************/
+/******************************************************************************
+ Check DRAM Size
+ 1Gb : 0x80000000 ~ 0x87FFFFFF
+ 2Gb : 0x80000000 ~ 0x8FFFFFFF
+ 4Gb : 0x80000000 ~ 0x9FFFFFFF
+ 8Gb : 0x80000000 ~ 0xBFFFFFFF
+ *****************************************************************************/
+    ldr   r0, =0x1e6e0004
+    ldr   r5, [r0]
+    bic   r5, r5, #0x00000003                    @ record MCR04
+    orr   r1, r5, #0x23
+    str   r1, [r0]                               @ set to 8Gbit
+    ldr   r6, =0x0020100B
+
+check_dram_size:
+    ldr   r0, =0xA0100000
+    ldr   r1, =0x41424344
+    str   r1, [r0]
+    ldr   r0, =0x90100000
+    ldr   r1, =0x35363738
+    str   r1, [r0]
+    ldr   r0, =0x88100000
+    ldr   r1, =0x292A2B2C
+    str   r1, [r0]
+    ldr   r0, =0x80100000
+    ldr   r1, =0x1D1E1F10
+    str   r1, [r0]
+    ldr   r0, =0xA0100000
+    ldr   r1, =0x41424344
+    ldr   r2, [r0]
+    cmp   r2, r1                                 @ == 8Gbit
+    orreq r5, r5, #0x23
+    moveq r6, r6, lsr #16
+    beq   check_dram_size_end
+    ldr   r0, =0x90100000
+    ldr   r1, =0x35363738
+    ldr   r2, [r0]
+    cmp   r2, r1                                 @ == 4Gbit
+    orreq r5, r5, #0x02
+    moveq r6, r6, lsr #16
+    beq   check_dram_size_end
+    ldr   r0, =0x88100000
+    ldr   r1, =0x292A2B2C
+    ldr   r2, [r0]
+    cmp   r2, r1                                 @ == 2Gbit
+    orreq r5, r5, #0x01
+    moveq r6, r6, lsr #8
+    beq   check_dram_size_end
+
+check_dram_size_end:
+    ldr   r0, =0x1e6e0004
+    str   r5, [r0]
+    ldr   r0, =0x1e6e0014
+    ldr   r1, [r0]
+    bic   r1, r1, #0x000000FF
+    and   r6, r6, #0xFF
+    orr   r1, r1, r6
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0120                        @ VGA Compatible Mode
+    ldr   r1, =0x000050C0                        @ 408 MHz
+    str   r1, [r0]
+
+    /* Enable DRAM Cache */
+    ldr   r0, =0x1e6e0004
+    ldr   r1, [r0]
+    mov   r2, #1
+    orr   r2, r1, r2, lsl #12
+    ldr   r3, =0x00080000
+    str   r2, [r0]
+dram_cache_init:
+    ldr   r2, [r0]
+    tst   r2, r3
+    beq   dram_cache_init
+    mov   r2, #1
+    orr   r1, r1, r2, lsl #10
+    str   r1, [r0]
+
+    /* Enable DRAM ECC */
+    orr   r1, r1, r2, lsl #7
+    str   r1, [r0]
+    ldr   r0, =0x1e6e0050
+    ldr   r1, =0x80000000
+    str   r1, [r0]
+    ldr   r1, =0x00000000
+    str   r1, [r0]
+    ldr   r0, =0x1e6e0054
+    ldr   r1, =0x05FFFFFF                        @ set ECC size = 96MB
+    str   r1, [r0]
+
+    ldr   r0, =0x1e6e0074
+    ldr   r1, =0x00000000
+    str   r1, [r0]
+    ldr   r0, =0x1e6e007C
+    str   r1, [r0]
+    ldr   r0, =0x1e6e0070
+    ldr   r1, =0x00000221
+    ldr   r2, =0x00001000
+    str   r1, [r0]
+dram_ecc_init:
+    ldr   r1, [r0]
+    tst   r1, r2
+    beq   dram_ecc_init
+    ldr   r1, =0x00000400
+    str   r1, [r0]
+
+/******************************************************************************
+ Version Number
+ *****************************************************************************/
+    ldr   r0, =0x1e6e0004
+    ldr   r1, [r0]
+    mov   r2, #0x01
+    orr   r1, r1, r2, lsl #20
+    str   r1, [r0]
+
+/******************************************************************************
+ Calibration Code End
+ ******************************************************************************/
+/* Debug - UART console message */
+    ldr   r0, =0x1e784000
+    mov   r1, #0x44                              @ 'D'
+    str   r1, [r0]
+    mov   r1, #0x6F                              @ 'o'
+    str   r1, [r0]
+    mov   r1, #0x6E                              @ 'n'
+    str   r1, [r0]
+    mov   r1, #0x65                              @ 'e'
+    str   r1, [r0]
+    mov   r1, #0x0D                              @ '\r'
+    str   r1, [r0]
+    mov   r1, #0x0A                              @ '\n'
+    str   r1, [r0]
+/* Debug - UART console message */
+
+platform_exit:
+
+    ldr   r0, =0x1e6e2004                        @ enable CPUI DRAM request for ARM9
+    ldr   r1, [r0]
+    bic   r1, r1, #0x00020000
+    str   r1, [r0]
+
+    ldr r0, =0x1e6e2040
+    ldr r1, [r0]
+    orr r1, r1, #0xC0
+    str r1, [r0]
+
+    ldr r0, =0x1e6e2070
+    ldr r1, [r0]
+    orr r1, r1, #0x20
+    str r1, [r0]
+
+    /* restore lr */
+    mov   lr, r4
+
+    /* back to arch calling code */
+    mov   pc, lr
diff --git a/common/exports.c b/common/exports.c
index b4f1f7af1529..568be21fc94c 100644
--- a/common/exports.c
+++ b/common/exports.c
@@ -21,6 +21,12 @@ unsigned long get_version(void)
 # define phy_find_by_mask		dummy
 # define mdio_phydev_for_ethname	dummy
 # define miiphy_set_current_dev		dummy
+#ifdef CONFIG_FMC_SPI
+# define spi_dma          dummy
+#endif
+#endif
+#ifndef CONFIG_AST_SPI_NOR
+# define memmove_dma          dummy
 #endif
 
 void jumptable_init(void)
diff --git a/common/image.c b/common/image.c
index 26d6c9a59279..066dbaa237e1 100644
--- a/common/image.c
+++ b/common/image.c
@@ -1065,6 +1065,17 @@ int boot_get_ramdisk(int argc, char * const argv[], bootm_headers_t *images,
 				return 1;
 			}
 		}
+/// TODO ... Check Why ..................
+#if  defined(CONFIG_ARCH_ASPEED)
+		/*
+		 * We need to copy the ramdisk to SRAM to let Linux boot
+		 */
+		if (rd_data) {
+			memmove ((void *)rd_load, (uchar *)rd_data, rd_len);
+			rd_data = rd_load;
+		}
+#endif /* CONFIG_ASPEED */
+
 	} else if (images->legacy_hdr_valid &&
 			image_check_type(&images->legacy_hdr_os_copy,
 						IH_TYPE_MULTI)) {
diff --git a/configs/ast_g5_defconfig b/configs/ast_g5_defconfig
new file mode 100644
index 000000000000..b5f2b24dae89
--- /dev/null
+++ b/configs/ast_g5_defconfig
@@ -0,0 +1,9 @@
+CONFIG_ARM=y
+CONFIG_TARGET_AST_G5=y
+CONFIG_SPI_FLASH=y
+CONFIG_SYS_NS16550=y
+CONFIG_SYS_PROMPT="ast# "
+CONFIG_CMD_SAVEENV=y
+CONFIG_CMD_FLASH=y
+CONFIG_CMD_PING=y
+CONFIG_CMD_DHCP=y
\ No newline at end of file
diff --git a/drivers/net/ftgmac100.c b/drivers/net/ftgmac100.c
index 5ccc4beda817..05bbd929ddef 100644
--- a/drivers/net/ftgmac100.c
+++ b/drivers/net/ftgmac100.c
@@ -7,7 +7,19 @@
  * (C) Copyright 2010 Andes Technology
  * Macpaul Lin <macpaul@andestech.com>
  *
- * SPDX-License-Identifier:	GPL-2.0+
+ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
 #include <config.h>
@@ -15,13 +27,21 @@
 #include <malloc.h>
 #include <net.h>
 #include <asm/io.h>
-#include <asm/dma-mapping.h>
 #include <linux/mii.h>
 
+#include <i2c.h>
+
+#include <asm/arch/ast_scu.h>
+#include <asm/arch/aspeed.h>
+
+#if defined(CONFIG_MII) || defined(CONFIG_CMD_MII)
+#include <miiphy.h>
+#endif
+
+
 #include "ftgmac100.h"
 
 #define ETH_ZLEN	60
-#define CFG_XBUF_SIZE	1536
 
 /* RBSR - hw default init value is also 0x640 */
 #define RBSR_DEFAULT_VALUE	0x640
@@ -30,10 +50,8 @@
 #define PKTBUFSTX	4	/* must be power of 2 */
 
 struct ftgmac100_data {
-	ulong txdes_dma;
-	struct ftgmac100_txdes *txdes;
-	ulong rxdes_dma;
-	struct ftgmac100_rxdes *rxdes;
+	struct ftgmac100_txdes txdes[PKTBUFSTX];
+	struct ftgmac100_rxdes rxdes[PKTBUFSRX];
 	int tx_index;
 	int rx_index;
 	int phy_addr;
@@ -46,73 +64,171 @@ static int ftgmac100_mdiobus_read(struct eth_device *dev, int phy_addr,
 	int regnum)
 {
 	struct ftgmac100 *ftgmac100 = (struct ftgmac100 *)dev->iobase;
+	int fear0;
 	int phycr;
 	int i;
 
-	phycr = readl(&ftgmac100->phycr);
+#ifdef AST_MAC_OWN
+	if (__raw_readl(&ftgmac100->physts) & FTGMAC100_PHY_STS_UNVALID) {
+		printf("owner \n");
+	} else {
+		printf("not owner \n");
+		__raw_writel(__raw_readl(&ftgmac100->physts) | FTGMAC100_PHY_REQ_EN, &ftgmac100->physts);
+		while(!(__raw_readl(&ftgmac100->isr) & FTGMAC100_INT_FLAG_ACK)) {
+			mdelay(10);
+			i++;
+			if(i > 1000) {
+				printf("time out \n");
+				break;
+			}
+		}
+		__raw_writel(__raw_readl(&ftgmac100->physts) | FTGMAC100_PHY_POLL, &ftgmac100->physts);
+		__raw_writel(__raw_readl(&ftgmac100->physts) & ~FTGMAC100_PHY_REQ_EN, &ftgmac100->physts);
+		__raw_writel(FTGMAC100_INT_FLAG_ACK, &ftgmac100->isr);
+
+	}
+#endif
 
-	/* preserve MDC cycle threshold */
-	phycr &= FTGMAC100_PHYCR_MDC_CYCTHR_MASK;
+	fear0 = __raw_readl(&ftgmac100->fear0);
+	if(fear0 & (1 << 31)) {	//New MDC/MDIO
+		phycr = FTGMAC100_PHYCR_NEW_FIRE | FTGMAC100_PHYCR_ST_22 | FTGMAC100_PHYCR_NEW_READ |
+				FTGMAC100_PHYCR_NEW_PHYAD(phy_addr) | // 20141114
+				FTGMAC100_PHYCR_NEW_REGAD(regnum); // 20141114
 
-	phycr |= FTGMAC100_PHYCR_PHYAD(phy_addr)
-	      |  FTGMAC100_PHYCR_REGAD(regnum)
-	      |  FTGMAC100_PHYCR_MIIRD;
+		__raw_writel(phycr, &ftgmac100->phycr);
 
-	writel(phycr, &ftgmac100->phycr);
+		for (i = 0; i < 10; i++) {
+			phycr = __raw_readl(&ftgmac100->phycr);
 
-	for (i = 0; i < 10; i++) {
-		phycr = readl(&ftgmac100->phycr);
+			if ((phycr & FTGMAC100_PHYCR_NEW_FIRE) == 0) {
+				int data;
 
-		if ((phycr & FTGMAC100_PHYCR_MIIRD) == 0) {
-			int data;
+				data = __raw_readl(&ftgmac100->phydata);
+				return FTGMAC100_PHYDATA_NEW_MIIWDATA(data);
+			}
 
-			data = readl(&ftgmac100->phydata);
-			return FTGMAC100_PHYDATA_MIIRDATA(data);
+			mdelay(10);
 		}
 
-		mdelay(10);
-	}
+		debug("mdio read timed out\n");
+		return -1;
 
-	debug("mdio read timed out\n");
-	return -1;
+	} else {
+		phycr = __raw_readl(&ftgmac100->phycr);
+
+		/* preserve MDC cycle threshold */
+	//	phycr &= FTGMAC100_PHYCR_MDC_CYCTHR_MASK;
+
+		phycr = FTGMAC100_PHYCR_PHYAD(phy_addr)
+		      |  FTGMAC100_PHYCR_REGAD(regnum)
+		      |  FTGMAC100_PHYCR_MIIRD | 0x34;
+
+		__raw_writel(phycr, &ftgmac100->phycr);
+
+		for (i = 0; i < 10; i++) {
+			phycr = __raw_readl(&ftgmac100->phycr);
+
+			if ((phycr & FTGMAC100_PHYCR_MIIRD) == 0) {
+				int data;
+
+				data = __raw_readl(&ftgmac100->phydata);
+				return FTGMAC100_PHYDATA_MIIRDATA(data);
+			}
+
+			mdelay(10);
+		}
+
+		debug("mdio read timed out\n");
+		return -1;
+	}
 }
 
 static int ftgmac100_mdiobus_write(struct eth_device *dev, int phy_addr,
 	int regnum, u16 value)
 {
 	struct ftgmac100 *ftgmac100 = (struct ftgmac100 *)dev->iobase;
+	int fear0;
 	int phycr;
 	int data;
 	int i;
 
-	phycr = readl(&ftgmac100->phycr);
+#ifdef AST_MAC_OWN
+	if (__raw_readl(&ftgmac100->physts) & FTGMAC100_PHY_STS_UNVALID) {
+		printf("owner \n");
+	} else {
+		printf("not owner \n");
+		__raw_writel(__raw_readl(&ftgmac100->physts) | FTGMAC100_PHY_REQ_EN, &ftgmac100->physts);
+		while(!(__raw_readl(&ftgmac100->isr) & FTGMAC100_INT_FLAG_ACK)) {
+			mdelay(10);
+			i++;
+			if(i > 1000) {
+				printf("time out \n");
+				break;
+			}
+		}
+		__raw_writel(__raw_readl(&ftgmac100->physts) | FTGMAC100_PHY_POLL, &ftgmac100->physts);
+		__raw_writel(__raw_readl(&ftgmac100->physts) & ~FTGMAC100_PHY_REQ_EN, &ftgmac100->physts);
+		__raw_writel(FTGMAC100_INT_FLAG_ACK, &ftgmac100->isr);
 
-	/* preserve MDC cycle threshold */
-	phycr &= FTGMAC100_PHYCR_MDC_CYCTHR_MASK;
+	}
+#endif
 
-	phycr |= FTGMAC100_PHYCR_PHYAD(phy_addr)
-	      |  FTGMAC100_PHYCR_REGAD(regnum)
-	      |  FTGMAC100_PHYCR_MIIWR;
+	fear0 = __raw_readl(&ftgmac100->fear0);
+	if(fear0 & (1 << 31)) {	//New MDC/MDIO
+		phycr = (value << 16) |
+				FTGMAC100_PHYCR_NEW_FIRE | FTGMAC100_PHYCR_ST_22 |
+				FTGMAC100_PHYCR_NEW_WRITE |
+				FTGMAC100_PHYCR_NEW_PHYAD(phy_addr) | // 20141114
+				FTGMAC100_PHYCR_NEW_REGAD(regnum); // 20141114
 
-	data = FTGMAC100_PHYDATA_MIIWDATA(value);
+		__raw_writel(phycr, &ftgmac100->phycr);
 
-	writel(data, &ftgmac100->phydata);
-	writel(phycr, &ftgmac100->phycr);
+		for (i = 0; i < 10; i++) {
+			phycr = __raw_readl(&ftgmac100->phycr);
 
-	for (i = 0; i < 10; i++) {
-		phycr = readl(&ftgmac100->phycr);
+			if ((phycr & FTGMAC100_PHYCR_NEW_FIRE) == 0) {
+				debug("(phycr & FTGMAC100_PHYCR_MIIWR) == 0: " \
+					"phy_addr: %x\n", phy_addr);
+				return 0;
+			}
 
-		if ((phycr & FTGMAC100_PHYCR_MIIWR) == 0) {
-			debug("(phycr & FTGMAC100_PHYCR_MIIWR) == 0: " \
-				"phy_addr: %x\n", phy_addr);
-			return 0;
+			mdelay(10);
 		}
 
-		mdelay(1);
-	}
+		debug("mdio write timed out\n");
+		return -1;
+
+	} else {
+
+		phycr = __raw_readl(&ftgmac100->phycr);
+
+		/* preserve MDC cycle threshold */
+	//	phycr &= FTGMAC100_PHYCR_MDC_CYCTHR_MASK;
+
+		phycr = FTGMAC100_PHYCR_PHYAD(phy_addr)
+		      |  FTGMAC100_PHYCR_REGAD(regnum)
+		      |  FTGMAC100_PHYCR_MIIWR | 0x34;
+
+		data = FTGMAC100_PHYDATA_MIIWDATA(value);
+
+		__raw_writel(data, &ftgmac100->phydata);
+		__raw_writel(phycr, &ftgmac100->phycr);
+
+		for (i = 0; i < 10; i++) {
+			phycr = __raw_readl(&ftgmac100->phycr);
+
+			if ((phycr & FTGMAC100_PHYCR_MIIWR) == 0) {
+				debug("(phycr & FTGMAC100_PHYCR_MIIWR) == 0: " \
+					"phy_addr: %x\n", phy_addr);
+				return 0;
+			}
+
+			mdelay(1);
+		}
 
-	debug("mdio write timed out\n");
-	return -1;
+		debug("mdio write timed out\n");
+		return -1;
+	}
 }
 
 int ftgmac100_phy_read(struct eth_device *dev, int addr, int reg, u16 *value)
@@ -133,6 +249,30 @@ int  ftgmac100_phy_write(struct eth_device *dev, int addr, int reg, u16 value)
 	return 0;
 }
 
+#if defined(CONFIG_MII) || defined(CONFIG_CMD_MII)
+static int ftgmac100_reg_read(const char *devname, u8 phy_addr, u8 phy_reg,
+			u16 *value)
+{
+	struct eth_device *dev = eth_get_dev_by_name(devname);
+	*value = ftgmac100_mdiobus_read(dev , phy_addr, phy_reg);
+
+	if (*value == -1)
+		return -1;
+
+	return 0;
+
+}
+
+static int ftgmac100_reg_write(const char *devname, u8 phy_addr, u8 phy_reg, u16 value)
+{
+	struct eth_device *dev = eth_get_dev_by_name(devname);
+	if (ftgmac100_mdiobus_write(dev, phy_addr, phy_reg, value) == -1)
+		return -1;
+
+	return 0;
+}
+#endif
+
 static int ftgmac100_phy_reset(struct eth_device *dev)
 {
 	struct ftgmac100_data *priv = dev->priv;
@@ -172,35 +312,41 @@ static int ftgmac100_phy_init(struct eth_device *dev)
 	struct ftgmac100_data *priv = dev->priv;
 
 	int phy_addr;
-	u16 phy_id, status, adv, lpa, stat_ge;
+//	u32 phy_id;
+	u16 phy_id1, status, adv, lpa, stat_ge;
+	u16 phy_id2;
 	int media, speed, duplex;
 	int i;
 
 	/* Check if the PHY is up to snuff... */
 	for (phy_addr = 0; phy_addr < CONFIG_PHY_MAX_ADDR; phy_addr++) {
 
-		ftgmac100_phy_read(dev, phy_addr, MII_PHYSID1, &phy_id);
+		ftgmac100_phy_read(dev, phy_addr, MII_PHYSID1, &phy_id1);
+		ftgmac100_phy_read(dev, phy_addr, MII_PHYSID2, &phy_id2);
 
 		/*
 		 * When it is unable to found PHY,
 		 * the interface usually return 0xffff or 0x0000
 		 */
-		if (phy_id != 0xffff && phy_id != 0x0) {
-			printf("%s: found PHY at 0x%02x\n",
-				dev->name, phy_addr);
+		if (phy_id1 != 0xffff && phy_id1 != 0x0) {
+//			printf("%s: found PHY at 0x%02x\n",
+//				dev->name, phy_addr);
 			priv->phy_addr = phy_addr;
 			break;
 		}
 	}
 
-	if (phy_id == 0xffff || phy_id == 0x0) {
+	if (phy_id1 == 0xffff || phy_id1 == 0x0) {
 		printf("%s: no PHY present\n", dev->name);
 		return 0;
 	}
 
 	ftgmac100_phy_read(dev, priv->phy_addr, MII_BMSR, &status);
 
+//	printf("phy_id : %x , status %x \n",((phy_id1 << 16) | phy_id2), status );
+
 	if (!(status & BMSR_LSTATUS)) {
+//		printf("! status \n");
 		/* Try to re-negotiate if we don't have link already. */
 		ftgmac100_phy_reset(dev);
 
@@ -269,7 +415,7 @@ static int ftgmac100_update_link_speed(struct eth_device *dev)
 		return 0;
 
 	/* read MAC control register and clear related bits */
-	maccr = readl(&ftgmac100->maccr) &
+	maccr = __raw_readl(&ftgmac100->maccr) &
 		~(FTGMAC100_MACCR_GIGA_MODE |
 		  FTGMAC100_MACCR_FAST_MODE |
 		  FTGMAC100_MACCR_FULLDUP);
@@ -308,7 +454,7 @@ static int ftgmac100_update_link_speed(struct eth_device *dev)
 	}
 
 	/* update MII config into maccr */
-	writel(maccr, &ftgmac100->maccr);
+	__raw_writel(maccr, &ftgmac100->maccr);
 
 	return 1;
 }
@@ -322,10 +468,13 @@ static void ftgmac100_reset(struct eth_device *dev)
 
 	debug("%s()\n", __func__);
 
-	writel(FTGMAC100_MACCR_SW_RST, &ftgmac100->maccr);
+	//Ryan modify
+	__raw_writel(__raw_readl(&ftgmac100->maccr) | FTGMAC100_MACCR_SW_RST, &ftgmac100->maccr);
 
-	while (readl(&ftgmac100->maccr) & FTGMAC100_MACCR_SW_RST)
-		;
+	while (__raw_readl(&ftgmac100->maccr) & FTGMAC100_MACCR_SW_RST);
+
+	//Use New MDC and MDIO interface
+	__raw_writel(__raw_readl(&ftgmac100->fear0) | 0x80000000, &ftgmac100->fear0);
 }
 
 /*
@@ -340,15 +489,47 @@ static void ftgmac100_set_mac(struct eth_device *dev,
 
 	debug("%s(%x %x)\n", __func__, maddr, laddr);
 
-	writel(maddr, &ftgmac100->mac_madr);
-	writel(laddr, &ftgmac100->mac_ladr);
+	__raw_writel(maddr, &ftgmac100->mac_madr);
+	__raw_writel(laddr, &ftgmac100->mac_ladr);
 }
 
 static void ftgmac100_set_mac_from_env(struct eth_device *dev)
 {
-	eth_getenv_enetaddr("ethaddr", dev->enetaddr);
+#ifdef CONFIG_SYS_I2C_MAC_OFFSET
+
+	char *s;
+    int i, env;                // env variable 0: eeprom, 1: environment parameters
+
+	s = getenv ("eeprom");
+	env = (s && (*s == 'y')) ? 1 : 0;
 
+	if (env) {
+		printf("TODO ... eerprom --> \n");
+	    eeprom_init();
+		i2c_set_bus_num(3);
+	    eeprom_read(CONFIG_SYS_I2C_EEPROM_ADDR, CONFIG_SYS_I2C_MAC_OFFSET, dev->enetaddr, 6);
+
+		for (i = 0; i < 6; i++) {
+		    if (dev->enetaddr[i] != 0xFF) {
+		        env = 0;	//Suppose not all 0xFF is valid
+		    }
+		}
+	}
+
+	if(env)
+		eth_getenv_enetaddr_by_index("eth", dev->index, dev->enetaddr);
+//		eth_setenv_enetaddr("ethaddr", dev->enetaddr);
+	else
+		eth_getenv_enetaddr_by_index("eth", dev->index, dev->enetaddr);
+//		eth_getenv_enetaddr("ethaddr", dev->enetaddr);
+
+	ftgmac100_set_mac(dev, dev->enetaddr);
+#else
+	eth_getenv_enetaddr_by_index("eth", dev->index, dev->enetaddr);
+//	eth_getenv_enetaddr("ethaddr", dev->enetaddr);
 	ftgmac100_set_mac(dev, dev->enetaddr);
+#endif
+
 }
 
 /*
@@ -360,87 +541,64 @@ static void ftgmac100_halt(struct eth_device *dev)
 
 	debug("%s()\n", __func__);
 
-	writel(0, &ftgmac100->maccr);
+//	__raw_writel(0, &ftgmac100->maccr);
+	//ryan modify
+	__raw_writel(__raw_readl(&ftgmac100->maccr) & ~(FTGMAC100_MACCR_TXDMA_EN | FTGMAC100_MACCR_RXDMA_EN | FTGMAC100_MACCR_TXMAC_EN | FTGMAC100_MACCR_RXMAC_EN), &ftgmac100->maccr);
+
 }
 
 static int ftgmac100_init(struct eth_device *dev, bd_t *bd)
 {
 	struct ftgmac100 *ftgmac100 = (struct ftgmac100 *)dev->iobase;
 	struct ftgmac100_data *priv = dev->priv;
-	struct ftgmac100_txdes *txdes;
-	struct ftgmac100_rxdes *rxdes;
+	struct ftgmac100_txdes *txdes = priv->txdes;
+	struct ftgmac100_rxdes *rxdes = priv->rxdes;
 	unsigned int maccr;
-	void *buf;
 	int i;
 
 	debug("%s()\n", __func__);
 
-	if (!priv->txdes) {
-		txdes = dma_alloc_coherent(
-			sizeof(*txdes) * PKTBUFSTX, &priv->txdes_dma);
-		if (!txdes)
-			panic("ftgmac100: out of memory\n");
-		memset(txdes, 0, sizeof(*txdes) * PKTBUFSTX);
-		priv->txdes = txdes;
-	}
-	txdes = priv->txdes;
-
-	if (!priv->rxdes) {
-		rxdes = dma_alloc_coherent(
-			sizeof(*rxdes) * PKTBUFSRX, &priv->rxdes_dma);
-		if (!rxdes)
-			panic("ftgmac100: out of memory\n");
-		memset(rxdes, 0, sizeof(*rxdes) * PKTBUFSRX);
-		priv->rxdes = rxdes;
-	}
-	rxdes = priv->rxdes;
+	//Ryan Add
+	ftgmac100_reset(dev);
 
 	/* set the ethernet address */
 	ftgmac100_set_mac_from_env(dev);
 
 	/* disable all interrupts */
-	writel(0, &ftgmac100->ier);
+	__raw_writel(0, &ftgmac100->ier);
 
 	/* initialize descriptors */
 	priv->tx_index = 0;
 	priv->rx_index = 0;
 
-	txdes[PKTBUFSTX - 1].txdes0	= FTGMAC100_TXDES0_EDOTR;
-	rxdes[PKTBUFSRX - 1].rxdes0	= FTGMAC100_RXDES0_EDORR;
+	txdes[PKTBUFSTX - 1].txdes0	= cpu_to_le32(FTGMAC100_TXDES0_EDOTR);
+	rxdes[PKTBUFSRX - 1].rxdes0	= cpu_to_le32(FTGMAC100_RXDES0_EDORR);
 
 	for (i = 0; i < PKTBUFSTX; i++) {
 		/* TXBUF_BADR */
-		if (!txdes[i].txdes2) {
-			buf = memalign(ARCH_DMA_MINALIGN, CFG_XBUF_SIZE);
-			if (!buf)
-				panic("ftgmac100: out of memory\n");
-			txdes[i].txdes3 = virt_to_phys(buf);
-			txdes[i].txdes2 = (uint)buf;
-		}
+		txdes[i].txdes3 = 0;
 		txdes[i].txdes1 = 0;
 	}
 
 	for (i = 0; i < PKTBUFSRX; i++) {
 		/* RXBUF_BADR */
-		if (!rxdes[i].rxdes2) {
-			buf = net_rx_packets[i];
-			rxdes[i].rxdes3 = virt_to_phys(buf);
-			rxdes[i].rxdes2 = (uint)buf;
-		}
-		rxdes[i].rxdes0 &= ~FTGMAC100_RXDES0_RXPKT_RDY;
+		rxdes[i].rxdes3 = cpu_to_le32((unsigned int)net_rx_packets[i]);
+
+//		rxdes[i].rxdes0 &= ~FTGMAC100_RXDES0_RXPKT_RDY;
+		rxdes[i].rxdes0 = cpu_to_le32(le32_to_cpu(rxdes[i].rxdes0) & ~FTGMAC100_RXDES0_RXPKT_RDY);
 	}
 
 	/* transmit ring */
-	writel(priv->txdes_dma, &ftgmac100->txr_badr);
+	__raw_writel((unsigned int)txdes, &ftgmac100->txr_badr);
 
 	/* receive ring */
-	writel(priv->rxdes_dma, &ftgmac100->rxr_badr);
+	__raw_writel((unsigned int)rxdes, &ftgmac100->rxr_badr);
 
 	/* poll receive descriptor automatically */
-	writel(FTGMAC100_APTC_RXPOLL_CNT(1), &ftgmac100->aptc);
+	__raw_writel(FTGMAC100_APTC_RXPOLL_CNT(1), &ftgmac100->aptc);
 
 	/* config receive buffer size register */
-	writel(FTGMAC100_RBSR_SIZE(RBSR_DEFAULT_VALUE), &ftgmac100->rbsr);
+	__raw_writel(FTGMAC100_RBSR_SIZE(RBSR_DEFAULT_VALUE), &ftgmac100->rbsr);
 
 	/* enable transmitter, receiver */
 	maccr = FTGMAC100_MACCR_TXMAC_EN |
@@ -452,13 +610,34 @@ static int ftgmac100_init(struct eth_device *dev, bd_t *bd)
 		FTGMAC100_MACCR_RX_RUNT |
 		FTGMAC100_MACCR_RX_BROADPKT;
 
-	writel(maccr, &ftgmac100->maccr);
+	__raw_writel(maccr, &ftgmac100->maccr);
 
+//Ryan modify
+#if 1
+	ftgmac100_phy_init(dev);
+	if (!ftgmac100_update_link_speed(dev))
+		return -1;
+#else
 	if (!ftgmac100_phy_init(dev)) {
 		if (!ftgmac100_update_link_speed(dev))
 			return -1;
 	}
+#endif
+
+/////////////////
+#if 0 //(defined(CONFIG_MII) || defined(CONFIG_CMD_MII))
+	/* Search phy address from range 0-31 */
+	phy_adr = ethernet_phy_detect(dev);
+	if (phy_adr < 0) {
+		printf("FTGMAC100 : PHY not detected at address range 0-31\n");
+		return -1;
+	} else {
+		debug("FTGMAC100 : PHY detected at addr %d\n", phy_adr);
+		miiphy_write(dev->name, PHY_ADR_REQ, PHY_ADR_REQ, phy_adr);
+	}
+#endif
 
+//////////////////
 	return 0;
 }
 
@@ -473,10 +652,12 @@ static int ftgmac100_recv(struct eth_device *dev)
 
 	curr_des = &priv->rxdes[priv->rx_index];
 
-	if (!(curr_des->rxdes0 & FTGMAC100_RXDES0_RXPKT_RDY))
+	invalidate_dcache_range((u32) curr_des, (u32) curr_des + sizeof(struct ftgmac100_rxdes));
+
+	if (!(le32_to_cpu(curr_des->rxdes0) & FTGMAC100_RXDES0_RXPKT_RDY))
 		return -1;
 
-	if (curr_des->rxdes0 & (FTGMAC100_RXDES0_RX_ERR |
+	if (le32_to_cpu(curr_des->rxdes0) & (FTGMAC100_RXDES0_RX_ERR |
 				FTGMAC100_RXDES0_CRC_ERR |
 				FTGMAC100_RXDES0_FTL |
 				FTGMAC100_RXDES0_RUNT |
@@ -484,19 +665,20 @@ static int ftgmac100_recv(struct eth_device *dev)
 		return -1;
 	}
 
-	rxlen = FTGMAC100_RXDES0_VDBC(curr_des->rxdes0);
+	rxlen = FTGMAC100_RXDES0_VDBC(le32_to_cpu(curr_des->rxdes0));
 
 	debug("%s(): RX buffer %d, %x received\n",
 	       __func__, priv->rx_index, rxlen);
 
-	/* invalidate d-cache */
-	dma_map_single((void *)curr_des->rxdes2, rxlen, DMA_FROM_DEVICE);
+	invalidate_dcache_range((u32) (le32_to_cpu(curr_des->rxdes3)), (u32) (le32_to_cpu(curr_des->rxdes3)) + rxlen);
 
 	/* pass the packet up to the protocol layers. */
-	net_process_received_packet((void *)curr_des->rxdes2, rxlen);
+	net_process_received_packet((void *)le32_to_cpu(curr_des->rxdes3), rxlen);
 
 	/* release buffer to DMA */
-	curr_des->rxdes0 &= ~FTGMAC100_RXDES0_RXPKT_RDY;
+	//curr_des->rxdes0 &= ~FTGMAC100_RXDES0_RXPKT_RDY;
+
+	curr_des->rxdes0 = cpu_to_le32(le32_to_cpu(curr_des->rxdes0) & ~FTGMAC100_RXDES0_RXPKT_RDY);
 
 	priv->rx_index = (priv->rx_index + 1) % PKTBUFSRX;
 
@@ -511,6 +693,9 @@ static int ftgmac100_send(struct eth_device *dev, void *packet, int length)
 	struct ftgmac100 *ftgmac100 = (struct ftgmac100 *)dev->iobase;
 	struct ftgmac100_data *priv = dev->priv;
 	struct ftgmac100_txdes *curr_des = &priv->txdes[priv->tx_index];
+	unsigned long start;
+    unsigned long now;
+    unsigned long diff_time;
 
 	if (curr_des->txdes0 & FTGMAC100_TXDES0_TXDMA_OWN) {
 		debug("%s(): no TX descriptor available\n", __func__);
@@ -521,18 +706,45 @@ static int ftgmac100_send(struct eth_device *dev, void *packet, int length)
 
 	length = (length < ETH_ZLEN) ? ETH_ZLEN : length;
 
-	memcpy((void *)curr_des->txdes2, (void *)packet, length);
-	dma_map_single((void *)curr_des->txdes2, length, DMA_TO_DEVICE);
+	/* initiate a transmit sequence */
+	curr_des->txdes3 = cpu_to_le32((unsigned int)packet);	/* TXBUF_BADR */
 
 	/* only one descriptor on TXBUF */
+	/*
 	curr_des->txdes0 &= FTGMAC100_TXDES0_EDOTR;
+
 	curr_des->txdes0 |= FTGMAC100_TXDES0_FTS |
 			    FTGMAC100_TXDES0_LTS |
 			    FTGMAC100_TXDES0_TXBUF_SIZE(length) |
 			    FTGMAC100_TXDES0_TXDMA_OWN ;
+	*/
+	curr_des->txdes0 = cpu_to_le32(le32_to_cpu(curr_des->txdes0) & FTGMAC100_TXDES0_EDOTR);
+
+	curr_des->txdes0 = cpu_to_le32(le32_to_cpu(curr_des->txdes0) | (FTGMAC100_TXDES0_FTS |
+			    FTGMAC100_TXDES0_LTS |
+			    FTGMAC100_TXDES0_TXBUF_SIZE(length) |
+			    FTGMAC100_TXDES0_TXDMA_OWN));
 
 	/* start transmit */
-	writel(1, &ftgmac100->txpd);
+	__raw_writel(1, &ftgmac100->txpd);
+	invalidate_dcache_range((u32) curr_des, (u32) curr_des + sizeof(struct ftgmac100_rxdes));
+
+	/* wait for transfer to succeed */
+	start = get_timer(0);
+
+	while (le32_to_cpu(curr_des->txdes0) & FTGMAC100_TXDES0_TXDMA_OWN) {
+//		invalidate_dcache_range((u32) curr_des, (u32) curr_des + sizeof(struct ftgmac100_rxdes));
+        now = get_timer(0);
+        if ( now >= start )
+            diff_time = now - start;
+        else
+            diff_time = now + 0xFFFFFFFF - start;
+        if (diff_time >= 5000) /* 5ms */
+        {
+			debug("%s(): timed out\n", __func__);
+			return -1;
+		}
+	}
 
 	debug("%s(): packet sent\n", __func__);
 
@@ -546,6 +758,61 @@ int ftgmac100_initialize(bd_t *bd)
 	struct eth_device *dev;
 	struct ftgmac100_data *priv;
 
+#if 1   //Ryan Chen for more mac use
+	int i, card_number = 0, mac_no;
+	unsigned int			iobase[CONFIG_MAC_NUM];
+
+	mac_no = CONFIG_MAC_NUM;
+	iobase[0] = AST_MAC0_BASE;
+
+#ifdef AST_MAC1_BASE
+	iobase[1] = AST_MAC1_BASE;
+#endif
+	for (i = 0; i < mac_no; i++)
+	{
+		ast_scu_multi_func_eth(i);
+		ast_scu_init_eth(i);
+
+		debug ("FTGMAC100: Device @0x%x\n", iobase[i]);
+
+		dev = malloc(sizeof *dev);
+
+		/* Transmit and receive descriptors should align to 16 bytes */
+		priv = memalign(16, sizeof(struct ftgmac100_data));
+		if (!priv) {
+			printf("%s(): failed to allocate priv\n", __func__);
+			goto free_dev;
+		}
+
+		memset(dev, 0, sizeof(*dev));
+		memset(priv, 0, sizeof(*priv));
+
+		sprintf(dev->name, "FTGMAC100#%d", card_number);
+
+		dev->iobase = iobase[i];
+		dev->init	= ftgmac100_init;
+		dev->halt	= ftgmac100_halt;
+		dev->send	= ftgmac100_send;
+		dev->recv	= ftgmac100_recv;
+		dev->priv	= priv;
+		dev->write_hwaddr = NULL;		//20130209, ryan chen add
+
+		eth_register(dev);
+
+#if defined(CONFIG_MII) || defined(CONFIG_CMD_MII)
+		miiphy_register(dev->name, ftgmac100_reg_read, ftgmac100_reg_write);
+#endif
+
+		/* set the ethernet address */
+		ftgmac100_set_mac_from_env(dev);
+
+		ftgmac100_reset(dev);
+
+		card_number++;
+	}
+	return card_number;
+
+#else
 	dev = malloc(sizeof *dev);
 	if (!dev) {
 		printf("%s(): failed to allocate dev\n", __func__);
@@ -562,8 +829,8 @@ int ftgmac100_initialize(bd_t *bd)
 	memset(dev, 0, sizeof(*dev));
 	memset(priv, 0, sizeof(*priv));
 
-	strcpy(dev->name, "FTGMAC100");
-	dev->iobase	= CONFIG_FTGMAC100_BASE;
+	sprintf(dev->name, "FTGMAC100#0");
+	dev->iobase	= AST_MAC0_BASE;
 	dev->init	= ftgmac100_init;
 	dev->halt	= ftgmac100_halt;
 	dev->send	= ftgmac100_send;
@@ -571,13 +838,18 @@ int ftgmac100_initialize(bd_t *bd)
 	dev->priv	= priv;
 
 	eth_register(dev);
-
+//////
+	ast_scu_multi_func_eth(0);
+	ast_scu_init_eth(0);
+/////
 	ftgmac100_reset(dev);
 
 	return 1;
+#endif
 
 free_dev:
 	free(dev);
-out:
+//out:
 	return 0;
+
 }
diff --git a/drivers/net/ftgmac100.h b/drivers/net/ftgmac100.h
index 71121ba9d40f..de86379750ec 100644
--- a/drivers/net/ftgmac100.h
+++ b/drivers/net/ftgmac100.h
@@ -7,7 +7,19 @@
  * (C) Copyright 2010 Andes Technology
  * Macpaul Lin <macpaul@andestech.com>
  *
- * SPDX-License-Identifier:	GPL-2.0+
+ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
 #ifndef __FTGMAC100_H
@@ -31,26 +43,28 @@ struct ftgmac100 {
 	unsigned int	aptc;		/* 0x34 */
 	unsigned int	dblac;		/* 0x38 */
 	unsigned int	dmafifos;	/* 0x3c */
-	unsigned int	revr;		/* 0x40 */
-	unsigned int	fear;		/* 0x44 */
+	unsigned int	fear0;		/* 0x40 */
+	unsigned int	fear1;		/* 0x44 */
 	unsigned int	tpafcr;		/* 0x48 */
 	unsigned int	rbsr;		/* 0x4c */
 	unsigned int	maccr;		/* 0x50 */
 	unsigned int	macsr;		/* 0x54 */
 	unsigned int	tm;		/* 0x58 */
-	unsigned int	resv1;		/* 0x5c */ /* not defined in spec */
+	unsigned int	physts;		/* 0x5c */ /* not defined in spec */
 	unsigned int	phycr;		/* 0x60 */
 	unsigned int	phydata;	/* 0x64 */
 	unsigned int	fcr;		/* 0x68 */
 	unsigned int	bpr;		/* 0x6c */
 	unsigned int	wolcr;		/* 0x70 */
 	unsigned int	wolsr;		/* 0x74 */
-	unsigned int	wfcrc;		/* 0x78 */
-	unsigned int	resv2;		/* 0x7c */ /* not defined in spec */
-	unsigned int	wfbm1;		/* 0x80 */
-	unsigned int	wfbm2;		/* 0x84 */
-	unsigned int	wfbm3;		/* 0x88 */
-	unsigned int	wfbm4;		/* 0x8c */
+//	unsigned int	wfcrc;		/* 0x78 */
+//	unsigned int	resv2;		/* 0x7c */ /* not defined in spec */
+	unsigned int	wfbm1m;		/* 0x78 */
+	unsigned int	wfbm1l;		/* 0x7c */
+	unsigned int	wfbm2m;		/* 0x80 */
+	unsigned int	wfbm2l;		/* 0x84 */
+	unsigned int	wfbm3m;		/* 0x88 */
+	unsigned int	wfbm3l;		/* 0x8c */
 	unsigned int	nptxr_ptr;	/* 0x90 */
 	unsigned int	hptxr_ptr;	/* 0x94 */
 	unsigned int	rxr_ptr;	/* 0x98 */
@@ -82,6 +96,11 @@ struct ftgmac100 {
 #define FTGMAC100_INT_AHB_ERR		(1 << 8)
 #define FTGMAC100_INT_PHYSTS_CHG	(1 << 9)
 #define FTGMAC100_INT_NO_HPTXBUF	(1 << 10)
+////
+#define FTGMAC100_INT_PHY_CHG		(1 << 28)
+#define FTGMAC100_INT_PHY_TIMEOUT	(1 << 29)
+#define FTGMAC100_INT_FLAG_ACK		(1 << 30)
+#define FTGMAC100_INT_FLAG_REQ		(1 << 31)
 
 /*
  * Interrupt timer control register
@@ -144,11 +163,12 @@ struct ftgmac100 {
 #define FTGMAC100_MACCR_RXMAC_EN	(1 << 3)
 #define FTGMAC100_MACCR_RM_VLAN		(1 << 4)
 #define FTGMAC100_MACCR_HPTXR_EN	(1 << 5)
-#define FTGMAC100_MACCR_LOOP_EN		(1 << 6)
+//#define FTGMAC100_MACCR_LOOP_EN		(1 << 6)
 #define FTGMAC100_MACCR_ENRX_IN_HALFTX	(1 << 7)
 #define FTGMAC100_MACCR_FULLDUP		(1 << 8)
 #define FTGMAC100_MACCR_GIGA_MODE	(1 << 9)
 #define FTGMAC100_MACCR_CRC_APD		(1 << 10)
+#define FTGMAC100_MACCR_LOW_SEN		(1 << 11) //new
 #define FTGMAC100_MACCR_RX_RUNT		(1 << 12)
 #define FTGMAC100_MACCR_JUMBO_LF	(1 << 13)
 #define FTGMAC100_MACCR_RX_ALL		(1 << 14)
@@ -159,6 +179,19 @@ struct ftgmac100 {
 #define FTGMAC100_MACCR_FAST_MODE	(1 << 19)
 #define FTGMAC100_MACCR_SW_RST		(1 << 31)
 
+/* */
+#define FTGMAC100_PHY_LINK_UP		(1 << 0)
+#define FTGMAC100_PHY_100M_MODE		(1 << 2)
+#define FTGMAC100_PHY_FULL_DUPLEX	(1 << 1)
+#define FTGMAC100_PHY_1G_MODE		(1 << 3)
+
+#define FTGMAC100_PHY_STS_UNVALID	(1 << 16)
+
+#define FTGMAC100_PHY_POLL			(1 << 28)
+#define FTGMAC100_PHY_LINK			(1 << 29)
+#define FTGMAC100_PHY_ACK_EN		(1 << 30)
+#define FTGMAC100_PHY_REQ_EN		(1 << 31)
+
 /*
  * PHY control register
  */
@@ -169,12 +202,22 @@ struct ftgmac100 {
 #define FTGMAC100_PHYCR_MIIRD		(1 << 26)
 #define FTGMAC100_PHYCR_MIIWR		(1 << 27)
 
+//New MDC/MDIO
+#define FTGMAC100_PHYCR_NEW_FIRE		(1 << 15)
+#define FTGMAC100_PHYCR_ST_22			(1 << 12)
+#define FTGMAC100_PHYCR_NEW_WRITE		(1 << 10)
+#define FTGMAC100_PHYCR_NEW_READ		(2 << 10)
+#define FTGMAC100_PHYCR_NEW_PHYAD(x)	(((x) & 0x1f) << 5)
+#define FTGMAC100_PHYCR_NEW_REGAD(x)	((x) & 0x1f)
+
 /*
  * PHY data register
  */
 #define FTGMAC100_PHYDATA_MIIWDATA(x)		((x) & 0xffff)
 #define FTGMAC100_PHYDATA_MIIRDATA(phydata)	(((phydata) >> 16) & 0xffff)
 
+#define FTGMAC100_PHYDATA_NEW_MIIWDATA(x)		((x) & 0xffff)
+
 /*
  * Transmit descriptor, aligned to 16 bytes
  */
@@ -186,17 +229,18 @@ struct ftgmac100_txdes {
 } __attribute__ ((aligned(16)));
 
 #define FTGMAC100_TXDES0_TXBUF_SIZE(x)	((x) & 0x3fff)
-#define FTGMAC100_TXDES0_EDOTR		(1 << 15)
+//#define FTGMAC100_TXDES0_EDOTR		(1 << 15)
 #define FTGMAC100_TXDES0_CRC_ERR	(1 << 19)
 #define FTGMAC100_TXDES0_LTS		(1 << 28)
 #define FTGMAC100_TXDES0_FTS		(1 << 29)
+#define FTGMAC100_TXDES0_EDOTR		(1 << 30) //org is 15 ->30
 #define FTGMAC100_TXDES0_TXDMA_OWN	(1 << 31)
 
 #define FTGMAC100_TXDES1_VLANTAG_CI(x)	((x) & 0xffff)
 #define FTGMAC100_TXDES1_INS_VLANTAG	(1 << 16)
-#define FTGMAC100_TXDES1_TCP_CHKSUM	(1 << 17)
-#define FTGMAC100_TXDES1_UDP_CHKSUM	(1 << 18)
-#define FTGMAC100_TXDES1_IP_CHKSUM	(1 << 19)
+//#define FTGMAC100_TXDES1_TCP_CHKSUM	(1 << 17)
+//#define FTGMAC100_TXDES1_UDP_CHKSUM	(1 << 18)
+//#define FTGMAC100_TXDES1_IP_CHKSUM	(1 << 19)
 #define FTGMAC100_TXDES1_LLC		(1 << 22)
 #define FTGMAC100_TXDES1_TX2FIC		(1 << 30)
 #define FTGMAC100_TXDES1_TXIC		(1 << 31)
@@ -212,7 +256,7 @@ struct ftgmac100_rxdes {
 } __attribute__ ((aligned(16)));
 
 #define FTGMAC100_RXDES0_VDBC(x)	((x) & 0x3fff)
-#define FTGMAC100_RXDES0_EDORR		(1 << 15)
+//#define FTGMAC100_RXDES0_EDORR		(1 << 15)
 #define FTGMAC100_RXDES0_MULTICAST	(1 << 16)
 #define FTGMAC100_RXDES0_BROADCAST	(1 << 17)
 #define FTGMAC100_RXDES0_RX_ERR		(1 << 18)
@@ -225,6 +269,7 @@ struct ftgmac100_rxdes {
 #define FTGMAC100_RXDES0_PAUSE_FRAME	(1 << 25)
 #define FTGMAC100_RXDES0_LRS		(1 << 28)
 #define FTGMAC100_RXDES0_FRS		(1 << 29)
+#define FTGMAC100_RXDES0_EDORR		(1 << 30)	//org 15->30
 #define FTGMAC100_RXDES0_RXPKT_RDY	(1 << 31)
 
 #define FTGMAC100_RXDES1_VLANTAG_CI	0xffff
diff --git a/include/_exports.h b/include/_exports.h
index 11beeb24f183..d4ad18c35ef0 100644
--- a/include/_exports.h
+++ b/include/_exports.h
@@ -55,6 +55,9 @@
 	EXPORT_FUNC(dummy, void, spi_free_slave, void)
 #else
 	EXPORT_FUNC(spi_init, void, spi_init, void)
+#ifdef CONFIG_FMC_SPI
+	EXPORT_FUNC(spi_dma)
+#endif
 	EXPORT_FUNC(spi_setup_slave, struct spi_slave *, spi_setup_slave,
 		    unsigned int, unsigned int, unsigned int, unsigned int)
 	EXPORT_FUNC(spi_free_slave, void, spi_free_slave, struct spi_slave *)
diff --git a/include/configs/ast-g5.h b/include/configs/ast-g5.h
new file mode 100644
index 000000000000..5621a6967fe1
--- /dev/null
+++ b/include/configs/ast-g5.h
@@ -0,0 +1,245 @@
+/*
+ * Copyright (C) 2012-2020  ASPEED Technology Inc.
+ * Ryan Chen <ryan_chen@aspeedtech.com>
+ *
+ * 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
+
+#define CONFIG_ARCH_ASPEED
+#define CONFIG_ARCH_AST2500
+#define CONFIG_MAC_NUM 2
+#define CONFIG_EXTRA_ENV_SETTINGS AST2500_ENV_SETTINGS
+
+/* #define DEBUG	1 */
+/* #define  CONFIG_SKIP_LOWLEVEL_INIT */
+#define CONFIG_AST_FPGA_VER 4 /* for arm1176 */
+
+/*
+ * High Level Configuration Options
+ * (easy to change)
+ */
+#define CONFIG_ARCH_CPU_INIT
+#define CONFIG_MISC_INIT_R		1
+#define CONFIG_MACH_TYPE				MACH_TYPE_ASPEED
+#ifdef CONFIG_ARCH_AST1070
+#define CONFIG_AST_GPIO
+#endif
+
+
+#include <asm/arch/platform.h>
+
+/* Misc CPU related */
+/* #define CONFIG_ARCH_CPU_INIT */
+#define CONFIG_CMDLINE_TAG		/* enable passing of ATAGs */
+#define CONFIG_SETUP_MEMORY_TAGS
+#define CONFIG_INITRD_TAG
+
+#define CONFIG_CMDLINE_EDITING		1	/* command line history */
+/* #define CONFIG_SYS_HUSH_PARSER		1 */	/* Use the HUSH parser		*/
+
+/* ------------------------------------------------------------------------- */
+
+/* Enable cache controller */
+#define CONFIG_SYS_DCACHE_OFF	1
+
+/* ------------------------------------------------------------------------- */
+/* additions for new relocation code, must added to all boards */
+#define CONFIG_SYS_SDRAM_BASE			(AST_DRAM_BASE)
+#define CONFIG_SYS_INIT_RAM_ADDR		CONFIG_SYS_SDRAM_BASE /*(AST_SRAM_BASE)*/
+#define CONFIG_SYS_INIT_RAM_SIZE		(32*1024)
+#define CONFIG_SYS_INIT_RAM_END     (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_RAM_SIZE)
+#define CONFIG_SYS_INIT_SP_ADDR 	(CONFIG_SYS_INIT_RAM_END - GENERATED_GBL_DATA_SIZE)
+
+#define CONFIG_NR_DRAM_BANKS	1
+
+#define CONFIG_SYS_MEMTEST_START		CONFIG_SYS_SDRAM_BASE + 0x300000
+#define CONFIG_SYS_MEMTEST_END			(CONFIG_SYS_MEMTEST_START + (80*1024*1024))
+/*-----------------------------------------------------------------------*/
+
+#define CONFIG_SYS_TEXT_BASE            0
+#define CONFIG_SYS_UBOOT_BASE		CONFIG_SYS_TEXT_BASE
+/*
+ * Memory Info
+ */
+#define CONFIG_SYS_MALLOC_LEN   	(0x1000 + 4*1024*1024) /* malloc() len */
+
+
+/*
+ * Timer Set
+ */
+#undef CONFIG_SYS_HZ
+#define CONFIG_SYS_HZ				(1*1000*1000) /* use external clk (1M) */
+
+/*
+ * Hardware drivers
+ */
+
+/* #define CONFIG_FARADAYNIC */
+/* #define CONFIG_DRIVER_ASPEED_I2C */
+
+/*
+ * NS16550 Configuration
+ */
+#define CONFIG_SYS_NS16550_SERIAL
+#define CONFIG_SYS_NS16550_REG_SIZE		-4
+#define CONFIG_SYS_NS16550_CLK			24000000
+#define CONFIG_SYS_NS16550_COM1			AST_UART0_BASE
+#define CONFIG_SYS_LOADS_BAUD_CHANGE
+#define CONFIG_SERIAL1					1
+#define CONFIG_CONS_INDEX				1
+#define CONFIG_BAUDRATE					115200
+
+/* #define CONFIG_SYS_BAUDRATE_TABLE		{ 9600, 19200, 38400, 57600, 115200 } */
+
+/* #define CONFIG_SYS_MAX_FLASH_BANKS      1 */
+/* #define CONFIG_SYS_MAX_FLASH_SECT       (256) */           /* max number of sectors on one chip */
+
+/*
+ * BOOTP options
+ */
+#define CONFIG_BOOTP_BOOTFILESIZE
+#define CONFIG_BOOTP_BOOTPATH
+#define CONFIG_BOOTP_GATEWAY
+#define CONFIG_BOOTP_HOSTNAME
+#define CONFIG_BOOTP_SUBNETMASK
+
+/*
+ * Environment Config
+ */
+#define CONFIG_BOOTDELAY	2
+#define CONFIG_BOOTFILE		"all.bin"
+
+/*
+ * Miscellaneous configurable options
+ */
+#define CONFIG_SYS_LONGHELP	/* undef to save memory */
+#define CONFIG_SYS_CBSIZE	256		/* Console I/O Buffer Size */
+/* Monitor Command Prompt	 */
+#define CONFIG_SYS_PROMPT		"ast# "
+
+/* Print 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 /* Boot Argument Buffer Size */
+
+#define CONFIG_SYS_LOAD_ADDR		0x83000000	/* default load address */
+
+#define CONFIG_BOOTARGS		"console=ttyS0,115200n8 ramdisk_size=16384 root=/dev/ram rw init=/linuxrc mem=80M"
+
+/* ------------------------------------------------------------------------- */
+
+/* ------------------------------------------------------------------------- */
+#define CONFIG_AST_SPI_NOR    /* AST SPI NOR Flash */
+
+#ifdef CONFIG_AST_SPI_NOR
+
+#define CONFIG_FMC_CS			1
+/*#define CONFIG_SPI0_CS		1 */
+
+/*#define CONFIG_FLASH_DMA */
+#define CONFIG_SYS_MAX_FLASH_BANKS 	(CONFIG_FMC_CS)
+/*#define CONFIG_SYS_MAX_FLASH_SECT	(1024)	*/	/* max number of sectors on one chip */
+#define CONFIG_SYS_MAX_FLASH_SECT	(8192)		/* max number of sectors on one chip */
+#define CONFIG_ENV_IS_IN_FLASH		1
+#define CONFIG_ENV_ADDR				(AST_FMC_CS0_BASE + 0x60000)
+
+#endif
+
+/* ------------------------------------------------------------------------- */
+#define CONFIG_ENV_OFFSET				0x60000	/* environment starts here  */
+#define CONFIG_ENV_SIZE					0x20000		/* Total Size of Environment Sector */
+
+#define CONFIG_BOOTCOMMAND	"bootm 20080000 20300000"
+#define CONFIG_ENV_OVERWRITE
+
+#define AST2500_ENV_SETTINGS					\
+	"verify=yes\0"	\
+	"spi_dma=yes\0" \
+	"update=tftp 80800000 ast2500.scr; so 80800000\0" \
+	""
+
+/* ------------------------------------------------------------------------- */
+
+/* Ethernet */
+#ifdef CONFIG_CMD_MII
+#define CONFIG_MII			1
+#define CONFIG_PHY_GIGE
+#define CONFIG_PHYLIB
+#define CONFIG_PHY_ADDR			0
+#define CONFIG_PHY_REALTEK
+#endif
+
+#ifdef CONFIG_CMD_NET
+/* #define CONFIG_MAC_NUM	2 */
+#define CONFIG_FTGMAC100
+#define CONFIG_PHY_MAX_ADDR	32	/* this comes from <linux/phy.h> */
+/* #define CONFIG_SYS_DISCOVER_PHY */
+#define CONFIG_FTGMAC100_EGIGA
+
+#define CONFIG_GATEWAYIP		192.168.0.1
+#define CONFIG_NETMASK			255.255.255.0
+#define CONFIG_IPADDR			192.168.0.45
+#define CONFIG_SERVERIP			192.168.0.81
+#define CONFIG_ETHADDR			00:C0:A8:12:34:56
+#define CONFIG_ETH1ADDR			00:C0:A8:12:34:57
+
+#endif
+
+#ifdef CONFIG_PCI
+#define CONFIG_CMD_PCI
+#define CONFIG_PCI_PNP
+#define CONFIG_PCI_SCAN_SHOW
+#define CONFIG_PCI_CONFIG_HOST_BRIDGE
+
+#define CONFIG_SYS_PCIE1_BASE		0x8c000000
+#define CONFIG_SYS_PCIE1_CFG_BASE	0x8c000000
+#define CONFIG_SYS_PCIE1_CFG_SIZE	0x01000000
+#define CONFIG_SYS_PCIE1_MEM_BASE	0x8d000000
+#define CONFIG_SYS_PCIE1_MEM_PHYS	0x8d000000
+#define CONFIG_SYS_PCIE1_MEM_SIZE	0x01000000
+#define CONFIG_SYS_PCIE1_IO_BASE	0x8e000000
+#define CONFIG_SYS_PCIE1_IO_PHYS	0x8e000000
+#define CONFIG_SYS_PCIE1_IO_SIZE	0x00100000
+
+#define CONFIG_SYS_PCIE2_BASE		0x8f000000
+#define CONFIG_SYS_PCIE2_CFG_BASE	0x8f000000
+#define CONFIG_SYS_PCIE2_CFG_SIZE	0x01000000
+#define CONFIG_SYS_PCIE2_MEM_BASE	0x90000000
+#define CONFIG_SYS_PCIE2_MEM_PHYS	0x90000000
+#define CONFIG_SYS_PCIE2_MEM_SIZE	0x00100000
+#define CONFIG_SYS_PCIE2_IO_BASE	0x91000000
+#define CONFIG_SYS_PCIE2_IO_PHYS	0x91000000
+#define CONFIG_SYS_PCIE2_IO_SIZE	0x00100000
+#endif
+
+/* -------------------------------------------------------------------------
+ * 1. DRAM Speed
+ * #define CONFIG_DRAM_1333
+ * #define CONFIG_DRAM_1600        (default)
+ * #define CONFIG_DRAM_1866
+ *  2. UART5 message output
+ * #define	 CONFIG_DRAM_UART_38400
+ * 3. DRAM Type
+ * #define CONFIG_DDR3_8GSTACK     DDR3 8Gbit Stack die
+ * 4. ECC Function enable
+ * #define CONFIG_DRAM_ECC
+ */
+#define	CONFIG_DRAM_ECC_SIZE	0x10000000
+
+#endif	/* __CONFIG_H */
diff --git a/include/flash.h b/include/flash.h
index c6321a02ef8e..431f4ff47cfa 100644
--- a/include/flash.h
+++ b/include/flash.h
@@ -47,6 +47,23 @@ typedef struct {
 #ifdef CONFIG_MTD
 	struct mtd_info *mtd;
 #endif
+#ifdef CONFIG_AST_SPI_NOR
+	ulong 	reg_base;
+        ulong   readcmd;
+        ulong   dualport;
+	ulong	dummybyte;
+	ulong	tCK_Write;
+	ulong	tCK_Erase;
+	ulong	tCK_Read;
+	ulong	CE;
+	ulong 	sysspi;
+	ulong	iomode;
+	ulong   address32;
+	ulong   quadport;
+	ulong	dummydata;
+	ulong	buffersize;
+	ulong	specificspi;
+#endif
 } flash_info_t;
 
 extern flash_info_t flash_info[]; /* info for FLASH chips	*/
@@ -98,6 +115,10 @@ extern int flash_write (char *, ulong, ulong);
 extern flash_info_t *addr2info (ulong);
 extern int write_buff (flash_info_t *info, uchar *src, ulong addr, ulong cnt);
 
+#ifdef CONFIG_AST_SPI_NOR
+extern void memmove_dma(void * dest,const void *src,size_t count);
+#endif
+
 /* drivers/mtd/cfi_mtd.c */
 #ifdef CONFIG_FLASH_CFI_MTD
 extern int cfi_mtd_init(void);
diff --git a/include/spi.h b/include/spi.h
index 4b88d3986e78..8e22c5fe4faf 100644
--- a/include/spi.h
+++ b/include/spi.h
@@ -194,6 +194,8 @@ void *spi_do_alloc_slave(int offset, int size, unsigned int bus,
 struct spi_slave *spi_setup_slave(unsigned int bus, unsigned int cs,
 		unsigned int max_hz, unsigned int mode);
 
+void spi_dma(struct spi_slave *slave, void *to, void *from, size_t len);
+
 /**
  * Free any memory associated with a SPI slave.
  *
-- 
2.1.4

^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2016-06-04 21:33 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-06-04 20:55 [RFC PATCH uboot] ARM: AST2500: add support Cédric Le Goater

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.