summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--barebox-defaultenv/boot/sd16
-rw-r--r--barebox.config60
-rw-r--r--barebox_mlo.config41
-rw-r--r--patches/barebox-2012.07.0/0000-barebox-v2012.07.0-to-master.patch12305
-rw-r--r--patches/barebox-2012.07.0/0001-WIP-beaglebone-add-support-for-AM335x-and-board.patch3688
-rw-r--r--patches/barebox-2012.07.0/series2
-rw-r--r--patches/barebox-2012.11.0/0001-ARM-OMAP-AM33XX-create-new-ARCH-for-AM33xx.patch433
-rw-r--r--patches/barebox-2012.11.0/0002-pcm051-Add-inital-support.patch470
-rw-r--r--patches/barebox-2012.11.0/0003-WIP-beaglebone-add-first-stage-supprort-for-AM335x-a.patch2302
-rw-r--r--patches/barebox-2012.11.0/0004-Enable-Bone-i2c-mux.patch64
-rw-r--r--patches/barebox-2012.11.0/0005-update-env.patch48
-rw-r--r--patches/barebox-2012.11.0/series5
-rw-r--r--platformconfig9
13 files changed, 3390 insertions, 16053 deletions
diff --git a/barebox-defaultenv/boot/sd b/barebox-defaultenv/boot/sd
deleted file mode 100644
index f2916a9..0000000
--- a/barebox-defaultenv/boot/sd
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/bin/sh
-
-if [ "$1" = menu ]; then
- boot-menu-add-entry "$0" "kernel & rootfs on SD card"
- exit
-fi
-
-global.bootm.image=/boot/uImage
-#global.bootm.oftree=<path to oftree>
-#global.bootm.initrd=<path to initrd>
-
-#bootargs-root-nfs -n "<path on server>" -s <serverip>
-#bootargs-root-jffs2 -m <mtdname>
-#bootargs-root-ubi -r <volume> -m <mtdname>
-
-global.linux.bootargs.root="root=/dev/mmcblk0p2 rootfstype=ext4 rootwait rw"
diff --git a/barebox.config b/barebox.config
index 2e5e08f..3a51345 100644
--- a/barebox.config
+++ b/barebox.config
@@ -1,9 +1,7 @@
#
# Automatically generated file; DO NOT EDIT.
-# Barebox/arm 2012.07.0 Configuration
+# Barebox/arm 2012.11.0 Configuration
#
-# CONFIG_BOARD_LINKER_SCRIPT is not set
-CONFIG_GENERIC_LINKER_SCRIPT=y
CONFIG_ARM=y
CONFIG_ARM_LINUX=y
@@ -20,6 +18,7 @@ CONFIG_ARCH_OMAP=y
# CONFIG_ARCH_PXA is not set
# CONFIG_ARCH_S3C24xx is not set
# CONFIG_ARCH_S5PCxx is not set
+# CONFIG_ARCH_S3C64xx is not set
# CONFIG_ARCH_VERSATILE is not set
# CONFIG_ARCH_TEGRA is not set
@@ -39,19 +38,14 @@ CONFIG_BOARDINFO="Texas Instrument's Beagle Bone"
#
# OMAP Features
#
-CONFIG_OMAP3_LOWLEVEL_INIT=y
-CONFIG_ARCH_OMAP3=y
+# CONFIG_ARCH_OMAP3 is not set
# CONFIG_ARCH_OMAP4 is not set
-CONFIG_OMAP_CLOCK_ALL=y
-CONFIG_OMAP_CLOCK_SOURCE_S32K=y
-# CONFIG_OMAP3_CLOCK_CONFIG is not set
-# CONFIG_OMAP_GPMC is not set
+CONFIG_ARCH_AM33XX=y
+CONFIG_OMAP_CLOCK_SOURCE_DMTIMER0=y
# CONFIG_OMAP_BUILD_IFT is not set
-# CONFIG_MACH_OMAP343xSDP is not set
-# CONFIG_MACH_BEAGLE is not set
+# CONFIG_OMAP_BUILD_SPI is not set
CONFIG_MACH_BEAGLEBONE=y
-# CONFIG_MACH_OMAP3EVM is not set
-# CONFIG_MACH_PCAAL1 is not set
+# CONFIG_MACH_PCM051 is not set
CONFIG_AEABI=y
# CONFIG_THUMB2_BAREBOX is not set
@@ -75,7 +69,9 @@ CONFIG_BLOCK_WRITE=y
CONFIG_HAVE_NOSHELL=y
CONFIG_FILETYPE=y
CONFIG_BINFMT=y
+CONFIG_UIMAGE=y
CONFIG_GLOBALVAR=y
+CONFIG_STDDEV=y
#
# General Settings
@@ -83,11 +79,15 @@ CONFIG_GLOBALVAR=y
CONFIG_LOCALVERSION=""
CONFIG_LOCALVERSION_AUTO=y
CONFIG_BANNER=y
+CONFIG_MEMINFO=y
CONFIG_ENVIRONMENT_VARIABLES=y
#
# memory layout
#
+CONFIG_HAVE_PBL_IMAGE=y
+CONFIG_HAVE_IMAGE_COMPRESSION=y
+# CONFIG_PBL_IMAGE is not set
CONFIG_MMU=y
CONFIG_HAVE_CONFIGURABLE_TEXT_BASE=y
CONFIG_TEXT_BASE=0x81000000
@@ -103,7 +103,6 @@ CONFIG_MALLOC_SIZE=0x400000
CONFIG_MALLOC_DLMALLOC=y
# CONFIG_MALLOC_TLSF is not set
CONFIG_KALLSYMS=y
-CONFIG_ARCH_HAS_LOWLEVEL_INIT=y
CONFIG_PROMPT="barebox> "
CONFIG_BAUDRATE=115200
CONFIG_LONGHELP=y
@@ -133,8 +132,9 @@ CONFIG_DEFAULT_ENVIRONMENT=y
CONFIG_DEFAULT_ENVIRONMENT_GENERIC_NEW=y
# CONFIG_DEFAULT_ENVIRONMENT_GENERIC is not set
CONFIG_DEFAULT_ENVIRONMENT_PATH="arch/arm/boards/beaglebone/env"
-# CONFIG_BAREBOXENV_TARGET is not set
+CONFIG_BAREBOXENV_TARGET=y
# CONFIG_POLLER is not set
+# CONFIG_RESET_SOURCE is not set
#
# Debugging
@@ -163,6 +163,7 @@ CONFIG_CMD_LOADENV=y
CONFIG_CMD_EXPORT=y
CONFIG_CMD_PRINTENV=y
CONFIG_CMD_READLINE=y
+# CONFIG_CMD_LN is not set
CONFIG_CMD_TRUE=y
CONFIG_CMD_FALSE=y
CONFIG_CMD_MENU=y
@@ -188,6 +189,7 @@ CONFIG_CMD_UMOUNT=y
CONFIG_CMD_AUTOMOUNT=y
CONFIG_CMD_BASENAME=y
CONFIG_CMD_DIRNAME=y
+CONFIG_CMD_READLINK=y
#
# console
@@ -210,7 +212,6 @@ CONFIG_CMD_CRC_CMP=y
# CONFIG_CMD_SHA1SUM is not set
# CONFIG_CMD_SHA256SUM is not set
# CONFIG_CMD_SHA224SUM is not set
-# CONFIG_CMD_MTEST is not set
#
# flash
@@ -228,12 +229,22 @@ CONFIG_CMD_BOOTM_OFTREE=y
CONFIG_CMD_BOOTM_OFTREE_UIMAGE=y
# CONFIG_CMD_BOOTM_AIMAGE is not set
CONFIG_CMD_UIMAGE=y
-CONFIG_CMD_BOOTZ=y
+# CONFIG_CMD_BOOTZ is not set
CONFIG_CMD_BOOTU=y
CONFIG_FLEXIBLE_BOOTARGS=y
CONFIG_CMD_RESET=y
CONFIG_CMD_GO=y
CONFIG_CMD_OFTREE=y
+# CONFIG_CMD_OFTREE_PROBE is not set
+
+#
+# testing
+#
+# CONFIG_CMD_MTEST is not set
+
+#
+# video command
+#
CONFIG_CMD_TIMEOUT=y
CONFIG_CMD_PARTITION=y
CONFIG_CMD_TEST=y
@@ -281,7 +292,6 @@ CONFIG_DISK_WRITE=y
#
# CONFIG_DISK_INTF_PLATFORM_IDE is not set
# CONFIG_USB is not set
-# CONFIG_USB_GADGET is not set
# CONFIG_VIDEO is not set
CONFIG_MCI=y
@@ -300,6 +310,7 @@ CONFIG_MCI_OMAP_HSMMC=y
#
# MFD
#
+# CONFIG_MISC_DEVICES is not set
# CONFIG_LED is not set
#
@@ -316,21 +327,26 @@ CONFIG_MCI_OMAP_HSMMC=y
#
# DMA support
#
+CONFIG_GPIOLIB=y
+
+#
+# GPIO
+#
#
# Filesystem support
#
+CONFIG_FS=y
CONFIG_FS_AUTOMOUNT=y
# CONFIG_FS_CRAMFS is not set
CONFIG_FS_RAMFS=y
CONFIG_FS_DEVFS=y
-# CONFIG_FS_NFS is not set
CONFIG_FS_FAT=y
CONFIG_FS_FAT_WRITE=y
CONFIG_FS_FAT_LFN=y
#
-# Library routines
+# Library routines
#
CONFIG_PARAMETER=y
CONFIG_UNCOMPRESS=y
@@ -342,5 +358,9 @@ CONFIG_PROCESS_ESCAPE_SEQUENCE=y
CONFIG_FDT=y
CONFIG_OFTREE=y
CONFIG_QSORT=y
+
+#
+# Library gui routines
+#
CONFIG_CRC32=y
# CONFIG_DIGEST is not set
diff --git a/barebox_mlo.config b/barebox_mlo.config
index b83ffb1..5b53feb 100644
--- a/barebox_mlo.config
+++ b/barebox_mlo.config
@@ -1,9 +1,7 @@
#
# Automatically generated file; DO NOT EDIT.
-# Barebox/arm 2012.07.0 Configuration
+# Barebox/arm 2012.11.0 Configuration
#
-# CONFIG_BOARD_LINKER_SCRIPT is not set
-CONFIG_GENERIC_LINKER_SCRIPT=y
CONFIG_ARM=y
#
@@ -19,6 +17,7 @@ CONFIG_ARCH_OMAP=y
# CONFIG_ARCH_PXA is not set
# CONFIG_ARCH_S3C24xx is not set
# CONFIG_ARCH_S5PCxx is not set
+# CONFIG_ARCH_S3C64xx is not set
# CONFIG_ARCH_VERSATILE is not set
# CONFIG_ARCH_TEGRA is not set
@@ -38,19 +37,14 @@ CONFIG_BOARDINFO="Texas Instrument's Beagle Bone"
#
# OMAP Features
#
-CONFIG_OMAP3_LOWLEVEL_INIT=y
-CONFIG_ARCH_OMAP3=y
+# CONFIG_ARCH_OMAP3 is not set
# CONFIG_ARCH_OMAP4 is not set
-CONFIG_OMAP_CLOCK_ALL=y
-CONFIG_OMAP_CLOCK_SOURCE_S32K=y
-# CONFIG_OMAP3_CLOCK_CONFIG is not set
-# CONFIG_OMAP_GPMC is not set
+CONFIG_ARCH_AM33XX=y
+CONFIG_OMAP_CLOCK_SOURCE_DMTIMER0=y
CONFIG_OMAP_BUILD_IFT=y
-# CONFIG_MACH_OMAP343xSDP is not set
-# CONFIG_MACH_BEAGLE is not set
+# CONFIG_OMAP_BUILD_SPI is not set
CONFIG_MACH_BEAGLEBONE=y
-# CONFIG_MACH_OMAP3EVM is not set
-# CONFIG_MACH_PCAAL1 is not set
+# CONFIG_MACH_PCM051 is not set
CONFIG_ARM_ASM_UNIFIED=y
CONFIG_AEABI=y
CONFIG_THUMB2_BAREBOX=y
@@ -71,6 +65,7 @@ CONFIG_GENERIC_GPIO=y
CONFIG_BLOCK=y
CONFIG_BLOCK_WRITE=y
CONFIG_HAVE_NOSHELL=y
+CONFIG_FILETYPE=y
#
# General Settings
@@ -78,11 +73,15 @@ CONFIG_HAVE_NOSHELL=y
CONFIG_LOCALVERSION=""
CONFIG_LOCALVERSION_AUTO=y
CONFIG_BANNER=y
+CONFIG_MEMINFO=y
CONFIG_ENVIRONMENT_VARIABLES=y
#
# memory layout
#
+CONFIG_HAVE_PBL_IMAGE=y
+CONFIG_HAVE_IMAGE_COMPRESSION=y
+# CONFIG_PBL_IMAGE is not set
CONFIG_MMU=y
CONFIG_HAVE_CONFIGURABLE_TEXT_BASE=y
CONFIG_TEXT_BASE=0x402F0400
@@ -101,7 +100,6 @@ CONFIG_MALLOC_DLMALLOC=y
# CONFIG_MALLOC_TLSF is not set
# CONFIG_MALLOC_DUMMY is not set
# CONFIG_KALLSYMS is not set
-CONFIG_ARCH_HAS_LOWLEVEL_INIT=y
CONFIG_PROMPT="MLO>"
CONFIG_BAUDRATE=115200
CONFIG_SIMPLE_READLINE=y
@@ -171,7 +169,6 @@ CONFIG_DISK_WRITE=y
#
# CONFIG_DISK_INTF_PLATFORM_IDE is not set
# CONFIG_USB is not set
-# CONFIG_USB_GADGET is not set
# CONFIG_VIDEO is not set
CONFIG_MCI=y
@@ -189,6 +186,7 @@ CONFIG_MCI_OMAP_HSMMC=y
#
# MFD
#
+# CONFIG_MISC_DEVICES is not set
# CONFIG_LED is not set
#
@@ -205,24 +203,33 @@ CONFIG_MCI_OMAP_HSMMC=y
#
# DMA support
#
+CONFIG_GPIOLIB=y
+
+#
+# GPIO
+#
#
# Filesystem support
#
+CONFIG_FS=y
# CONFIG_FS_CRAMFS is not set
# CONFIG_FS_RAMFS is not set
# CONFIG_FS_DEVFS is not set
-# CONFIG_FS_NFS is not set
CONFIG_FS_FAT=y
# CONFIG_FS_FAT_WRITE is not set
CONFIG_FS_FAT_LFN=y
#
-# Library routines
+# Library routines
#
# CONFIG_ZLIB is not set
# CONFIG_BZLIB is not set
# CONFIG_GENERIC_FIND_NEXT_BIT is not set
# CONFIG_PROCESS_ESCAPE_SEQUENCE is not set
# CONFIG_LZO_DECOMPRESS is not set
+
+#
+# Library gui routines
+#
# CONFIG_DIGEST is not set
diff --git a/patches/barebox-2012.07.0/0000-barebox-v2012.07.0-to-master.patch b/patches/barebox-2012.07.0/0000-barebox-v2012.07.0-to-master.patch
deleted file mode 100644
index 4519124..0000000
--- a/patches/barebox-2012.07.0/0000-barebox-v2012.07.0-to-master.patch
+++ /dev/null
@@ -1,12305 +0,0 @@
-diff --git a/.gitignore b/.gitignore
-index df0ed2c..fd429fa 100644
---- a/.gitignore
-+++ b/.gitignore
-@@ -65,3 +65,4 @@ cscope.*
- *.patch
- scripts/gen_netx_image
- scripts/s5p_cksum
-+scripts/bareboxenv-target
-diff --git a/Makefile b/Makefile
-index 63da477..ebcf9bf 100644
---- a/Makefile
-+++ b/Makefile
-@@ -540,7 +540,7 @@ quiet_cmd_check_file_size = CHKSIZE $@
- max_size=`printf "%d" $2`; \
- if [ $$size -gt $$max_size ] ; \
- then \
-- echo "$@ size $$size > of the maximum size $$max_size"; \
-+ echo "$@ size $$size > of the maximum size $$max_size" >&2; \
- exit 1 ; \
- fi;
-
-@@ -1003,6 +1003,7 @@ CLEAN_DIRS += $(MODVERDIR)
- CLEAN_FILES += barebox System.map include/generated/barebox_default_env.h \
- .tmp_version .tmp_barebox* barebox.bin barebox.map barebox.S \
- .tmp_kallsyms* barebox_default_env* barebox.ldr \
-+ scripts/bareboxenv-target \
- Doxyfile.version barebox.srec barebox.s5p
-
- # Directories & files removed with 'make mrproper'
-diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
-index 3eada5b..af4cb59 100644
---- a/arch/arm/Kconfig
-+++ b/arch/arm/Kconfig
-@@ -135,7 +135,15 @@ config CMD_ARM_CPUINFO
- default y
- help
- Say yes here to get a cpuinfo command to show some
-- information about the cp15 registers
-+ CPU information using the cp15 registers
-+
-+config CMD_ARM_MMUINFO
-+ bool "mmuinfo command"
-+ depends on CPU_V7
-+ default n
-+ help
-+ Say yes here to get a mmuinfo command to show some
-+ MMU and cache information using the cp15 registers
-
- config CPU_V7_DCACHE_SKIP
- bool "Skip DCache Invalidate"
-diff --git a/arch/arm/Makefile b/arch/arm/Makefile
-index bd684dc..1225df7 100644
---- a/arch/arm/Makefile
-+++ b/arch/arm/Makefile
-@@ -136,6 +136,7 @@ board-$(CONFIG_MACH_TQMA53) := tqma53
- board-$(CONFIG_MACH_TX51) := karo-tx51
- board-$(CONFIG_MACH_MX6Q_ARM2) := freescale-mx6-arm2
- board-$(CONFIG_MACH_TOSHIBA_AC100) := toshiba-ac100
-+board-$(CONFIG_MACH_CCMX51) := ccxmx51
-
- machdirs := $(patsubst %,arch/arm/mach-%/,$(machine-y))
-
-diff --git a/arch/arm/boards/a9m2410/a9m2410.c b/arch/arm/boards/a9m2410/a9m2410.c
-index eaafdbd..e2044a9 100644
---- a/arch/arm/boards/a9m2410/a9m2410.c
-+++ b/arch/arm/boards/a9m2410/a9m2410.c
-@@ -32,6 +32,7 @@
- #include <partition.h>
- #include <nand.h>
- #include <io.h>
-+#include <mach/devices-s3c24xx.h>
- #include <mach/s3c-iomap.h>
- #include <mach/s3c24xx-nand.h>
- #include <mach/s3c-generic.h>
-@@ -109,8 +110,7 @@ static int a9m2410_devices_init(void)
- writel(reg, S3C_MISCCR);
-
- /* ----------- the devices the boot loader should work with -------- */
-- add_generic_device("s3c24x0_nand", DEVICE_ID_DYNAMIC, NULL, S3C24X0_NAND_BASE,
-- 0, IORESOURCE_MEM, &nand_info);
-+ s3c24xx_add_nand(&nand_info);
- /*
- * SMSC 91C111 network controller on the baseboard
- * connected to CS line 1 and interrupt line
-@@ -145,8 +145,7 @@ void __bare_init nand_boot(void)
-
- static int a9m2410_console_init(void)
- {
-- add_generic_device("s3c_serial", DEVICE_ID_DYNAMIC, NULL, S3C_UART1_BASE,
-- S3C_UART1_SIZE, IORESOURCE_MEM, NULL);
-+ s3c24xx_add_uart1();
- return 0;
- }
-
-diff --git a/arch/arm/boards/a9m2440/a9m2440.c b/arch/arm/boards/a9m2440/a9m2440.c
-index 1d20248..8975c15 100644
---- a/arch/arm/boards/a9m2440/a9m2440.c
-+++ b/arch/arm/boards/a9m2440/a9m2440.c
-@@ -32,6 +32,7 @@
- #include <partition.h>
- #include <nand.h>
- #include <io.h>
-+#include <mach/devices-s3c24xx.h>
- #include <mach/s3c-iomap.h>
- #include <mach/s3c24xx-nand.h>
- #include <mach/s3c-generic.h>
-@@ -129,8 +130,7 @@ static int a9m2440_devices_init(void)
- writel(reg, S3C_MISCCR);
-
- /* ----------- the devices the boot loader should work with -------- */
-- add_generic_device("s3c24x0_nand", DEVICE_ID_DYNAMIC, NULL, S3C24X0_NAND_BASE, 0,
-- IORESOURCE_MEM, &nand_info);
-+ s3c24xx_add_nand(&nand_info);
- /*
- * cs8900 network controller onboard
- * Connected to CS line 5 + A24 and interrupt line EINT9,
-@@ -164,8 +164,7 @@ void __bare_init nand_boot(void)
-
- static int a9m2440_console_init(void)
- {
-- add_generic_device("s3c_serial", DEVICE_ID_DYNAMIC, NULL, S3C_UART1_BASE,
-- S3C_UART1_SIZE, IORESOURCE_MEM, NULL);
-+ s3c24xx_add_uart1();
- return 0;
- }
-
-diff --git a/arch/arm/boards/ccxmx51/Makefile b/arch/arm/boards/ccxmx51/Makefile
-new file mode 100644
-index 0000000..249927e
---- /dev/null
-+++ b/arch/arm/boards/ccxmx51/Makefile
-@@ -0,0 +1,2 @@
-+obj-y += flash_header.o ccxmx51.o
-+obj-$(CONFIG_MACH_CCMX51_BASEBOARD) += ccxmx51js.o
-diff --git a/arch/arm/boards/ccxmx51/ccxmx51.c b/arch/arm/boards/ccxmx51/ccxmx51.c
-new file mode 100644
-index 0000000..f494174
---- /dev/null
-+++ b/arch/arm/boards/ccxmx51/ccxmx51.c
-@@ -0,0 +1,489 @@
-+/*
-+ * (C) Copyright 2009-2010 Digi International, Inc.
-+ * Copyright (C) 2007 Sascha Hauer, Pengutronix
-+ * (c) 2011 Eukrea Electromatique, Eric BĂ©nard <eric@eukrea.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 <net.h>
-+#include <init.h>
-+#include <environment.h>
-+#include <mach/imx-regs.h>
-+#include <fec.h>
-+#include <mach/gpio.h>
-+#include <asm/armlinux.h>
-+#include <generated/mach-types.h>
-+#include <partition.h>
-+#include <fs.h>
-+#include <fcntl.h>
-+#include <sizes.h>
-+#include <nand.h>
-+#include <notifier.h>
-+#include <spi/spi.h>
-+#include <mfd/mc13xxx.h>
-+#include <asm/io.h>
-+#include <mach/imx-nand.h>
-+#include <mach/spi.h>
-+#include <mach/generic.h>
-+#include <mach/iomux-mx51.h>
-+#include <mach/devices-imx51.h>
-+#include <mach/iim.h>
-+#include <mach/clock-imx51_53.h>
-+#include <mach/imx5.h>
-+
-+#include "ccxmx51.h"
-+
-+static struct ccxmx51_ident ccxmx51_ids[] = {
-+/* 0x00 */ { "Unknown", 0, 0, 0, 0, 0 },
-+/* 0x01 */ { "Not supported", 0, 0, 0, 0, 0 },
-+/* 0x02 */ { "i.MX515@800MHz, Wireless, PHY, Ext. Eth, Accel", SZ_512M, 0, 1, 1, 1 },
-+/* 0x03 */ { "i.MX515@800MHz, PHY, Ext. Eth, Accel", SZ_512M, 0, 1, 1, 0 },
-+/* 0x04 */ { "i.MX515@600MHz, Wireless, PHY, Ext. Eth, Accel", SZ_512M, 1, 1, 1, 1 },
-+/* 0x05 */ { "i.MX515@600MHz, PHY, Ext. Eth, Accel", SZ_512M, 1, 1, 1, 0 },
-+/* 0x06 */ { "i.MX515@800MHz, Wireless, PHY, Accel", SZ_512M, 0, 1, 0, 1 },
-+/* 0x07 */ { "i.MX515@800MHz, PHY, Accel", SZ_512M, 0, 1, 0, 0 },
-+/* 0x08 */ { "i.MX515@800MHz, Wireless, PHY, Accel", SZ_256M, 0, 1, 0, 1 },
-+/* 0x09 */ { "i.MX515@800MHz, PHY, Accel", SZ_256M, 0, 1, 0, 0 },
-+/* 0x0a */ { "i.MX515@600MHz, Wireless, PHY, Accel", SZ_256M, 1, 1, 0, 1 },
-+/* 0x0b */ { "i.MX515@600MHz, PHY, Accel", SZ_256M, 1, 1, 0, 0 },
-+/* 0x0c */ { "i.MX515@800MHz, Wireless, PHY, Accel", SZ_128M, 0, 1, 0, 1 },
-+/* 0x0d */ { "i.MX512@800MHz", SZ_128M, 0, 0, 0, 0 },
-+/* 0x0e */ { "i.MX515@800MHz, Wireless, PHY, Accel", SZ_512M, 0, 1, 0, 1 },
-+/* 0x0f */ { "i.MX515@600MHz, PHY, Accel", SZ_128M, 1, 1, 0, 0 },
-+/* 0x10 */ { "i.MX515@600MHz, Wireless, PHY, Accel", SZ_128M, 1, 1, 0, 1 },
-+/* 0x11 */ { "i.MX515@800MHz, PHY, Accel", SZ_128M, 0, 1, 0, 0 },
-+/* 0x12 */ { "i.MX515@600MHz, Wireless, PHY, Accel", SZ_512M, 1, 1, 0, 1 },
-+/* 0x13 */ { "i.MX515@800MHz, PHY, Accel", SZ_512M, 0, 1, 0, 0 },
-+};
-+
-+struct ccxmx51_ident *ccxmx51_id;
-+
-+struct imx_nand_platform_data nand_info = {
-+ .width = 1,
-+ .hw_ecc = 1,
-+ .flash_bbt = 1,
-+};
-+
-+#ifdef CONFIG_DRIVER_NET_FEC_IMX
-+static struct fec_platform_data fec_info = {
-+ .xcv_type = MII100,
-+ .phy_addr = 7,
-+};
-+#endif
-+
-+static iomux_v3_cfg_t ccxmx51_pads[] = {
-+ /* UART1 */
-+ MX51_PAD_UART1_RXD__UART1_RXD,
-+ MX51_PAD_UART1_TXD__UART1_TXD,
-+ /* UART2 */
-+ MX51_PAD_UART2_RXD__UART2_RXD,
-+ MX51_PAD_UART2_TXD__UART2_TXD,
-+ /* UART3 */
-+ MX51_PAD_UART3_RXD__UART3_RXD,
-+ MX51_PAD_UART3_TXD__UART3_TXD,
-+ /* I2C2 */
-+ MX51_PAD_GPIO1_2__I2C2_SCL,
-+ MX51_PAD_GPIO1_3__I2C2_SDA,
-+ /* eCSPI1 */
-+ MX51_PAD_CSPI1_MOSI__ECSPI1_MOSI,
-+ MX51_PAD_CSPI1_MISO__ECSPI1_MISO,
-+ MX51_PAD_CSPI1_SCLK__ECSPI1_SCLK,
-+ MX51_PAD_CSPI1_RDY__ECSPI1_RDY,
-+ MX51_PAD_CSPI1_SS0__ECSPI1_SS0,
-+ MX51_PAD_CSPI1_SS1__ECSPI1_SS1,
-+ /* FEC */
-+ MX51_PAD_DISP2_DAT14__FEC_RDATA0,
-+ MX51_PAD_DI2_DISP_CLK__FEC_RDATA1,
-+ MX51_PAD_DI_GP4__FEC_RDATA2,
-+ MX51_PAD_DISP2_DAT0__FEC_RDATA3,
-+ MX51_PAD_DISP2_DAT15__FEC_TDATA0,
-+ MX51_PAD_DISP2_DAT6__FEC_TDATA1,
-+ MX51_PAD_DISP2_DAT7__FEC_TDATA2,
-+ MX51_PAD_DISP2_DAT8__FEC_TDATA3,
-+ MX51_PAD_DISP2_DAT9__FEC_TX_EN,
-+ MX51_PAD_DISP2_DAT10__FEC_COL,
-+ MX51_PAD_DISP2_DAT11__FEC_RX_CLK,
-+ MX51_PAD_DISP2_DAT12__FEC_RX_DV,
-+ MX51_PAD_DISP2_DAT13__FEC_TX_CLK,
-+ MX51_PAD_DI2_PIN2__FEC_MDC,
-+ MX51_PAD_DI2_PIN4__FEC_CRS,
-+ MX51_PAD_DI2_PIN3__FEC_MDIO,
-+ MX51_PAD_DI_GP3__FEC_TX_ER,
-+ MX51_PAD_DISP2_DAT1__FEC_RX_ER,
-+ /* WEIM */
-+ MX51_PAD_EIM_DA0__EIM_DA0,
-+ MX51_PAD_EIM_DA1__EIM_DA1,
-+ MX51_PAD_EIM_DA2__EIM_DA2,
-+ MX51_PAD_EIM_DA3__EIM_DA3,
-+ MX51_PAD_EIM_DA4__EIM_DA4,
-+ MX51_PAD_EIM_DA5__EIM_DA5,
-+ MX51_PAD_EIM_DA6__EIM_DA6,
-+ MX51_PAD_EIM_DA7__EIM_DA7,
-+ MX51_PAD_EIM_D16__EIM_D16,
-+ MX51_PAD_EIM_D17__EIM_D17,
-+ MX51_PAD_EIM_D18__EIM_D18,
-+ MX51_PAD_EIM_D19__EIM_D19,
-+ MX51_PAD_EIM_D20__EIM_D20,
-+ MX51_PAD_EIM_D21__EIM_D21,
-+ MX51_PAD_EIM_D22__EIM_D22,
-+ MX51_PAD_EIM_D23__EIM_D23,
-+ MX51_PAD_EIM_D24__EIM_D24,
-+ MX51_PAD_EIM_D25__EIM_D25,
-+ MX51_PAD_EIM_D26__EIM_D26,
-+ MX51_PAD_EIM_D27__EIM_D27,
-+ MX51_PAD_EIM_D28__EIM_D28,
-+ MX51_PAD_EIM_D29__EIM_D29,
-+ MX51_PAD_EIM_D30__EIM_D30,
-+ MX51_PAD_EIM_D31__EIM_D31,
-+ MX51_PAD_EIM_OE__EIM_OE,
-+ MX51_PAD_EIM_CS5__EIM_CS5,
-+ /* NAND */
-+ MX51_PAD_NANDF_D0__NANDF_D0,
-+ MX51_PAD_NANDF_D1__NANDF_D1,
-+ MX51_PAD_NANDF_D2__NANDF_D2,
-+ MX51_PAD_NANDF_D3__NANDF_D3,
-+ MX51_PAD_NANDF_D4__NANDF_D4,
-+ MX51_PAD_NANDF_D5__NANDF_D5,
-+ MX51_PAD_NANDF_D6__NANDF_D6,
-+ MX51_PAD_NANDF_D7__NANDF_D7,
-+ MX51_PAD_NANDF_ALE__NANDF_ALE,
-+ MX51_PAD_NANDF_CLE__NANDF_CLE,
-+ MX51_PAD_NANDF_RE_B__NANDF_RE_B,
-+ MX51_PAD_NANDF_WE_B__NANDF_WE_B,
-+ MX51_PAD_NANDF_WP_B__NANDF_WP_B,
-+ MX51_PAD_NANDF_CS0__NANDF_CS0,
-+ MX51_PAD_NANDF_RB0__NANDF_RB0,
-+ /* LAN9221 IRQ (GPIO1.9) */
-+ MX51_PAD_GPIO1_9__GPIO1_9,
-+ /* MC13892 IRQ (GPIO1.5) */
-+ MX51_PAD_GPIO1_5__GPIO1_5,
-+ /* MMA7455LR IRQ1 (GPIO1.7) */
-+ MX51_PAD_GPIO1_7__GPIO1_7,
-+ /* MMA7455LR IRQ2 (GPIO1.6) */
-+ MX51_PAD_GPIO1_6__GPIO1_6,
-+};
-+
-+#define CCXMX51_ECSPI1_CS0 IMX_GPIO_NR(4, 24)
-+#define CCXMX51_ECSPI1_CS1 IMX_GPIO_NR(4, 25)
-+
-+static int ecspi_0_cs[] = { CCXMX51_ECSPI1_CS0, CCXMX51_ECSPI1_CS1, };
-+
-+static struct spi_imx_master ecspi_0_data = {
-+ .chipselect = ecspi_0_cs,
-+ .num_chipselect = ARRAY_SIZE(ecspi_0_cs),
-+};
-+
-+static const struct spi_board_info ccxmx51_spi_board_info[] = {
-+ {
-+ .name = "mc13xxx-spi",
-+ .max_speed_hz = 6000000,
-+ .bus_num = 0,
-+ .chip_select = 0,
-+ },
-+};
-+
-+static int ccxmx51_mem_init(void)
-+{
-+ /* Add minimal SDRAM first */
-+ arm_add_mem_device("ram0", MX51_CSD0_BASE_ADDR, SZ_128M);
-+
-+ return 0;
-+}
-+mem_initcall(ccxmx51_mem_init);
-+
-+static void ccxmx51_otghost_init(void)
-+{
-+#define MX51_USBOTHER_REGS_OFFSET 0x800
-+#define MX51_USBCTRL_OFFSET 0x0
-+#define MX51_USB_PHY_CTR_FUNC_OFFSET 0x8
-+#define MX51_USB_PHY_CTR_FUNC2_OFFSET 0xc
-+#define MX51_USB_UTMI_PHYCTRL1_PLLDIV_MASK 0x3
-+#define MX51_USB_PLL_DIV_19_2_MHZ 0x00
-+#define MX51_USB_PLL_DIV_24_MHZ 0x01
-+#define MX51_USB_PLL_DIV_26_MHZ 0x02
-+#define MX51_USB_PLL_DIV_27_MHZ 0x03
-+#define MX51_OTG_PHYCTRL_OC_DIS_BIT (1 << 8)
-+#define MX51_OTG_UCTRL_OWIE_BIT (1 << 27)
-+#define MX51_OTG_UCTRL_OPM_BIT (1 << 24)
-+
-+#define USBOTHER_BASE (MX51_OTG_BASE_ADDR + MX51_USBOTHER_REGS_OFFSET)
-+
-+ u32 reg;
-+
-+ /* Set sysclock to 24 MHz */
-+ reg = readl(USBOTHER_BASE + MX51_USB_PHY_CTR_FUNC2_OFFSET);
-+ reg &= ~MX51_USB_UTMI_PHYCTRL1_PLLDIV_MASK;
-+ reg |= MX51_USB_PLL_DIV_24_MHZ;
-+ writel(reg, USBOTHER_BASE + MX51_USB_PHY_CTR_FUNC2_OFFSET);
-+
-+ /* OC is not used */
-+ reg = readl(USBOTHER_BASE + MX51_USB_PHY_CTR_FUNC_OFFSET);
-+ reg |= MX51_OTG_PHYCTRL_OC_DIS_BIT;
-+ writel(reg, USBOTHER_BASE + MX51_USB_PHY_CTR_FUNC_OFFSET);
-+
-+ /* Power pins enable */
-+ reg = readl(USBOTHER_BASE + MX51_USBCTRL_OFFSET);
-+ reg |= MX51_OTG_UCTRL_OWIE_BIT | MX51_OTG_UCTRL_OPM_BIT;
-+ writel(reg, USBOTHER_BASE + MX51_USBCTRL_OFFSET);
-+
-+ /* Setup PORTSC */
-+ reg = readl(MX51_OTG_BASE_ADDR + 0x184);
-+ reg &= ~(3 << 30);
-+ reg |= 1 << 28;
-+ writel(reg, MX51_OTG_BASE_ADDR + 0x184);
-+
-+ mdelay(10);
-+
-+ add_generic_usb_ehci_device(0, MX51_OTG_BASE_ADDR, NULL);
-+}
-+
-+static int ccxmx51_power_init(void)
-+{
-+ struct mc13xxx *mc13xxx_dev;
-+ u32 val;
-+
-+ mc13xxx_dev = mc13xxx_get();
-+ if (!mc13xxx_dev)
-+ return -ENODEV;
-+
-+ mc13xxx_reg_read(mc13xxx_dev, MC13892_REG_POWER_MISC, &val);
-+ /* Reset devices by clearing GP01-GPO4 */
-+ val &= ~((1 << 21) | (3 << 12) | (3 << 10) | (3 << 8) | (3 << 6));
-+ /* Switching off the PWGT1SPIEN */
-+ val |= (1 << 15);
-+ /* Switching on the PWGT2SPIEN */
-+ val &= ~(1 << 16);
-+ /* Enable short circuit protection */
-+ val |= (1 << 0);
-+ mc13xxx_reg_write(mc13xxx_dev, MC13892_REG_POWER_MISC, val);
-+
-+ /* Allow charger to charge (4.2V and 560mA) */
-+ val = 0x238033;
-+ mc13xxx_reg_write(mc13xxx_dev, MC13892_REG_CHARGE, val);
-+
-+ /* Set core voltage (SW1) to 1.1V */
-+ mc13xxx_reg_read(mc13xxx_dev, MC13892_REG_SW_0, &val);
-+ val &= ~0x00001f;
-+ val |= 0x000014;
-+ mc13xxx_reg_write(mc13xxx_dev, MC13892_REG_SW_0, val);
-+
-+ if (imx_silicon_revision() < IMX_CHIP_REV_3_0) {
-+ /* Setup VCC (SW2) to 1.25 */
-+ mc13xxx_reg_read(mc13xxx_dev, MC13892_REG_SW_1, &val);
-+ val &= ~0x00001f;
-+ val |= 0x00001a;
-+ mc13xxx_reg_write(mc13xxx_dev, MC13892_REG_SW_1, val);
-+
-+ /* Setup 1V2_DIG1 (SW3) to 1.25 */
-+ mc13xxx_reg_read(mc13xxx_dev, MC13892_REG_SW_2, &val);
-+ val &= ~0x00001f;
-+ val |= 0x00001a;
-+ mc13xxx_reg_write(mc13xxx_dev, MC13892_REG_SW_2, val);
-+ } else {
-+ /* Setup VCC (SW2) to 1.225 */
-+ mc13xxx_reg_read(mc13xxx_dev, MC13892_REG_SW_1, &val);
-+ val &= ~0x00001f;
-+ val |= 0x000019;
-+ mc13xxx_reg_write(mc13xxx_dev, MC13892_REG_SW_1, val);
-+
-+ /* Setup 1V2_DIG1 (SW3) to 1.2 */
-+ mc13xxx_reg_read(mc13xxx_dev, MC13892_REG_SW_2, &val);
-+ val &= ~0x00001f;
-+ val |= 0x000018;
-+ mc13xxx_reg_write(mc13xxx_dev, MC13892_REG_SW_2, val);
-+ }
-+
-+ if (mc13xxx_dev->revision <= MC13892_REVISION_2_0) {
-+ /* Set switchers in PWM mode for Atlas 2.0 and lower */
-+ /* Setup the switcher mode for SW1 & SW2*/
-+ mc13xxx_reg_read(mc13xxx_dev, MC13892_REG_SW_4, &val);
-+ val &= ~0x003c0f;
-+ val |= 0x001405;
-+ mc13xxx_reg_write(mc13xxx_dev, MC13892_REG_SW_4, val);
-+
-+ /* Setup the switcher mode for SW3 & SW4 */
-+ mc13xxx_reg_read(mc13xxx_dev, MC13892_REG_SW_5, &val);
-+ val &= ~0x000f0f;
-+ val |= 0x000505;
-+ mc13xxx_reg_write(mc13xxx_dev, MC13892_REG_SW_5, val);
-+ } else {
-+ /* Set switchers in Auto in NORMAL mode & STANDBY mode for Atlas 2.0a */
-+ /* Setup the switcher mode for SW1 & SW2*/
-+ mc13xxx_reg_read(mc13xxx_dev, MC13892_REG_SW_4, &val);
-+ val &= ~0x003c0f;
-+ val |= 0x002008;
-+ mc13xxx_reg_write(mc13xxx_dev, MC13892_REG_SW_4, val);
-+
-+ /* Setup the switcher mode for SW3 & SW4 */
-+ mc13xxx_reg_read(mc13xxx_dev, MC13892_REG_SW_5, &val);
-+ val &= ~0x000f0f;
-+ val |= 0x000808;
-+ mc13xxx_reg_write(mc13xxx_dev, MC13892_REG_SW_5, val);
-+ }
-+
-+ /* Set VVIDEO to 2.775V, VAUDIO to 3V, VSD to 3.15V */
-+ mc13xxx_reg_read(mc13xxx_dev, MC13892_REG_SETTING_1, &val);
-+ val &= ~0x0001fc;
-+ val |= 0x0001f4;
-+ mc13xxx_reg_write(mc13xxx_dev, MC13892_REG_SETTING_1, val);
-+
-+ /* Configure VGEN3 and VCAM regulators to use external PNP */
-+ val = 0x000208;
-+ mc13xxx_reg_write(mc13xxx_dev, MC13892_REG_MODE_1, val);
-+ udelay(200);
-+
-+ /* Set VGEN3 to 1.8V */
-+ mc13xxx_reg_read(mc13xxx_dev, MC13892_REG_SETTING_0, &val);
-+ val &= ~(1 << 14);
-+ mc13xxx_reg_write(mc13xxx_dev, MC13892_REG_SETTING_0, val);
-+
-+ /* Enable VGEN3, VCAM, VAUDIO, VVIDEO, VSD regulators */
-+ val = 0x049249;
-+ mc13xxx_reg_write(mc13xxx_dev, MC13892_REG_MODE_1, val);
-+
-+ /* Enable USB1 charger */
-+ val = 0x000409;
-+ mc13xxx_reg_write(mc13xxx_dev, MC13892_REG_USB1, val);
-+
-+ /* Set VCOIN to 3.0V and Enable It */
-+ mc13xxx_reg_read(mc13xxx_dev, MC13892_REG_POWER_CTL0, &val);
-+ val &= ~(7 << 20);
-+ val |= (4 << 20) | (1 << 23);
-+ mc13xxx_reg_write(mc13xxx_dev, MC13892_REG_POWER_CTL0, val);
-+ /* Keeps VSRTC and CLK32KMCU */
-+ val |= (1 << 4);
-+ mc13xxx_reg_write(mc13xxx_dev, MC13892_REG_POWER_CTL0, val);
-+
-+ /* De-assert reset of external devices on GP01, GPO2, GPO3 and GPO4 */
-+ mc13xxx_reg_read(mc13xxx_dev, MC13892_REG_POWER_MISC, &val);
-+ /* GPO1 - External */
-+ /* GP02 - LAN9221 */
-+ /* GP03 - FEC */
-+ /* GP04 - Wireless */
-+ if (IS_ENABLED(CONFIG_DRIVER_NET_SMC911X) && ccxmx51_id->eth0)
-+ val |= (1 << 8);
-+ if (IS_ENABLED(CONFIG_DRIVER_NET_FEC_IMX) && ccxmx51_id->eth1)
-+ val |= (1 << 10);
-+ if (ccxmx51_id->wless)
-+ val |= (1 << 12);
-+ mc13xxx_reg_write(mc13xxx_dev, MC13892_REG_POWER_MISC, val);
-+
-+ udelay(100);
-+
-+ return 0;
-+}
-+
-+static int ccxmx51_devices_init(void)
-+{
-+ u8 hwid[6];
-+ int pwr;
-+ char manloc;
-+
-+ if ((imx_iim_read(1, 9, hwid, sizeof(hwid)) != sizeof(hwid)) || (hwid[0] < 0x02) || (hwid[0] >= ARRAY_SIZE(ccxmx51_ids)))
-+ memset(hwid, 0x00, sizeof(hwid));
-+
-+ ccxmx51_id = &ccxmx51_ids[hwid[0]];
-+ printf("Module Variant: %s (0x%02x)\n", ccxmx51_id->id_string, hwid[0]);
-+
-+ if (hwid[0]) {
-+ printf("Module HW Rev : %02x\n", hwid[1]);
-+ switch (hwid[2] & 0xc0) {
-+ case 0x00:
-+ manloc = 'B';
-+ break;
-+ case 0x40:
-+ manloc = 'W';
-+ break;
-+ case 0x80:
-+ manloc = 'S';
-+ break;
-+ default:
-+ manloc = 'N';
-+ break;
-+ }
-+ printf("Module Serial : %c%d\n", manloc, ((hwid[2] & 0x3f) << 24) | (hwid[3] << 16) | (hwid[4] << 8) | hwid[5]);
-+ if ((ccxmx51_id->mem_sz - SZ_128M) > 0)
-+ arm_add_mem_device("ram1", MX51_CSD0_BASE_ADDR + SZ_128M, ccxmx51_id->mem_sz - SZ_128M);
-+ }
-+
-+ imx51_add_uart1();
-+ imx51_add_uart2();
-+
-+ spi_register_board_info(ccxmx51_spi_board_info, ARRAY_SIZE(ccxmx51_spi_board_info));
-+ imx51_add_spi0(&ecspi_0_data);
-+
-+ pwr = ccxmx51_power_init();
-+ console_flush();
-+ imx51_init_lowlevel((ccxmx51_id->industrial || pwr) ? 600 : 800);
-+ clock_notifier_call_chain();
-+ if (pwr)
-+ printf("Could not setup PMIC. Clocks not adjusted.\n");
-+
-+ imx51_add_i2c1(NULL);
-+
-+ imx51_add_nand(&nand_info);
-+ devfs_add_partition("nand0", 0x00000, 0x80000, DEVFS_PARTITION_FIXED, "self_raw");
-+ dev_add_bb_dev("self_raw", "self0");
-+ devfs_add_partition("nand0", 0x80000, 0x40000, DEVFS_PARTITION_FIXED, "env_raw");
-+ dev_add_bb_dev("env_raw", "env0");
-+
-+#ifdef CONFIG_DRIVER_NET_FEC_IMX
-+ if (ccxmx51_id->eth0 && !pwr) {
-+ imx51_add_fec(&fec_info);
-+ eth_register_ethaddr(0, hwid);
-+ }
-+#endif
-+
-+#ifdef CONFIG_DRIVER_NET_SMC911X
-+ if (ccxmx51_id->eth1 && !pwr) {
-+ /* Configure the WEIM CS5 timming, bus width, etc */
-+ /* 16 bit on DATA[31..16], not multiplexed, async */
-+ writel(0x00420081, MX51_WEIM_BASE_ADDR + WEIM_CSxGCR1(5));
-+ /* ADH has not effect on non muxed bus */
-+ writel(0, MX51_WEIM_BASE_ADDR + WEIM_CSxGCR2(5));
-+ /* RWSC=50, RADVA=2, RADVN=6, OEA=0, OEN=0, RCSA=0, RCSN=0 */
-+ writel(0x32260000, MX51_WEIM_BASE_ADDR + WEIM_CSxRCR1(5));
-+ /* APR=0 */
-+ writel(0, MX51_WEIM_BASE_ADDR + WEIM_CSxRCR2(5));
-+ /* WAL=0, WBED=1, WWSC=50, WADVA=2, WADVN=6, WEA=0, WEN=0, WCSA=0 */
-+ writel(0x72080f00, MX51_WEIM_BASE_ADDR + WEIM_CSxWCR1(5));
-+
-+ /* LAN9221 network controller */
-+ add_generic_device("smc911x", 1, NULL, MX51_CS5_BASE_ADDR, SZ_4K, IORESOURCE_MEM, NULL);
-+ }
-+#endif
-+
-+ ccxmx51_otghost_init();
-+
-+ armlinux_set_bootparams((void *)(MX51_CSD0_BASE_ADDR + 0x100));
-+
-+ armlinux_set_architecture(ccxmx51_id->wless ? MACH_TYPE_CCWMX51 : MACH_TYPE_CCMX51);
-+
-+ return 0;
-+}
-+device_initcall(ccxmx51_devices_init);
-+
-+static int ccxmx51_console_init(void)
-+{
-+ mxc_iomux_v3_setup_multiple_pads(ccxmx51_pads, ARRAY_SIZE(ccxmx51_pads));
-+
-+ imx51_add_uart0();
-+
-+ return 0;
-+}
-+console_initcall(ccxmx51_console_init);
-diff --git a/arch/arm/boards/ccxmx51/ccxmx51.dox b/arch/arm/boards/ccxmx51/ccxmx51.dox
-new file mode 100644
-index 0000000..cc28e8d
---- /dev/null
-+++ b/arch/arm/boards/ccxmx51/ccxmx51.dox
-@@ -0,0 +1,7 @@
-+/** @page ccxmx51 Digi ConnectCore board
-+
-+This boards is based on a Freescale i.MX51 CPU. The board is shipped with:
-+- Up to 8 GB NAND Flash.
-+- Up to 512 MB DDR2 RAM.
-+
-+*/
-diff --git a/arch/arm/boards/ccxmx51/ccxmx51.h b/arch/arm/boards/ccxmx51/ccxmx51.h
-new file mode 100644
-index 0000000..3feacac
---- /dev/null
-+++ b/arch/arm/boards/ccxmx51/ccxmx51.h
-@@ -0,0 +1,35 @@
-+/*
-+ * Copyright 2010 Digi International Inc. All Rights Reserved.
-+ */
-+
-+/*
-+ * The code contained herein is licensed under the GNU General Public
-+ * License. You may obtain a copy of the GNU General Public License
-+ * Version 2 or later at the following locations:
-+ *
-+ * http://www.opensource.org/licenses/gpl-license.html
-+ * http://www.gnu.org/copyleft/gpl.html
-+ */
-+
-+#ifndef _CCXMX51_H_
-+#define _CCXMX51_H_
-+
-+struct ccxmx51_hwid {
-+ u8 variant;
-+ u8 version;
-+ u32 sn;
-+ char mloc;
-+};
-+
-+struct ccxmx51_ident {
-+ const char *id_string;
-+ const int mem_sz;
-+ const char industrial;
-+ const char eth0;
-+ const char eth1;
-+ const char wless;
-+};
-+
-+extern struct ccxmx51_ident *ccxmx51_id;
-+
-+#endif /* _CCXMX51_H_ */
-diff --git a/arch/arm/boards/ccxmx51/ccxmx51js.c b/arch/arm/boards/ccxmx51/ccxmx51js.c
-new file mode 100644
-index 0000000..f04615d
---- /dev/null
-+++ b/arch/arm/boards/ccxmx51/ccxmx51js.c
-@@ -0,0 +1,90 @@
-+/*
-+ * 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 <io.h>
-+#include <init.h>
-+#include <mci.h>
-+#include <asm/armlinux.h>
-+#include <mach/imx-regs.h>
-+#include <mach/iomux-mx51.h>
-+#include <mach/devices-imx51.h>
-+#include <generated/mach-types.h>
-+
-+#include "ccxmx51.h"
-+
-+static iomux_v3_cfg_t ccxmx51js_pads[] = {
-+ /* SD1 */
-+ MX51_PAD_SD1_CLK__SD1_CLK,
-+ MX51_PAD_SD1_CMD__SD1_CMD,
-+ MX51_PAD_SD1_DATA0__SD1_DATA0,
-+ MX51_PAD_SD1_DATA1__SD1_DATA1,
-+ MX51_PAD_SD1_DATA2__SD1_DATA2,
-+ MX51_PAD_SD1_DATA3__SD1_DATA3,
-+ /* SD3 */
-+ MX51_PAD_NANDF_CS7__SD3_CLK,
-+ MX51_PAD_NANDF_RDY_INT__SD3_CMD,
-+ MX51_PAD_NANDF_D8__SD3_DATA0,
-+ MX51_PAD_NANDF_D9__SD3_DATA1,
-+ MX51_PAD_NANDF_D10__SD3_DATA2,
-+ MX51_PAD_NANDF_D11__SD3_DATA3,
-+ MX51_PAD_NANDF_D12__SD3_DAT4,
-+ MX51_PAD_NANDF_D13__SD3_DAT5,
-+ MX51_PAD_NANDF_D14__SD3_DAT6,
-+ MX51_PAD_NANDF_D15__SD3_DAT7,
-+ /* USB HOST1 */
-+ MX51_PAD_USBH1_CLK__USBH1_CLK,
-+ MX51_PAD_USBH1_DIR__USBH1_DIR,
-+ MX51_PAD_USBH1_NXT__USBH1_NXT,
-+ MX51_PAD_USBH1_STP__USBH1_STP,
-+ MX51_PAD_USBH1_DATA0__USBH1_DATA0,
-+ MX51_PAD_USBH1_DATA1__USBH1_DATA1,
-+ MX51_PAD_USBH1_DATA2__USBH1_DATA2,
-+ MX51_PAD_USBH1_DATA3__USBH1_DATA3,
-+ MX51_PAD_USBH1_DATA4__USBH1_DATA4,
-+ MX51_PAD_USBH1_DATA5__USBH1_DATA5,
-+ MX51_PAD_USBH1_DATA6__USBH1_DATA6,
-+ MX51_PAD_USBH1_DATA7__USBH1_DATA7,
-+};
-+
-+static struct esdhc_platform_data sdhc1_pdata = {
-+ .cd_type = ESDHC_CD_NONE,
-+ .wp_type = ESDHC_WP_NONE,
-+ .caps = MMC_MODE_4BIT,
-+};
-+
-+static struct esdhc_platform_data sdhc3_pdata = {
-+ .cd_type = ESDHC_CD_NONE,
-+ .wp_type = ESDHC_WP_NONE,
-+ .caps = MMC_MODE_4BIT | MMC_MODE_8BIT,
-+};
-+
-+static int ccxmx51js_init(void)
-+{
-+ mxc_iomux_v3_setup_multiple_pads(ccxmx51js_pads, ARRAY_SIZE(ccxmx51js_pads));
-+
-+ if (IS_ENABLED(CONFIG_MCI_IMX_ESDHC)) {
-+ imx51_add_mmc0(&sdhc1_pdata);
-+ imx51_add_mmc2(&sdhc3_pdata);
-+ }
-+
-+ armlinux_set_architecture(ccxmx51_id->wless ? MACH_TYPE_CCWMX51JS : MACH_TYPE_CCMX51JS);
-+
-+ return 0;
-+}
-+
-+late_initcall(ccxmx51js_init);
-diff --git a/arch/arm/boards/ccxmx51/config.h b/arch/arm/boards/ccxmx51/config.h
-new file mode 100644
-index 0000000..fdf2f81
---- /dev/null
-+++ b/arch/arm/boards/ccxmx51/config.h
-@@ -0,0 +1,24 @@
-+/**
-+ * @file
-+ * @brief Global defintions for the ARM i.MX51 based ccmx51 board
-+ *
-+ * 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
-+
-+#endif /* __CONFIG_H */
-diff --git a/arch/arm/boards/ccxmx51/env/config b/arch/arm/boards/ccxmx51/env/config
-new file mode 100644
-index 0000000..bbd43e7
---- /dev/null
-+++ b/arch/arm/boards/ccxmx51/env/config
-@@ -0,0 +1,37 @@
-+#!/bin/sh
-+
-+machine=ccmx51
-+
-+# use 'dhcp' to do dhcp in barebox and in kernel
-+# use 'none' if you want to skip kernel ip autoconfiguration
-+ip=none
-+
-+# or set your networking parameters here
-+#eth0.ipaddr=a.b.c.d
-+#eth0.netmask=a.b.c.d
-+#eth0.gateway=a.b.c.d
-+#eth0.serverip=a.b.c.d
-+
-+# can be either 'nfs', 'tftp' or 'nand'
-+kernel_loc=nand
-+# can be either 'net', 'nand' or 'initrd'
-+rootfs_loc=nand
-+
-+# rootfs
-+rootfs_type=cramfs
-+
-+# kernel
-+kernelimage_type=zimage
-+kernel_img=/dev/nand0.kernel
-+
-+autoboot_timeout=3
-+
-+bootargs="console=ttymxc0,115200"
-+
-+device_type="nand"
-+nand_device="mxc_nand"
-+nand_parts="512k(barebox)ro,256k(bareboxenv),3328k(kernel),-(root)"
-+rootfs_mtdblock_nand=3
-+
-+# set a fancy prompt (if support is compiled in)
-+PS1="\e[1;32mbarebox@\e[1;31m\h:\w\e[0m "
-diff --git a/arch/arm/boards/ccxmx51/flash_header.c b/arch/arm/boards/ccxmx51/flash_header.c
-new file mode 100644
-index 0000000..c148eea
---- /dev/null
-+++ b/arch/arm/boards/ccxmx51/flash_header.c
-@@ -0,0 +1,84 @@
-+#include <common.h>
-+#include <mach/imx-flash-header.h>
-+#include <asm/barebox-arm-head.h>
-+
-+void __naked __flash_header_start go(void)
-+{
-+ barebox_arm_head();
-+}
-+
-+struct imx_dcd_entry __dcd_entry_section dcd_entry[] = {
-+ { .ptr_type = 4, .addr = 0x73fa88a0, .val = 0x00000200, },
-+ { .ptr_type = 4, .addr = 0x73fa850c, .val = 0x000020c5, },
-+ { .ptr_type = 4, .addr = 0x73fa8510, .val = 0x000020c5, },
-+ { .ptr_type = 4, .addr = 0x73fa883c, .val = 0x00000002, },
-+ { .ptr_type = 4, .addr = 0x73fa8848, .val = 0x00000002, },
-+ { .ptr_type = 4, .addr = 0x73fa84b8, .val = 0x000000e7, },
-+ { .ptr_type = 4, .addr = 0x73fa84bc, .val = 0x00000045, },
-+ { .ptr_type = 4, .addr = 0x73fa84c0, .val = 0x00000045, },
-+ { .ptr_type = 4, .addr = 0x73fa84c4, .val = 0x00000045, },
-+ { .ptr_type = 4, .addr = 0x73fa84c8, .val = 0x00000045, },
-+ { .ptr_type = 4, .addr = 0x73fa8820, .val = 0x00000000, },
-+ { .ptr_type = 4, .addr = 0x73fa84a4, .val = 0x00000003, },
-+ { .ptr_type = 4, .addr = 0x73fa84a8, .val = 0x00000003, },
-+ { .ptr_type = 4, .addr = 0x73fa84ac, .val = 0x000000e3, },
-+ { .ptr_type = 4, .addr = 0x73fa84b0, .val = 0x000000e3, },
-+ { .ptr_type = 4, .addr = 0x73fa84b4, .val = 0x000000e3, },
-+ { .ptr_type = 4, .addr = 0x73fa84cc, .val = 0x000000e3, },
-+ { .ptr_type = 4, .addr = 0x73fa84d0, .val = 0x000000e2, },
-+ { .ptr_type = 4, .addr = 0x73fa882c, .val = 0x00000004, },
-+ { .ptr_type = 4, .addr = 0x73fa88a4, .val = 0x00000004, },
-+ { .ptr_type = 4, .addr = 0x73fa88ac, .val = 0x00000004, },
-+ { .ptr_type = 4, .addr = 0x73fa88b8, .val = 0x00000004, },
-+ { .ptr_type = 4, .addr = 0x83fd9000, .val = 0x82a20000, },
-+ { .ptr_type = 4, .addr = 0x83fd9008, .val = 0x82a20000, },
-+ { .ptr_type = 4, .addr = 0x83fd9010, .val = 0x000ad0d0, },
-+ { .ptr_type = 4, .addr = 0x83fd9004, .val = 0x3f3584ab, },
-+ { .ptr_type = 4, .addr = 0x83fd900c, .val = 0x3f3584ab, },
-+ { .ptr_type = 4, .addr = 0x83fd9014, .val = 0x04008008, },
-+ { .ptr_type = 4, .addr = 0x83fd9014, .val = 0x0000801a, },
-+ { .ptr_type = 4, .addr = 0x83fd9014, .val = 0x0000801b, },
-+ { .ptr_type = 4, .addr = 0x83fd9014, .val = 0x00448019, },
-+ { .ptr_type = 4, .addr = 0x83fd9014, .val = 0x07328018, },
-+ { .ptr_type = 4, .addr = 0x83fd9014, .val = 0x04008008, },
-+ { .ptr_type = 4, .addr = 0x83fd9014, .val = 0x00008010, },
-+ { .ptr_type = 4, .addr = 0x83fd9014, .val = 0x00008010, },
-+ { .ptr_type = 4, .addr = 0x83fd9014, .val = 0x06328018, },
-+ { .ptr_type = 4, .addr = 0x83fd9014, .val = 0x03808019, },
-+ { .ptr_type = 4, .addr = 0x83fd9014, .val = 0x00408019, },
-+ { .ptr_type = 4, .addr = 0x83fd9014, .val = 0x00008000, },
-+ { .ptr_type = 4, .addr = 0x83fd9014, .val = 0x0400800c, },
-+ { .ptr_type = 4, .addr = 0x83fd9014, .val = 0x0000801e, },
-+ { .ptr_type = 4, .addr = 0x83fd9014, .val = 0x0000801f, },
-+ { .ptr_type = 4, .addr = 0x83fd9014, .val = 0x0000801d, },
-+ { .ptr_type = 4, .addr = 0x83fd9014, .val = 0x0732801c, },
-+ { .ptr_type = 4, .addr = 0x83fd9014, .val = 0x0400800c, },
-+ { .ptr_type = 4, .addr = 0x83fd9014, .val = 0x00008014, },
-+ { .ptr_type = 4, .addr = 0x83fd9014, .val = 0x00008014, },
-+ { .ptr_type = 4, .addr = 0x83fd9014, .val = 0x0632801c, },
-+ { .ptr_type = 4, .addr = 0x83fd9014, .val = 0x0380801d, },
-+ { .ptr_type = 4, .addr = 0x83fd9014, .val = 0x0040801d, },
-+ { .ptr_type = 4, .addr = 0x83fd9014, .val = 0x00008004, },
-+ { .ptr_type = 4, .addr = 0x83fd9000, .val = 0xb2a20000, },
-+ { .ptr_type = 4, .addr = 0x83fd9008, .val = 0xb2a20000, },
-+ { .ptr_type = 4, .addr = 0x83fd9010, .val = 0x000ad6d0, },
-+ { .ptr_type = 4, .addr = 0x83fd9034, .val = 0x90000000, },
-+ { .ptr_type = 4, .addr = 0x83fd9014, .val = 0x00000000, },
-+};
-+
-+#define APP_DEST 0x90000000
-+
-+struct imx_flash_header __flash_header_section flash_header = {
-+ .app_code_jump_vector = APP_DEST + 0x1000,
-+ .app_code_barker = APP_CODE_BARKER,
-+ .app_code_csf = 0,
-+ .dcd_ptr_ptr = APP_DEST + 0x400 + offsetof(struct imx_flash_header, dcd),
-+ .super_root_key = 0,
-+ .dcd = APP_DEST + 0x400 + offsetof(struct imx_flash_header, dcd_barker),
-+ .app_dest = APP_DEST,
-+ .dcd_barker = DCD_BARKER,
-+ .dcd_block_len = sizeof (dcd_entry),
-+};
-+
-+unsigned long __image_len_section barebox_len = DCD_BAREBOX_SIZE;
-+
-diff --git a/arch/arm/boards/chumby_falconwing/falconwing.c b/arch/arm/boards/chumby_falconwing/falconwing.c
-index 38f28be..b40713d 100644
---- a/arch/arm/boards/chumby_falconwing/falconwing.c
-+++ b/arch/arm/boards/chumby_falconwing/falconwing.c
-@@ -316,7 +316,7 @@ static void falconwing_init_usb(void)
- /* bring USB hub out of reset */
- gpio_direction_output(GPIO_USB_HUB_RESET, 1);
-
-- imx_usb_phy_enable();
-+ imx23_usb_phy_enable();
-
- add_generic_usb_ehci_device(-1, IMX_USB_BASE, NULL);
- }
-diff --git a/arch/arm/boards/eukrea_cpuimx51/eukrea_cpuimx51.c b/arch/arm/boards/eukrea_cpuimx51/eukrea_cpuimx51.c
-index 3cc7a72..35c114d 100644
---- a/arch/arm/boards/eukrea_cpuimx51/eukrea_cpuimx51.c
-+++ b/arch/arm/boards/eukrea_cpuimx51/eukrea_cpuimx51.c
-@@ -53,6 +53,11 @@ struct imx_nand_platform_data nand_info = {
- };
-
- static iomux_v3_cfg_t eukrea_cpuimx51_pads[] = {
-+ /* UART1 */
-+ MX51_PAD_UART1_RXD__UART1_RXD,
-+ MX51_PAD_UART1_TXD__UART1_TXD,
-+ MX51_PAD_UART1_RTS__UART1_RTS,
-+ MX51_PAD_UART1_CTS__UART1_CTS,
- /* FEC */
- MX51_PAD_DISP2_DAT1__FEC_RX_ER,
- MX51_PAD_DISP2_DAT15__FEC_TDATA0,
-@@ -141,12 +146,8 @@ static int eukrea_cpuimx51_console_init(void)
-
- imx51_init_lowlevel(800);
-
-- writel(0, 0x73fa8228);
-- writel(0, 0x73fa822c);
-- writel(0, 0x73fa8230);
-- writel(0, 0x73fa8234);
--
- imx51_add_uart0();
-+
- return 0;
- }
-
-diff --git a/arch/arm/boards/freescale-mx28-evk/mx28-evk.c b/arch/arm/boards/freescale-mx28-evk/mx28-evk.c
-index 9168ed8..1283e17 100644
---- a/arch/arm/boards/freescale-mx28-evk/mx28-evk.c
-+++ b/arch/arm/boards/freescale-mx28-evk/mx28-evk.c
-@@ -22,17 +22,18 @@
- #include <init.h>
- #include <mci.h>
- #include <io.h>
-+#include <net.h>
-
- #include <mach/clock.h>
- #include <mach/imx-regs.h>
- #include <mach/iomux-imx28.h>
- #include <mach/mci.h>
-+#include <mach/fb.h>
-+#include <mach/ocotp.h>
-
- #include <asm/armlinux.h>
- #include <asm/mmu.h>
-
--#include <mach/fb.h>
--
- #include <generated/mach-types.h>
-
- #define MX28EVK_FEC_PHY_RESET_GPIO 141
-@@ -118,6 +119,27 @@ static struct mxs_mci_platform_data mci_pdata = {
- };
-
- /* fec */
-+static void mx28_evk_get_ethaddr(void)
-+{
-+ u8 mac_ocotp[3], mac[6];
-+ int ret;
-+
-+ ret = mxs_ocotp_read(mac_ocotp, 3, 0);
-+ if (ret != 3) {
-+ pr_err("Reading MAC from OCOTP failed!\n");
-+ return;
-+ }
-+
-+ mac[0] = 0x00;
-+ mac[1] = 0x04;
-+ mac[2] = 0x9f;
-+ mac[3] = mac_ocotp[2];
-+ mac[4] = mac_ocotp[1];
-+ mac[5] = mac_ocotp[0];
-+
-+ eth_register_ethaddr(0, mac);
-+}
-+
- static void __init mx28_evk_fec_reset(void)
- {
- mdelay(1);
-@@ -208,6 +230,10 @@ static int mx28_evk_devices_init(void)
- add_generic_device("stmfb", 0, NULL, IMX_FB_BASE, 4096,
- IORESOURCE_MEM, &mx28_evk_fb_pdata);
-
-+ add_generic_device("ocotp", 0, NULL, IMX_OCOTP_BASE, 0,
-+ IORESOURCE_MEM, NULL);
-+ mx28_evk_get_ethaddr(); /* must be after registering ocotp */
-+
- imx_enable_enetclk();
- mx28_evk_fec_reset();
- add_generic_device("fec_imx", 0, NULL, IMX_FEC0_BASE, 0,
-diff --git a/arch/arm/boards/freescale-mx51-pdk/board.c b/arch/arm/boards/freescale-mx51-pdk/board.c
-index 0bb2ffe..3a568d0 100644
---- a/arch/arm/boards/freescale-mx51-pdk/board.c
-+++ b/arch/arm/boards/freescale-mx51-pdk/board.c
-@@ -48,6 +48,12 @@ static struct fec_platform_data fec_info = {
- };
-
- static iomux_v3_cfg_t f3s_pads[] = {
-+ /* UART1 */
-+ MX51_PAD_UART1_RXD__UART1_RXD,
-+ MX51_PAD_UART1_TXD__UART1_TXD,
-+ MX51_PAD_UART1_RTS__UART1_RTS,
-+ MX51_PAD_UART1_CTS__UART1_CTS,
-+ /* FEC */
- MX51_PAD_EIM_EB2__FEC_MDIO,
- MX51_PAD_EIM_EB3__FEC_RDATA1,
- MX51_PAD_EIM_CS2__FEC_RDATA2,
-@@ -246,6 +252,7 @@ static int f3s_devices_init(void)
- imx51_iim_register_fec_ethaddr();
- imx51_add_fec(&fec_info);
- imx51_add_mmc0(NULL);
-+ imx51_add_mmc1(NULL);
-
- armlinux_set_bootparams((void *)0x90000100);
- armlinux_set_architecture(MACH_TYPE_MX51_BABBAGE);
-@@ -268,12 +275,8 @@ static int f3s_console_init(void)
- {
- mxc_iomux_v3_setup_multiple_pads(f3s_pads, ARRAY_SIZE(f3s_pads));
-
-- writel(0, 0x73fa8228);
-- writel(0, 0x73fa822c);
-- writel(0, 0x73fa8230);
-- writel(0, 0x73fa8234);
--
- imx51_add_uart0();
-+
- return 0;
- }
-
-diff --git a/arch/arm/boards/mini2440/mini2440.c b/arch/arm/boards/mini2440/mini2440.c
-index 3d3b820..3523949 100644
---- a/arch/arm/boards/mini2440/mini2440.c
-+++ b/arch/arm/boards/mini2440/mini2440.c
-@@ -39,6 +39,7 @@
- #include <io.h>
- #include <mach/gpio.h>
- #include <mach/s3c-iomap.h>
-+#include <mach/devices-s3c24xx.h>
- #include <mach/s3c24xx-nand.h>
- #include <mach/s3c-generic.h>
- #include <mach/s3c-mci.h>
-@@ -297,8 +298,7 @@ static int mini2440_devices_init(void)
- reg |= 0x10000;
- writel(reg, S3C_MISCCR);
-
-- add_generic_device("s3c24x0_nand", DEVICE_ID_DYNAMIC, NULL, S3C24X0_NAND_BASE,
-- 0, IORESOURCE_MEM, &nand_info);
-+ s3c24xx_add_nand(&nand_info);
-
- add_dm9000_device(0, S3C_CS4_BASE + 0x300, S3C_CS4_BASE + 0x304,
- IORESOURCE_MEM_16BIT, &dm9000_data);
-@@ -312,12 +312,9 @@ static int mini2440_devices_init(void)
- devfs_add_partition("nand0", 0x40000, 0x20000, DEVFS_PARTITION_FIXED, "env_raw");
- dev_add_bb_dev("env_raw", "env0");
- #endif
-- add_generic_device("s3c_mci", 0, NULL, S3C2410_SDI_BASE, 0,
-- IORESOURCE_MEM, &mci_data);
-- add_generic_device("s3c_fb", 0, NULL, S3C2410_LCD_BASE, 0,
-- IORESOURCE_MEM, &s3c24x0_fb_data);
-- add_generic_device("ohci", 0, NULL, S3C2410_USB_HOST_BASE, 0x100,
-- IORESOURCE_MEM, NULL);
-+ s3c24xx_add_mci(&mci_data);
-+ s3c24xx_add_fb(&s3c24x0_fb_data);
-+ s3c24xx_add_ohci();
- armlinux_set_bootparams((void*)S3C_SDRAM_BASE + 0x100);
- armlinux_set_architecture(MACH_TYPE_MINI2440);
-
-@@ -344,8 +341,7 @@ static int mini2440_console_init(void)
- s3c_gpio_mode(GPH2_TXD0);
- s3c_gpio_mode(GPH3_RXD0);
-
-- add_generic_device("s3c_serial", DEVICE_ID_DYNAMIC, NULL, S3C_UART1_BASE,
-- S3C_UART1_SIZE, IORESOURCE_MEM, NULL);
-+ s3c24xx_add_uart1();
- return 0;
- }
-
-diff --git a/arch/arm/boards/nhk8815/setup.c b/arch/arm/boards/nhk8815/setup.c
-index 173892a..ccc0510 100644
---- a/arch/arm/boards/nhk8815/setup.c
-+++ b/arch/arm/boards/nhk8815/setup.c
-@@ -55,15 +55,15 @@ static struct nomadik_nand_platform_data nhk8815_nand_data = {
- static struct resource nhk8815_nand_resources[] = {
- {
- .start = NAND_IO_ADDR,
-- .size = 0xfff,
-+ .end = NAND_IO_ADDR + 0xfff,
- .flags = IORESOURCE_MEM,
- }, {
- .start = NAND_IO_CMD,
-- .size = 0xfff,
-+ .end = NAND_IO_CMD + 0xfff,
- .flags = IORESOURCE_MEM,
- }, {
- .start = NAND_IO_DATA,
-- .size = 0xfff,
-+ .end = NAND_IO_CMD + 0xfff,
- .flags = IORESOURCE_MEM,
- }
- };
-diff --git a/arch/arm/boards/pcm038/pcm970.c b/arch/arm/boards/pcm038/pcm970.c
-index ca10afb..df9b852 100644
---- a/arch/arm/boards/pcm038/pcm970.c
-+++ b/arch/arm/boards/pcm038/pcm970.c
-@@ -55,7 +55,7 @@ static void pcm970_usbh2_init(void)
- static struct resource pcm970_ide_resources[] = {
- {
- .start = IMX_PCMCIA_MEM_BASE,
-- .size = SZ_1K,
-+ .end = IMX_PCMCIA_MEM_BASE + SZ_1K - 1,
- .flags = IORESOURCE_MEM,
- },
- };
-diff --git a/arch/arm/configs/at91sam9m10g45ek_defconfig b/arch/arm/configs/at91sam9m10g45ek_defconfig
-index b72e964..e22f80a 100644
---- a/arch/arm/configs/at91sam9m10g45ek_defconfig
-+++ b/arch/arm/configs/at91sam9m10g45ek_defconfig
-@@ -1,5 +1,4 @@
- CONFIG_ARCH_AT91SAM9G45=y
--CONFIG_MACH_AT91SAM9M10G45EK=y
- CONFIG_AEABI=y
- # CONFIG_CMD_ARM_CPUINFO is not set
- CONFIG_ARM_OPTIMZED_STRING_FUNCTIONS=y
-@@ -75,3 +74,4 @@ CONFIG_LED_TRIGGERS=y
- CONFIG_FS_FAT=y
- CONFIG_FS_FAT_WRITE=y
- CONFIG_FS_FAT_LFN=y
-+CONFIG_LZO_DECOMPRESS=y
-diff --git a/arch/arm/configs/ccmx51_defconfig b/arch/arm/configs/ccmx51_defconfig
-new file mode 100644
-index 0000000..d14de55
---- /dev/null
-+++ b/arch/arm/configs/ccmx51_defconfig
-@@ -0,0 +1,55 @@
-+CONFIG_ARCH_IMX=y
-+CONFIG_ARCH_IMX51=y
-+CONFIG_MACH_CCMX51=y
-+CONFIG_AEABI=y
-+CONFIG_ARM_OPTIMZED_STRING_FUNCTIONS=y
-+CONFIG_MALLOC_SIZE=0x2000000
-+CONFIG_LONGHELP=y
-+CONFIG_GLOB=y
-+CONFIG_HUSH_FANCY_PROMPT=y
-+CONFIG_CMDLINE_EDITING=y
-+CONFIG_AUTO_COMPLETE=y
-+CONFIG_PARTITION=y
-+CONFIG_DEFAULT_ENVIRONMENT_GENERIC=y
-+CONFIG_DEFAULT_ENVIRONMENT_PATH="defaultenv arch/arm/boards/ccxmx51/env"
-+CONFIG_CMD_EDIT=y
-+CONFIG_CMD_SLEEP=y
-+CONFIG_CMD_SAVEENV=y
-+CONFIG_CMD_LOADENV=y
-+CONFIG_CMD_EXPORT=y
-+CONFIG_CMD_PRINTENV=y
-+CONFIG_CMD_READLINE=y
-+CONFIG_CMD_ECHO_E=y
-+CONFIG_CMD_MEMINFO=y
-+CONFIG_CMD_MTEST=y
-+CONFIG_CMD_FLASH=y
-+CONFIG_CMD_BOOTM_ZLIB=y
-+CONFIG_CMD_BOOTM_BZLIB=y
-+CONFIG_CMD_BOOTM_SHOW_TYPE=y
-+CONFIG_CMD_RESET=y
-+CONFIG_CMD_GO=y
-+CONFIG_CMD_TIMEOUT=y
-+CONFIG_CMD_PARTITION=y
-+CONFIG_CMD_GPIO=y
-+CONFIG_CMD_UNLZO=y
-+CONFIG_CMD_I2C=y
-+CONFIG_NET=y
-+CONFIG_NET_DHCP=y
-+CONFIG_NET_PING=y
-+CONFIG_NET_TFTP=y
-+CONFIG_DRIVER_NET_SMC911X=y
-+CONFIG_DRIVER_NET_FEC_IMX=y
-+CONFIG_DRIVER_SPI_IMX=y
-+CONFIG_I2C=y
-+CONFIG_I2C_IMX=y
-+CONFIG_MTD=y
-+CONFIG_NAND=y
-+CONFIG_NAND_IMX=y
-+CONFIG_USB=y
-+CONFIG_USB_EHCI=y
-+CONFIG_MCI=y
-+# CONFIG_MCI_WRITE is not set
-+CONFIG_MCI_IMX_ESDHC=y
-+CONFIG_FS_CRAMFS=y
-+CONFIG_FS_FAT=y
-+CONFIG_FS_FAT_LFN=y
-diff --git a/arch/arm/configs/eukrea_cpuimx25_defconfig b/arch/arm/configs/eukrea_cpuimx25_defconfig
-index 94ae670..f7207e8 100644
---- a/arch/arm/configs/eukrea_cpuimx25_defconfig
-+++ b/arch/arm/configs/eukrea_cpuimx25_defconfig
-@@ -8,6 +8,7 @@ CONFIG_MMU=y
- CONFIG_BAREBOX_MAX_IMAGE_SIZE=0x40000
- CONFIG_MALLOC_SIZE=0x800000
- CONFIG_EXPERIMENTAL=y
-+CONFIG_MALLOC_TLSF=y
- CONFIG_LONGHELP=y
- CONFIG_GLOB=y
- CONFIG_HUSH_FANCY_PROMPT=y
-diff --git a/arch/arm/configs/eukrea_cpuimx35_defconfig b/arch/arm/configs/eukrea_cpuimx35_defconfig
-index a888765..880beb6 100644
---- a/arch/arm/configs/eukrea_cpuimx35_defconfig
-+++ b/arch/arm/configs/eukrea_cpuimx35_defconfig
-@@ -9,6 +9,7 @@ CONFIG_MMU=y
- CONFIG_BAREBOX_MAX_IMAGE_SIZE=0x40000
- CONFIG_MALLOC_SIZE=0x800000
- CONFIG_EXPERIMENTAL=y
-+CONFIG_MALLOC_TLSF=y
- CONFIG_LONGHELP=y
- CONFIG_GLOB=y
- CONFIG_HUSH_FANCY_PROMPT=y
-diff --git a/arch/arm/configs/eukrea_cpuimx51_defconfig b/arch/arm/configs/eukrea_cpuimx51_defconfig
-index f6fd7bc..7261796 100644
---- a/arch/arm/configs/eukrea_cpuimx51_defconfig
-+++ b/arch/arm/configs/eukrea_cpuimx51_defconfig
-@@ -7,6 +7,7 @@ CONFIG_MMU=y
- CONFIG_BAREBOX_MAX_IMAGE_SIZE=0x40000
- CONFIG_MALLOC_SIZE=0x2000000
- CONFIG_EXPERIMENTAL=y
-+CONFIG_MALLOC_TLSF=y
- CONFIG_LONGHELP=y
- CONFIG_GLOB=y
- CONFIG_HUSH_FANCY_PROMPT=y
-diff --git a/arch/arm/configs/usb_a9260_defconfig b/arch/arm/configs/usb_a9260_defconfig
-index 85e7878..a9574c4 100644
---- a/arch/arm/configs/usb_a9260_defconfig
-+++ b/arch/arm/configs/usb_a9260_defconfig
-@@ -6,6 +6,7 @@ CONFIG_ARM_OPTIMZED_STRING_FUNCTIONS=y
- CONFIG_MMU=y
- CONFIG_BAREBOX_MAX_IMAGE_SIZE=0x40000
- CONFIG_EXPERIMENTAL=y
-+CONFIG_MALLOC_TLSF=y
- CONFIG_PROMPT="USB-9G20:"
- CONFIG_LONGHELP=y
- CONFIG_GLOB=y
-diff --git a/arch/arm/configs/usb_a9263_128mib_defconfig b/arch/arm/configs/usb_a9263_128mib_defconfig
-index 23bc3d7..d31057f 100644
---- a/arch/arm/configs/usb_a9263_128mib_defconfig
-+++ b/arch/arm/configs/usb_a9263_128mib_defconfig
-@@ -1,12 +1,13 @@
- CONFIG_ARCH_AT91SAM9263=y
- CONFIG_MACH_USB_A9263=y
-+CONFIG_AT91_HAVE_SRAM_128M=y
- CONFIG_AEABI=y
- # CONFIG_CMD_ARM_CPUINFO is not set
--CONFIG_AT91_HAVE_SRAM_128M=y
- CONFIG_ARM_OPTIMZED_STRING_FUNCTIONS=y
- CONFIG_MMU=y
- CONFIG_BAREBOX_MAX_IMAGE_SIZE=0x40000
- CONFIG_EXPERIMENTAL=y
-+CONFIG_MALLOC_TLSF=y
- CONFIG_PROMPT="USB-9263:"
- CONFIG_LONGHELP=y
- CONFIG_GLOB=y
-diff --git a/arch/arm/configs/usb_a9263_defconfig b/arch/arm/configs/usb_a9263_defconfig
-index 96ea3e1..b57c300 100644
---- a/arch/arm/configs/usb_a9263_defconfig
-+++ b/arch/arm/configs/usb_a9263_defconfig
-@@ -6,6 +6,7 @@ CONFIG_ARM_OPTIMZED_STRING_FUNCTIONS=y
- CONFIG_MMU=y
- CONFIG_BAREBOX_MAX_IMAGE_SIZE=0x40000
- CONFIG_EXPERIMENTAL=y
-+CONFIG_MALLOC_TLSF=y
- CONFIG_PROMPT="USB-9263:"
- CONFIG_LONGHELP=y
- CONFIG_GLOB=y
-@@ -22,7 +23,6 @@ CONFIG_DEFAULT_ENVIRONMENT_PATH="arch/arm/boards/usb-a926x/env"
- CONFIG_CMD_EDIT=y
- CONFIG_CMD_SLEEP=y
- CONFIG_CMD_SAVEENV=y
--CONFIG_CMD_LOADENV=y
- CONFIG_CMD_EXPORT=y
- CONFIG_CMD_PRINTENV=y
- CONFIG_CMD_READLINE=y
-diff --git a/arch/arm/configs/usb_a9g20_128mib_defconfig b/arch/arm/configs/usb_a9g20_128mib_defconfig
-index c25d7de..6b02342 100644
---- a/arch/arm/configs/usb_a9g20_128mib_defconfig
-+++ b/arch/arm/configs/usb_a9g20_128mib_defconfig
-@@ -1,12 +1,13 @@
- CONFIG_ARCH_AT91SAM9G20=y
- CONFIG_MACH_USB_A9G20=y
-+CONFIG_AT91_HAVE_SRAM_128M=y
- CONFIG_AEABI=y
- # CONFIG_CMD_ARM_CPUINFO is not set
--CONFIG_AT91_HAVE_SRAM_128M=y
- CONFIG_ARM_OPTIMZED_STRING_FUNCTIONS=y
- CONFIG_MMU=y
- CONFIG_BAREBOX_MAX_IMAGE_SIZE=0x40000
- CONFIG_EXPERIMENTAL=y
-+CONFIG_MALLOC_TLSF=y
- CONFIG_PROMPT="USB-9G20:"
- CONFIG_LONGHELP=y
- CONFIG_GLOB=y
-diff --git a/arch/arm/configs/usb_a9g20_defconfig b/arch/arm/configs/usb_a9g20_defconfig
-index d645adb..30bf380 100644
---- a/arch/arm/configs/usb_a9g20_defconfig
-+++ b/arch/arm/configs/usb_a9g20_defconfig
-@@ -6,6 +6,7 @@ CONFIG_ARM_OPTIMZED_STRING_FUNCTIONS=y
- CONFIG_MMU=y
- CONFIG_BAREBOX_MAX_IMAGE_SIZE=0x40000
- CONFIG_EXPERIMENTAL=y
-+CONFIG_MALLOC_TLSF=y
- CONFIG_PROMPT="USB-9G20:"
- CONFIG_LONGHELP=y
- CONFIG_GLOB=y
-diff --git a/arch/arm/cpu/Makefile b/arch/arm/cpu/Makefile
-index e30ae1c..93a34a9 100644
---- a/arch/arm/cpu/Makefile
-+++ b/arch/arm/cpu/Makefile
-@@ -7,6 +7,7 @@ obj-y += start.o
- # Any variants can be called as start-armxyz.S
- #
- obj-$(CONFIG_CMD_ARM_CPUINFO) += cpuinfo.o
-+obj-$(CONFIG_CMD_ARM_MMUINFO) += mmuinfo.o
- obj-$(CONFIG_MMU) += mmu.o
- obj-$(CONFIG_CPU_32v4T) += cache-armv4.o
- obj-$(CONFIG_CPU_32v5) += cache-armv5.o
-diff --git a/arch/arm/cpu/mmu.c b/arch/arm/cpu/mmu.c
-index c19f931..607f357 100644
---- a/arch/arm/cpu/mmu.c
-+++ b/arch/arm/cpu/mmu.c
-@@ -147,7 +147,7 @@ static int arm_mmu_remap_sdram(struct memory_bank *bank)
- if ((phys & (SZ_1M - 1)) || (bank->size & (SZ_1M - 1)))
- return -EINVAL;
-
-- ptes = memalign(0x400, num_ptes * sizeof(u32));
-+ ptes = memalign(PAGE_SIZE, num_ptes * sizeof(u32));
-
- debug("ptes: 0x%p ttb_start: 0x%08lx ttb_end: 0x%08lx\n",
- ptes, ttb_start, ttb_end);
-@@ -165,6 +165,9 @@ static int arm_mmu_remap_sdram(struct memory_bank *bank)
- pte += 256;
- }
-
-+ dma_flush_range((unsigned long)ttb, (unsigned long)ttb + 0x4000);
-+ dma_flush_range((unsigned long)ptes, num_ptes * sizeof(u32));
-+
- tlb_invalidate();
-
- return 0;
-@@ -299,11 +302,9 @@ void *dma_alloc_coherent(size_t size)
- size = PAGE_ALIGN(size);
- ret = xmemalign(4096, size);
-
--#ifdef CONFIG_MMU
- dma_inv_range((unsigned long)ret, (unsigned long)ret + size);
-
- remap_range(ret, size, PTE_FLAGS_UNCACHED);
--#endif
-
- return ret;
- }
-@@ -320,9 +321,7 @@ void *phys_to_virt(unsigned long phys)
-
- void dma_free_coherent(void *mem, size_t size)
- {
--#ifdef CONFIG_MMU
- remap_range(mem, size, PTE_FLAGS_CACHED);
--#endif
-
- free(mem);
- }
-diff --git a/arch/arm/cpu/mmuinfo.c b/arch/arm/cpu/mmuinfo.c
-new file mode 100644
-index 0000000..6bea34e
---- /dev/null
-+++ b/arch/arm/cpu/mmuinfo.c
-@@ -0,0 +1,111 @@
-+/*
-+ * mmuinfo.c - Show MMU/cache information from cp15 registers
-+ *
-+ * Copyright (c) Jan Luebbe <j.luebbe@pengutronix.de>, Pengutronix
-+ *
-+ * 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 version 2
-+ * as published by the Free Software Foundation.
-+ *
-+ * 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 <command.h>
-+
-+static char *inner_attr[] = {
-+ "0b000 Non-cacheable",
-+ "0b001 Strongly-ordered",
-+ "0b010 (reserved)",
-+ "0b011 Device",
-+ "0b100 (reserved)",
-+ "0b101 Write-Back, Write-Allocate",
-+ "0b110 Write-Through",
-+ "0b111 Write-Back, no Write-Allocate",
-+};
-+
-+static char *outer_attr[] = {
-+ "0b00 Non-cacheable",
-+ "0b01 Write-Back, Write-Allocate",
-+ "0b10 Write-Through, no Write-Allocate",
-+ "0b11 Write-Back, no Write-Allocate",
-+};
-+
-+static void decode_par(unsigned long par)
-+{
-+ printf(" Physical Address [31:12]: 0x%08lx\n", par & 0xFFFFF000);
-+ printf(" Reserved [11]: 0x%lx\n", (par >> 11) & 0x1);
-+ printf(" Not Outer Shareable [10]: 0x%lx\n", (par >> 10) & 0x1);
-+ printf(" Non-Secure [9]: 0x%lx\n", (par >> 9) & 0x1);
-+ printf(" Impl. def. [8]: 0x%lx\n", (par >> 8) & 0x1);
-+ printf(" Shareable [7]: 0x%lx\n", (par >> 7) & 0x1);
-+ printf(" Inner mem. attr. [6:4]: 0x%lx (%s)\n", (par >> 4) & 0x7,
-+ inner_attr[(par >> 4) & 0x7]);
-+ printf(" Outer mem. attr. [3:2]: 0x%lx (%s)\n", (par >> 2) & 0x3,
-+ outer_attr[(par >> 2) & 0x3]);
-+ printf(" SuperSection [1]: 0x%lx\n", (par >> 1) & 0x1);
-+ printf(" Failure [0]: 0x%lx\n", (par >> 0) & 0x1);
-+}
-+
-+static int do_mmuinfo(int argc, char *argv[])
-+{
-+ unsigned long addr = 0, priv_read, priv_write;
-+
-+ if (argc < 2)
-+ return COMMAND_ERROR_USAGE;
-+
-+ addr = strtoul_suffix(argv[1], NULL, 0);
-+
-+ __asm__ __volatile__(
-+ "mcr p15, 0, %0, c7, c8, 0 @ write VA to PA translation (priv read)\n"
-+ :
-+ : "r" (addr)
-+ : "memory");
-+
-+ __asm__ __volatile__(
-+ "mrc p15, 0, %0, c7, c4, 0 @ read PAR\n"
-+ : "=r" (priv_read)
-+ :
-+ : "memory");
-+
-+ __asm__ __volatile__(
-+ "mcr p15, 0, %0, c7, c8, 1 @ write VA to PA translation (priv write)\n"
-+ :
-+ : "r" (addr)
-+ : "memory");
-+
-+ __asm__ __volatile__(
-+ "mrc p15, 0, %0, c7, c4, 0 @ read PAR\n"
-+ : "=r" (priv_write)
-+ :
-+ : "memory");
-+
-+ printf("PAR result for 0x%08lx: \n", addr);
-+ printf(" privileged read: 0x%08lx\n", priv_read);
-+ decode_par(priv_read);
-+ printf(" privileged write: 0x%08lx\n", priv_write);
-+ decode_par(priv_write);
-+
-+ return 0;
-+}
-+
-+BAREBOX_CMD_HELP_START(mmuinfo)
-+BAREBOX_CMD_HELP_USAGE("mmuinfo <address>\n")
-+BAREBOX_CMD_HELP_SHORT("Show MMU/cache information for an address.\n")
-+BAREBOX_CMD_HELP_END
-+
-+BAREBOX_CMD_START(mmuinfo)
-+ .cmd = do_mmuinfo,
-+ .usage = "mmuinfo <address>",
-+ BAREBOX_CMD_HELP(cmd_mmuinfo_help)
-+BAREBOX_CMD_END
-diff --git a/arch/arm/cpu/start.c b/arch/arm/cpu/start.c
-index 3c282ee..523179d 100644
---- a/arch/arm/cpu/start.c
-+++ b/arch/arm/cpu/start.c
-@@ -81,13 +81,11 @@ void __naked __bare_init reset(void)
- r &= ~(CR_M | CR_C | CR_B | CR_S | CR_R | CR_V);
- r |= CR_I;
-
-- if (!(r & CR_U))
-- /* catch unaligned access on architectures which do not
-- * support unaligned access */
-- r |= CR_A;
-- else
-- r &= ~CR_A;
--
-+#if __LINUX_ARM_ARCH__ >= 6
-+ r |= CR_U;
-+#else
-+ r |= CR_A;
-+#endif
-
- #ifdef __ARMEB__
- r |= CR_B;
-diff --git a/arch/arm/include/asm/dma.h b/arch/arm/include/asm/dma.h
-new file mode 100644
-index 0000000..cb9cd1b
---- /dev/null
-+++ b/arch/arm/include/asm/dma.h
-@@ -0,0 +1,8 @@
-+/*
-+ * Copyright (C) 2012 by Marc Kleine-Budde <mkl@pengutronix.de>
-+ *
-+ * This file is released under the GPLv2
-+ *
-+ */
-+
-+#include <asm/mmu.h>
-diff --git a/arch/arm/include/asm/mmu.h b/arch/arm/include/asm/mmu.h
-index f5ae7a8..a66da8c 100644
---- a/arch/arm/include/asm/mmu.h
-+++ b/arch/arm/include/asm/mmu.h
-@@ -1,9 +1,12 @@
- #ifndef __ASM_MMU_H
- #define __ASM_MMU_H
-
--#include <asm/pgtable.h>
--#include <malloc.h>
-+#include <common.h>
- #include <errno.h>
-+#include <malloc.h>
-+#include <xfuncs.h>
-+
-+#include <asm/pgtable.h>
-
- #define PMD_SECT_DEF_UNCACHED (PMD_SECT_AP_WRITE | PMD_SECT_AP_READ | PMD_TYPE_SECT)
- #define PMD_SECT_DEF_CACHED (PMD_SECT_WB | PMD_SECT_DEF_UNCACHED)
-@@ -23,6 +26,12 @@ static inline void setup_dma_coherent(unsigned long offset)
- {
- }
-
-+#define dma_alloc dma_alloc
-+static inline void *dma_alloc(size_t size)
-+{
-+ return xmemalign(64, ALIGN(size, 64));
-+}
-+
- #ifdef CONFIG_MMU
- void *dma_alloc_coherent(size_t size);
- void dma_free_coherent(void *mem, size_t size);
-diff --git a/arch/arm/lib/bootm.c b/arch/arm/lib/bootm.c
-index 033e2eb..3a00437 100644
---- a/arch/arm/lib/bootm.c
-+++ b/arch/arm/lib/bootm.c
-@@ -80,7 +80,7 @@ static int __do_bootm_linux(struct image_data *data, int swap)
-
- if (data->initrd_res) {
- initrd_start = data->initrd_res->start;
-- initrd_size = data->initrd_res->size;
-+ initrd_size = resource_size(data->initrd_res);
- }
-
- if (bootm_verbose(data)) {
-@@ -154,7 +154,7 @@ static int do_bootz_linux_fdt(int fd, struct image_data *data)
- }
- } else {
-
-- of_res = request_sdram_region("oftree", r->start + r->size, end);
-+ of_res = request_sdram_region("oftree", r->start + resource_size(r), end);
- if (!of_res) {
- perror("zImage: oftree request_sdram_region");
- return -ENOMEM;
-@@ -310,9 +310,9 @@ static int aimage_load_resource(int fd, struct resource *r, void* buf, int ps)
- {
- int ret;
- void *image = (void *)r->start;
-- unsigned to_read = ps - r->size % ps;
-+ unsigned to_read = ps - resource_size(r) % ps;
-
-- ret = read_full(fd, image, r->size);
-+ ret = read_full(fd, image, resource_size(r));
- if (ret < 0)
- return ret;
-
-diff --git a/arch/arm/mach-at91/at91sam9260_devices.c b/arch/arm/mach-at91/at91sam9260_devices.c
-index 3297a89..b56ca14 100644
---- a/arch/arm/mach-at91/at91sam9260_devices.c
-+++ b/arch/arm/mach-at91/at91sam9260_devices.c
-@@ -111,12 +111,12 @@ void at91_add_device_eth(int id, struct at91_ether_platform_data *data) {}
- static struct resource nand_resources[] = {
- [0] = {
- .start = AT91_CHIPSELECT_3,
-- .size = SZ_256M,
-+ .end = AT91_CHIPSELECT_3 + SZ_256M - 1,
- .flags = IORESOURCE_MEM,
- },
- [1] = {
- .start = AT91_BASE_SYS + AT91_ECC,
-- .size = 512,
-+ .end = AT91_BASE_SYS + AT91_ECC + 512 - 1,
- .flags = IORESOURCE_MEM,
- }
- };
-diff --git a/arch/arm/mach-at91/at91sam9263_devices.c b/arch/arm/mach-at91/at91sam9263_devices.c
-index 2ebc4da..7f916d2 100644
---- a/arch/arm/mach-at91/at91sam9263_devices.c
-+++ b/arch/arm/mach-at91/at91sam9263_devices.c
-@@ -113,12 +113,12 @@ void at91_add_device_eth(int id, struct at91_ether_platform_data *data) {}
- static struct resource nand_resources[] = {
- [0] = {
- .start = AT91_CHIPSELECT_3,
-- .size = SZ_256M,
-+ .end = AT91_CHIPSELECT_3 + SZ_256M - 1,
- .flags = IORESOURCE_MEM,
- },
- [1] = {
- .start = AT91_BASE_SYS + AT91_ECC0,
-- .size = 512,
-+ .end = AT91_BASE_SYS + AT91_ECC0 + 512 - 1,
- .flags = IORESOURCE_MEM,
- }
- };
-diff --git a/arch/arm/mach-at91/at91sam9g45_devices.c b/arch/arm/mach-at91/at91sam9g45_devices.c
-index d406bcc..22b455e 100644
---- a/arch/arm/mach-at91/at91sam9g45_devices.c
-+++ b/arch/arm/mach-at91/at91sam9g45_devices.c
-@@ -93,12 +93,12 @@ void at91_add_device_eth(int id, struct at91_ether_platform_data *data) {}
- static struct resource nand_resources[] = {
- [0] = {
- .start = AT91_CHIPSELECT_3,
-- .size = SZ_256M,
-+ .end = AT91_CHIPSELECT_3 + SZ_256M - 1,
- .flags = IORESOURCE_MEM,
- },
- [1] = {
- .start = AT91_BASE_SYS + AT91_ECC,
-- .size = 512,
-+ .end = AT91_BASE_SYS + AT91_ECC + 512 - 1,
- .flags = IORESOURCE_MEM,
- }
- };
-diff --git a/arch/arm/mach-at91/at91sam9x5_devices.c b/arch/arm/mach-at91/at91sam9x5_devices.c
-index 50bad7f..26a380d 100644
---- a/arch/arm/mach-at91/at91sam9x5_devices.c
-+++ b/arch/arm/mach-at91/at91sam9x5_devices.c
-@@ -130,12 +130,12 @@ void at91_add_device_eth(int id, struct at91_ether_platform_data *data) {}
- static struct resource nand_resources[] = {
- [0] = {
- .start = AT91_CHIPSELECT_3,
-- .size = SZ_256M,
-+ .end = AT91_CHIPSELECT_3 + SZ_256M - 1,
- .flags = IORESOURCE_MEM,
- },
- [1] = {
- .start = AT91_BASE_SYS + AT91_PMECC,
-- .size = 512,
-+ .end = AT91_BASE_SYS + AT91_PMECC + 512 - 1,
- .flags = IORESOURCE_MEM,
- }
- };
-diff --git a/arch/arm/mach-imx/Kconfig b/arch/arm/mach-imx/Kconfig
-index 564e2fe..5b77245 100644
---- a/arch/arm/mach-imx/Kconfig
-+++ b/arch/arm/mach-imx/Kconfig
-@@ -26,6 +26,7 @@ config ARCH_TEXT_BASE
- default 0x7ff00000 if MACH_TQMA53
- default 0x97f00000 if MACH_TX51
- default 0x4fc00000 if MACH_MX6Q_ARM2
-+ default 0x97f00000 if MACH_CCMX51
-
- config BOARDINFO
- default "Eukrea CPUIMX25" if MACH_EUKREA_CPUIMX25
-@@ -50,6 +51,7 @@ config BOARDINFO
- default "TQ tqma53" if MACH_TQMA53
- default "Ka-Ro tx51" if MACH_TX51
- default "Freescale i.MX6q armadillo2" if MACH_MX6Q_ARM2
-+ default "ConnectCore i.MX51" if MACH_CCMX51
-
- choice
- prompt "Select boot mode"
-@@ -391,7 +393,7 @@ choice
- prompt "i.MX51 Board Type"
-
- config MACH_FREESCALE_MX51_PDK
-- select DEFAULT_ENVIRONMENT_GENERIC_NEW
-+ select HAVE_DEFAULT_ENVIRONMENT_NEW
- bool "Freescale i.MX51 PDK"
-
- config MACH_EUKREA_CPUIMX51SD
-@@ -405,6 +407,23 @@ config MACH_TX51
- help
- Say Y here if you are using the Ka-Ro tx51 board
-
-+config MACH_CCMX51
-+ bool "ConnectCore i.MX51"
-+ select IMX_IIM
-+ select SPI
-+ select DRIVER_SPI_IMX
-+ select MFD_MC13XXX
-+ help
-+ Say Y here if you are using Digi ConnectCore (W)i-i.MX51
-+ equipped with a Freescale i.MX51 Processor
-+
-+config MACH_CCMX51_BASEBOARD
-+ bool "Digi development board for CCMX51 module"
-+ depends on MACH_CCMX51
-+ default y
-+ help
-+ This adds board specific devices that can be found on Digi
-+ evaluation board for CCMX51 module.
-
- endchoice
-
-@@ -517,7 +536,7 @@ menu "i.MX specific settings "
-
- config IMX_CLKO
- bool "clko command"
-- depends on ARCH_IMX21 || ARCH_IMX27 || ARCH_IMX35 || ARCH_IMX25
-+ depends on ARCH_IMX21 || ARCH_IMX27 || ARCH_IMX35 || ARCH_IMX25 || ARCH_IMX51
- help
- The i.MX SoCs have a Pin which can output different reference frequencies.
- Say y here if you want to have the clko command which lets you select the
-diff --git a/arch/arm/mach-imx/clko.c b/arch/arm/mach-imx/clko.c
-index 0e4fbcc..aeafaa9 100644
---- a/arch/arm/mach-imx/clko.c
-+++ b/arch/arm/mach-imx/clko.c
-@@ -6,15 +6,18 @@
-
- static int do_clko(int argc, char *argv[])
- {
-- int opt, div = 0, src = -2, ret;
-+ int opt, div = 0, src = -2, num = 1, ret;
-
-- while((opt = getopt(argc, argv, "d:s:")) > 0) {
-+ while((opt = getopt(argc, argv, "n:d:s:")) > 0) {
- switch(opt) {
-+ case 'n':
-+ num = simple_strtoul(optarg, NULL, 0);
-+ break;
- case 'd':
- div = simple_strtoul(optarg, NULL, 0);
- break;
- case 's':
-- src = simple_strtoul(optarg, NULL, 0);
-+ src = simple_strtol(optarg, NULL, 0);
- break;
- }
- }
-@@ -23,17 +26,19 @@ static int do_clko(int argc, char *argv[])
- return COMMAND_ERROR_USAGE;
-
- if (src == -1) {
-- imx_clko_set_src(-1);
-+ imx_clko_set_src(num, -1);
- return 0;
- }
-
- if (src != -2)
-- imx_clko_set_src(src);
-+ imx_clko_set_src(num, src);
-
- if (div != 0) {
-- ret = imx_clko_set_div(div);
-- if (ret != div)
-- printf("limited divider to %d\n", ret);
-+ ret = imx_clko_set_div(num, div);
-+ if (ret < 0)
-+ printf("CLKO-line %i not supported.\n", num);
-+ else if (ret != div)
-+ printf("Divider limited to %d.\n", ret);
- }
-
- return 0;
-@@ -42,7 +47,8 @@ static int do_clko(int argc, char *argv[])
- static __maybe_unused char cmd_clko_help[] =
- "Usage: clko [OPTION]...\n"
- "Route different signals to the i.MX clko pin\n"
--" -d <div> Divider\n"
-+" -n <num> Number of CLKO-line (Default 1)\n"
-+" -d <div> Divider\n"
- " -s <source> Clock select. See Ref. Manual for valid sources. Use -1\n"
- " for disabling clock output\n";
-
-diff --git a/arch/arm/mach-imx/clocksource.c b/arch/arm/mach-imx/clocksource.c
-index 4f5895c..4e77ece 100644
---- a/arch/arm/mach-imx/clocksource.c
-+++ b/arch/arm/mach-imx/clocksource.c
-@@ -38,7 +38,7 @@
- #include <io.h>
-
- #define GPT(x) __REG(IMX_TIM1_BASE + (x))
--#define timer_base (IMX_TIM1_BASE)
-+#define timer_base IOMEM(IMX_TIM1_BASE)
-
- static uint64_t imx_clocksource_read(void)
- {
-@@ -120,15 +120,17 @@ core_initcall(clocksource_init);
- */
- void __noreturn reset_cpu (unsigned long addr)
- {
-+ void __iomem *wdt = IOMEM(IMX_WDT_BASE);
-+
- /* Disable watchdog and set Time-Out field to 0 */
-- writew(0x0, IMX_WDT_BASE + WDOG_WCR);
-+ writew(0x0, wdt + WDOG_WCR);
-
- /* Write Service Sequence */
-- writew(0x5555, IMX_WDT_BASE + WDOG_WSR);
-- writew(0xaaaa, IMX_WDT_BASE + WDOG_WSR);
-+ writew(0x5555, wdt + WDOG_WSR);
-+ writew(0xaaaa, wdt + WDOG_WSR);
-
- /* Enable watchdog */
-- writew(WDOG_WCR_WDE, IMX_WDT_BASE + WDOG_WCR);
-+ writew(WDOG_WCR_WDE, wdt + WDOG_WCR);
-
- while (1);
- /*NOTREACHED*/
-diff --git a/arch/arm/mach-imx/iim.c b/arch/arm/mach-imx/iim.c
-index f2ace8a..0da8ea0 100644
---- a/arch/arm/mach-imx/iim.c
-+++ b/arch/arm/mach-imx/iim.c
-@@ -84,7 +84,7 @@ static int do_fuse_sense(void __iomem *reg_base, unsigned int bank,
- }
-
- static ssize_t imx_iim_cdev_read(struct cdev *cdev, void *buf, size_t count,
-- ulong offset, ulong flags)
-+ loff_t offset, ulong flags)
- {
- ulong size, i;
- struct iim_priv *priv = cdev->priv;
-@@ -94,7 +94,7 @@ static ssize_t imx_iim_cdev_read(struct cdev *cdev, void *buf, size_t count,
- if ((sense_param = dev_get_param(cdev->dev, "explicit_sense_enable")))
- explicit_sense = simple_strtoul(sense_param, NULL, 0);
-
-- size = min((ulong)count, priv->banksize - offset);
-+ size = min((loff_t)count, priv->banksize - offset);
- if (explicit_sense) {
- for (i = 0; i < size; i++) {
- int row_val;
-@@ -176,7 +176,7 @@ out:
- #endif /* CONFIG_IMX_IIM_FUSE_BLOW */
-
- static ssize_t imx_iim_cdev_write(struct cdev *cdev, const void *buf, size_t count,
-- ulong offset, ulong flags)
-+ loff_t offset, ulong flags)
- {
- ulong size, i;
- struct iim_priv *priv = cdev->priv;
-@@ -186,7 +186,7 @@ static ssize_t imx_iim_cdev_write(struct cdev *cdev, const void *buf, size_t cou
- if ((write_param = dev_get_param(cdev->dev, "permanent_write_enable")))
- blow_enable = simple_strtoul(write_param, NULL, 0);
-
-- size = min((ulong)count, priv->banksize - offset);
-+ size = min((loff_t)count, priv->banksize - offset);
- #ifdef CONFIG_IMX_IIM_FUSE_BLOW
- if (blow_enable) {
- for (i = 0; i < size; i++) {
-diff --git a/arch/arm/mach-imx/include/mach/clock.h b/arch/arm/mach-imx/include/mach/clock.h
-index 1082178..050b7f8 100644
---- a/arch/arm/mach-imx/include/mach/clock.h
-+++ b/arch/arm/mach-imx/include/mach/clock.h
-@@ -30,9 +30,11 @@ ulong imx_get_lcdclk(void);
- ulong imx_get_i2cclk(void);
- ulong imx_get_mmcclk(void);
- ulong imx_get_cspiclk(void);
-+ulong imx_get_ipgclk(void);
-+ulong imx_get_usbclk(void);
-
--int imx_clko_set_div(int div);
--void imx_clko_set_src(int src);
-+int imx_clko_set_div(int num, int div);
-+void imx_clko_set_src(int num, int src);
-
- void imx_dump_clocks(void);
-
-diff --git a/arch/arm/mach-imx/include/mach/devices-imx51.h b/arch/arm/mach-imx/include/mach/devices-imx51.h
-index 5de0fa7..dbf5862 100644
---- a/arch/arm/mach-imx/include/mach/devices-imx51.h
-+++ b/arch/arm/mach-imx/include/mach/devices-imx51.h
-@@ -67,11 +67,11 @@ static inline struct device_d *imx51_add_nand(struct imx_nand_platform_data *pda
- struct resource res[] = {
- {
- .start = MX51_NFC_BASE_ADDR,
-- .size = SZ_4K,
-+ .end = MX51_NFC_BASE_ADDR + SZ_4K - 1,
- .flags = IORESOURCE_MEM,
- }, {
- .start = MX51_NFC_AXI_BASE_ADDR,
-- .size = SZ_4K,
-+ .end = MX51_NFC_AXI_BASE_ADDR + SZ_4K - 1,
- .flags = IORESOURCE_MEM,
- },
- };
-diff --git a/arch/arm/mach-imx/include/mach/devices-imx53.h b/arch/arm/mach-imx/include/mach/devices-imx53.h
-index a9fe454..0fc4b5c 100644
---- a/arch/arm/mach-imx/include/mach/devices-imx53.h
-+++ b/arch/arm/mach-imx/include/mach/devices-imx53.h
-@@ -61,11 +61,11 @@ static inline struct device_d *imx53_add_nand(struct imx_nand_platform_data *pda
- struct resource res[] = {
- {
- .start = MX53_NFC_BASE_ADDR,
-- .size = SZ_4K,
-+ .end = MX53_NFC_BASE_ADDR + SZ_4K - 1,
- .flags = IORESOURCE_MEM,
- }, {
- .start = MX53_NFC_AXI_BASE_ADDR,
-- .size = SZ_4K,
-+ .end = MX53_NFC_AXI_BASE_ADDR + SZ_4K - 1,
- .flags = IORESOURCE_MEM,
- },
- };
-diff --git a/arch/arm/mach-imx/include/mach/iomux-mx51.h b/arch/arm/mach-imx/include/mach/iomux-mx51.h
-index c7f5169..36c8989 100644
---- a/arch/arm/mach-imx/include/mach/iomux-mx51.h
-+++ b/arch/arm/mach-imx/include/mach/iomux-mx51.h
-@@ -256,13 +256,13 @@
- #define MX51_PAD_NANDF_RB1__GPIO3_9 IOMUX_PAD(0x4fc, 0x120, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
- #define MX51_PAD_NANDF_RB1__NANDF_RB1 IOMUX_PAD(0x4fc, 0x120, 0, __NA_, 0, NO_PAD_CTRL)
- #define MX51_PAD_NANDF_RB1__PATA_IORDY IOMUX_PAD(0x4fc, 0x120, 1, __NA_, 0, NO_PAD_CTRL)
--#define MX51_PAD_NANDF_RB1__SD4_CMD IOMUX_PAD(0x4fc, 0x120, 5, __NA_, 0, MX51_SDHCI_PAD_CTRL)
-+#define MX51_PAD_NANDF_RB1__SD4_CMD IOMUX_PAD(0x4fc, 0x120, 0x15, __NA_, 0, MX51_SDHCI_PAD_CTRL)
- #define MX51_PAD_NANDF_RB2__DISP2_WAIT IOMUX_PAD(0x500, 0x124, 5, 0x9a8, 0, NO_PAD_CTRL)
- #define MX51_PAD_NANDF_RB2__ECSPI2_SCLK IOMUX_PAD(0x500, 0x124, 2, __NA_, 0, MX51_ECSPI_PAD_CTRL)
- #define MX51_PAD_NANDF_RB2__FEC_COL IOMUX_PAD(0x500, 0x124, 1, 0x94c, 0, MX51_PAD_CTRL_2)
- #define MX51_PAD_NANDF_RB2__GPIO3_10 IOMUX_PAD(0x500, 0x124, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
- #define MX51_PAD_NANDF_RB2__NANDF_RB2 IOMUX_PAD(0x500, 0x124, 0, __NA_, 0, NO_PAD_CTRL)
--#define MX51_PAD_NANDF_RB2__USBH3_H3_DP IOMUX_PAD(0x500, 0x124, 7, __NA_, 0, NO_PAD_CTRL)
-+#define MX51_PAD_NANDF_RB2__USBH3_H3_DP IOMUX_PAD(0x500, 0x124, 0x17, __NA_, 0, NO_PAD_CTRL)
- #define MX51_PAD_NANDF_RB2__USBH3_NXT IOMUX_PAD(0x500, 0x124, 6, 0xa20, 0, NO_PAD_CTRL)
- #define MX51_PAD_NANDF_RB3__DISP1_WAIT IOMUX_PAD(0x504, 0x128, 5, __NA_, 0, NO_PAD_CTRL)
- #define MX51_PAD_NANDF_RB3__ECSPI2_MISO IOMUX_PAD(0x504, 0x128, 2, __NA_, 0, MX51_ECSPI_PAD_CTRL)
-@@ -270,7 +270,7 @@
- #define MX51_PAD_NANDF_RB3__GPIO3_11 IOMUX_PAD(0x504, 0x128, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
- #define MX51_PAD_NANDF_RB3__NANDF_RB3 IOMUX_PAD(0x504, 0x128, 0, __NA_, 0, NO_PAD_CTRL)
- #define MX51_PAD_NANDF_RB3__USBH3_CLK IOMUX_PAD(0x504, 0x128, 6, 0x9f8, 0, NO_PAD_CTRL)
--#define MX51_PAD_NANDF_RB3__USBH3_H3_DM IOMUX_PAD(0x504, 0x128, 7, __NA_, 0, NO_PAD_CTRL)
-+#define MX51_PAD_NANDF_RB3__USBH3_H3_DM IOMUX_PAD(0x504, 0x128, 0x17, __NA_, 0, NO_PAD_CTRL)
- #define MX51_PAD_GPIO_NAND__GPIO_NAND IOMUX_PAD(0x514, 0x12c, 0, 0x998, 0, MX51_GPIO_PAD_CTRL)
- #define MX51_PAD_GPIO_NAND__PATA_INTRQ IOMUX_PAD(0x514, 0x12c, 1, __NA_, 0, NO_PAD_CTRL)
- #define MX51_PAD_NANDF_CS0__GPIO3_16 IOMUX_PAD(0x518, 0x130, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
-@@ -283,13 +283,13 @@
- #define MX51_PAD_NANDF_CS2__NANDF_CS2 IOMUX_PAD(0x520, 0x138, 0, __NA_, 0, NO_PAD_CTRL)
- #define MX51_PAD_NANDF_CS2__PATA_CS_0 IOMUX_PAD(0x520, 0x138, 1, __NA_, 0, NO_PAD_CTRL)
- #define MX51_PAD_NANDF_CS2__SD4_CLK IOMUX_PAD(0x520, 0x138, 5, __NA_, 0, MX51_SDHCI_PAD_CTRL | PAD_CTL_HYS)
--#define MX51_PAD_NANDF_CS2__USBH3_H1_DP IOMUX_PAD(0x520, 0x138, 7, __NA_, 0, NO_PAD_CTRL)
-+#define MX51_PAD_NANDF_CS2__USBH3_H1_DP IOMUX_PAD(0x520, 0x138, 0x17, __NA_, 0, NO_PAD_CTRL)
- #define MX51_PAD_NANDF_CS3__FEC_MDC IOMUX_PAD(0x524, 0x13c, 2, __NA_, 0, MX51_PAD_CTRL_5)
- #define MX51_PAD_NANDF_CS3__GPIO3_19 IOMUX_PAD(0x524, 0x13c, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
- #define MX51_PAD_NANDF_CS3__NANDF_CS3 IOMUX_PAD(0x524, 0x13c, 0, __NA_, 0, NO_PAD_CTRL)
- #define MX51_PAD_NANDF_CS3__PATA_CS_1 IOMUX_PAD(0x524, 0x13c, 1, __NA_, 0, NO_PAD_CTRL)
- #define MX51_PAD_NANDF_CS3__SD4_DAT0 IOMUX_PAD(0x524, 0x13c, 5, __NA_, 0, MX51_SDHCI_PAD_CTRL)
--#define MX51_PAD_NANDF_CS3__USBH3_H1_DM IOMUX_PAD(0x524, 0x13c, 7, __NA_, 0, NO_PAD_CTRL)
-+#define MX51_PAD_NANDF_CS3__USBH3_H1_DM IOMUX_PAD(0x524, 0x13c, 0x17, __NA_, 0, NO_PAD_CTRL)
- #define MX51_PAD_NANDF_CS4__FEC_TDATA1 IOMUX_PAD(0x528, 0x140, 2, __NA_, 0, MX51_PAD_CTRL_5)
- #define MX51_PAD_NANDF_CS4__GPIO3_20 IOMUX_PAD(0x528, 0x140, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
- #define MX51_PAD_NANDF_CS4__NANDF_CS4 IOMUX_PAD(0x528, 0x140, 0, __NA_, 0, NO_PAD_CTRL)
-@@ -316,7 +316,7 @@
- #define MX51_PAD_NANDF_RDY_INT__FEC_TX_CLK IOMUX_PAD(0x538, 0x150, 1, 0x974, 0, MX51_PAD_CTRL_4)
- #define MX51_PAD_NANDF_RDY_INT__GPIO3_24 IOMUX_PAD(0x538, 0x150, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
- #define MX51_PAD_NANDF_RDY_INT__NANDF_RDY_INT IOMUX_PAD(0x538, 0x150, 0, 0x938, 0, NO_PAD_CTRL)
--#define MX51_PAD_NANDF_RDY_INT__SD3_CMD IOMUX_PAD(0x538, 0x150, 5, __NA_, 0, MX51_SDHCI_PAD_CTRL)
-+#define MX51_PAD_NANDF_RDY_INT__SD3_CMD IOMUX_PAD(0x538, 0x150, 0x15, __NA_, 0, MX51_SDHCI_PAD_CTRL)
- #define MX51_PAD_NANDF_D15__ECSPI2_MOSI IOMUX_PAD(0x53c, 0x154, 2, __NA_, 0, MX51_ECSPI_PAD_CTRL)
- #define MX51_PAD_NANDF_D15__GPIO3_25 IOMUX_PAD(0x53c, 0x154, 3, __NA_, 0, MX51_GPIO_PAD_CTRL)
- #define MX51_PAD_NANDF_D15__NANDF_D15 IOMUX_PAD(0x53c, 0x154, 0, __NA_, 0, NO_PAD_CTRL)
-@@ -672,23 +672,23 @@
- #define MX51_PAD_DISP2_DAT5__DISP2_DAT5 IOMUX_PAD(0x770, 0x368, 0, __NA_, 0, NO_PAD_CTRL)
- #define MX51_PAD_DISP2_DAT6__DISP2_DAT6 IOMUX_PAD(0x774, 0x36c, 0, __NA_, 0, NO_PAD_CTRL)
- #define MX51_PAD_DISP2_DAT6__FEC_TDATA1 IOMUX_PAD(0x774, 0x36c, 2, __NA_, 0, MX51_PAD_CTRL_5)
--#define MX51_PAD_DISP2_DAT6__GPIO1_19 IOMUX_PAD(0x774, 0x36c, 5, __NA_, 0, NO_PAD_CTRL)
-+#define MX51_PAD_DISP2_DAT6__GPIO1_19 IOMUX_PAD(0x774, 0x36c, 5, __NA_, 0, MX51_GPIO_PAD_CTRL)
- #define MX51_PAD_DISP2_DAT6__KEY_ROW4 IOMUX_PAD(0x774, 0x36c, 4, 0x9d0, 1, NO_PAD_CTRL)
- #define MX51_PAD_DISP2_DAT6__USBH3_STP IOMUX_PAD(0x774, 0x36c, 3, 0xa24, 1, NO_PAD_CTRL)
- #define MX51_PAD_DISP2_DAT7__DISP2_DAT7 IOMUX_PAD(0x778, 0x370, 0, __NA_, 0, NO_PAD_CTRL)
- #define MX51_PAD_DISP2_DAT7__FEC_TDATA2 IOMUX_PAD(0x778, 0x370, 2, __NA_, 0, MX51_PAD_CTRL_5)
--#define MX51_PAD_DISP2_DAT7__GPIO1_29 IOMUX_PAD(0x778, 0x370, 5, __NA_, 0, NO_PAD_CTRL)
-+#define MX51_PAD_DISP2_DAT7__GPIO1_29 IOMUX_PAD(0x778, 0x370, 5, __NA_, 0, MX51_GPIO_PAD_CTRL)
- #define MX51_PAD_DISP2_DAT7__KEY_ROW5 IOMUX_PAD(0x778, 0x370, 4, 0x9d4, 1, NO_PAD_CTRL)
- #define MX51_PAD_DISP2_DAT7__USBH3_NXT IOMUX_PAD(0x778, 0x370, 3, 0xa20, 1, NO_PAD_CTRL)
- #define MX51_PAD_DISP2_DAT8__DISP2_DAT8 IOMUX_PAD(0x77c, 0x374, 0, __NA_, 0, NO_PAD_CTRL)
- #define MX51_PAD_DISP2_DAT8__FEC_TDATA3 IOMUX_PAD(0x77c, 0x374, 2, __NA_, 0, MX51_PAD_CTRL_5)
--#define MX51_PAD_DISP2_DAT8__GPIO1_30 IOMUX_PAD(0x77c, 0x374, 5, __NA_, 0, NO_PAD_CTRL)
-+#define MX51_PAD_DISP2_DAT8__GPIO1_30 IOMUX_PAD(0x77c, 0x374, 5, __NA_, 0, MX51_GPIO_PAD_CTRL)
- #define MX51_PAD_DISP2_DAT8__KEY_ROW6 IOMUX_PAD(0x77c, 0x374, 4, 0x9d8, 1, NO_PAD_CTRL)
- #define MX51_PAD_DISP2_DAT8__USBH3_DATA0 IOMUX_PAD(0x77c, 0x374, 3, 0x9fc, 1, NO_PAD_CTRL)
- #define MX51_PAD_DISP2_DAT9__AUD6_RXC IOMUX_PAD(0x780, 0x378, 4, 0x8f4, 1, NO_PAD_CTRL)
- #define MX51_PAD_DISP2_DAT9__DISP2_DAT9 IOMUX_PAD(0x780, 0x378, 0, __NA_, 0, NO_PAD_CTRL)
- #define MX51_PAD_DISP2_DAT9__FEC_TX_EN IOMUX_PAD(0x780, 0x378, 2, __NA_, 0, MX51_PAD_CTRL_5)
--#define MX51_PAD_DISP2_DAT9__GPIO1_31 IOMUX_PAD(0x780, 0x378, 5, __NA_, 0, NO_PAD_CTRL)
-+#define MX51_PAD_DISP2_DAT9__GPIO1_31 IOMUX_PAD(0x780, 0x378, 5, __NA_, 0, MX51_GPIO_PAD_CTRL)
- #define MX51_PAD_DISP2_DAT9__USBH3_DATA1 IOMUX_PAD(0x780, 0x378, 3, 0xa00, 1, NO_PAD_CTRL)
- #define MX51_PAD_DISP2_DAT10__DISP2_DAT10 IOMUX_PAD(0x784, 0x37c, 0, __NA_, 0, NO_PAD_CTRL)
- #define MX51_PAD_DISP2_DAT10__DISP2_SER_CS IOMUX_PAD(0x784, 0x37c, 5, __NA_, 0, NO_PAD_CTRL)
-@@ -698,7 +698,7 @@
- #define MX51_PAD_DISP2_DAT11__AUD6_TXD IOMUX_PAD(0x788, 0x380, 4, 0x8f0, 1, NO_PAD_CTRL)
- #define MX51_PAD_DISP2_DAT11__DISP2_DAT11 IOMUX_PAD(0x788, 0x380, 0, __NA_, 0, NO_PAD_CTRL)
- #define MX51_PAD_DISP2_DAT11__FEC_RX_CLK IOMUX_PAD(0x788, 0x380, 2, 0x968, 1, NO_PAD_CTRL)
--#define MX51_PAD_DISP2_DAT11__GPIO1_10 IOMUX_PAD(0x788, 0x380, 7, __NA_, 0, NO_PAD_CTRL)
-+#define MX51_PAD_DISP2_DAT11__GPIO1_10 IOMUX_PAD(0x788, 0x380, 7, __NA_, 0, MX51_GPIO_PAD_CTRL)
- #define MX51_PAD_DISP2_DAT11__USBH3_DATA3 IOMUX_PAD(0x788, 0x380, 3, 0xa08, 1, NO_PAD_CTRL)
- #define MX51_PAD_DISP2_DAT12__AUD6_RXD IOMUX_PAD(0x78c, 0x384, 4, 0x8ec, 1, NO_PAD_CTRL)
- #define MX51_PAD_DISP2_DAT12__DISP2_DAT12 IOMUX_PAD(0x78c, 0x384, 0, __NA_, 0, NO_PAD_CTRL)
-@@ -746,16 +746,16 @@
- #define MX51_PAD_SD1_DATA3__CSPI_SS1 IOMUX_PAD(0x7b0, 0x3a8, 2, 0x920, 1, MX51_ECSPI_PAD_CTRL)
- #define MX51_PAD_SD1_DATA3__SD1_DATA3 IOMUX_PAD(0x7b0, 0x3a8, 0x10, __NA_, 0, MX51_SDHCI_PAD_CTRL)
- #define MX51_PAD_GPIO1_0__CSPI_SS2 IOMUX_PAD(0x7b4, 0x3ac, 2, 0x924, 0, MX51_ECSPI_PAD_CTRL)
--#define MX51_PAD_GPIO1_0__GPIO1_0 IOMUX_PAD(0x7b4, 0x3ac, 1, __NA_, 0, NO_PAD_CTRL)
-+#define MX51_PAD_GPIO1_0__GPIO1_0 IOMUX_PAD(0x7b4, 0x3ac, 1, __NA_, 0, MX51_GPIO_PAD_CTRL)
- #define MX51_PAD_GPIO1_0__SD1_CD IOMUX_PAD(0x7b4, 0x3ac, 0, __NA_, 0, MX51_ESDHC_PAD_CTRL)
- #define MX51_PAD_GPIO1_1__CSPI_MISO IOMUX_PAD(0x7b8, 0x3b0, 2, 0x918, 2, MX51_ECSPI_PAD_CTRL)
--#define MX51_PAD_GPIO1_1__GPIO1_1 IOMUX_PAD(0x7b8, 0x3b0, 1, __NA_, 0, NO_PAD_CTRL)
-+#define MX51_PAD_GPIO1_1__GPIO1_1 IOMUX_PAD(0x7b8, 0x3b0, 1, __NA_, 0, MX51_GPIO_PAD_CTRL)
- #define MX51_PAD_GPIO1_1__SD1_WP IOMUX_PAD(0x7b8, 0x3b0, 0, __NA_, 0, MX51_ESDHC_PAD_CTRL)
- #define MX51_PAD_EIM_DA12__EIM_DA12 IOMUX_PAD(__NA_, 0x04c, 0, 0x000, 0, NO_PAD_CTRL)
- #define MX51_PAD_EIM_DA13__EIM_DA13 IOMUX_PAD(__NA_, 0x050, 0, 0x000, 0, NO_PAD_CTRL)
- #define MX51_PAD_EIM_DA14__EIM_DA14 IOMUX_PAD(__NA_, 0x054, 0, 0x000, 0, NO_PAD_CTRL)
- #define MX51_PAD_EIM_DA15__EIM_DA15 IOMUX_PAD(__NA_, 0x058, 0, 0x000, 0, NO_PAD_CTRL)
--#define MX51_PAD_SD2_CMD__CSPI_MOSI IOMUX_PAD(__NA_, 0x3b4, 2, 0x91c, 3, MX51_ECSPI_PAD_CTRL)
-+#define MX51_PAD_SD2_CMD__CSPI_MOSI IOMUX_PAD(0x7bc, 0x3b4, 2, 0x91c, 3, MX51_ECSPI_PAD_CTRL)
- #define MX51_PAD_SD2_CMD__I2C1_SCL IOMUX_PAD(0x7bc, 0x3b4, 0x11, 0x9b0, 2, MX51_I2C_PAD_CTRL)
- #define MX51_PAD_SD2_CMD__SD2_CMD IOMUX_PAD(0x7bc, 0x3b4, 0x10, __NA_, 0, MX51_SDHCI_PAD_CTRL)
- #define MX51_PAD_SD2_CLK__CSPI_SCLK IOMUX_PAD(0x7c0, 0x3b8, 2, 0x914, 3, MX51_ECSPI_PAD_CTRL)
-@@ -766,19 +766,19 @@
- #define MX51_PAD_SD2_DATA0__SD2_DATA0 IOMUX_PAD(0x7c4, 0x3bc, 0x10, __NA_, 0, MX51_SDHCI_PAD_CTRL)
- #define MX51_PAD_SD2_DATA1__SD1_DAT5 IOMUX_PAD(0x7c8, 0x3c0, 1, __NA_, 0, NO_PAD_CTRL)
- #define MX51_PAD_SD2_DATA1__SD2_DATA1 IOMUX_PAD(0x7c8, 0x3c0, 0x10, __NA_, 0, MX51_SDHCI_PAD_CTRL)
--#define MX51_PAD_SD2_DATA1__USBH3_H2_DP IOMUX_PAD(0x7c8, 0x3c0, 2, __NA_, 0, NO_PAD_CTRL)
-+#define MX51_PAD_SD2_DATA1__USBH3_H2_DP IOMUX_PAD(0x7c8, 0x3c0, 0x12, __NA_, 0, NO_PAD_CTRL)
- #define MX51_PAD_SD2_DATA2__SD1_DAT6 IOMUX_PAD(0x7cc, 0x3c4, 1, __NA_, 0, NO_PAD_CTRL)
- #define MX51_PAD_SD2_DATA2__SD2_DATA2 IOMUX_PAD(0x7cc, 0x3c4, 0x10, __NA_, 0, MX51_SDHCI_PAD_CTRL)
--#define MX51_PAD_SD2_DATA2__USBH3_H2_DM IOMUX_PAD(0x7cc, 0x3c4, 2, __NA_, 0, NO_PAD_CTRL)
-+#define MX51_PAD_SD2_DATA2__USBH3_H2_DM IOMUX_PAD(0x7cc, 0x3c4, 0x12, __NA_, 0, NO_PAD_CTRL)
- #define MX51_PAD_SD2_DATA3__CSPI_SS2 IOMUX_PAD(0x7d0, 0x3c8, 2, 0x924, 1, MX51_ECSPI_PAD_CTRL)
- #define MX51_PAD_SD2_DATA3__SD1_DAT7 IOMUX_PAD(0x7d0, 0x3c8, 1, __NA_, 0, NO_PAD_CTRL)
- #define MX51_PAD_SD2_DATA3__SD2_DATA3 IOMUX_PAD(0x7d0, 0x3c8, 0x10, __NA_, 0, MX51_SDHCI_PAD_CTRL)
- #define MX51_PAD_GPIO1_2__CCM_OUT_2 IOMUX_PAD(0x7d4, 0x3cc, 5, __NA_, 0, NO_PAD_CTRL)
--#define MX51_PAD_GPIO1_2__GPIO1_2 IOMUX_PAD(0x7d4, 0x3cc, 0, __NA_, 0, NO_PAD_CTRL)
-+#define MX51_PAD_GPIO1_2__GPIO1_2 IOMUX_PAD(0x7d4, 0x3cc, 0, __NA_, 0, MX51_GPIO_PAD_CTRL)
- #define MX51_PAD_GPIO1_2__I2C2_SCL IOMUX_PAD(0x7d4, 0x3cc, 0x12, 0x9b8, 3, MX51_I2C_PAD_CTRL)
- #define MX51_PAD_GPIO1_2__PLL1_BYP IOMUX_PAD(0x7d4, 0x3cc, 7, 0x90c, 1, NO_PAD_CTRL)
- #define MX51_PAD_GPIO1_2__PWM1_PWMO IOMUX_PAD(0x7d4, 0x3cc, 1, __NA_, 0, NO_PAD_CTRL)
--#define MX51_PAD_GPIO1_3__GPIO1_3 IOMUX_PAD(0x7d8, 0x3d0, 0, __NA_, 0, NO_PAD_CTRL)
-+#define MX51_PAD_GPIO1_3__GPIO1_3 IOMUX_PAD(0x7d8, 0x3d0, 0, __NA_, 0, MX51_GPIO_PAD_CTRL)
- #define MX51_PAD_GPIO1_3__I2C2_SDA IOMUX_PAD(0x7d8, 0x3d0, 0x12, 0x9bc, 3, MX51_I2C_PAD_CTRL)
- #define MX51_PAD_GPIO1_3__PLL2_BYP IOMUX_PAD(0x7d8, 0x3d0, 7, 0x910, 1, NO_PAD_CTRL)
- #define MX51_PAD_GPIO1_3__PWM2_PWMO IOMUX_PAD(0x7d8, 0x3d0, 1, __NA_, 0, NO_PAD_CTRL)
-@@ -786,27 +786,27 @@
- #define MX51_PAD_PMIC_INT_REQ__PMIC_PMU_IRQ_B IOMUX_PAD(0x7fc, 0x3d4, 1, __NA_, 0, NO_PAD_CTRL)
- #define MX51_PAD_GPIO1_4__DISP2_EXT_CLK IOMUX_PAD(0x804, 0x3d8, 4, 0x908, 1, NO_PAD_CTRL)
- #define MX51_PAD_GPIO1_4__EIM_RDY IOMUX_PAD(0x804, 0x3d8, 3, 0x938, 1, NO_PAD_CTRL)
--#define MX51_PAD_GPIO1_4__GPIO1_4 IOMUX_PAD(0x804, 0x3d8, 0, __NA_, 0, NO_PAD_CTRL)
-+#define MX51_PAD_GPIO1_4__GPIO1_4 IOMUX_PAD(0x804, 0x3d8, 0, __NA_, 0, MX51_GPIO_PAD_CTRL)
- #define MX51_PAD_GPIO1_4__WDOG1_WDOG_B IOMUX_PAD(0x804, 0x3d8, 2, __NA_, 0, NO_PAD_CTRL)
- #define MX51_PAD_GPIO1_5__CSI2_MCLK IOMUX_PAD(0x808, 0x3dc, 6, __NA_, 0, NO_PAD_CTRL)
- #define MX51_PAD_GPIO1_5__DISP2_PIN16 IOMUX_PAD(0x808, 0x3dc, 3, __NA_, 0, NO_PAD_CTRL)
--#define MX51_PAD_GPIO1_5__GPIO1_5 IOMUX_PAD(0x808, 0x3dc, 0, __NA_, 0, NO_PAD_CTRL)
-+#define MX51_PAD_GPIO1_5__GPIO1_5 IOMUX_PAD(0x808, 0x3dc, 0, __NA_, 0, MX51_GPIO_PAD_CTRL)
- #define MX51_PAD_GPIO1_5__WDOG2_WDOG_B IOMUX_PAD(0x808, 0x3dc, 2, __NA_, 0, NO_PAD_CTRL)
- #define MX51_PAD_GPIO1_6__DISP2_PIN17 IOMUX_PAD(0x80c, 0x3e0, 4, __NA_, 0, NO_PAD_CTRL)
--#define MX51_PAD_GPIO1_6__GPIO1_6 IOMUX_PAD(0x80c, 0x3e0, 0, __NA_, 0, NO_PAD_CTRL)
-+#define MX51_PAD_GPIO1_6__GPIO1_6 IOMUX_PAD(0x80c, 0x3e0, 0, __NA_, 0, MX51_GPIO_PAD_CTRL)
- #define MX51_PAD_GPIO1_6__REF_EN_B IOMUX_PAD(0x80c, 0x3e0, 3, __NA_, 0, NO_PAD_CTRL)
- #define MX51_PAD_GPIO1_7__CCM_OUT_0 IOMUX_PAD(0x810, 0x3e4, 3, __NA_, 0, NO_PAD_CTRL)
--#define MX51_PAD_GPIO1_7__GPIO1_7 IOMUX_PAD(0x810, 0x3e4, 0, __NA_, 0, NO_PAD_CTRL)
-+#define MX51_PAD_GPIO1_7__GPIO1_7 IOMUX_PAD(0x810, 0x3e4, 0, __NA_, 0, MX51_GPIO_PAD_CTRL)
- #define MX51_PAD_GPIO1_7__SD2_WP IOMUX_PAD(0x810, 0x3e4, 6, __NA_, 0, MX51_ESDHC_PAD_CTRL)
- #define MX51_PAD_GPIO1_7__SPDIF_OUT1 IOMUX_PAD(0x810, 0x3e4, 2, __NA_, 0, NO_PAD_CTRL)
- #define MX51_PAD_GPIO1_8__CSI2_DATA_EN IOMUX_PAD(0x814, 0x3e8, 2, 0x99c, 2, NO_PAD_CTRL)
--#define MX51_PAD_GPIO1_8__GPIO1_8 IOMUX_PAD(0x814, 0x3e8, 0, __NA_, 0, NO_PAD_CTRL)
-+#define MX51_PAD_GPIO1_8__GPIO1_8 IOMUX_PAD(0x814, 0x3e8, 0, __NA_, 0, MX51_GPIO_PAD_CTRL)
- #define MX51_PAD_GPIO1_8__SD2_CD IOMUX_PAD(0x814, 0x3e8, 6, __NA_, 0, MX51_ESDHC_PAD_CTRL)
- #define MX51_PAD_GPIO1_8__USBH3_PWR IOMUX_PAD(0x814, 0x3e8, 1, __NA_, 0, NO_PAD_CTRL)
- #define MX51_PAD_GPIO1_9__CCM_OUT_1 IOMUX_PAD(0x818, 0x3ec, 3, __NA_, 0, NO_PAD_CTRL)
- #define MX51_PAD_GPIO1_9__DISP2_D1_CS IOMUX_PAD(0x818, 0x3ec, 2, __NA_, 0, NO_PAD_CTRL)
- #define MX51_PAD_GPIO1_9__DISP2_SER_CS IOMUX_PAD(0x818, 0x3ec, 7, __NA_, 0, NO_PAD_CTRL)
--#define MX51_PAD_GPIO1_9__GPIO1_9 IOMUX_PAD(0x818, 0x3ec, 0, __NA_, 0, NO_PAD_CTRL)
-+#define MX51_PAD_GPIO1_9__GPIO1_9 IOMUX_PAD(0x818, 0x3ec, 0, __NA_, 0, MX51_GPIO_PAD_CTRL)
- #define MX51_PAD_GPIO1_9__SD2_LCTL IOMUX_PAD(0x818, 0x3ec, 6, __NA_, 0, NO_PAD_CTRL)
- #define MX51_PAD_GPIO1_9__USBH3_OC IOMUX_PAD(0x818, 0x3ec, 1, __NA_, 0, NO_PAD_CTRL)
-
-diff --git a/arch/arm/mach-imx/speed-imx21.c b/arch/arm/mach-imx/speed-imx21.c
-index 6ab1dca..4729583 100644
---- a/arch/arm/mach-imx/speed-imx21.c
-+++ b/arch/arm/mach-imx/speed-imx21.c
-@@ -16,6 +16,7 @@
- */
-
- #include <common.h>
-+#include <asm-generic/errno.h>
- #include <mach/imx-regs.h>
- #include <mach/generic.h>
- #include <mach/clock.h>
-@@ -162,9 +163,13 @@ void imx_dump_clocks(void)
- * Returns the new divider (which may be smaller
- * than the desired one)
- */
--int imx_clko_set_div(int div)
-+int imx_clko_set_div(int num, int div)
- {
- ulong pcdr;
-+
-+ if (num != 1)
-+ return -ENODEV;
-+
- div--;
- div &= 0x7;
-
-@@ -178,11 +183,11 @@ int imx_clko_set_div(int div)
- /*
- * Set the clock source for the CLKO pin
- */
--void imx_clko_set_src(int src)
-+void imx_clko_set_src(int num, int src)
- {
- unsigned long ccsr;
-
-- if (src < 0) {
-+ if (src < 0 || num != 1) {
- return;
- }
-
-diff --git a/arch/arm/mach-imx/speed-imx25.c b/arch/arm/mach-imx/speed-imx25.c
-index f6dcacb..ed14113 100644
---- a/arch/arm/mach-imx/speed-imx25.c
-+++ b/arch/arm/mach-imx/speed-imx25.c
-@@ -1,4 +1,5 @@
- #include <common.h>
-+#include <asm-generic/errno.h>
- #include <mach/imx-regs.h>
- #include <io.h>
- #include <mach/clock.h>
-@@ -111,10 +112,13 @@ void imx_dump_clocks(void)
- * the new divider (which may be smaller
- * than the desired one)
- */
--int imx_clko_set_div(int div)
-+int imx_clko_set_div(int num, int div)
- {
- unsigned long mcr = readl(IMX_CCM_BASE + 0x64);
-
-+ if (num != 1)
-+ return -ENODEV;
-+
- div -= 1;
- div &= 0x3f;
-
-@@ -129,10 +133,13 @@ int imx_clko_set_div(int div)
- /*
- * Set the clock source for the CLKO pin
- */
--void imx_clko_set_src(int src)
-+void imx_clko_set_src(int num, int src)
- {
- unsigned long mcr = readl(IMX_CCM_BASE + 0x64);
-
-+ if (num != 1)
-+ return;
-+
- if (src < 0) {
- mcr &= ~(1 << 30);
- writel(mcr, IMX_CCM_BASE + 0x64);
-diff --git a/arch/arm/mach-imx/speed-imx27.c b/arch/arm/mach-imx/speed-imx27.c
-index aba5097..644fd04 100644
---- a/arch/arm/mach-imx/speed-imx27.c
-+++ b/arch/arm/mach-imx/speed-imx27.c
-@@ -16,6 +16,7 @@
- */
-
- #include <common.h>
-+#include <asm-generic/errno.h>
- #include <mach/imx-regs.h>
- #include <mach/generic.h>
- #include <mach/clock.h>
-@@ -189,9 +190,13 @@ void imx_dump_clocks(void)
- * the new divider (which may be smaller
- * than the desired one)
- */
--int imx_clko_set_div(int div)
-+int imx_clko_set_div(int num, int div)
- {
- ulong pcdr;
-+
-+ if (num != 1)
-+ return -ENODEV;
-+
- div--;
- div &= 0x7;
-
-@@ -205,10 +210,13 @@ int imx_clko_set_div(int div)
- /*
- * Set the clock source for the CLKO pin
- */
--void imx_clko_set_src(int src)
-+void imx_clko_set_src(int num, int src)
- {
- unsigned long ccsr;
-
-+ if (num != 1)
-+ return;
-+
- if (src < 0) {
- PCDR0 &= ~(1 << 25);
- return;
-diff --git a/arch/arm/mach-imx/speed-imx35.c b/arch/arm/mach-imx/speed-imx35.c
-index 1e1c39f..684dc14 100644
---- a/arch/arm/mach-imx/speed-imx35.c
-+++ b/arch/arm/mach-imx/speed-imx35.c
-@@ -16,6 +16,7 @@
- */
-
- #include <common.h>
-+#include <asm-generic/errno.h>
- #include <mach/imx-regs.h>
- #include <io.h>
- #include <mach/clock.h>
-@@ -84,7 +85,7 @@ unsigned long imx_get_ahbclk(void)
- return fref / aad->ahb;
- }
-
--static unsigned long imx_get_ipgclk(void)
-+unsigned long imx_get_ipgclk(void)
- {
- ulong clk = imx_get_ahbclk();
-
-@@ -203,10 +204,13 @@ void imx_dump_clocks(void)
- * the new divider (which may be smaller
- * than the desired one)
- */
--int imx_clko_set_div(int div)
-+int imx_clko_set_div(int num, int div)
- {
- unsigned long cosr = readl(IMX_CCM_BASE + CCM_COSR);
-
-+ if (num != 1)
-+ return -ENODEV;
-+
- div -= 1;
- div &= 0x3f;
-
-@@ -221,10 +225,13 @@ int imx_clko_set_div(int div)
- /*
- * Set the clock source for the CLKO pin
- */
--void imx_clko_set_src(int src)
-+void imx_clko_set_src(int num, int src)
- {
- unsigned long cosr = readl(IMX_CCM_BASE + CCM_COSR);
-
-+ if (num != 1)
-+ return;
-+
- if (src < 0) {
- cosr &= ~(1 << 5);
- writel(cosr, IMX_CCM_BASE + CCM_COSR);
-diff --git a/arch/arm/mach-imx/speed-imx51.c b/arch/arm/mach-imx/speed-imx51.c
-index 8d1ecf3..87fbc75 100644
---- a/arch/arm/mach-imx/speed-imx51.c
-+++ b/arch/arm/mach-imx/speed-imx51.c
-@@ -1,12 +1,19 @@
- #include <common.h>
- #include <io.h>
- #include <asm-generic/div64.h>
-+#include <asm-generic/errno.h>
- #include <mach/imx51-regs.h>
-+#include <mach/clock.h>
- #include <mach/clock-imx51_53.h>
-
- static u32 ccm_readl(u32 ofs)
- {
-- return readl(MX51_CCM_BASE_ADDR + ofs);
-+ return readl(IOMEM(MX51_CCM_BASE_ADDR) + ofs);
-+}
-+
-+static void ccm_writel(u32 val, u32 ofs)
-+{
-+ writel(val, MX51_CCM_BASE_ADDR + ofs);
- }
-
- static unsigned long ckil_get_rate(void)
-@@ -142,7 +149,7 @@ unsigned long imx_get_uartclk(void)
- return parent_rate / (prediv * podf);
- }
-
--static unsigned long imx_get_ahbclk(void)
-+unsigned long imx_get_ahbclk(void)
- {
- u32 reg, div;
-
-@@ -221,6 +228,70 @@ unsigned long imx_get_usbclk(void)
- return rate / (prediv * podf);
- }
-
-+/*
-+ * Set the divider of the CLKO pin. Returns
-+ * the new divider (which may be smaller
-+ * than the desired one)
-+ */
-+int imx_clko_set_div(int num, int div)
-+{
-+ u32 ccosr = ccm_readl(MX5_CCM_CCOSR);
-+
-+ div--;
-+
-+ switch (num) {
-+ case 1:
-+ div &= 0x7;
-+ ccosr &= ~(0x7 << 4);
-+ ccosr |= div << 4;
-+ ccm_writel(ccosr, MX5_CCM_CCOSR);
-+ break;
-+ case 2:
-+ div &= 0x7;
-+ ccosr &= ~(0x7 << 21);
-+ ccosr |= div << 21;
-+ ccm_writel(ccosr, MX5_CCM_CCOSR);
-+ break;
-+ default:
-+ return -ENODEV;
-+ }
-+
-+ return div + 1;
-+}
-+
-+/*
-+ * Set the clock source for the CLKO pin
-+ */
-+void imx_clko_set_src(int num, int src)
-+{
-+ u32 ccosr = ccm_readl(MX5_CCM_CCOSR);
-+
-+ switch (num) {
-+ case 1:
-+ if (src < 0) {
-+ ccosr &= ~(1 << 7);
-+ break;
-+ }
-+ ccosr &= ~0xf;
-+ ccosr |= src & 0xf;
-+ ccosr |= 1 << 7;
-+ break;
-+ case 2:
-+ if (src < 0) {
-+ ccosr &= ~(1 << 24);
-+ break;
-+ }
-+ ccosr &= ~(0x1f << 16);
-+ ccosr |= (src & 0x1f) << 16;
-+ ccosr |= 1 << 24;
-+ break;
-+ default:
-+ return;
-+ }
-+
-+ ccm_writel(ccosr, MX5_CCM_CCOSR);
-+}
-+
- void imx_dump_clocks(void)
- {
- printf("pll1: %ld\n", pll1_main_get_rate());
-diff --git a/arch/arm/mach-imx/speed-imx53.c b/arch/arm/mach-imx/speed-imx53.c
-index 634341e..653dae3 100644
---- a/arch/arm/mach-imx/speed-imx53.c
-+++ b/arch/arm/mach-imx/speed-imx53.c
-@@ -2,6 +2,7 @@
- #include <io.h>
- #include <asm-generic/div64.h>
- #include <mach/imx-regs.h>
-+#include <mach/clock.h>
- #include "mach/clock-imx51_53.h"
-
- static u32 ccm_readl(u32 ofs)
-@@ -139,7 +140,7 @@ unsigned long imx_get_uartclk(void)
- return parent_rate / (prediv * podf);
- }
-
--static unsigned long imx_get_ahbclk(void)
-+unsigned long imx_get_ahbclk(void)
- {
- u32 reg, div;
-
-diff --git a/arch/arm/mach-mxs/Kconfig b/arch/arm/mach-mxs/Kconfig
-index 3348a3c..746c986 100644
---- a/arch/arm/mach-mxs/Kconfig
-+++ b/arch/arm/mach-mxs/Kconfig
-@@ -61,6 +61,7 @@ config MACH_TX28
-
- config MACH_MX28EVK
- bool "mx28-evk"
-+ select MXS_OCOTP
- help
- Say Y here if you are using the Freescale i.MX28-EVK board
-
-@@ -80,6 +81,25 @@ config MXS_OCOTP
- internal view). Don't use register offsets here, the SET, CLR and
- TGL registers are not mapped!
-
-+config MXS_OCOTP_WRITABLE
-+ bool "OCOTP write support"
-+ depends on MXS_OCOTP
-+ help
-+ Enable this option to add writing to OCOTP.
-+ Warning: blown bits can not be unblown. Use with care.
-+
-+ Before being actually able to blow the bits, you need to explicitely
-+ enable writing:
-+ ocotp0.permanent_write_enable=1
-+
-+config MXS_CMD_BCB
-+ depends on NAND_MXS
-+ tristate "Nand bcb command"
-+ help
-+ To be able to boot from NAND the i.MX23/28 need a Boot Control Block
-+ in flash. This option enabled the 'bcb' command which can be used to
-+ generate this block during runtime.
-+
- endmenu
-
- menu "Board specific settings "
-diff --git a/arch/arm/mach-mxs/Makefile b/arch/arm/mach-mxs/Makefile
-index 172d928..fe93096 100644
---- a/arch/arm/mach-mxs/Makefile
-+++ b/arch/arm/mach-mxs/Makefile
-@@ -1,5 +1,6 @@
--obj-y += imx.o iomux-imx.o reset-imx.o
-+obj-y += imx.o iomux-imx.o power.o common.o
- obj-$(CONFIG_DRIVER_VIDEO_STM) += imx_lcd_clk.o
--obj-$(CONFIG_ARCH_IMX23) += speed-imx23.o clocksource-imx23.o usb.o
--obj-$(CONFIG_ARCH_IMX28) += speed-imx28.o clocksource-imx28.o
-+obj-$(CONFIG_ARCH_IMX23) += speed-imx23.o clocksource-imx23.o usb-imx23.o soc-imx23.o
-+obj-$(CONFIG_ARCH_IMX28) += speed-imx28.o clocksource-imx28.o usb-imx28.o soc-imx28.o
- obj-$(CONFIG_MXS_OCOTP) += ocotp.o
-+obj-$(CONFIG_MXS_CMD_BCB) += bcb.o
-diff --git a/arch/arm/mach-mxs/bcb.c b/arch/arm/mach-mxs/bcb.c
-new file mode 100644
-index 0000000..d0a3ddc
---- /dev/null
-+++ b/arch/arm/mach-mxs/bcb.c
-@@ -0,0 +1,399 @@
-+/*
-+ * (C) Copyright 2011 Wolfram Sang, Pengutronix e.K.
-+ *
-+ * 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.
-+ *
-+ * Based on a similar function in Karo Electronics TX28-U-Boot (flash.c).
-+ * Probably written by Lothar WaĂźmann (like tx28.c).
-+ */
-+
-+#include <common.h>
-+#include <command.h>
-+#include <environment.h>
-+#include <malloc.h>
-+#include <nand.h>
-+#include <sizes.h>
-+#include <errno.h>
-+#include <io.h>
-+
-+#include <mach/imx-regs.h>
-+
-+#include <linux/err.h>
-+#include <linux/mtd/nand.h>
-+
-+#define FCB_START_BLOCK 0
-+#define NUM_FCB_BLOCKS 1
-+#define MAX_FCB_BLOCKS 32768
-+
-+#define GPMI_TIMING0 0x00000070
-+#define GPMI_TIMING0_ADDRESS_SETUP_MASK (0xff << 16)
-+#define GPMI_TIMING0_ADDRESS_SETUP_OFFSET 16
-+#define GPMI_TIMING0_DATA_HOLD_MASK (0xff << 8)
-+#define GPMI_TIMING0_DATA_HOLD_OFFSET 8
-+#define GPMI_TIMING0_DATA_SETUP_MASK 0xff
-+#define GPMI_TIMING0_DATA_SETUP_OFFSET 0
-+
-+#define GPMI_TIMING1 0x00000080
-+
-+#define BCH_MODE 0x00000020
-+
-+#define BCH_FLASH0LAYOUT0 0x00000080
-+#define BCH_FLASHLAYOUT0_NBLOCKS_MASK (0xff << 24)
-+#define BCH_FLASHLAYOUT0_NBLOCKS_OFFSET 24
-+#define BCH_FLASHLAYOUT0_META_SIZE_MASK (0xff << 16)
-+#define BCH_FLASHLAYOUT0_META_SIZE_OFFSET 16
-+#define BCH_FLASHLAYOUT0_ECC0_MASK (0xf << 12)
-+#define BCH_FLASHLAYOUT0_ECC0_OFFSET 12
-+#define BCH_FLASHLAYOUT0_DATA0_SIZE_MASK 0xfff
-+#define BCH_FLASHLAYOUT0_DATA0_SIZE_OFFSET 0
-+
-+#define BCH_FLASH0LAYOUT1 0x00000090
-+#define BCH_FLASHLAYOUT1_PAGE_SIZE_MASK (0xffff << 16)
-+#define BCH_FLASHLAYOUT1_PAGE_SIZE_OFFSET 16
-+#define BCH_FLASHLAYOUT1_ECCN_MASK (0xf << 12)
-+#define BCH_FLASHLAYOUT1_ECCN_OFFSET 12
-+#define BCH_FLASHLAYOUT1_DATAN_SIZE_MASK 0xfff
-+#define BCH_FLASHLAYOUT1_DATAN_SIZE_OFFSET 0
-+
-+struct mx28_nand_timing {
-+ u8 data_setup;
-+ u8 data_hold;
-+ u8 address_setup;
-+ u8 dsample_time;
-+ u8 nand_timing_state;
-+ u8 tREA;
-+ u8 tRLOH;
-+ u8 tRHOH;
-+};
-+
-+struct mx28_fcb {
-+ u32 checksum;
-+ u32 fingerprint;
-+ u32 version;
-+ struct mx28_nand_timing timing;
-+ u32 page_data_size;
-+ u32 total_page_size;
-+ u32 sectors_per_block;
-+ u32 number_of_nands; /* not used by ROM code */
-+ u32 total_internal_die; /* not used by ROM code */
-+ u32 cell_type; /* not used by ROM code */
-+ u32 ecc_blockn_type;
-+ u32 ecc_block0_size;
-+ u32 ecc_blockn_size;
-+ u32 ecc_block0_type;
-+ u32 metadata_size;
-+ u32 ecc_blocks_per_page;
-+ u32 rsrvd[6]; /* not used by ROM code */
-+ u32 bch_mode;
-+ u32 boot_patch;
-+ u32 patch_sectors;
-+ u32 fw1_start_page;
-+ u32 fw2_start_page;
-+ u32 fw1_sectors;
-+ u32 fw2_sectors;
-+ u32 dbbt_search_area;
-+ u32 bb_mark_byte;
-+ u32 bb_mark_startbit;
-+ u32 bb_mark_phys_offset;
-+};
-+
-+struct mx28_dbbt_header {
-+ u32 checksum;
-+ u32 fingerprint;
-+ u32 version;
-+ u32 number_bb;
-+ u32 number_pages;
-+ u8 spare[492];
-+};
-+
-+struct mx28_dbbt {
-+ u32 nand_number;
-+ u32 number_bb;
-+ u32 bb_num[2040 / 4];
-+};
-+
-+#define BF_VAL(v, bf) (((v) & bf##_MASK) >> bf##_OFFSET)
-+#define GETBIT(v,n) (((v) >> (n)) & 0x1)
-+
-+static u8 calculate_parity_13_8(u8 d)
-+{
-+ u8 p = 0;
-+
-+ p |= (GETBIT(d, 6) ^ GETBIT(d, 5) ^ GETBIT(d, 3) ^ GETBIT(d, 2)) << 0;
-+ p |= (GETBIT(d, 7) ^ GETBIT(d, 5) ^ GETBIT(d, 4) ^ GETBIT(d, 2) ^ GETBIT(d, 1)) << 1;
-+ p |= (GETBIT(d, 7) ^ GETBIT(d, 6) ^ GETBIT(d, 5) ^ GETBIT(d, 1) ^ GETBIT(d, 0)) << 2;
-+ p |= (GETBIT(d, 7) ^ GETBIT(d, 4) ^ GETBIT(d, 3) ^ GETBIT(d, 0)) << 3;
-+ p |= (GETBIT(d, 6) ^ GETBIT(d, 4) ^ GETBIT(d, 3) ^ GETBIT(d, 2) ^ GETBIT(d, 1) ^ GETBIT(d, 0)) << 4;
-+ return p;
-+}
-+
-+static void encode_hamming_13_8(void *_src, void *_ecc, size_t size)
-+{
-+ int i;
-+ u8 *src = _src;
-+ u8 *ecc = _ecc;
-+
-+ for (i = 0; i < size; i++)
-+ ecc[i] = calculate_parity_13_8(src[i]);
-+}
-+
-+static u32 calc_chksum(void *buf, size_t size)
-+{
-+ u32 chksum = 0;
-+ u8 *bp = buf;
-+ size_t i;
-+
-+ for (i = 0; i < size; i++)
-+ chksum += bp[i];
-+
-+ return ~chksum;
-+}
-+
-+/*
-+ Physical organisation of data in NAND flash:
-+ metadata
-+ payload chunk 0 (may be empty)
-+ ecc for metadata + payload chunk 0
-+ payload chunk 1
-+ ecc for payload chunk 1
-+...
-+ payload chunk n
-+ ecc for payload chunk n
-+ */
-+
-+static int calc_bb_offset(struct mtd_info *mtd, struct mx28_fcb *fcb)
-+{
-+ int bb_mark_offset;
-+ int chunk_data_size = fcb->ecc_blockn_size * 8;
-+ int chunk_ecc_size = (fcb->ecc_blockn_type << 1) * 13;
-+ int chunk_total_size = chunk_data_size + chunk_ecc_size;
-+ int bb_mark_chunk, bb_mark_chunk_offs;
-+
-+ bb_mark_offset = (mtd->writesize - fcb->metadata_size) * 8;
-+ if (fcb->ecc_block0_size == 0)
-+ bb_mark_offset -= (fcb->ecc_block0_type << 1) * 13;
-+
-+ bb_mark_chunk = bb_mark_offset / chunk_total_size;
-+ bb_mark_chunk_offs = bb_mark_offset - (bb_mark_chunk * chunk_total_size);
-+ if (bb_mark_chunk_offs > chunk_data_size) {
-+ printf("Unsupported ECC layout; BB mark resides in ECC data: %u\n",
-+ bb_mark_chunk_offs);
-+ return -EINVAL;
-+ }
-+ bb_mark_offset -= bb_mark_chunk * chunk_ecc_size;
-+ return bb_mark_offset;
-+}
-+
-+static struct mx28_fcb *create_fcb(struct mtd_info *mtd, void *buf, unsigned fw1_start_block,
-+ size_t fw_size, unsigned fw2_start_block)
-+{
-+ u32 fl0, fl1, t0;
-+ int metadata_size;
-+ int bb_mark_bit_offs;
-+ struct mx28_fcb *fcb;
-+ int fcb_offs;
-+ void __iomem *bch_regs = (void *)MXS_BCH_BASE;
-+ void __iomem *gpmi_regs = (void *)MXS_GPMI_BASE;
-+
-+ fl0 = readl(bch_regs + BCH_FLASH0LAYOUT0);
-+ fl1 = readl(bch_regs + BCH_FLASH0LAYOUT1);
-+ t0 = readl(gpmi_regs + GPMI_TIMING0);
-+ metadata_size = BF_VAL(fl0, BCH_FLASHLAYOUT0_META_SIZE);
-+
-+ fcb = buf + ALIGN(metadata_size, 4);
-+ fcb_offs = (void *)fcb - buf;
-+
-+ memset(buf, 0x00, fcb_offs);
-+ memset(fcb, 0x00, sizeof(*fcb));
-+ memset(fcb + 1, 0xff, mtd->erasesize - fcb_offs - sizeof(*fcb));
-+
-+ strncpy((char *)&fcb->fingerprint, "FCB ", 4);
-+ fcb->version = cpu_to_be32(1);
-+
-+ fcb->timing.data_setup = BF_VAL(t0, GPMI_TIMING0_DATA_SETUP);
-+ fcb->timing.data_hold = BF_VAL(t0, GPMI_TIMING0_DATA_HOLD);
-+ fcb->timing.address_setup = BF_VAL(t0, GPMI_TIMING0_ADDRESS_SETUP);
-+
-+ fcb->page_data_size = mtd->writesize;
-+ fcb->total_page_size = mtd->writesize + mtd->oobsize;
-+ fcb->sectors_per_block = mtd->erasesize / mtd->writesize;
-+
-+ fcb->ecc_block0_type = BF_VAL(fl0, BCH_FLASHLAYOUT0_ECC0);
-+ fcb->ecc_block0_size = BF_VAL(fl0, BCH_FLASHLAYOUT0_DATA0_SIZE);
-+ fcb->ecc_blockn_type = BF_VAL(fl1, BCH_FLASHLAYOUT1_ECCN);
-+ fcb->ecc_blockn_size = BF_VAL(fl1, BCH_FLASHLAYOUT1_DATAN_SIZE);
-+
-+ fcb->metadata_size = BF_VAL(fl0, BCH_FLASHLAYOUT0_META_SIZE);
-+ fcb->ecc_blocks_per_page = BF_VAL(fl0, BCH_FLASHLAYOUT0_NBLOCKS);
-+ fcb->bch_mode = readl(bch_regs + BCH_MODE);
-+/*
-+ fcb->boot_patch = 0;
-+ fcb->patch_sectors = 0;
-+*/
-+ fcb->fw1_start_page = fw1_start_block / mtd->writesize;
-+ fcb->fw1_sectors = DIV_ROUND_UP(fw_size, mtd->writesize);
-+
-+ if (fw2_start_block != 0 && fw2_start_block < mtd->size / mtd->erasesize) {
-+ fcb->fw2_start_page = fw2_start_block / mtd->writesize;
-+ fcb->fw2_sectors = fcb->fw1_sectors;
-+ }
-+
-+ fcb->dbbt_search_area = 1;
-+
-+ bb_mark_bit_offs = calc_bb_offset(mtd, fcb);
-+ if (bb_mark_bit_offs < 0)
-+ return ERR_PTR(bb_mark_bit_offs);
-+ fcb->bb_mark_byte = bb_mark_bit_offs / 8;
-+ fcb->bb_mark_startbit = bb_mark_bit_offs % 8;
-+ fcb->bb_mark_phys_offset = mtd->writesize;
-+
-+ fcb->checksum = calc_chksum(&fcb->fingerprint, 512 - 4);
-+ return fcb;
-+}
-+
-+static int find_fcb(struct mtd_info *mtd, void *ref, int page)
-+{
-+ int ret = 0;
-+ struct nand_chip *chip = mtd->priv;
-+ void *buf = malloc(mtd->erasesize);
-+
-+ if (buf == NULL)
-+ return -ENOMEM;
-+
-+ chip->select_chip(mtd, 0);
-+ chip->cmdfunc(mtd, NAND_CMD_READ0, 0x00, page);
-+ ret = chip->ecc.read_page_raw(mtd, chip, buf);
-+ if (ret) {
-+ printf("Failed to read FCB from page %u: %d\n", page, ret);
-+ return ret;
-+ }
-+ chip->select_chip(mtd, -1);
-+ if (memcmp(buf, ref, mtd->writesize) == 0) {
-+ printf("%s: Found FCB in page %u (%08x)\n", __func__,
-+ page, page * mtd->writesize);
-+ ret = 1;
-+ }
-+ free(buf);
-+ return ret;
-+}
-+
-+static int write_fcb(struct mtd_info *mtd, void *buf, int block)
-+{
-+ int ret;
-+ struct nand_chip *chip = mtd->priv;
-+ int page = block / mtd->writesize;
-+ struct erase_info erase_opts = {
-+ .mtd = mtd,
-+ .addr = block,
-+ .len = mtd->erasesize,
-+ .callback = NULL,
-+ };
-+
-+ ret = find_fcb(mtd, buf, page);
-+ if (ret > 0) {
-+ printf("FCB at block %08x is up to date\n", block);
-+ return 0;
-+ }
-+
-+ ret = mtd->erase(mtd, &erase_opts);
-+ if (ret) {
-+ printf("Failed to erase FCB block %08x\n", block);
-+ return ret;
-+ }
-+
-+ printf("Writing FCB to block %08x\n", block);
-+ chip->select_chip(mtd, 0);
-+ ret = chip->write_page(mtd, chip, buf, page, 0, 1);
-+ if (ret) {
-+ printf("Failed to write FCB to block %08x: %d\n", block, ret);
-+ }
-+ chip->select_chip(mtd, -1);
-+ return ret;
-+}
-+
-+int update_bcb(int argc, char *argv[])
-+{
-+ int ret;
-+ int block;
-+ void *buf;
-+ struct mx28_fcb *fcb;
-+ struct cdev *tmp_cdev, *bcb_cdev, *firmware_cdev;
-+ unsigned long fw2_offset = 0;
-+ struct mtd_info *mtd;
-+ unsigned fcb_written = 0;
-+
-+ if (argc == 1)
-+ return COMMAND_ERROR_USAGE;
-+
-+ tmp_cdev = cdev_by_name("nand0");
-+ if (!tmp_cdev || !tmp_cdev->mtd) {
-+ pr_err("%s: No NAND device!\n", __func__);
-+ return -ENODEV;
-+ }
-+
-+ mtd = tmp_cdev->mtd;
-+
-+ bcb_cdev = cdev_by_name("nand0.bcb");
-+ if (!bcb_cdev) {
-+ pr_err("%s: No FCB device!\n", __func__);
-+ return -ENODEV;
-+ }
-+
-+ firmware_cdev = cdev_by_name(argv[1]);
-+ if (!firmware_cdev) {
-+ pr_err("%s: Bootstream-Image not found!\n", __func__);
-+ return -ENODEV;
-+ }
-+
-+ if (argc > 2) {
-+ tmp_cdev = cdev_by_name(argv[2]);
-+ if (!tmp_cdev) {
-+ pr_err("%s: Redundant Bootstream-Image not found!\n", __func__);
-+ return -ENODEV;
-+ }
-+ fw2_offset = tmp_cdev->offset;
-+ }
-+
-+ buf = malloc(mtd->erasesize);
-+ if (!buf)
-+ return -ENOMEM;
-+
-+ fcb = create_fcb(mtd, buf, firmware_cdev->offset, firmware_cdev->size, fw2_offset);
-+ if (IS_ERR(fcb)) {
-+ printf("Failed to initialize FCB: %ld\n", PTR_ERR(fcb));
-+ return PTR_ERR(fcb);
-+ }
-+ encode_hamming_13_8(fcb, (void *)fcb + 512, 512);
-+
-+ for (block = bcb_cdev->offset; block < bcb_cdev->offset + bcb_cdev->size / 2;
-+ block += mtd->erasesize) {
-+
-+ if (nand_isbad_bbt(mtd, block, false))
-+ continue;
-+
-+ ret = write_fcb(mtd, buf, block);
-+ if (ret) {
-+ printf("Failed to write FCB to block %u\n", block);
-+ return ret;
-+ }
-+
-+ fcb_written++;
-+ }
-+
-+ return fcb_written ? 0 : -ENOSPC;
-+}
-+
-+BAREBOX_CMD_HELP_START(bcb)
-+BAREBOX_CMD_HELP_USAGE("bcb <first_bootstream> [second_bootstream]\n")
-+BAREBOX_CMD_HELP_SHORT("Write a BCB to NAND flash which an MX23/28 needs to boot.\n")
-+BAREBOX_CMD_HELP_TEXT ("Example: bcb nand0.bootstream\n")
-+BAREBOX_CMD_HELP_END
-+
-+BAREBOX_CMD_START(bcb)
-+ .cmd = update_bcb,
-+ .usage = "Writes a MX23/28 BCB data structure to flash",
-+ BAREBOX_CMD_HELP(cmd_bcb_help)
-+BAREBOX_CMD_END
-diff --git a/arch/arm/mach-mxs/common.c b/arch/arm/mach-mxs/common.c
-new file mode 100644
-index 0000000..3730633
---- /dev/null
-+++ b/arch/arm/mach-mxs/common.c
-@@ -0,0 +1,33 @@
-+#include <common.h>
-+#include <io.h>
-+#include <mach/mxs.h>
-+#include <mach/imx-regs.h>
-+
-+#define MXS_BLOCK_SFTRST (1 << 31)
-+#define MXS_BLOCK_CLKGATE (1 << 30)
-+
-+int mxs_reset_block(void __iomem *reg, int just_enable)
-+{
-+ /* Clear SFTRST */
-+ writel(MXS_BLOCK_SFTRST, reg + BIT_CLR);
-+ mdelay(1);
-+
-+ /* Clear CLKGATE */
-+ writel(MXS_BLOCK_CLKGATE, reg + BIT_CLR);
-+
-+ if (!just_enable) {
-+ /* Set SFTRST */
-+ writel(MXS_BLOCK_SFTRST, reg + BIT_SET);
-+ mdelay(1);
-+ }
-+
-+ /* Clear SFTRST */
-+ writel(MXS_BLOCK_SFTRST, reg + BIT_CLR);
-+ mdelay(1);
-+
-+ /* Clear CLKGATE */
-+ writel(MXS_BLOCK_CLKGATE, reg + BIT_CLR);
-+ mdelay(1);
-+
-+ return 0;
-+}
-diff --git a/arch/arm/mach-mxs/include/mach/clock-imx23.h b/arch/arm/mach-mxs/include/mach/clock-imx23.h
-index 723f343..6507792 100644
---- a/arch/arm/mach-mxs/include/mach/clock-imx23.h
-+++ b/arch/arm/mach-mxs/include/mach/clock-imx23.h
-@@ -18,11 +18,13 @@ unsigned imx_get_emiclk(void);
- unsigned imx_get_ioclk(void);
- unsigned imx_get_armclk(void);
- unsigned imx_get_hclk(void);
-+unsigned imx_set_hclk(unsigned);
- unsigned imx_get_xclk(void);
- unsigned imx_get_sspclk(unsigned);
- unsigned imx_set_sspclk(unsigned, unsigned, int);
- unsigned imx_set_ioclk(unsigned);
- unsigned imx_set_lcdifclk(unsigned);
- unsigned imx_get_lcdifclk(void);
-+void imx_enable_nandclk(void);
-
- #endif /* MACH_CLOCK_IMX23_H */
-diff --git a/arch/arm/mach-mxs/include/mach/clock-imx28.h b/arch/arm/mach-mxs/include/mach/clock-imx28.h
-index 45fb043..0604f0a 100644
---- a/arch/arm/mach-mxs/include/mach/clock-imx28.h
-+++ b/arch/arm/mach-mxs/include/mach/clock-imx28.h
-@@ -18,6 +18,7 @@ unsigned imx_get_emiclk(void);
- unsigned imx_get_ioclk(unsigned);
- unsigned imx_get_armclk(void);
- unsigned imx_get_hclk(void);
-+unsigned imx_set_hclk(unsigned);
- unsigned imx_get_xclk(void);
- unsigned imx_get_sspclk(unsigned);
- unsigned imx_set_sspclk(unsigned, unsigned, int);
-@@ -26,6 +27,7 @@ unsigned imx_set_lcdifclk(unsigned);
- unsigned imx_get_lcdifclk(void);
- unsigned imx_get_fecclk(void);
- void imx_enable_enetclk(void);
-+void imx_enable_nandclk(void);
-
- #endif /* MACH_CLOCK_IMX28_H */
-
-diff --git a/arch/arm/mach-mxs/include/mach/dma.h b/arch/arm/mach-mxs/include/mach/dma.h
-new file mode 100644
-index 0000000..52747e2
---- /dev/null
-+++ b/arch/arm/mach-mxs/include/mach/dma.h
-@@ -0,0 +1,145 @@
-+/*
-+ * Freescale i.MX28 APBH DMA
-+ *
-+ * Copyright (C) 2011 Marek Vasut <marek.vasut@gmail.com>
-+ * on behalf of DENX Software Engineering GmbH
-+ *
-+ * Based on code from LTIB:
-+ * Copyright 2008-2010 Freescale Semiconductor, Inc. All Rights Reserved.
-+ *
-+ * 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 __DMA_H__
-+#define __DMA_H__
-+
-+#include <linux/list.h>
-+
-+#ifndef CONFIG_ARCH_DMA_PIO_WORDS
-+#define DMA_PIO_WORDS 15
-+#else
-+#define DMA_PIO_WORDS CONFIG_ARCH_DMA_PIO_WORDS
-+#endif
-+
-+#define MXS_DMA_ALIGNMENT 32
-+
-+/*
-+ * MXS DMA channels
-+ */
-+enum {
-+ MXS_DMA_CHANNEL_AHB_APBH_SSP0 = 0,
-+ MXS_DMA_CHANNEL_AHB_APBH_SSP1,
-+ MXS_DMA_CHANNEL_AHB_APBH_SSP2,
-+ MXS_DMA_CHANNEL_AHB_APBH_SSP3,
-+ MXS_DMA_CHANNEL_AHB_APBH_GPMI0,
-+ MXS_DMA_CHANNEL_AHB_APBH_GPMI1,
-+ MXS_DMA_CHANNEL_AHB_APBH_GPMI2,
-+ MXS_DMA_CHANNEL_AHB_APBH_GPMI3,
-+ MXS_DMA_CHANNEL_AHB_APBH_GPMI4,
-+ MXS_DMA_CHANNEL_AHB_APBH_GPMI5,
-+ MXS_DMA_CHANNEL_AHB_APBH_GPMI6,
-+ MXS_DMA_CHANNEL_AHB_APBH_GPMI7,
-+ MXS_DMA_CHANNEL_AHB_APBH_SSP,
-+ MXS_MAX_DMA_CHANNELS,
-+};
-+
-+/*
-+ * MXS DMA hardware command.
-+ *
-+ * This structure describes the in-memory layout of an entire DMA command,
-+ * including space for the maximum number of PIO accesses. See the appropriate
-+ * reference manual for a detailed description of what these fields mean to the
-+ * DMA hardware.
-+ */
-+#define MXS_DMA_DESC_COMMAND_MASK 0x3
-+#define MXS_DMA_DESC_COMMAND_OFFSET 0
-+#define MXS_DMA_DESC_COMMAND_NO_DMAXFER 0x0
-+#define MXS_DMA_DESC_COMMAND_DMA_WRITE 0x1
-+#define MXS_DMA_DESC_COMMAND_DMA_READ 0x2
-+#define MXS_DMA_DESC_COMMAND_DMA_SENSE 0x3
-+#define MXS_DMA_DESC_CHAIN (1 << 2)
-+#define MXS_DMA_DESC_IRQ (1 << 3)
-+#define MXS_DMA_DESC_NAND_LOCK (1 << 4)
-+#define MXS_DMA_DESC_NAND_WAIT_4_READY (1 << 5)
-+#define MXS_DMA_DESC_DEC_SEM (1 << 6)
-+#define MXS_DMA_DESC_WAIT4END (1 << 7)
-+#define MXS_DMA_DESC_HALT_ON_TERMINATE (1 << 8)
-+#define MXS_DMA_DESC_TERMINATE_FLUSH (1 << 9)
-+#define MXS_DMA_DESC_PIO_WORDS_MASK (0xf << 12)
-+#define MXS_DMA_DESC_PIO_WORDS_OFFSET 12
-+#define MXS_DMA_DESC_BYTES_MASK (0xffff << 16)
-+#define MXS_DMA_DESC_BYTES_OFFSET 16
-+
-+struct mxs_dma_cmd {
-+ unsigned long next;
-+ unsigned long data;
-+ union {
-+ dma_addr_t address;
-+ unsigned long alternate;
-+ };
-+ unsigned long pio_words[DMA_PIO_WORDS];
-+};
-+
-+/*
-+ * MXS DMA command descriptor.
-+ *
-+ * This structure incorporates an MXS DMA hardware command structure, along
-+ * with metadata.
-+ */
-+#define MXS_DMA_DESC_FIRST (1 << 0)
-+#define MXS_DMA_DESC_LAST (1 << 1)
-+#define MXS_DMA_DESC_READY (1 << 31)
-+
-+struct mxs_dma_desc {
-+ struct mxs_dma_cmd cmd;
-+ unsigned int flags;
-+ dma_addr_t address;
-+ void *buffer;
-+ struct list_head node;
-+};
-+
-+/**
-+ * MXS DMA channel
-+ *
-+ * This structure represents a single DMA channel. The MXS platform code
-+ * maintains an array of these structures to represent every DMA channel in the
-+ * system (see mxs_dma_channels).
-+ */
-+#define MXS_DMA_FLAGS_IDLE 0
-+#define MXS_DMA_FLAGS_BUSY (1 << 0)
-+#define MXS_DMA_FLAGS_FREE 0
-+#define MXS_DMA_FLAGS_ALLOCATED (1 << 16)
-+#define MXS_DMA_FLAGS_VALID (1 << 31)
-+
-+struct mxs_dma_chan {
-+ const char *name;
-+ unsigned long dev;
-+ struct mxs_dma_device *dma;
-+ unsigned int flags;
-+ unsigned int active_num;
-+ unsigned int pending_num;
-+ struct list_head active;
-+ struct list_head done;
-+};
-+
-+struct mxs_dma_desc *mxs_dma_desc_alloc(void);
-+void mxs_dma_desc_free(struct mxs_dma_desc *);
-+int mxs_dma_desc_append(int channel, struct mxs_dma_desc *pdesc);
-+
-+int mxs_dma_go(int chan);
-+int mxs_dma_init(void);
-+
-+#endif /* __DMA_H__ */
-diff --git a/arch/arm/mach-mxs/include/mach/imx23-regs.h b/arch/arm/mach-mxs/include/mach/imx23-regs.h
-index 60f5bf9..7ea3057 100644
---- a/arch/arm/mach-mxs/include/mach/imx23-regs.h
-+++ b/arch/arm/mach-mxs/include/mach/imx23-regs.h
-@@ -27,6 +27,9 @@
- #endif
-
- #define IMX_MEMORY_BASE 0x40000000
-+#define MXS_APBH_BASE 0x80004000
-+#define MXS_BCH_BASE 0x8000a000
-+#define MXS_GPMI_BASE 0x8000c000
- #define IMX_UART1_BASE 0x8006c000
- #define IMX_UART2_BASE 0x8006e000
- #define IMX_DBGUART_BASE 0x80070000
-diff --git a/arch/arm/mach-mxs/include/mach/imx28-regs.h b/arch/arm/mach-mxs/include/mach/imx28-regs.h
-index 9a2052c..16bf5f7 100644
---- a/arch/arm/mach-mxs/include/mach/imx28-regs.h
-+++ b/arch/arm/mach-mxs/include/mach/imx28-regs.h
-@@ -23,15 +23,19 @@
- #define IMX_SRAM_BASE 0x00000000
- #define IMX_MEMORY_BASE 0x40000000
-
--#define IMX_NFC_BASE 0x8000C000
-+#define MXS_APBH_BASE 0x80004000
-+#define MXS_BCH_BASE 0x8000a000
-+#define MXS_GPMI_BASE 0x8000c000
- #define IMX_SSP0_BASE 0x80010000
- #define IMX_SSP1_BASE 0x80012000
- #define IMX_SSP2_BASE 0x80014000
- #define IMX_SSP3_BASE 0x80016000
- #define IMX_IOMUXC_BASE 0x80018000
-+#define IMX_DIGCTL_BASE 0x8001c000
- #define IMX_OCOTP_BASE 0x8002c000
- #define IMX_FB_BASE 0x80030000
- #define IMX_CCM_BASE 0x80040000
-+#define IMX_POWER_BASE 0x80044000
- #define IMX_WDT_BASE 0x80056000
- #define IMX_I2C0_BASE 0x80058000
- #define IMX_I2C1_BASE 0x8005a000
-@@ -42,6 +46,9 @@
- #define IMX_UART3_BASE 0x80070000
- #define IMX_UART4_BASE 0x80072000
- #define IMX_DBGUART_BASE 0x80074000
-+#define IMX_USBPHY0_BASE 0x8007c000
-+#define IMX_USBPHY1_BASE 0x8007e000
-+#define IMX_USB_BASE 0x80080000
- #define IMX_FEC0_BASE 0x800F0000
- #define IMX_FEC1_BASE 0x800F4000
-
-diff --git a/arch/arm/mach-mxs/include/mach/mxs.h b/arch/arm/mach-mxs/include/mach/mxs.h
-new file mode 100644
-index 0000000..182ed8a
---- /dev/null
-+++ b/arch/arm/mach-mxs/include/mach/mxs.h
-@@ -0,0 +1,6 @@
-+#ifndef __MACH_MXS_H
-+#define __MACH_MXS_H
-+
-+int mxs_reset_block(void __iomem *reg, int just_enable);
-+
-+#endif /* __MACH_MXS_H */
-diff --git a/arch/arm/mach-mxs/include/mach/power.h b/arch/arm/mach-mxs/include/mach/power.h
-new file mode 100644
-index 0000000..f429b3c
---- /dev/null
-+++ b/arch/arm/mach-mxs/include/mach/power.h
-@@ -0,0 +1,8 @@
-+#ifndef __MACH_POWER_H
-+#define __MACH_POWER_H
-+
-+void imx_power_prepare_usbphy(void);
-+int imx_get_vddio(void);
-+int imx_set_vddio(int);
-+
-+#endif /* __MACH_POWER_H */
-diff --git a/arch/arm/mach-mxs/include/mach/usb.h b/arch/arm/mach-mxs/include/mach/usb.h
-index af7d885..2d31b0d 100644
---- a/arch/arm/mach-mxs/include/mach/usb.h
-+++ b/arch/arm/mach-mxs/include/mach/usb.h
-@@ -1,6 +1,9 @@
- #ifndef __MACH_USB_H
- #define __MACH_USB_H
-
--int imx_usb_phy_enable(void);
-+int imx23_usb_phy_enable(void);
-+
-+int imx28_usb_phy0_enable(void);
-+int imx28_usb_phy1_enable(void);
-
- #endif /* __MACH_USB_H */
-diff --git a/arch/arm/mach-mxs/iomux-imx.c b/arch/arm/mach-mxs/iomux-imx.c
-index 6bcde03..a3ecb94 100644
---- a/arch/arm/mach-mxs/iomux-imx.c
-+++ b/arch/arm/mach-mxs/iomux-imx.c
-@@ -131,7 +131,7 @@ void imx_gpio_mode(uint32_t m)
- if (BK_PRESENT(m)) {
- reg_offset = calc_pullup_reg(gpio_pin);
- writel(0x1 << (gpio_pin % 32), IMX_IOMUXC_BASE + reg_offset +
-- (GET_BITKEEPER(m) == 1 ? BIT_SET : BIT_CLR));
-+ (GET_BITKEEPER(m) == 1 ? BIT_CLR : BIT_SET));
- }
-
- if (GET_FUNC(m) == IS_GPIO) {
-diff --git a/arch/arm/mach-mxs/ocotp.c b/arch/arm/mach-mxs/ocotp.c
-index 38f9ffd..7824402 100644
---- a/arch/arm/mach-mxs/ocotp.c
-+++ b/arch/arm/mach-mxs/ocotp.c
-@@ -25,27 +25,45 @@
- #include <mach/generic.h>
- #include <mach/ocotp.h>
- #include <mach/imx-regs.h>
-+#include <mach/clock-imx28.h>
-+#include <mach/power.h>
-
- #define DRIVERNAME "ocotp"
-
--#define OCOTP_WORD_OFFSET 0x20
-+#define OCOTP_CTRL 0x0
-+# define OCOTP_CTRL_ADDR_MASK 0x3f
-+# define OCOTP_CTRL_BUSY (1 << 8)
-+# define OCOTP_CTRL_ERROR (1 << 9)
-+# define OCOTP_CTRL_RD_BANK_OPEN (1 << 12)
-+# define OCOTP_CTRL_WR_UNLOCK 0x3e770000
-+
-+#define OCOTP_DATA 0x10
-
--#define BM_OCOTP_CTRL_BUSY (1 << 8)
--#define BM_OCOTP_CTRL_ERROR (1 << 9)
--#define BM_OCOTP_CTRL_RD_BANK_OPEN (1 << 12)
-+#define OCOTP_WORD_OFFSET 0x20
-
- struct ocotp_priv {
- struct cdev cdev;
- void __iomem *base;
- };
-
-+static int mxs_ocotp_wait_busy(struct ocotp_priv *priv)
-+{
-+ uint64_t start = get_time_ns();
-+
-+ /* check both BUSY and ERROR cleared */
-+ while (readl(priv->base + OCOTP_CTRL) & (OCOTP_CTRL_BUSY | OCOTP_CTRL_ERROR))
-+ if (is_timeout(start, MSECOND))
-+ return -ETIMEDOUT;
-+
-+ return 0;
-+}
-+
- static ssize_t mxs_ocotp_cdev_read(struct cdev *cdev, void *buf, size_t count,
-- ulong offset, ulong flags)
-+ loff_t offset, ulong flags)
- {
- struct ocotp_priv *priv = cdev->priv;
- void __iomem *base = priv->base;
-- size_t size = min((ulong)count, cdev->size - offset);
-- uint64_t start;
-+ size_t size = min((loff_t)count, cdev->size - offset);
- int i;
-
- /*
-@@ -54,25 +72,20 @@ static ssize_t mxs_ocotp_cdev_read(struct cdev *cdev, void *buf, size_t count,
- */
-
- /* try to clear ERROR bit */
-- writel(BM_OCOTP_CTRL_ERROR, base + BIT_CLR);
-+ writel(OCOTP_CTRL_ERROR, base + OCOTP_CTRL + BIT_CLR);
-
-- /* check both BUSY and ERROR cleared */
-- start = get_time_ns();
-- while (readl(base) & (BM_OCOTP_CTRL_BUSY | BM_OCOTP_CTRL_ERROR))
-- if (is_timeout(start, MSECOND))
-- return -ETIMEDOUT;
-+ if (mxs_ocotp_wait_busy(priv))
-+ return -ETIMEDOUT;
-
- /* open OCOTP banks for read */
-- writel(BM_OCOTP_CTRL_RD_BANK_OPEN, base + BIT_SET);
-+ writel(OCOTP_CTRL_RD_BANK_OPEN, base + OCOTP_CTRL + BIT_SET);
-
- /* approximately wait 32 hclk cycles */
- udelay(1);
-
- /* poll BUSY bit becoming cleared */
-- start = get_time_ns();
-- while (readl(base) & BM_OCOTP_CTRL_BUSY)
-- if (is_timeout(start, MSECOND))
-- return -ETIMEDOUT;
-+ if (mxs_ocotp_wait_busy(priv))
-+ return -ETIMEDOUT;
-
- for (i = 0; i < size; i++)
- /* When reading bytewise, we need to hop over the SET/CLR/TGL regs */
-@@ -80,16 +93,107 @@ static ssize_t mxs_ocotp_cdev_read(struct cdev *cdev, void *buf, size_t count,
- (((i + offset) & 0xfc) << 2) + ((i + offset) & 3));
-
- /* close banks for power saving */
-- writel(BM_OCOTP_CTRL_RD_BANK_OPEN, base + BIT_CLR);
-+ writel(OCOTP_CTRL_RD_BANK_OPEN, base + OCOTP_CTRL + BIT_CLR);
-
- return size;
- }
-
-+static ssize_t mxs_ocotp_cdev_write(struct cdev *cdev, const void *buf, size_t count,
-+ loff_t offset, ulong flags)
-+{
-+ struct ocotp_priv *priv = cdev->priv;
-+ void __iomem *base = priv->base;
-+ const char *write_param;
-+ unsigned int write_enabled = 0;
-+ unsigned long old_hclk, aligned_offset;
-+ int old_vddio, num_words, num_bytes, i, ret = 0;
-+ u8 *work_buf;
-+ u32 reg;
-+
-+ write_param = dev_get_param(cdev->dev, "permanent_write_enable");
-+ if (write_param)
-+ write_enabled = simple_strtoul(write_param, NULL, 0);
-+
-+ if (!write_param || !write_enabled)
-+ return -EPERM;
-+
-+ /* we can only work on u32, so calc some helpers */
-+ aligned_offset = offset & ~3UL;
-+ num_words = DIV_ROUND_UP(offset - aligned_offset + count, 4);
-+ num_bytes = num_words << 2;
-+
-+ /* read in all words which will be modified */
-+ work_buf = xmalloc(num_bytes);
-+
-+ i = mxs_ocotp_cdev_read(cdev, work_buf, num_bytes, aligned_offset, 0);
-+ if (i != num_bytes) {
-+ ret = -ENXIO;
-+ goto free_mem;
-+ }
-+
-+ /* modify read words with to be written data */
-+ for (i = 0; i < count; i++)
-+ work_buf[offset - aligned_offset + i] |= ((u8 *)buf)[i];
-+
-+ /* prepare system for OTP write */
-+ old_hclk = imx_get_hclk();
-+ old_vddio = imx_get_vddio();
-+
-+ imx_set_hclk(24000000);
-+ imx_set_vddio(2800000);
-+
-+ writel(OCOTP_CTRL_RD_BANK_OPEN, base + OCOTP_CTRL + BIT_CLR);
-+
-+ if (mxs_ocotp_wait_busy(priv)) {
-+ ret = -ETIMEDOUT;
-+ goto restore_system;
-+ }
-+
-+ /* write word for word via data register */
-+ for (i = 0; i < num_words; i++) {
-+ reg = readl(base + OCOTP_CTRL) & ~OCOTP_CTRL_ADDR_MASK;
-+ reg |= OCOTP_CTRL_WR_UNLOCK | ((aligned_offset >> 2) + i);
-+ writel(reg, base + OCOTP_CTRL);
-+
-+ writel(((u32 *)work_buf)[i], base + OCOTP_DATA);
-+
-+ if (mxs_ocotp_wait_busy(priv)) {
-+ ret = -ETIMEDOUT;
-+ goto restore_system;
-+ }
-+
-+ mdelay(2);
-+ }
-+
-+restore_system:
-+ imx_set_vddio(old_vddio);
-+ imx_set_hclk(old_hclk);
-+free_mem:
-+ free(work_buf);
-+
-+ return ret;
-+}
-+
- static struct file_operations mxs_ocotp_ops = {
- .read = mxs_ocotp_cdev_read,
- .lseek = dev_lseek_default,
- };
-
-+static int mxs_ocotp_write_enable_set(struct device_d *dev, struct param_d *param,
-+ const char *val)
-+{
-+ unsigned long write_enable;
-+
-+ if (!val)
-+ return -EINVAL;
-+
-+ write_enable = simple_strtoul(val, NULL, 0);
-+ if (write_enable > 1)
-+ return -EINVAL;
-+
-+ return dev_param_set_generic(dev, param, write_enable ? "1" : "0");
-+}
-+
- static int mxs_ocotp_probe(struct device_d *dev)
- {
- int err;
-@@ -106,6 +210,18 @@ static int mxs_ocotp_probe(struct device_d *dev)
- if (err < 0)
- return err;
-
-+ if (IS_ENABLED(CONFIG_MXS_OCOTP_WRITABLE)) {
-+ mxs_ocotp_ops.write = mxs_ocotp_cdev_write;
-+
-+ err = dev_add_param(dev, "permanent_write_enable",
-+ mxs_ocotp_write_enable_set, NULL, 0);
-+ if (err < 0)
-+ return err;
-+ err = dev_set_param(dev, "permanent_write_enable", "0");
-+ if (err < 0)
-+ return err;
-+ }
-+
- return 0;
- }
-
-diff --git a/arch/arm/mach-mxs/power.c b/arch/arm/mach-mxs/power.c
-new file mode 100644
-index 0000000..f4d0b9e
---- /dev/null
-+++ b/arch/arm/mach-mxs/power.c
-@@ -0,0 +1,84 @@
-+/*
-+ * i.MX28 power related functions
-+ *
-+ * Copyright 2011 Sascha Hauer, Pengutronix <s.hauer@pengutronix.de>
-+ * Copyright (C) 2012 Wolfram Sang, Pengutronix <w.sang@pengutronix.de>
-+ *
-+ * 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.
-+ */
-+#include <common.h>
-+#include <io.h>
-+#include <errno.h>
-+#include <mach/imx-regs.h>
-+
-+#define POWER_CTRL (IMX_POWER_BASE + 0x0)
-+#define POWER_CTRL_CLKGATE 0x40000000
-+
-+#define POWER_VDDIOCTRL (IMX_POWER_BASE + 0x60)
-+
-+#define POWER_STS (IMX_POWER_BASE + 0xc0)
-+#define POWER_STS_VBUSVALID 0x00000002
-+#define POWER_STS_BVALID 0x00000004
-+#define POWER_STS_AVALID 0x00000008
-+
-+#define POWER_DEBUG (IMX_POWER_BASE + 0x110)
-+#define POWER_DEBUG_BVALIDPIOLOCK 0x00000002
-+#define POWER_DEBUG_AVALIDPIOLOCK 0x00000004
-+#define POWER_DEBUG_VBUSVALIDPIOLOCK 0x00000008
-+
-+#define TRG_MASK 0x1f
-+
-+int imx_get_vddio(void)
-+{
-+ u32 val;
-+
-+ val = readl(POWER_VDDIOCTRL) & TRG_MASK;
-+ if (val > 0x10)
-+ val = 0x10;
-+
-+ return 2800000 + val * 50000;
-+}
-+
-+int imx_set_vddio(int new_voltage_uV)
-+{
-+ u32 reg, val;
-+
-+ if (new_voltage_uV < 2800000 || new_voltage_uV > 3600000)
-+ return -EINVAL;
-+
-+ val = (new_voltage_uV - 2800000) / 50000;
-+ reg = readl(POWER_VDDIOCTRL) & ~TRG_MASK;
-+ writel(reg | val, POWER_VDDIOCTRL);
-+
-+ /*
-+ * Wait for power to become stable. We just wait, because DC_OK can
-+ * only detect rising voltages for DCDC. For all other cases, bootlets
-+ * also do simple waiting, although horribly nested. We just take the
-+ * maximum value of all cases from the bootlets and then add some.
-+ */
-+ mdelay(30);
-+
-+ return 2800000 + val * 50000;
-+}
-+
-+void imx_power_prepare_usbphy(void)
-+{
-+ u32 reg;
-+
-+ /*
-+ * Set these bits so that we can force the OTG bits high
-+ * so the ARC core operates properly
-+ */
-+ writel(POWER_CTRL_CLKGATE, POWER_CTRL + BIT_CLR);
-+
-+ writel(POWER_DEBUG_VBUSVALIDPIOLOCK |
-+ POWER_DEBUG_AVALIDPIOLOCK |
-+ POWER_DEBUG_BVALIDPIOLOCK, POWER_DEBUG + BIT_SET);
-+
-+ reg = readl(POWER_STS);
-+ reg |= POWER_STS_BVALID | POWER_STS_AVALID | POWER_STS_VBUSVALID;
-+ writel(reg, POWER_STS);
-+}
-diff --git a/arch/arm/mach-mxs/reset-imx.c b/arch/arm/mach-mxs/reset-imx.c
-deleted file mode 100644
-index cfb3548..0000000
---- a/arch/arm/mach-mxs/reset-imx.c
-+++ /dev/null
-@@ -1,61 +0,0 @@
--/*
-- * (C) Copyright 2010 Juergen Beisert - Pengutronix
-- *
-- * 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 <init.h>
--#include <notifier.h>
--#include <mach/imx-regs.h>
--#include <io.h>
--
--#define HW_RTC_CTRL 0x000
--# define BM_RTC_CTRL_WATCHDOGEN (1 << 4)
--#define HW_RTC_CTRL_SET 0x004
--#define HW_RTC_CTRL_CLR 0x008
--#define HW_RTC_CTRL_TOG 0x00C
--
--#define HW_RTC_WATCHDOG 0x050
--#define HW_RTC_WATCHDOG_SET 0x054
--#define HW_RTC_WATCHDOG_CLR 0x058
--#define HW_RTC_WATCHDOG_TOG 0x05C
--
--#define WDOG_COUNTER_RATE 1000 /* 1 kHz clock */
--
--#define HW_RTC_PERSISTENT1 0x070
--# define BV_RTC_PERSISTENT1_GENERAL__RTC_FORCE_UPDATER 0x80000000
--#define HW_RTC_PERSISTENT1_SET 0x074
--#define HW_RTC_PERSISTENT1_CLR 0x078
--#define HW_RTC_PERSISTENT1_TOG 0x07C
--
--/*
-- * Reset the cpu by setting up the watchdog timer and let it time out
-- *
-- * TODO There is a much easier way to reset the CPU: Refer bit 2 in
-- * the HW_CLKCTRL_RESET register, data sheet page 106/4-30
-- */
--void __noreturn reset_cpu (unsigned long addr)
--{
-- writel(WDOG_COUNTER_RATE, IMX_WDT_BASE + HW_RTC_WATCHDOG);
-- writel(BM_RTC_CTRL_WATCHDOGEN, IMX_WDT_BASE + HW_RTC_CTRL_SET);
-- writel(BV_RTC_PERSISTENT1_GENERAL__RTC_FORCE_UPDATER, IMX_WDT_BASE + HW_RTC_PERSISTENT1);
--
-- while (1)
-- ;
-- /*NOTREACHED*/
--}
--EXPORT_SYMBOL(reset_cpu);
-diff --git a/arch/arm/mach-mxs/soc-imx23.c b/arch/arm/mach-mxs/soc-imx23.c
-new file mode 100644
-index 0000000..6819b3c
---- /dev/null
-+++ b/arch/arm/mach-mxs/soc-imx23.c
-@@ -0,0 +1,37 @@
-+/*
-+ * (c) 2012 Juergen Beisert <kernel@pengutronix.de>
-+ *
-+ * 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.
-+ *
-+ * Collection of some SoC specific functions
-+ */
-+
-+#include <common.h>
-+#include <init.h>
-+#include <mach/imx-regs.h>
-+#include <io.h>
-+
-+#define HW_CLKCTRL_RESET 0x120
-+# define HW_CLKCTRL_RESET_CHIP (1 << 1)
-+
-+/* Reset the full i.MX23 SoC via a chipset feature */
-+void __noreturn reset_cpu(unsigned long addr)
-+{
-+ u32 reg;
-+
-+ reg = readl(IMX_CCM_BASE + HW_CLKCTRL_RESET);
-+ writel(reg | HW_CLKCTRL_RESET_CHIP, IMX_CCM_BASE + HW_CLKCTRL_RESET);
-+
-+ while (1)
-+ ;
-+ /*NOTREACHED*/
-+}
-+EXPORT_SYMBOL(reset_cpu);
-diff --git a/arch/arm/mach-mxs/soc-imx28.c b/arch/arm/mach-mxs/soc-imx28.c
-new file mode 100644
-index 0000000..a181b75
---- /dev/null
-+++ b/arch/arm/mach-mxs/soc-imx28.c
-@@ -0,0 +1,37 @@
-+/*
-+ * (c) 2012 Juergen Beisert <kernel@pengutronix.de>
-+ *
-+ * 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.
-+ *
-+ * Collection of some SoC specific functions
-+ */
-+
-+#include <common.h>
-+#include <init.h>
-+#include <mach/imx-regs.h>
-+#include <io.h>
-+
-+#define HW_CLKCTRL_RESET 0x1e0
-+# define HW_CLKCTRL_RESET_CHIP (1 << 1)
-+
-+/* Reset the full i.MX28 SoC via a chipset feature */
-+void __noreturn reset_cpu(unsigned long addr)
-+{
-+ u32 reg;
-+
-+ reg = readl(IMX_CCM_BASE + HW_CLKCTRL_RESET);
-+ writel(reg | HW_CLKCTRL_RESET_CHIP, IMX_CCM_BASE + HW_CLKCTRL_RESET);
-+
-+ while (1)
-+ ;
-+ /*NOTREACHED*/
-+}
-+EXPORT_SYMBOL(reset_cpu);
-diff --git a/arch/arm/mach-mxs/speed-imx23.c b/arch/arm/mach-mxs/speed-imx23.c
-index b10c786..5d0c90d 100644
---- a/arch/arm/mach-mxs/speed-imx23.c
-+++ b/arch/arm/mach-mxs/speed-imx23.c
-@@ -47,6 +47,8 @@
- # define GET_SSP_DIV(x) ((x) & CLKCTRL_SSP_DIV_MASK)
- # define SET_SSP_DIV(x) ((x) & CLKCTRL_SSP_DIV_MASK)
- #define HW_CLKCTRL_GPMI 0x080
-+# define CLKCTRL_GPMI_CLKGATE (1 << 31)
-+# define CLKCTRL_GPMI_DIV_MASK 0x3ff
- /* note: no set/clear register! */
- #define HW_CLKCTRL_SPDIF 0x090
- /* note: no set/clear register! */
-@@ -184,12 +186,34 @@ unsigned imx_get_hclk(void)
-
- if (readl(IMX_CCM_BASE + HW_CLKCTRL_HBUS) & 0x20) {
- rate *= readl(IMX_CCM_BASE + HW_CLKCTRL_HBUS) & 0x1f;
-- rate >>= 5U; /* / 32 */
-+ rate = DIV_ROUND_UP(rate, 32);
- } else
-- rate /= readl(IMX_CCM_BASE + HW_CLKCTRL_HBUS) & 0x1f;
-+ rate = DIV_ROUND_UP(rate,
-+ readl(IMX_CCM_BASE + HW_CLKCTRL_HBUS) & 0x1f);
- return rate * 1000;
- }
-
-+unsigned imx_set_hclk(unsigned nc)
-+{
-+ unsigned root_rate = imx_get_armclk();
-+ unsigned reg, div;
-+
-+ div = DIV_ROUND_UP(root_rate, nc);
-+ if ((div == 0) || (div >= 32))
-+ return 0;
-+
-+ if ((root_rate < nc) && (root_rate == 64000000))
-+ div = 3;
-+
-+ reg = readl(IMX_CCM_BASE + HW_CLKCTRL_HBUS) & ~0x3f;
-+ writel(reg | div, IMX_CCM_BASE + HW_CLKCTRL_HBUS);
-+
-+ while (readl(IMX_CCM_BASE + HW_CLKCTRL_HBUS) & (1 << 31))
-+ ;
-+
-+ return imx_get_hclk();
-+}
-+
- /*
- * Source of UART, debug UART, audio, PWM, dri, timer, digctl
- */
-@@ -266,6 +290,23 @@ unsigned imx_set_sspclk(unsigned index, unsigned nc, int high)
- return imx_get_sspclk(index);
- }
-
-+void imx_enable_nandclk(void)
-+{
-+ uint32_t reg;
-+
-+ /* Clear bypass bit; refman says clear, but fsl-code does set. Hooray! */
-+ writel(CLKCTRL_CLKSEQ_BYPASS_GPMI,
-+ IMX_CCM_BASE + HW_CLKCTRL_CLKSEQ + BIT_SET);
-+
-+ reg = readl(IMX_CCM_BASE + HW_CLKCTRL_GPMI) & ~CLKCTRL_GPMI_CLKGATE;
-+ writel(reg, IMX_CCM_BASE + HW_CLKCTRL_GPMI);
-+ udelay(1000);
-+ /* Initialize DIV to 1 */
-+ reg &= ~CLKCTRL_GPMI_DIV_MASK;
-+ reg |= 1;
-+ writel(reg, IMX_CCM_BASE + HW_CLKCTRL_GPMI);
-+}
-+
- void imx_dump_clocks(void)
- {
- printf("mpll: %10u kHz\n", imx_get_mpllclk() / 1000);
-diff --git a/arch/arm/mach-mxs/speed-imx28.c b/arch/arm/mach-mxs/speed-imx28.c
-index 67cdbdf..df55f64 100644
---- a/arch/arm/mach-mxs/speed-imx28.c
-+++ b/arch/arm/mach-mxs/speed-imx28.c
-@@ -48,6 +48,8 @@
- # define GET_SSP_DIV(x) ((x) & CLKCTRL_SSP_DIV_MASK)
- # define SET_SSP_DIV(x) ((x) & CLKCTRL_SSP_DIV_MASK)
- #define HW_CLKCTRL_GPMI 0x0d0
-+# define CLKCTRL_GPMI_CLKGATE (1 << 31)
-+# define CLKCTRL_GPMI_DIV_MASK 0x3ff
- /* note: no set/clear register! */
- #define HW_CLKCTRL_SPDIF 0x0e0
- /* note: no set/clear register! */
-@@ -251,12 +253,34 @@ unsigned imx_get_hclk(void)
-
- if (readl(IMX_CCM_BASE + HW_CLKCTRL_HBUS) & 0x20) {
- rate *= readl(IMX_CCM_BASE + HW_CLKCTRL_HBUS) & 0x1f;
-- rate /= 32;
-+ rate = DIV_ROUND_UP(rate, 32);
- } else
-- rate /= readl(IMX_CCM_BASE + HW_CLKCTRL_HBUS) & 0x1f;
-+ rate = DIV_ROUND_UP(rate,
-+ readl(IMX_CCM_BASE + HW_CLKCTRL_HBUS) & 0x1f);
- return rate * 1000;
- }
-
-+unsigned imx_set_hclk(unsigned nc)
-+{
-+ unsigned root_rate = imx_get_armclk();
-+ unsigned reg, div;
-+
-+ div = DIV_ROUND_UP(root_rate, nc);
-+ if ((div == 0) || (div >= 32))
-+ return 0;
-+
-+ if ((root_rate < nc) && (root_rate == 64000000))
-+ div = 3;
-+
-+ reg = readl(IMX_CCM_BASE + HW_CLKCTRL_HBUS) & ~0x3f;
-+ writel(reg | div, IMX_CCM_BASE + HW_CLKCTRL_HBUS);
-+
-+ while (readl(IMX_CCM_BASE + HW_CLKCTRL_HBUS) & (1 << 31))
-+ ;
-+
-+ return imx_get_hclk();
-+}
-+
- /*
- * Source of UART, debug UART, audio, PWM, dri, timer, digctl
- */
-@@ -376,6 +400,23 @@ void imx_enable_enetclk(void)
- IMX_CCM_BASE + HW_CLKCTRL_ENET);
- }
-
-+void imx_enable_nandclk(void)
-+{
-+ uint32_t reg;
-+
-+ /* Clear bypass bit; refman says clear, but fsl-code does set. Hooray! */
-+ writel(CLKCTRL_CLKSEQ_BYPASS_GPMI,
-+ IMX_CCM_BASE + HW_CLKCTRL_CLKSEQ + BIT_SET);
-+
-+ reg = readl(IMX_CCM_BASE + HW_CLKCTRL_GPMI) & ~CLKCTRL_GPMI_CLKGATE;
-+ writel(reg, IMX_CCM_BASE + HW_CLKCTRL_GPMI);
-+ udelay(1000);
-+ /* Initialize DIV to 1 */
-+ reg &= ~CLKCTRL_GPMI_DIV_MASK;
-+ reg |= 1;
-+ writel(reg, IMX_CCM_BASE + HW_CLKCTRL_GPMI);
-+}
-+
- void imx_dump_clocks(void)
- {
- printf("mpll: %10u kHz\n", imx_get_mpllclk() / 1000);
-diff --git a/arch/arm/mach-mxs/usb-imx23.c b/arch/arm/mach-mxs/usb-imx23.c
-new file mode 100644
-index 0000000..9aaf4bc
---- /dev/null
-+++ b/arch/arm/mach-mxs/usb-imx23.c
-@@ -0,0 +1,65 @@
-+/*
-+ * i.MX23 USBPHY setup
-+ *
-+ * Copyright 2011 Sascha Hauer, Pengutronix <s.hauer@pengutronix.de>
-+ *
-+ * 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 <io.h>
-+#include <mach/imx-regs.h>
-+#include <mach/power.h>
-+
-+#define USBPHY_PWD (IMX_USBPHY_BASE + 0x0)
-+
-+#define USBPHY_CTRL (IMX_USBPHY_BASE + 0x30)
-+#define USBPHY_CTRL_SFTRST 0x80000000
-+#define USBPHY_CTRL_CLKGATE 0x40000000
-+
-+#define CLK_PLLCTRL0 (IMX_CCM_BASE + 0x0)
-+#define PLLCTRL0_EN_USB_CLKS 0x00040000
-+
-+#define DIGCTRL_CTRL (IMX_DIGCTL_BASE + 0x0)
-+#define DIGCTL_CTRL_USB_CLKGATE 0x00000004
-+
-+#define SET 0x4
-+#define CLR 0x8
-+
-+int imx23_usb_phy_enable(void)
-+{
-+ imx_power_prepare_usbphy();
-+
-+ /* Reset USBPHY module */
-+ writel(USBPHY_CTRL_SFTRST, USBPHY_CTRL + SET);
-+ udelay(10);
-+
-+ /* Remove CLKGATE and SFTRST */
-+ writel(USBPHY_CTRL_CLKGATE | USBPHY_CTRL_SFTRST, USBPHY_CTRL + CLR);
-+
-+ /* Turn on the USB clocks */
-+ writel(PLLCTRL0_EN_USB_CLKS, CLK_PLLCTRL0 + SET);
-+ writel(DIGCTL_CTRL_USB_CLKGATE, DIGCTRL_CTRL + CLR);
-+
-+ /* Power up the PHY */
-+ writel(0, USBPHY_PWD);
-+
-+ /*
-+ * Set precharge bit to cure overshoot problems at the
-+ * start of packets
-+ */
-+ writel(1, USBPHY_CTRL + SET);
-+
-+ return 0;
-+}
-diff --git a/arch/arm/mach-mxs/usb-imx28.c b/arch/arm/mach-mxs/usb-imx28.c
-new file mode 100644
-index 0000000..61d59c3
---- /dev/null
-+++ b/arch/arm/mach-mxs/usb-imx28.c
-@@ -0,0 +1,101 @@
-+/*
-+ * i.MX28 USBPHY setup
-+ *
-+ * Copyright 2011 Sascha Hauer, Pengutronix <s.hauer@pengutronix.de>
-+ *
-+ * 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 <io.h>
-+#include <errno.h>
-+#include <mach/imx-regs.h>
-+
-+#define POWER_CTRL (IMX_POWER_BASE + 0x0)
-+#define POWER_CTRL_CLKGATE 0x40000000
-+
-+#define POWER_STS (IMX_POWER_BASE + 0xc0)
-+#define POWER_STS_VBUSVALID 0x00000002
-+#define POWER_STS_BVALID 0x00000004
-+#define POWER_STS_AVALID 0x00000008
-+
-+#define POWER_DEBUG (IMX_POWER_BASE + 0x110)
-+#define POWER_DEBUG_BVALIDPIOLOCK 0x00000002
-+#define POWER_DEBUG_AVALIDPIOLOCK 0x00000004
-+#define POWER_DEBUG_VBUSVALIDPIOLOCK 0x00000008
-+
-+#define USBPHY_PWD 0x0
-+
-+#define USBPHY_CTRL 0x30
-+#define USBPHY_CTRL_SFTRST (1 << 31)
-+#define USBPHY_CTRL_CLKGATE (1 << 30)
-+#define USBPHY_CTRL_ENUTMILEVEL3 (1 << 15)
-+#define USBPHY_CTRL_ENUTMILEVEL2 (1 << 14)
-+
-+#define CLK_PLL0CTRL0 (IMX_CCM_BASE + 0x0)
-+#define CLK_PLL1CTRL0 (IMX_CCM_BASE + 0x20)
-+#define PLLCTRL0_EN_USB_CLKS (1 << 18)
-+
-+#define DIGCTRL_CTRL (IMX_DIGCTL_BASE + 0x0)
-+#define DIGCTL_CTRL_USB0_CLKGATE (1 << 2)
-+#define DIGCTL_CTRL_USB1_CLKGATE (1 << 16)
-+
-+#define SET 0x4
-+#define CLR 0x8
-+
-+static void imx28_usb_phy_reset(void __iomem *phybase)
-+{
-+ /* Reset USBPHY module */
-+ writel(USBPHY_CTRL_SFTRST, phybase + USBPHY_CTRL + SET);
-+ udelay(10);
-+ writel(USBPHY_CTRL_CLKGATE | USBPHY_CTRL_SFTRST,
-+ phybase + USBPHY_CTRL + CLR);
-+}
-+
-+static void imx28_usb_phy_enable(void __iomem *phybase)
-+{
-+ /* Power up the PHY */
-+ writel(0, phybase + USBPHY_PWD);
-+
-+ writel(USBPHY_CTRL_ENUTMILEVEL3 | USBPHY_CTRL_ENUTMILEVEL2 | 1,
-+ phybase + USBPHY_CTRL + SET);
-+}
-+
-+int imx28_usb_phy0_enable(void)
-+{
-+ imx28_usb_phy_reset((void *)IMX_USBPHY0_BASE);
-+
-+ /* Turn on the USB clocks */
-+ writel(PLLCTRL0_EN_USB_CLKS, CLK_PLL0CTRL0 + SET);
-+
-+ writel(DIGCTL_CTRL_USB0_CLKGATE, DIGCTRL_CTRL + CLR);
-+
-+ imx28_usb_phy_enable((void *)IMX_USBPHY0_BASE);
-+
-+ return 0;
-+}
-+
-+int imx28_usb_phy1_enable(void)
-+{
-+ imx28_usb_phy_reset((void *)IMX_USBPHY1_BASE);
-+
-+ /* Turn on the USB clocks */
-+ writel(PLLCTRL0_EN_USB_CLKS, CLK_PLL1CTRL0 + SET);
-+
-+ writel(DIGCTL_CTRL_USB1_CLKGATE, DIGCTRL_CTRL + CLR);
-+
-+ imx28_usb_phy_enable((void *)IMX_USBPHY1_BASE);
-+
-+ return 0;
-+}
-diff --git a/arch/arm/mach-mxs/usb.c b/arch/arm/mach-mxs/usb.c
-deleted file mode 100644
-index b7a9376..0000000
---- a/arch/arm/mach-mxs/usb.c
-+++ /dev/null
-@@ -1,92 +0,0 @@
--/*
-- * i.MX23/28 USBPHY setup
-- *
-- * Copyright 2011 Sascha Hauer, Pengutronix <s.hauer@pengutronix.de>
-- *
-- * 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 <io.h>
--#include <mach/imx-regs.h>
--
--#define POWER_CTRL (IMX_POWER_BASE + 0x0)
--#define POWER_CTRL_CLKGATE 0x40000000
--
--#define POWER_STS (IMX_POWER_BASE + 0xc0)
--#define POWER_STS_VBUSVALID 0x00000002
--#define POWER_STS_BVALID 0x00000004
--#define POWER_STS_AVALID 0x00000008
--
--#define POWER_DEBUG (IMX_POWER_BASE + 0x110)
--#define POWER_DEBUG_BVALIDPIOLOCK 0x00000002
--#define POWER_DEBUG_AVALIDPIOLOCK 0x00000004
--#define POWER_DEBUG_VBUSVALIDPIOLOCK 0x00000008
--
--#define USBPHY_PWD (IMX_USBPHY_BASE + 0x0)
--
--#define USBPHY_CTRL (IMX_USBPHY_BASE + 0x30)
--#define USBPHY_CTRL_SFTRST 0x80000000
--#define USBPHY_CTRL_CLKGATE 0x40000000
--
--#define CLK_PLLCTRL0 (IMX_CCM_BASE + 0x0)
--#define PLLCTRL0_EN_USB_CLKS 0x00040000
--
--#define DIGCTRL_CTRL (IMX_DIGCTL_BASE + 0x0)
--#define DIGCTL_CTRL_USB_CLKGATE 0x00000004
--
--#define SET 0x4
--#define CLR 0x8
--
--int imx_usb_phy_enable(void)
--{
-- u32 reg;
--
-- /*
-- * Set these bits so that we can force the OTG bits high
-- * so the ARC core operates properly
-- */
-- writel(POWER_CTRL_CLKGATE, POWER_CTRL + CLR);
--
-- writel(POWER_DEBUG_VBUSVALIDPIOLOCK |
-- POWER_DEBUG_AVALIDPIOLOCK |
-- POWER_DEBUG_BVALIDPIOLOCK, POWER_DEBUG + SET);
--
-- reg = readl(POWER_STS);
-- reg |= POWER_STS_BVALID | POWER_STS_AVALID | POWER_STS_VBUSVALID;
-- writel(reg, POWER_STS);
--
-- /* Reset USBPHY module */
-- writel(USBPHY_CTRL_SFTRST, USBPHY_CTRL + SET);
-- udelay(10);
--
-- /* Remove CLKGATE and SFTRST */
-- writel(USBPHY_CTRL_CLKGATE | USBPHY_CTRL_SFTRST, USBPHY_CTRL + CLR);
--
-- /* Turn on the USB clocks */
-- writel(PLLCTRL0_EN_USB_CLKS, CLK_PLLCTRL0 + SET);
-- writel(DIGCTL_CTRL_USB_CLKGATE, DIGCTRL_CTRL + CLR);
--
-- /* Power up the PHY */
-- writel(0, USBPHY_PWD);
--
-- /*
-- * Set precharge bit to cure overshoot problems at the
-- * start of packets
-- */
-- writel(1, USBPHY_CTRL + SET);
--
-- return 0;
--}
--
-diff --git a/arch/arm/mach-samsung/include/mach/devices-s3c24xx.h b/arch/arm/mach-samsung/include/mach/devices-s3c24xx.h
-new file mode 100644
-index 0000000..51fd9a1
---- /dev/null
-+++ b/arch/arm/mach-samsung/include/mach/devices-s3c24xx.h
-@@ -0,0 +1,55 @@
-+/*
-+ * Copyright 2012 Juergen Beisert
-+ *
-+ * 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.
-+ *
-+ */
-+
-+#ifndef INCLUDE_MACH_DEVICES_S3C24XX_H
-+# define INCLUDE_MACH_DEVICES_S3C24XX_H
-+
-+#include <driver.h>
-+#include <mach/s3c24xx-iomap.h>
-+#include <mach/s3c24xx-nand.h>
-+#include <mach/s3c-mci.h>
-+#include <mach/s3c24xx-fb.h>
-+
-+static inline void s3c24xx_add_nand(struct s3c24x0_nand_platform_data *d)
-+{
-+ add_generic_device("s3c24x0_nand", DEVICE_ID_DYNAMIC, NULL,
-+ S3C24X0_NAND_BASE, 0x80, IORESOURCE_MEM, d);
-+}
-+
-+static inline void s3c24xx_add_mci(struct s3c_mci_platform_data *d)
-+{
-+ add_generic_device("s3c_mci", DEVICE_ID_DYNAMIC, NULL,
-+ S3C2410_SDI_BASE, 0x80, IORESOURCE_MEM, d);
-+}
-+
-+static inline void s3c24xx_add_fb(struct s3c_fb_platform_data *d)
-+{
-+ add_generic_device("s3c_fb", DEVICE_ID_DYNAMIC, NULL,
-+ S3C2410_LCD_BASE, 0x80, IORESOURCE_MEM, d);
-+}
-+
-+static inline void s3c24xx_add_ohci(void)
-+{
-+ add_generic_device("ohci", DEVICE_ID_DYNAMIC, NULL,
-+ S3C2410_USB_HOST_BASE, 0x100, IORESOURCE_MEM, NULL);
-+}
-+
-+static inline void s3c24xx_add_uart1(void)
-+{
-+ add_generic_device("s3c_serial", DEVICE_ID_DYNAMIC, NULL, S3C_UART1_BASE,
-+ S3C_UART1_SIZE, IORESOURCE_MEM, NULL);
-+}
-+
-+#endif /* INCLUDE_MACH_DEVICES_S3C24XX_H */
-diff --git a/arch/arm/mach-samsung/include/mach/s3c24xx-nand.h b/arch/arm/mach-samsung/include/mach/s3c24xx-nand.h
-index acd78b8..fa88da1 100644
---- a/arch/arm/mach-samsung/include/mach/s3c24xx-nand.h
-+++ b/arch/arm/mach-samsung/include/mach/s3c24xx-nand.h
-@@ -18,6 +18,9 @@
- *
- */
-
-+#ifndef MACH_S3C24XX_NAND_H
-+# define MACH_S3C24XX_NAND_H
-+
- #ifdef CONFIG_S3C_NAND_BOOT
- extern void s3c24x0_nand_load_image(void*, int, int);
- #endif
-@@ -52,3 +55,5 @@ struct s3c24x0_nand_platform_data {
- * @file
- * @brief Basic declaration to use the s3c24x0 NAND driver
- */
-+
-+#endif /* MACH_S3C24XX_NAND_H */
-diff --git a/arch/blackfin/include/asm/bitops.h b/arch/blackfin/include/asm/bitops.h
-index cdcb2f8..623ddfb 100644
---- a/arch/blackfin/include/asm/bitops.h
-+++ b/arch/blackfin/include/asm/bitops.h
-@@ -268,7 +268,10 @@ static __inline__ int find_next_zero_bit(void *addr, int size, int offset)
- return result + ffz(tmp);
- }
-
-+#include <asm-generic/bitops/__ffs.h>
-+#include <asm-generic/bitops/__fls.h>
- #include <asm-generic/bitops/ffs.h>
-+#include <asm-generic/bitops/fls.h>
- #include <asm-generic/bitops/hweight.h>
-
- static __inline__ int ext2_set_bit(int nr, volatile void *addr)
-diff --git a/arch/blackfin/include/asm/dma.h b/arch/blackfin/include/asm/dma.h
-new file mode 100644
-index 0000000..27d269f
---- /dev/null
-+++ b/arch/blackfin/include/asm/dma.h
-@@ -0,0 +1,13 @@
-+/*
-+ * Copyright (C) 2012 by Marc Kleine-Budde <mkl@pengutronix.de>
-+ *
-+ * This file is released under the GPLv2
-+ *
-+ */
-+
-+#ifndef __ASM_DMA_H
-+#define __ASM_DMA_H
-+
-+/* empty */
-+
-+#endif /* __ASM_DMA_H */
-diff --git a/arch/blackfin/lib/Makefile b/arch/blackfin/lib/Makefile
-index 2f77318..cefb4dc 100644
---- a/arch/blackfin/lib/Makefile
-+++ b/arch/blackfin/lib/Makefile
-@@ -8,6 +8,7 @@ obj-y += smulsi3_highpart.o
- obj-y += umodsi3.o
- obj-y += lshrdi3.o
- obj-y += ashldi3.o
-+obj-y += ashrdi3.o
- obj-y += divsi3.o
- obj-y += modsi3.o
- obj-y += cpu.o
-diff --git a/arch/blackfin/lib/ashrdi3.c b/arch/blackfin/lib/ashrdi3.c
-new file mode 100644
-index 0000000..b5b351e
---- /dev/null
-+++ b/arch/blackfin/lib/ashrdi3.c
-@@ -0,0 +1,36 @@
-+/*
-+ * Copyright 2004-2009 Analog Devices Inc.
-+ *
-+ * Licensed under the GPL-2 or later.
-+ */
-+
-+#include "gcclib.h"
-+
-+#ifdef CONFIG_ARITHMETIC_OPS_L1
-+DItype __ashrdi3(DItype u, word_type b)__attribute__((l1_text));
-+#endif
-+
-+DItype __ashrdi3(DItype u, word_type b)
-+{
-+ DIunion w;
-+ word_type bm;
-+ DIunion uu;
-+
-+ if (b == 0)
-+ return u;
-+
-+ uu.ll = u;
-+
-+ bm = (sizeof(SItype) * BITS_PER_UNIT) - b;
-+ if (bm <= 0) {
-+ /* w.s.high = 1..1 or 0..0 */
-+ w.s.high = uu.s.high >> (sizeof(SItype) * BITS_PER_UNIT - 1);
-+ w.s.low = uu.s.high >> -bm;
-+ } else {
-+ USItype carries = (USItype) uu.s.high << bm;
-+ w.s.high = uu.s.high >> b;
-+ w.s.low = ((USItype) uu.s.low >> b) | carries;
-+ }
-+
-+ return w.ll;
-+}
-diff --git a/arch/mips/include/asm/bitops.h b/arch/mips/include/asm/bitops.h
-index 001ebf2..bf1ac6e 100644
---- a/arch/mips/include/asm/bitops.h
-+++ b/arch/mips/include/asm/bitops.h
-@@ -28,5 +28,8 @@
- #define _ASM_MIPS_BITOPS_H_
-
- #include <asm-generic/bitops/__ffs.h>
-+#include <asm-generic/bitops/__fls.h>
-+#include <asm-generic/bitops/ffs.h>
-+#include <asm-generic/bitops/fls.h>
-
- #endif /* _ASM_MIPS_BITOPS_H_ */
-diff --git a/arch/mips/include/asm/dma.h b/arch/mips/include/asm/dma.h
-new file mode 100644
-index 0000000..27d269f
---- /dev/null
-+++ b/arch/mips/include/asm/dma.h
-@@ -0,0 +1,13 @@
-+/*
-+ * Copyright (C) 2012 by Marc Kleine-Budde <mkl@pengutronix.de>
-+ *
-+ * This file is released under the GPLv2
-+ *
-+ */
-+
-+#ifndef __ASM_DMA_H
-+#define __ASM_DMA_H
-+
-+/* empty */
-+
-+#endif /* __ASM_DMA_H */
-diff --git a/arch/mips/mach-xburst/Kconfig b/arch/mips/mach-xburst/Kconfig
-index 60e411c..c72b741 100644
---- a/arch/mips/mach-xburst/Kconfig
-+++ b/arch/mips/mach-xburst/Kconfig
-@@ -12,6 +12,7 @@ choice
-
- config BOARD_RZX50
- bool "Ritmix RZX-50"
-+ select HAS_POWEROFF
- select CPU_JZ4755
-
- endchoice
-diff --git a/arch/mips/mach-xburst/csrc-jz4750.c b/arch/mips/mach-xburst/csrc-jz4750.c
-index f625b70..36e401e 100644
---- a/arch/mips/mach-xburst/csrc-jz4750.c
-+++ b/arch/mips/mach-xburst/csrc-jz4750.c
-@@ -28,7 +28,7 @@
- #include <io.h>
- #include <mach/jz4750d_regs.h>
-
--#define JZ_TIMER_CLOCK 40000
-+#define JZ_TIMER_CLOCK 24000000
-
- static uint64_t jz4750_cs_read(void)
- {
-@@ -38,12 +38,13 @@ static uint64_t jz4750_cs_read(void)
- static struct clocksource jz4750_cs = {
- .read = jz4750_cs_read,
- .mask = CLOCKSOURCE_MASK(32),
-- .shift = 10,
- };
-
- static int clocksource_init(void)
- {
-- jz4750_cs.mult = clocksource_hz2mult(JZ_TIMER_CLOCK, jz4750_cs.shift);
-+ clocks_calc_mult_shift(&jz4750_cs.mult, &jz4750_cs.shift,
-+ JZ_TIMER_CLOCK, NSEC_PER_SEC, 10);
-+
- init_clock(&jz4750_cs);
-
- __raw_writel(TCU_OSTCSR_PRESCALE1 | TCU_OSTCSR_EXT_EN,
-diff --git a/arch/mips/mach-xburst/include/mach/jz4750d_regs.h b/arch/mips/mach-xburst/include/mach/jz4750d_regs.h
-index 717493b..eafdd2f 100644
---- a/arch/mips/mach-xburst/include/mach/jz4750d_regs.h
-+++ b/arch/mips/mach-xburst/include/mach/jz4750d_regs.h
-@@ -15,6 +15,7 @@
-
- #define TCU_BASE 0xb0002000
- #define WDT_BASE 0xb0002000
-+#define RTC_BASE 0xb0003000
- #define UART1_BASE 0xb0031000
-
- /*************************************************************************
-@@ -77,4 +78,34 @@
-
- #define WDT_TCER_TCEN (1 << 0)
-
-+/*************************************************************************
-+ * RTC
-+ *************************************************************************/
-+#define RTC_RCR (RTC_BASE + 0x00) /* RTC Control Register */
-+#define RTC_RSR (RTC_BASE + 0x04) /* RTC Second Register */
-+#define RTC_RSAR (RTC_BASE + 0x08) /* RTC Second Alarm Register */
-+#define RTC_RGR (RTC_BASE + 0x0c) /* RTC Regulator Register */
-+
-+#define RTC_HCR (RTC_BASE + 0x20) /* Hibernate Control Register */
-+#define RTC_HWFCR (RTC_BASE + 0x24) /* Hibernate Wakeup Filter Counter Reg */
-+#define RTC_HRCR (RTC_BASE + 0x28) /* Hibernate Reset Counter Register */
-+#define RTC_HWCR (RTC_BASE + 0x2c) /* Hibernate Wakeup Control Register */
-+#define RTC_HWRSR (RTC_BASE + 0x30) /* Hibernate Wakeup Status Register */
-+#define RTC_HSPR (RTC_BASE + 0x34) /* Hibernate Scratch Pattern Register */
-+
-+/* RTC Control Register */
-+#define RTC_RCR_WRDY_BIT 7
-+#define RTC_RCR_WRDY (1 << 7) /* Write Ready Flag */
-+#define RTC_RCR_1HZ_BIT 6
-+#define RTC_RCR_1HZ (1 << RTC_RCR_1HZ_BIT) /* 1Hz Flag */
-+#define RTC_RCR_1HZIE (1 << 5) /* 1Hz Interrupt Enable */
-+#define RTC_RCR_AF_BIT 4
-+#define RTC_RCR_AF (1 << RTC_RCR_AF_BIT) /* Alarm Flag */
-+#define RTC_RCR_AIE (1 << 3) /* Alarm Interrupt Enable */
-+#define RTC_RCR_AE (1 << 2) /* Alarm Enable */
-+#define RTC_RCR_RTCE (1 << 0) /* RTC Enable */
-+
-+/* Hibernate Control Register */
-+#define RTC_HCR_PD (1 << 0) /* Power Down */
-+
- #endif /* __JZ4750D_REGS_H__ */
-diff --git a/arch/mips/mach-xburst/reset-jz4750.c b/arch/mips/mach-xburst/reset-jz4750.c
-index 3540ca9..765c033 100644
---- a/arch/mips/mach-xburst/reset-jz4750.c
-+++ b/arch/mips/mach-xburst/reset-jz4750.c
-@@ -29,6 +29,19 @@
-
- #define JZ_EXTAL 24000000
-
-+static void __noreturn jz4750d_halt(void)
-+{
-+ while (1) {
-+ __asm__(".set push;\n"
-+ ".set mips3;\n"
-+ "wait;\n"
-+ ".set pop;\n"
-+ );
-+ }
-+
-+ unreachable();
-+}
-+
- void __noreturn reset_cpu(ulong addr)
- {
- __raw_writew(WDT_TCSR_PRESCALE4 | WDT_TCSR_EXT_EN, (u16 *)WDT_TCSR);
-@@ -44,3 +57,18 @@ void __noreturn reset_cpu(ulong addr)
- unreachable();
- }
- EXPORT_SYMBOL(reset_cpu);
-+
-+void __noreturn poweroff()
-+{
-+ u32 ctrl;
-+
-+ shutdown_barebox();
-+
-+ do {
-+ ctrl = readl((u32 *)RTC_RCR);
-+ } while (!(ctrl & RTC_RCR_WRDY));
-+
-+ writel(RTC_HCR_PD, (u32 *)RTC_HCR);
-+ jz4750d_halt();
-+}
-+EXPORT_SYMBOL(poweroff);
-diff --git a/arch/nios2/boards/generic/generic.c b/arch/nios2/boards/generic/generic.c
-index b51b94a..2c998fe 100644
---- a/arch/nios2/boards/generic/generic.c
-+++ b/arch/nios2/boards/generic/generic.c
-@@ -9,17 +9,17 @@ static int phy_address = 1;
- static struct resource mac_resources[] = {
- [0] = {
- .start = NIOS_SOPC_TSE_BASE,
-- .size = 0x400,
-+ .end = NIOS_SOPC_TSE_BASE + 0x400 - 1,
- .flags = IORESOURCE_MEM,
- },
- [1] = {
- .start = NIOS_SOPC_SGDMA_RX_BASE,
-- .size = 0x40,
-+ .end = 0x40 + NIOS_SOPC_SGDMA_RX_BASE - 1,
- .flags = IORESOURCE_MEM,
- },
- [2] = {
- .start = NIOS_SOPC_SGDMA_TX_BASE,
-- .size = 0x40,
-+ .end = 0x40 + NIOS_SOPC_SGDMA_TX_BASE - 1,
- .flags = IORESOURCE_MEM,
- },
- };
-diff --git a/arch/nios2/include/asm/bitops.h b/arch/nios2/include/asm/bitops.h
-index ab0e3d5..0712845 100644
---- a/arch/nios2/include/asm/bitops.h
-+++ b/arch/nios2/include/asm/bitops.h
-@@ -1,4 +1,9 @@
- #ifndef _ASM_BITOPS_H
- #define _ASM_BITOPS_H
-
-+#include <asm-generic/bitops/__ffs.h>
-+#include <asm-generic/bitops/__fls.h>
-+#include <asm-generic/bitops/ffs.h>
-+#include <asm-generic/bitops/fls.h>
-+
- #endif /* _ASM_BITOPS_H */
-diff --git a/arch/nios2/include/asm/dma-mapping.h b/arch/nios2/include/asm/dma-mapping.h
-index 5b70f4c..9819a97 100644
---- a/arch/nios2/include/asm/dma-mapping.h
-+++ b/arch/nios2/include/asm/dma-mapping.h
-@@ -1,8 +1,12 @@
- #ifndef __ASM_NIOS2_DMA_MAPPING_H
- #define __ASM_NIOS2_DMA_MAPPING_H
-
-+#include <common.h>
-+#include <xfuncs.h>
-+
- #include <asm/cache.h>
-
-+
- /* dma_alloc_coherent() return cache-line aligned allocation which is mapped
- * to uncached io region.
- *
-@@ -22,4 +26,10 @@ static inline void *dma_alloc_coherent(size_t len, unsigned long *handle)
- return (void *)(*handle | IO_REGION_BASE);
- }
-
-+#define dma_alloc dma_alloc
-+static inline void *dma_alloc(size_t size)
-+{
-+ return xmemalign(DCACHE_LINE_SIZE, ALIGN(size, DCACHE_LINE_SIZE));
-+}
-+
- #endif /* __ASM_NIOS2_DMA_MAPPING_H */
-diff --git a/arch/nios2/include/asm/dma.h b/arch/nios2/include/asm/dma.h
-new file mode 100644
-index 0000000..8f709d2
---- /dev/null
-+++ b/arch/nios2/include/asm/dma.h
-@@ -0,0 +1,8 @@
-+/*
-+ * Copyright (C) 2012 by Marc Kleine-Budde <mkl@pengutronix.de>
-+ *
-+ * This file is released under the GPLv2
-+ *
-+ */
-+
-+#include <asm/dma-mapping.h>
-diff --git a/arch/openrisc/Makefile b/arch/openrisc/Makefile
-index fd8bbbf..1f4b175 100644
---- a/arch/openrisc/Makefile
-+++ b/arch/openrisc/Makefile
-@@ -1,5 +1,7 @@
- CPPFLAGS += -D__OR1K__ -ffixed-r10 -mhard-mul -mhard-div
-
-+LIBGCC := $(shell $(CC) $(KBUILD_CFLAGS) -print-libgcc-file-name)
-+
- board-$(CONFIG_GENERIC) := generic
-
- KALLSYMS += --symbol-prefix=_
-@@ -18,4 +20,6 @@ common-y += $(BOARD)
- common-y += arch/openrisc/lib/
- common-y += arch/openrisc/cpu/
-
-+common-y += $(LIBGCC)
-+
- lds-y += arch/openrisc/cpu/barebox.lds
-diff --git a/arch/openrisc/include/asm/dma.h b/arch/openrisc/include/asm/dma.h
-new file mode 100644
-index 0000000..27d269f
---- /dev/null
-+++ b/arch/openrisc/include/asm/dma.h
-@@ -0,0 +1,13 @@
-+/*
-+ * Copyright (C) 2012 by Marc Kleine-Budde <mkl@pengutronix.de>
-+ *
-+ * This file is released under the GPLv2
-+ *
-+ */
-+
-+#ifndef __ASM_DMA_H
-+#define __ASM_DMA_H
-+
-+/* empty */
-+
-+#endif /* __ASM_DMA_H */
-diff --git a/arch/ppc/include/asm/dma.h b/arch/ppc/include/asm/dma.h
-new file mode 100644
-index 0000000..27d269f
---- /dev/null
-+++ b/arch/ppc/include/asm/dma.h
-@@ -0,0 +1,13 @@
-+/*
-+ * Copyright (C) 2012 by Marc Kleine-Budde <mkl@pengutronix.de>
-+ *
-+ * This file is released under the GPLv2
-+ *
-+ */
-+
-+#ifndef __ASM_DMA_H
-+#define __ASM_DMA_H
-+
-+/* empty */
-+
-+#endif /* __ASM_DMA_H */
-diff --git a/arch/ppc/mach-mpc85xx/include/mach/clocks.h b/arch/ppc/mach-mpc85xx/include/mach/clocks.h
-index 9477168..2ab367b 100644
---- a/arch/ppc/mach-mpc85xx/include/mach/clocks.h
-+++ b/arch/ppc/mach-mpc85xx/include/mach/clocks.h
-@@ -10,8 +10,6 @@ struct sys_info {
- unsigned long freqLocalBus;
- };
-
--#define NSEC_PER_SEC 1000000000L
--
- unsigned long fsl_get_bus_freq(ulong dummy);
- unsigned long fsl_get_timebase_clock(void);
- void fsl_get_sys_info(struct sys_info *sysInfo);
-diff --git a/arch/sandbox/board/hostfile.c b/arch/sandbox/board/hostfile.c
-index 90a9741..96fa100 100644
---- a/arch/sandbox/board/hostfile.c
-+++ b/arch/sandbox/board/hostfile.c
-@@ -34,7 +34,7 @@ struct hf_priv {
- struct hf_platform_data *pdata;
- };
-
--static ssize_t hf_read(struct cdev *cdev, void *buf, size_t count, ulong offset, ulong flags)
-+static ssize_t hf_read(struct cdev *cdev, void *buf, size_t count, loff_t offset, ulong flags)
- {
- struct hf_platform_data *hf = cdev->priv;
- int fd = hf->fd;
-@@ -45,7 +45,7 @@ static ssize_t hf_read(struct cdev *cdev, void *buf, size_t count, ulong offset,
- return linux_read(fd, buf, count);
- }
-
--static ssize_t hf_write(struct cdev *cdev, const void *buf, size_t count, ulong offset, ulong flags)
-+static ssize_t hf_write(struct cdev *cdev, const void *buf, size_t count, loff_t offset, ulong flags)
- {
- struct hf_platform_data *hf = cdev->priv;
- int fd = hf->fd;
-diff --git a/arch/sandbox/include/asm/dma.h b/arch/sandbox/include/asm/dma.h
-new file mode 100644
-index 0000000..4595367
---- /dev/null
-+++ b/arch/sandbox/include/asm/dma.h
-@@ -0,0 +1,13 @@
-+/*
-+ * Copyright (C) 2012 by Marc Kleine-Budde <mkl@pengutronix.de>
-+ *
-+ * This file is released under the GPLv2
-+ *
-+ */
-+
-+#ifndef __ASM_DMA_H
-+#define __ASM_DMA_H
-+
-+/* empty*/
-+
-+#endif /* __ASM_DMA_H */
-diff --git a/arch/x86/include/asm/bitops.h b/arch/x86/include/asm/bitops.h
-index b43afa3..830b1a5 100644
---- a/arch/x86/include/asm/bitops.h
-+++ b/arch/x86/include/asm/bitops.h
-@@ -27,6 +27,11 @@
- #ifndef _ASM_X86_BITOPS_H_
- #define _ASM_X86_BITOPS_H_
-
--/* nothing special yet */
-+#define BITS_PER_LONG 32
-+
-+#include <asm-generic/bitops/__fls.h>
-+#include <asm-generic/bitops/__ffs.h>
-+#include <asm-generic/bitops/fls.h>
-+#include <asm-generic/bitops/ffs.h>
-
- #endif /* _ASM_X86_BITOPS_H_ */
-diff --git a/arch/x86/include/asm/dma.h b/arch/x86/include/asm/dma.h
-new file mode 100644
-index 0000000..27d269f
---- /dev/null
-+++ b/arch/x86/include/asm/dma.h
-@@ -0,0 +1,13 @@
-+/*
-+ * Copyright (C) 2012 by Marc Kleine-Budde <mkl@pengutronix.de>
-+ *
-+ * This file is released under the GPLv2
-+ *
-+ */
-+
-+#ifndef __ASM_DMA_H
-+#define __ASM_DMA_H
-+
-+/* empty */
-+
-+#endif /* __ASM_DMA_H */
-diff --git a/commands/Kconfig b/commands/Kconfig
-index 52e1f17..2478e3f 100644
---- a/commands/Kconfig
-+++ b/commands/Kconfig
-@@ -6,6 +6,10 @@ config COMMAND_SUPPORT
- depends on !SHELL_NONE
- default y
-
-+config HAS_POWEROFF
-+ bool
-+ default n
-+
- if COMMAND_SUPPORT
-
- menu "commands "
-@@ -25,6 +29,10 @@ config CMD_SLEEP
- tristate
- prompt "sleep"
-
-+config CMD_MSLEEP
-+ tristate
-+ prompt "msleep"
-+
- config CMD_SAVEENV
- tristate
- select ENV_HANDLING
-@@ -198,6 +206,20 @@ config CMD_AUTOMOUNT
- this directory available (discover USB devices, bring network interface
- up and finally mount the filesystem).
-
-+config CMD_BASENAME
-+ tristate
-+ prompt "basename"
-+ help
-+ Strip directory and suffix from filenames and store the result in a
-+ environment variable
-+
-+config CMD_DIRNAME
-+ tristate
-+ prompt "dirname"
-+ help
-+ Strip last component of file name and store the result in a
-+ environment variable
-+
- endmenu
-
- menu "console "
-@@ -422,6 +444,11 @@ config CMD_RESET
- tristate
- prompt "reset"
-
-+config CMD_POWEROFF
-+ tristate
-+ depends on HAS_POWEROFF
-+ prompt "poweroff"
-+
- config CMD_GO
- tristate
- prompt "go"
-@@ -552,6 +579,25 @@ config CMD_USB
- help
- The usb command allows to rescan for USB devices.
-
-+menuconfig CMD_WD
-+ bool
-+ depends on WATCHDOG
-+ prompt "wd command "
-+ help
-+ The 'wd' command which allows to start, stop and trigger the onboard
-+ watchdog.
-+
-+if CMD_WD
-+
-+config CMD_WD_DEFAULT_TIMOUT
-+ int
-+ prompt "default timeout"
-+ help
-+ Define the default timeout value in [seconds] if the first call of
-+ 'wd' is done without a timeout value (which means the watchdog gets
-+ enabled and re-triggered with the default timeout value).
-+endif
-+
- endmenu
-
- endif
-diff --git a/commands/Makefile b/commands/Makefile
-index 4c8a0a9..54191b4 100644
---- a/commands/Makefile
-+++ b/commands/Makefile
-@@ -1,3 +1,4 @@
-+obj-y += stddev.o
- obj-$(CONFIG_CMD_BOOTM) += bootm.o
- obj-$(CONFIG_CMD_UIMAGE) += uimage.o
- obj-$(CONFIG_CMD_LINUX16) += linux16.o
-@@ -10,7 +11,9 @@ obj-$(CONFIG_CMD_MTEST) += memtest.o
- obj-$(CONFIG_CMD_EDIT) += edit.o
- obj-$(CONFIG_CMD_EXEC) += exec.o
- obj-$(CONFIG_CMD_SLEEP) += sleep.o
-+obj-$(CONFIG_CMD_MSLEEP) += msleep.o
- obj-$(CONFIG_CMD_RESET) += reset.o
-+obj-$(CONFIG_CMD_POWEROFF) += poweroff.o
- obj-$(CONFIG_CMD_GO) += go.o
- obj-$(CONFIG_NET) += net.o
- obj-$(CONFIG_CMD_PARTITION) += partition.o
-@@ -57,6 +60,7 @@ obj-$(CONFIG_CMD_MENU) += menu.o
- obj-$(CONFIG_CMD_PASSWD) += passwd.o
- obj-$(CONFIG_CMD_LOGIN) += login.o
- obj-$(CONFIG_CMD_LED) += led.o
-+obj-$(CONFIG_CMD_WD) += wd.o
- obj-$(CONFIG_CMD_LED_TRIGGER) += trigger.o
- obj-$(CONFIG_CMD_USB) += usb.o
- obj-$(CONFIG_CMD_TIME) += time.o
-@@ -66,3 +70,5 @@ obj-$(CONFIG_CMD_IOMEM) += iomem.o
- obj-$(CONFIG_CMD_LINUX_EXEC) += linux_exec.o
- obj-$(CONFIG_CMD_AUTOMOUNT) += automount.o
- obj-$(CONFIG_CMD_GLOBAL) += global.o
-+obj-$(CONFIG_CMD_BASENAME) += basename.o
-+obj-$(CONFIG_CMD_DIRNAME) += dirname.o
-diff --git a/commands/basename.c b/commands/basename.c
-new file mode 100644
-index 0000000..b47ff8c
---- /dev/null
-+++ b/commands/basename.c
-@@ -0,0 +1,47 @@
-+/*
-+ * basename.c - strip directory and suffix from filenames
-+ *
-+ * Copyright (c) 2012 Sascha Hauer <s.hauer@pengutronix.de>, Pengutronix
-+ *
-+ * 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 version 2
-+ * as published by the Free Software Foundation.
-+ *
-+ * 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 <command.h>
-+#include <libgen.h>
-+#include <environment.h>
-+
-+static int do_basename(int argc, char *argv[])
-+{
-+ if (argc != 3)
-+ return COMMAND_ERROR_USAGE;
-+
-+ setenv(argv[2], basename(argv[1]));
-+
-+ return 0;
-+}
-+
-+BAREBOX_CMD_HELP_START(basename)
-+BAREBOX_CMD_HELP_USAGE("basename NAME BASENAME\n")
-+BAREBOX_CMD_HELP_SHORT("strip NAME and store into $BASENAME\n")
-+BAREBOX_CMD_HELP_END
-+
-+BAREBOX_CMD_START(basename)
-+ .cmd = do_basename,
-+ .usage = "strip directory and suffix from filenames",
-+ BAREBOX_CMD_HELP(cmd_basename_help)
-+BAREBOX_CMD_END
-diff --git a/commands/bootm.c b/commands/bootm.c
-index 2989d39..3c47ab5 100644
---- a/commands/bootm.c
-+++ b/commands/bootm.c
-@@ -383,8 +383,7 @@ static int do_bootm(int argc, char *argv[])
- if (data.os_res)
- printf("OS image is at 0x%08x-0x%08x\n",
- data.os_res->start,
-- data.os_res->start +
-- data.os_res->size - 1);
-+ data.os_res->end);
- else
- printf("OS image not yet relocated\n");
-
-@@ -399,8 +398,7 @@ static int do_bootm(int argc, char *argv[])
- if (data.initrd_res)
- printf("initrd is at 0x%08x-0x%08x\n",
- data.initrd_res->start,
-- data.initrd_res->start +
-- data.initrd_res->size - 1);
-+ data.initrd_res->end);
- else
- printf("initrd image not yet relocated\n");
- }
-diff --git a/commands/crc.c b/commands/crc.c
-index df22941..8f80e42 100644
---- a/commands/crc.c
-+++ b/commands/crc.c
-@@ -47,9 +47,12 @@ static int file_crc(char* filename, ulong start, ulong size, ulong *crc,
- }
-
- if (start > 0) {
-- ret = lseek(fd, start, SEEK_SET);
-- if (ret == -1) {
-+ off_t lseek_ret;
-+ errno = 0;
-+ lseek_ret = lseek(fd, start, SEEK_SET);
-+ if (lseek_ret == (off_t)-1 && errno) {
- perror("lseek");
-+ ret = -1;
- goto out;
- }
- }
-@@ -84,8 +87,8 @@ out:
-
- static int do_crc(int argc, char *argv[])
- {
-- ulong start = 0, size = ~0, total = 0;
-- ulong crc = 0, vcrc = 0;
-+ loff_t start = 0, size = ~0;
-+ ulong crc = 0, vcrc = 0, total = 0;
- char *filename = "/dev/mem";
- #ifdef CONFIG_CMD_CRC_CMP
- char *vfilename = NULL;
-diff --git a/commands/digest.c b/commands/digest.c
-index 8432914..07cbec9 100644
---- a/commands/digest.c
-+++ b/commands/digest.c
-@@ -51,7 +51,7 @@ static int do_digest(char *algorithm, int argc, char *argv[])
- argv++;
- while (*argv) {
- char *filename = "/dev/mem";
-- ulong start = 0, size = ~0;
-+ loff_t start = 0, size = ~0;
-
- /* arguments are either file, file+area or area */
- if (parse_area_spec(*argv, &start, &size)) {
-@@ -66,7 +66,7 @@ static int do_digest(char *algorithm, int argc, char *argv[])
- for (i = 0; i < d->length; i++)
- printf("%02x", hash[i]);
-
-- printf(" %s\t0x%08lx ... 0x%08lx\n", filename, start, start + size);
-+ printf(" %s\t0x%08llx ... 0x%08llx\n", filename, start, start + size);
-
- argv++;
- }
-diff --git a/commands/dirname.c b/commands/dirname.c
-new file mode 100644
-index 0000000..cf1d0a0
---- /dev/null
-+++ b/commands/dirname.c
-@@ -0,0 +1,47 @@
-+/*
-+ * dirname.c - strip directory and suffix from filenames
-+ *
-+ * Copyright (c) 2012 Sascha Hauer <s.hauer@pengutronix.de>, Pengutronix
-+ *
-+ * 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 version 2
-+ * as published by the Free Software Foundation.
-+ *
-+ * 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 <command.h>
-+#include <libgen.h>
-+#include <environment.h>
-+
-+static int do_dirname(int argc, char *argv[])
-+{
-+ if (argc != 3)
-+ return COMMAND_ERROR_USAGE;
-+
-+ setenv(argv[2], dirname(argv[1]));
-+
-+ return 0;
-+}
-+
-+BAREBOX_CMD_HELP_START(dirname)
-+BAREBOX_CMD_HELP_USAGE("dirname NAME DIRNAME\n")
-+BAREBOX_CMD_HELP_SHORT("strip last componext of NAME and store into $DIRNAME\n")
-+BAREBOX_CMD_HELP_END
-+
-+BAREBOX_CMD_START(dirname)
-+ .cmd = do_dirname,
-+ .usage = "strip last component from file name",
-+ BAREBOX_CMD_HELP(cmd_dirname_help)
-+BAREBOX_CMD_END
-diff --git a/commands/flash.c b/commands/flash.c
-index 1fcb1cf..d71349a 100644
---- a/commands/flash.c
-+++ b/commands/flash.c
-@@ -41,7 +41,7 @@ static int do_flerase(int argc, char *argv[])
- int fd;
- char *filename = NULL;
- struct stat s;
-- unsigned long start = 0, size = ~0;
-+ loff_t start = 0, size = ~0;
- int ret = 0;
-
- if (argc == 1)
-@@ -109,7 +109,7 @@ static int do_protect(int argc, char *argv[])
- char *filename = NULL;
- struct stat s;
- int prot = 1;
-- unsigned long start = 0, size = ~0;
-+ loff_t start = 0, size = ~0;
- int ret = 0, err;
-
- if (argc == 1)
-diff --git a/commands/go.c b/commands/go.c
-index e9e9d40..14569a5 100644
---- a/commands/go.c
-+++ b/commands/go.c
-@@ -92,5 +92,5 @@ BAREBOX_CMD_START(go)
- .cmd = do_go,
- .usage = "start application at address or file",
- BAREBOX_CMD_HELP(cmd_go_help)
-- BAREBOX_CMD_COMPLETE(cammand_var_complete)
-+ BAREBOX_CMD_COMPLETE(command_var_complete)
- BAREBOX_CMD_END
-diff --git a/commands/iomem.c b/commands/iomem.c
-index 70355fd..c22878c 100644
---- a/commands/iomem.c
-+++ b/commands/iomem.c
-@@ -32,8 +32,7 @@ static void __print_resources(struct resource *res, int indent)
-
- printf(PRINTF_CONVERSION_RESOURCE " - " PRINTF_CONVERSION_RESOURCE
- " (size " PRINTF_CONVERSION_RESOURCE ") %s\n", res->start,
-- res->start + res->size - 1,
-- res->size, res->name);
-+ res->end, resource_size(res), res->name);
-
- list_for_each_entry(r, &res->children, sibling)
- __print_resources(r, indent + 1);
-diff --git a/commands/ls.c b/commands/ls.c
-index ad609f3..fbcbadc 100644
---- a/commands/ls.c
-+++ b/commands/ls.c
-@@ -35,7 +35,7 @@ static void ls_one(const char *path, struct stat *s)
- unsigned int namelen = strlen(path);
-
- mkmodestr(s->st_mode, modestr);
-- printf("%s %10lu %*.*s\n", modestr, s->st_size, namelen, namelen, path);
-+ printf("%s %10llu %*.*s\n", modestr, s->st_size, namelen, namelen, path);
- }
-
- int ls(const char *path, ulong flags)
-diff --git a/commands/mem.c b/commands/mem.c
-index 080bfde..5322def 100644
---- a/commands/mem.c
-+++ b/commands/mem.c
-@@ -43,7 +43,7 @@
- #define PRINTF(fmt,args...)
- #endif
-
--#define RW_BUF_SIZE (ulong)4096
-+#define RW_BUF_SIZE 4096
- static char *rw_buf;
-
- static char *DEVMEM = "/dev/mem";
-@@ -55,7 +55,7 @@ static char *DEVMEM = "/dev/mem";
- */
- #define DISP_LINE_LEN 16
-
--int memory_display(char *addr, ulong offs, ulong nbytes, int size)
-+int memory_display(char *addr, loff_t offs, ulong nbytes, int size)
- {
- ulong linebytes, i;
- u_char *cp;
-@@ -72,7 +72,7 @@ int memory_display(char *addr, ulong offs, ulong nbytes, int size)
- u_char *ucp = (u_char *)linebuf;
- uint count = 52;
-
-- printf("%08lx:", offs);
-+ printf("%08llx:", offs);
- linebytes = (nbytes > DISP_LINE_LEN) ? DISP_LINE_LEN : nbytes;
-
- for (i = 0; i < linebytes; i += size) {
-@@ -108,7 +108,7 @@ int memory_display(char *addr, ulong offs, ulong nbytes, int size)
- return 0;
- }
-
--static int open_and_lseek(const char *filename, int mode, off_t pos)
-+static int open_and_lseek(const char *filename, int mode, loff_t pos)
- {
- int fd, ret;
-
-@@ -163,7 +163,7 @@ static int mem_parse_options(int argc, char *argv[], char *optstr, int *mode,
-
- static int do_mem_md(int argc, char *argv[])
- {
-- ulong start = 0, size = 0x100;
-+ loff_t start = 0, size = 0x100;
- int r, now;
- int ret = 0;
- int fd;
-@@ -180,6 +180,8 @@ static int do_mem_md(int argc, char *argv[])
- }
- if (size == ~0)
- size = 0x100;
-+ } else {
-+ return COMMAND_ERROR_USAGE;
- }
-
- fd = open_and_lseek(filename, mode | O_RDONLY, start);
-@@ -187,7 +189,7 @@ static int do_mem_md(int argc, char *argv[])
- return 1;
-
- do {
-- now = min(size, RW_BUF_SIZE);
-+ now = min(size, (loff_t)RW_BUF_SIZE);
- r = read(fd, rw_buf, now);
- if (r < 0) {
- perror("read");
-@@ -240,7 +242,7 @@ static int do_mem_mw(int argc, char *argv[])
- int fd;
- char *filename = DEVMEM;
- int mode = O_RWSIZE_4;
-- ulong adr;
-+ loff_t adr;
-
- if (mem_parse_options(argc, argv, "bwld:", &mode, NULL, &filename) < 0)
- return 1;
-@@ -248,7 +250,7 @@ static int do_mem_mw(int argc, char *argv[])
- if (optind + 1 >= argc)
- return COMMAND_ERROR_USAGE;
-
-- adr = strtoul_suffix(argv[optind++], NULL, 0);
-+ adr = strtoull_suffix(argv[optind++], NULL, 0);
-
- fd = open_and_lseek(filename, mode | O_WRONLY, adr);
- if (fd < 0)
-@@ -300,7 +302,7 @@ BAREBOX_CMD_END
-
- static int do_mem_cmp(int argc, char *argv[])
- {
-- ulong addr1, addr2, count = ~0;
-+ loff_t addr1, addr2, count = ~0;
- int mode = O_RWSIZE_1;
- char *sourcefile = DEVMEM;
- char *destfile = DEVMEM;
-@@ -316,8 +318,8 @@ static int do_mem_cmp(int argc, char *argv[])
- if (optind + 2 > argc)
- return COMMAND_ERROR_USAGE;
-
-- addr1 = strtoul_suffix(argv[optind], NULL, 0);
-- addr2 = strtoul_suffix(argv[optind + 1], NULL, 0);
-+ addr1 = strtoull_suffix(argv[optind], NULL, 0);
-+ addr2 = strtoull_suffix(argv[optind + 1], NULL, 0);
-
- if (optind + 2 == argc) {
- if (sourcefile == DEVMEM) {
-@@ -330,7 +332,7 @@ static int do_mem_cmp(int argc, char *argv[])
- }
- count = statbuf.st_size - addr1;
- } else {
-- count = strtoul_suffix(argv[optind + 2], NULL, 0);
-+ count = strtoull_suffix(argv[optind + 2], NULL, 0);
- }
-
- sourcefd = open_and_lseek(sourcefile, mode | O_RDONLY, addr1);
-@@ -348,7 +350,7 @@ static int do_mem_cmp(int argc, char *argv[])
- while (count > 0) {
- int now, r1, r2, i;
-
-- now = min(RW_BUF_SIZE, count);
-+ now = min((loff_t)RW_BUF_SIZE, count);
-
- r1 = read(sourcefd, rw_buf, now);
- if (r1 < 0) {
-@@ -409,8 +411,7 @@ BAREBOX_CMD_END
-
- static int do_mem_cp(int argc, char *argv[])
- {
-- ulong count;
-- ulong dest, src;
-+ loff_t count, dest, src;
- char *sourcefile = DEVMEM;
- char *destfile = DEVMEM;
- int sourcefd, destfd;
-@@ -424,8 +425,8 @@ static int do_mem_cp(int argc, char *argv[])
- if (optind + 2 > argc)
- return COMMAND_ERROR_USAGE;
-
-- src = strtoul_suffix(argv[optind], NULL, 0);
-- dest = strtoul_suffix(argv[optind + 1], NULL, 0);
-+ src = strtoull_suffix(argv[optind], NULL, 0);
-+ dest = strtoull_suffix(argv[optind + 1], NULL, 0);
-
- if (optind + 2 == argc) {
- if (sourcefile == DEVMEM) {
-@@ -438,7 +439,7 @@ static int do_mem_cp(int argc, char *argv[])
- }
- count = statbuf.st_size - src;
- } else {
-- count = strtoul_suffix(argv[optind + 2], NULL, 0);
-+ count = strtoull_suffix(argv[optind + 2], NULL, 0);
- }
-
- sourcefd = open_and_lseek(sourcefile, mode | O_RDONLY, src);
-@@ -454,7 +455,7 @@ static int do_mem_cp(int argc, char *argv[])
- while (count > 0) {
- int now, r, w, tmp;
-
-- now = min(RW_BUF_SIZE, count);
-+ now = min((loff_t)RW_BUF_SIZE, count);
-
- r = read(sourcefd, rw_buf, now);
- if (r < 0) {
-@@ -516,7 +517,7 @@ BAREBOX_CMD_END
-
- static int do_memset(int argc, char *argv[])
- {
-- ulong s, c, n;
-+ loff_t s, c, n;
- int fd;
- char *buf;
- int mode = O_RWSIZE_1;
-@@ -529,9 +530,9 @@ static int do_memset(int argc, char *argv[])
- if (optind + 3 > argc)
- return COMMAND_ERROR_USAGE;
-
-- s = strtoul_suffix(argv[optind], NULL, 0);
-- c = strtoul_suffix(argv[optind + 1], NULL, 0);
-- n = strtoul_suffix(argv[optind + 2], NULL, 0);
-+ s = strtoull_suffix(argv[optind], NULL, 0);
-+ c = strtoull_suffix(argv[optind + 1], NULL, 0);
-+ n = strtoull_suffix(argv[optind + 2], NULL, 0);
-
- fd = open_and_lseek(file, mode | O_WRONLY, s);
- if (fd < 0)
-@@ -543,7 +544,7 @@ static int do_memset(int argc, char *argv[])
- while (n > 0) {
- int now;
-
-- now = min(RW_BUF_SIZE, n);
-+ now = min((loff_t)RW_BUF_SIZE, n);
-
- ret = write(fd, buf, now);
- if (ret < 0) {
-@@ -594,7 +595,7 @@ static int mem_probe(struct device_d *dev)
- dev->priv = cdev;
-
- cdev->name = (char*)dev->resource[0].name;
-- cdev->size = (unsigned long)dev->resource[0].size;
-+ cdev->size = (unsigned long)resource_size(&dev->resource[0]);
- cdev->ops = &memops;
- cdev->dev = dev;
-
-@@ -623,32 +624,3 @@ static int mem_init(void)
- }
-
- device_initcall(mem_init);
--
--static ssize_t zero_read(struct cdev *cdev, void *buf, size_t count, ulong offset, ulong flags)
--{
-- memset(buf, 0, count);
-- return count;
--}
--
--static struct file_operations zeroops = {
-- .read = zero_read,
-- .lseek = dev_lseek_default,
--};
--
--static int zero_init(void)
--{
-- struct cdev *cdev;
--
-- cdev = xzalloc(sizeof (*cdev));
--
-- cdev->name = "zero";
-- cdev->size = ~0;
-- cdev->ops = &zeroops;
--
-- devfs_create(cdev);
--
-- return 0;
--}
--
--device_initcall(zero_init);
--
-diff --git a/commands/msleep.c b/commands/msleep.c
-new file mode 100644
-index 0000000..c9fa23c
---- /dev/null
-+++ b/commands/msleep.c
-@@ -0,0 +1,40 @@
-+/*
-+ * msleep.c - delay execution for n milliseconds
-+ *
-+ * Copyright (c) 2012 Steffen Trumtrar <s.trumtrar@pengutronix.de>, Pengutronix
-+ *
-+ * derived from commands/sleep.c
-+ *
-+ * 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.
-+ *
-+ * 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.
-+ *
-+ */
-+
-+#include <common.h>
-+#include <command.h>
-+#include <clock.h>
-+
-+static int do_msleep(int argc, char *argv[])
-+{
-+ ulong delay;
-+
-+ if (argc != 2)
-+ return COMMAND_ERROR_USAGE;
-+
-+ delay = simple_strtoul(argv[1], NULL, 10);
-+
-+ mdelay(delay);
-+
-+ return 0;
-+}
-+
-+BAREBOX_CMD_START(msleep)
-+ .cmd = do_msleep,
-+ .usage = "delay execution for n milliseconds",
-+BAREBOX_CMD_END
-diff --git a/commands/nand.c b/commands/nand.c
-index 34aa07b..6124dae 100644
---- a/commands/nand.c
-+++ b/commands/nand.c
-@@ -79,6 +79,7 @@ static int do_nand(int argc, char *argv[])
- if (command & NAND_MARKBAD) {
- if (optind < argc) {
- int ret = 0, fd;
-+ loff_t __badblock = badblock;
-
- printf("marking block at 0x%08x on %s as bad\n", badblock, argv[optind]);
-
-@@ -88,7 +89,7 @@ static int do_nand(int argc, char *argv[])
- return 1;
- }
-
-- ret = ioctl(fd, MEMSETBADBLOCK, (void *)badblock);
-+ ret = ioctl(fd, MEMSETBADBLOCK, &__badblock);
- if (ret)
- perror("ioctl");
-
-diff --git a/commands/nandtest.c b/commands/nandtest.c
-index d923e42..06b7f94 100644
---- a/commands/nandtest.c
-+++ b/commands/nandtest.c
-@@ -307,11 +307,11 @@ static int do_nandtest(int argc, char *argv[])
- for (test_ofs = flash_offset;
- test_ofs < flash_offset+length;
- test_ofs += meminfo.erasesize) {
--
-+ loff_t __test_ofs = test_ofs;
- srand(seed);
- seed = rand();
-
-- if (ioctl(fd, MEMGETBADBLOCK, (void *)test_ofs)) {
-+ if (ioctl(fd, MEMGETBADBLOCK, &__test_ofs)) {
- printf("\rBad block at 0x%08x\n",
- (unsigned)(test_ofs +
- memregion.offset));
-diff --git a/commands/net.c b/commands/net.c
-index a453f4e..e77f12f 100644
---- a/commands/net.c
-+++ b/commands/net.c
-@@ -36,35 +36,6 @@
- #include <errno.h>
- #include <libbb.h>
-
--#ifdef CONFIG_NET_RARP
--extern void RarpRequest(void);
--
--static int do_rarpb(int argc, char *argv[])
--{
-- int size;
--
-- if (NetLoopInit(RARP) < 0)
-- return 1;
--
-- NetOurIP = 0;
-- RarpRequest(); /* Basically same as BOOTP */
--
-- if ((size = NetLoop()) < 0)
-- return 1;
--
-- /* NetLoop ok, update environment */
-- netboot_update_env();
--
-- return 0;
--}
--
--BAREBOX_CMD_START(rarpboot)
-- .cmd = do_rarpb,
-- .usage = "boot image via network using rarp/tftp protocol",
-- BAREBOX_CMD_HELP("[loadAddress] [bootfilename]\n")
--BAREBOX_CMD_END
--#endif /* CONFIG_NET_RARP */
--
- static int do_ethact(int argc, char *argv[])
- {
- struct eth_device *edev;
-diff --git a/commands/poweroff.c b/commands/poweroff.c
-new file mode 100644
-index 0000000..ebb146c
---- /dev/null
-+++ b/commands/poweroff.c
-@@ -0,0 +1,37 @@
-+/*
-+ * poweroff.c - turn board's power off
-+ *
-+ * Copyright (C) 2011 Antony Pavlov <antonynpavlov@gmail.com>
-+ *
-+ * This file is part of barebox.
-+ * 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 version 2
-+ * as published by the Free Software Foundation.
-+ *
-+ * 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 <command.h>
-+
-+static int cmd_poweroff(int argc, char *argv[])
-+{
-+ poweroff();
-+
-+ /* Not reached */
-+ return 1;
-+}
-+
-+BAREBOX_CMD_START(poweroff)
-+ .cmd = cmd_poweroff,
-+ .usage = "Perform POWER OFF of the board",
-+BAREBOX_CMD_END
-diff --git a/commands/sleep.c b/commands/sleep.c
-index c5f7867..950ec08 100644
---- a/commands/sleep.c
-+++ b/commands/sleep.c
-@@ -47,5 +47,5 @@ static int do_sleep(int argc, char *argv[])
- BAREBOX_CMD_START(sleep)
- .cmd = do_sleep,
- .usage = "delay execution for n seconds",
-- BAREBOX_CMD_COMPLETE(cammand_var_complete)
-+ BAREBOX_CMD_COMPLETE(command_var_complete)
- BAREBOX_CMD_END
-diff --git a/commands/stddev.c b/commands/stddev.c
-new file mode 100644
-index 0000000..098aea8
---- /dev/null
-+++ b/commands/stddev.c
-@@ -0,0 +1,106 @@
-+/*
-+ * Copyright (c) 2011 Sascha Hauer <s.hauer@pengutronix.de>, Pengutronix
-+ *
-+ * 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 version 2
-+ * as published by the Free Software Foundation.
-+ *
-+ * 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
-+ * MA 02111-1307 USA
-+ */
-+
-+#include <common.h>
-+#include <init.h>
-+
-+static ssize_t zero_read(struct cdev *cdev, void *buf, size_t count, loff_t offset, ulong flags)
-+{
-+ memset(buf, 0, count);
-+ return count;
-+}
-+
-+static struct file_operations zeroops = {
-+ .read = zero_read,
-+ .lseek = dev_lseek_default,
-+};
-+
-+static int zero_init(void)
-+{
-+ struct cdev *cdev;
-+
-+ cdev = xzalloc(sizeof (*cdev));
-+
-+ cdev->name = "zero";
-+ cdev->flags = DEVFS_IS_CHARACTER_DEV;
-+ cdev->ops = &zeroops;
-+
-+ devfs_create(cdev);
-+
-+ return 0;
-+}
-+
-+device_initcall(zero_init);
-+
-+static ssize_t full_read(struct cdev *cdev, void *buf, size_t count, loff_t offset, ulong flags)
-+{
-+ memset(buf, 0xff, count);
-+ return count;
-+}
-+
-+static struct file_operations fullops = {
-+ .read = full_read,
-+ .lseek = dev_lseek_default,
-+};
-+
-+static int full_init(void)
-+{
-+ struct cdev *cdev;
-+
-+ cdev = xzalloc(sizeof (*cdev));
-+
-+ cdev->name = "full";
-+ cdev->flags = DEVFS_IS_CHARACTER_DEV;
-+ cdev->ops = &fullops;
-+
-+ devfs_create(cdev);
-+
-+ return 0;
-+}
-+
-+device_initcall(full_init);
-+
-+static ssize_t null_write(struct cdev *cdev, const void *buf, size_t count, loff_t offset, ulong flags)
-+{
-+ return count;
-+}
-+
-+static struct file_operations nullops = {
-+ .write = null_write,
-+ .lseek = dev_lseek_default,
-+};
-+
-+static int null_init(void)
-+{
-+ struct cdev *cdev;
-+
-+ cdev = xzalloc(sizeof (*cdev));
-+
-+ cdev->name = "null";
-+ cdev->flags = DEVFS_IS_CHARACTER_DEV;
-+ cdev->ops = &nullops;
-+
-+ devfs_create(cdev);
-+
-+ return 0;
-+}
-+
-+device_initcall(null_init);
-diff --git a/commands/wd.c b/commands/wd.c
-new file mode 100644
-index 0000000..080bab9
---- /dev/null
-+++ b/commands/wd.c
-@@ -0,0 +1,68 @@
-+/*
-+ * (c) 2012 Juergen Beisert <kernel@pengutronix.de>
-+ *
-+ * 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.
-+ */
-+
-+#include <common.h>
-+#include <command.h>
-+#include <errno.h>
-+#include <linux/ctype.h>
-+#include <watchdog.h>
-+
-+/* default timeout in [sec] */
-+static unsigned timeout = CONFIG_CMD_WD_DEFAULT_TIMOUT;
-+
-+static int do_wd(int argc, char *argv[])
-+{
-+ int rc;
-+
-+ if (argc > 1) {
-+ if (isdigit(*argv[1])) {
-+ timeout = simple_strtoul(argv[1], NULL, 0);
-+ } else {
-+ printf("numerical parameter expected\n");
-+ return 1;
-+ }
-+ }
-+
-+ rc = watchdog_set_timeout(timeout);
-+ if (rc < 0) {
-+ switch (rc) {
-+ case -EINVAL:
-+ printf("Timeout value out of range\n");
-+ break;
-+ case -ENOSYS:
-+ printf("Watchdog cannot be disabled\n");
-+ break;
-+ default:
-+ printf("Watchdog fails: '%s'\n", strerror(-rc));
-+ break;
-+ }
-+
-+ return 1;
-+ }
-+
-+ return 0;
-+}
-+
-+BAREBOX_CMD_HELP_START(wd)
-+BAREBOX_CMD_HELP_USAGE("wd [<time>]\n")
-+BAREBOX_CMD_HELP_SHORT("enable the watchdog to bark in <time> seconds. "
-+ "When <time> is 0, the watchdog gets disabled,\n"
-+ "without a parameter the watchdog will be re-triggered\n")
-+BAREBOX_CMD_HELP_END
-+
-+BAREBOX_CMD_START(wd)
-+ .cmd = do_wd,
-+ .usage = "enable/disable/trigger the watchdog",
-+ BAREBOX_CMD_HELP(cmd_wd_help)
-+BAREBOX_CMD_END
-diff --git a/common/block.c b/common/block.c
-index 71ecfd5..7ad5ecc 100644
---- a/common/block.c
-+++ b/common/block.c
-@@ -24,6 +24,7 @@
- #include <malloc.h>
- #include <linux/err.h>
- #include <linux/list.h>
-+#include <dma.h>
-
- #define BLOCKSIZE(blk) (1 << blk->blockbits)
-
-@@ -179,7 +180,7 @@ static void *block_get(struct block_device *blk, int block)
- }
-
- static ssize_t block_read(struct cdev *cdev, void *buf, size_t count,
-- unsigned long offset, unsigned long flags)
-+ loff_t offset, unsigned long flags)
- {
- struct block_device *blk = cdev->priv;
- unsigned long mask = BLOCKSIZE(blk) - 1;
-@@ -256,7 +257,7 @@ static int block_put(struct block_device *blk, const void *buf, int block)
- }
-
- static ssize_t block_write(struct cdev *cdev, const void *buf, size_t count,
-- unsigned long offset, ulong flags)
-+ loff_t offset, ulong flags)
- {
- struct block_device *blk = cdev->priv;
- unsigned long mask = BLOCKSIZE(blk) - 1;
-@@ -338,7 +339,7 @@ static struct file_operations block_ops = {
-
- int blockdevice_register(struct block_device *blk)
- {
-- size_t size = blk->num_blocks * BLOCKSIZE(blk);
-+ loff_t size = (loff_t)blk->num_blocks * BLOCKSIZE(blk);
- int ret;
- int i;
-
-@@ -357,7 +358,7 @@ int blockdevice_register(struct block_device *blk)
-
- for (i = 0; i < 8; i++) {
- struct chunk *chunk = xzalloc(sizeof(*chunk));
-- chunk->data = xmalloc(BUFSIZE);
-+ chunk->data = dma_alloc(BUFSIZE);
- chunk->num = i;
- list_add_tail(&chunk->list, &blk->idle_blocks);
- }
-@@ -376,12 +377,12 @@ int blockdevice_unregister(struct block_device *blk)
- writebuffer_flush(blk);
-
- list_for_each_entry_safe(chunk, tmp, &blk->buffered_blocks, list) {
-- free(chunk->data);
-+ dma_free(chunk->data);
- free(chunk);
- }
-
- list_for_each_entry_safe(chunk, tmp, &blk->idle_blocks, list) {
-- free(chunk->data);
-+ dma_free(chunk->data);
- free(chunk);
- }
-
-diff --git a/common/complete.c b/common/complete.c
-index 0780888..a8bde8d 100644
---- a/common/complete.c
-+++ b/common/complete.c
-@@ -198,7 +198,7 @@ int empty_complete(struct string_list *sl, char *instr)
- return COMPLETE_END;
- }
-
--int cammand_var_complete(struct string_list *sl, char *instr)
-+int command_var_complete(struct string_list *sl, char *instr)
- {
- return COMPLETE_CONTINUE;
- }
-@@ -221,7 +221,7 @@ static int env_param_complete(struct string_list *sl, char *instr, int eval)
- end = ' ';
- }
-
-- instr_param = strrchr(instr, '.');
-+ instr_param = strchr(instr, '.');
- len = strlen(instr);
-
- current_c = get_current_context();
-diff --git a/common/filetype.c b/common/filetype.c
-index 39c2098..1a5b82d 100644
---- a/common/filetype.c
-+++ b/common/filetype.c
-@@ -39,6 +39,7 @@ static const char *filetype_str[] = {
- [filetype_oftree] = "open firmware flat device tree",
- [filetype_aimage] = "Android boot image",
- [filetype_sh] = "Bourne Shell",
-+ [filetype_mips_barebox] = "MIPS barebox image",
- };
-
- const char *file_type_to_string(enum filetype f)
-diff --git a/common/memory.c b/common/memory.c
-index 3b4a5ef..f04cfac 100644
---- a/common/memory.c
-+++ b/common/memory.c
-@@ -122,7 +122,7 @@ void barebox_add_memory_bank(const char *name, resource_size_t start,
- struct memory_bank *bank = xzalloc(sizeof(*bank));
- struct device_d *dev;
-
-- bank->res = request_iomem_region(name, start, size);
-+ bank->res = request_iomem_region(name, start, start + size - 1);
-
- BUG_ON(!bank->res);
-
-@@ -146,7 +146,7 @@ struct resource *request_sdram_region(const char *name, resource_size_t start,
- for_each_memory_bank(bank) {
- struct resource *res;
-
-- res = request_region(bank->res, name, start, size);
-+ res = request_region(bank->res, name, start, start + size - 1);
- if (res)
- return res;
- }
-diff --git a/common/menu.c b/common/menu.c
-index 6c530b6..9f536d6 100644
---- a/common/menu.c
-+++ b/common/menu.c
-@@ -53,7 +53,6 @@ void menu_free(struct menu *m)
- free(m->name);
- free(m->display);
- free(m->auto_display);
-- free(m->display_buffer);
-
- list_for_each_entry_safe(me, tmp, &m->entries, list)
- menu_entry_free(me);
-@@ -87,15 +86,9 @@ EXPORT_SYMBOL(menu_remove);
-
- int menu_add_entry(struct menu *m, struct menu_entry *me)
- {
-- int len;
--
- if (!m || !me || !me->display)
- return -EINVAL;
-
-- len = strlen(me->display);
--
-- m->width = max(len, m->width);
--
- m->nb_entries++;
- me->num = m->nb_entries;
- list_add_tail(&me->list, &m->entries);
-@@ -160,6 +153,18 @@ void menu_entry_free(struct menu_entry *me)
- }
- EXPORT_SYMBOL(menu_entry_free);
-
-+static void __print_entry(const char *str)
-+{
-+ static char outstr[256];
-+
-+ if (IS_ENABLED(CONFIG_SHELL_HUSH)) {
-+ process_escape_sequence(str, outstr, 256);
-+ puts(outstr);
-+ } else {
-+ puts(str);
-+ }
-+}
-+
- static void print_menu_entry(struct menu *m, struct menu_entry *me,
- int selected)
- {
-@@ -174,17 +179,11 @@ static void print_menu_entry(struct menu *m, struct menu_entry *me,
- puts(" ");
- }
-
-- if (IS_ENABLED(CONFIG_SHELL_HUSH))
-- process_escape_sequence(me->display, m->display_buffer,
-- m->display_buffer_size);
--
- printf(" %d: ", me->num);
- if (selected)
- puts("\e[7m");
-- if (IS_ENABLED(CONFIG_SHELL_HUSH))
-- puts(m->display_buffer);
-- else
-- puts(me->display);
-+
-+ __print_entry(me->display);
-
- if (selected)
- puts("\e[m");
-@@ -241,13 +240,7 @@ static void print_menu(struct menu *m)
- clear();
- gotoXY(1, 2);
- if(m->display) {
-- if (IS_ENABLED(CONFIG_SHELL_HUSH)) {
-- process_escape_sequence(m->display, m->display_buffer,
-- m->display_buffer_size);
-- puts(m->display_buffer);
-- } else {
-- puts(m->display);
-- }
-+ __print_entry(m->display);
- } else {
- puts("Menu : ");
- puts(m->name);
-@@ -266,50 +259,16 @@ static void print_menu(struct menu *m)
- print_menu_entry(m, m->selected, 1);
- }
-
--static int menu_alloc_display_buffer(struct menu *m)
--{
-- int min_size;
--
-- if (m->display)
-- min_size = max((int)strlen(m->display), m->width);
-- else
-- min_size = m->width;
--
--
-- if (m->display_buffer) {
-- if (m->display_buffer_size >= min_size)
-- return 0;
-- m->display_buffer = realloc(m->display_buffer, min_size * sizeof(char));
-- } else {
-- m->display_buffer = calloc(min_size, sizeof(char));
-- }
--
-- if (!m->display_buffer) {
-- perror("display_buffer");
-- return -ENOMEM;
-- }
--
-- m->display_buffer_size = min_size;
--
-- return 0;
--}
--
- int menu_show(struct menu *m)
- {
- int ch, ch_previous = 0;
-- int escape = 0;
- int countdown;
- int auto_display_len = 16;
- uint64_t start, second;
-- int ret;
-
- if(!m || list_empty(&m->entries))
- return -EINVAL;
-
-- ret = menu_alloc_display_buffer(m);
-- if (ret)
-- return ret;
--
- print_menu(m);
-
- countdown = m->auto_select;
-@@ -344,41 +303,34 @@ int menu_show(struct menu *m)
- gotoXY(m->selected->num + 1, 3);
-
- do {
-+ struct menu_entry *old_selected = m->selected;
-+ int repaint = 0;
-+
- if (m->auto_select >= 0)
- ch = KEY_RETURN;
- else
-- ch = getc();
-+ ch = read_key();
-
- m->auto_select = -1;
-
-- switch(ch) {
-- case 0x1b:
-- escape = 1;
-- break;
-- case '[':
-- if (escape)
-- break;
-- case 'A': /* up */
-- escape = 0;
-- print_menu_entry(m, m->selected, 0);
-+ switch (ch) {
-+ case KEY_UP:
- m->selected = list_entry(m->selected->list.prev, struct menu_entry,
- list);
- if (&(m->selected->list) == &(m->entries)) {
- m->selected = list_entry(m->selected->list.prev, struct menu_entry,
- list);
- }
-- print_menu_entry(m, m->selected, 1);
-+ repaint = 1;
- break;
-- case 'B': /* down */
-- escape = 0;
-- print_menu_entry(m, m->selected, 0);
-+ case KEY_DOWN:
- m->selected = list_entry(m->selected->list.next, struct menu_entry,
- list);
- if (&(m->selected->list) == &(m->entries)) {
- m->selected = list_entry(m->selected->list.next, struct menu_entry,
- list);
- }
-- print_menu_entry(m, m->selected, 1);
-+ repaint = 1;
- break;
- case ' ':
- if (m->selected->type != MENU_ENTRY_BOX)
-@@ -386,7 +338,7 @@ int menu_show(struct menu *m)
- m->selected->box_state = !m->selected->box_state;
- if (m->selected->action)
- m->selected->action(m, m->selected);
-- print_menu_entry(m, m->selected, 1);
-+ repaint = 1;
- break;
- case KEY_ENTER:
- if (ch_previous == KEY_RETURN)
-@@ -401,9 +353,24 @@ int menu_show(struct menu *m)
- return m->selected->num;
- else
- print_menu(m);
-+ break;
-+ case KEY_HOME:
-+ m->selected = list_first_entry(&m->entries, struct menu_entry, list);
-+ repaint = 1;
-+ break;
-+ case KEY_END:
-+ m->selected = list_last_entry(&m->entries, struct menu_entry, list);
-+ repaint = 1;
-+ break;
- default:
- break;
- }
-+
-+ if (repaint) {
-+ print_menu_entry(m, old_selected, 0);
-+ print_menu_entry(m, m->selected, 1);
-+ }
-+
- ch_previous = ch;
- } while(1);
-
-diff --git a/common/oftree.c b/common/oftree.c
-index 49758a9..677e934 100644
---- a/common/oftree.c
-+++ b/common/oftree.c
-@@ -207,7 +207,7 @@ int fdt_find_and_setprop(struct fdt_header *fdt, const char *node,
- if (nodeoff < 0)
- return nodeoff;
-
-- if ((!create) && (fdt_get_property(fdt, nodeoff, prop, 0) == NULL))
-+ if ((!create) && (fdt_get_property(fdt, nodeoff, prop, NULL) == NULL))
- return 0; /* create flag not set; so exit quietly */
-
- return fdt_setprop(fdt, nodeoff, prop, val, len);
-diff --git a/common/partitions.c b/common/partitions.c
-index 74b4f12..78b09fc 100644
---- a/common/partitions.c
-+++ b/common/partitions.c
-@@ -31,6 +31,7 @@
- #include <block.h>
- #include <asm/unaligned.h>
- #include <disks.h>
-+#include <dma.h>
-
- struct partition {
- uint64_t first_sec;
-@@ -43,23 +44,6 @@ struct partition_desc {
- };
-
- /**
-- * Reject values which cannot be used in Barebox
-- * @param val Value to be check
-- * @return 0 if value can be used in Barebox, -EINVAL if not
-- *
-- * @note this routine can be removed when Barebox uses file offsets larger
-- * than 32 bit
-- */
--static int check_offset_value(uint64_t val)
--{
--#if 1 /* until Barebox can handle 64 bit offsets */
-- if (val > (__INT_MAX__ / SECTOR_SIZE))
-- return -EINVAL;
--#endif
-- return 0;
--}
--
--/**
- * Guess the size of the disk, based on the partition table entries
- * @param dev device to create partitions for
- * @param table partition table
-@@ -76,12 +60,6 @@ static int disk_guess_size(struct device_d *dev, struct partition_entry *table)
- size += get_unaligned(&table[i].partition_size);
- }
- }
-- /* limit disk sector counts we can't handle due to 32 bit limits */
-- if (check_offset_value(size) != 0) {
-- dev_warn(dev, "Warning: Sector count limited due to 31 bit"
-- "contraints\n");
-- size = __INT_MAX__ / SECTOR_SIZE;
-- }
-
- return (int)size;
- }
-@@ -102,7 +80,7 @@ static void __maybe_unused try_dos_partition(struct block_device *blk,
- struct partition pentry;
- int i, rc;
-
-- buffer = xmalloc(SECTOR_SIZE);
-+ buffer = dma_alloc(SECTOR_SIZE);
-
- /* read in the MBR to get the partition table */
- rc = blk->ops->read(blk, buffer, 0, 1);
-@@ -119,19 +97,13 @@ static void __maybe_unused try_dos_partition(struct block_device *blk,
- table = (struct partition_entry *)&buffer[446];
-
- /* valid for x86 BIOS based disks only */
-- if (blk->num_blocks == 0)
-+ if (IS_ENABLED(CONFIG_DISK_BIOS) && blk->num_blocks == 0)
- blk->num_blocks = disk_guess_size(blk->dev, table);
-
- for (i = 0; i < 4; i++) {
- pentry.first_sec = get_unaligned(&table[i].partition_start);
- pentry.size = get_unaligned(&table[i].partition_size);
-
-- /* do we have to ignore this partition due to limitations? */
-- if (check_offset_value(pentry.first_sec) != 0)
-- continue;
-- if (check_offset_value(pentry.size) != 0)
-- continue;
--
- if (pentry.first_sec != 0) {
- pd->parts[pd->used_entries].first_sec = pentry.first_sec;
- pd->parts[pd->used_entries].size = pentry.size;
-@@ -142,7 +114,7 @@ static void __maybe_unused try_dos_partition(struct block_device *blk,
- }
-
- on_error:
-- free(buffer);
-+ dma_free(buffer);
- }
-
- /**
-diff --git a/common/resource.c b/common/resource.c
-index 63e9c49..ce5aa27 100644
---- a/common/resource.c
-+++ b/common/resource.c
-@@ -42,16 +42,20 @@ static int init_resource(struct resource *res, const char *name)
- */
- struct resource *request_region(struct resource *parent,
- const char *name, resource_size_t start,
-- resource_size_t size)
-+ resource_size_t end)
- {
- struct resource *r, *new;
-
-+ if (end < start) {
-+ debug("%s: request region 0x%08x:0x%08x: end < start\n",
-+ __func__, start, end);
-+ return NULL;
-+ }
-+
- /* outside parent resource? */
-- if (start < parent->start ||
-- start + size > parent->start + parent->size) {
-+ if (start < parent->start || end > parent->end) {
- debug("%s: 0x%08x:0x%08x outside parent resource 0x%08x:0x%08x\n",
-- __func__, start, size, parent->start,
-- parent->size);
-+ __func__, start, end, parent->start, parent->end);
- return NULL;
- }
-
-@@ -60,22 +64,22 @@ struct resource *request_region(struct resource *parent,
- * us searching for conflicts here.
- */
- list_for_each_entry(r, &parent->children, sibling) {
-- if (start + size <= r->start)
-+ if (end < r->start)
- goto ok;
-- if (start >= r->start + r->size)
-+ if (start > r->end)
- continue;
- debug("%s: 0x%08x:0x%08x conflicts with 0x%08x:0x%08x\n",
-- __func__, start, size, r->start, r->size);
-+ __func__, start, end, r->start, r->end);
- return NULL;
- }
-
- ok:
-- debug("%s ok: 0x%08x 0x%08x\n", __func__, start, size);
-+ debug("%s ok: 0x%08x:0x%08x\n", __func__, start, end);
-
- new = xzalloc(sizeof(*new));
- init_resource(new, name);
- new->start = start;
-- new->size = size;
-+ new->end = end;
- new->parent = parent;
- list_add_tail(&new->sibling, &r->sibling);
-
-@@ -100,16 +104,16 @@ int release_region(struct resource *res)
- /* The root resource for the whole io space */
- struct resource iomem_resource = {
- .start = 0,
-- .size = ~0,
-+ .end = 0xffffffff,
- };
-
- /*
- * request a region inside the io space
- */
- struct resource *request_iomem_region(const char *name,
-- resource_size_t start, resource_size_t size)
-+ resource_size_t start, resource_size_t end)
- {
-- return request_region(&iomem_resource, name, start, size);
-+ return request_region(&iomem_resource, name, start, end);
- }
-
- static int iomem_init(void)
-diff --git a/common/tlsf.c b/common/tlsf.c
-index c810e8d..9515ac7 100644
---- a/common/tlsf.c
-+++ b/common/tlsf.c
-@@ -367,7 +367,7 @@ static block_header_t* search_suitable_block(pool_t* pool, int* fli, int* sli)
- if (!fl_map)
- {
- /* No free blocks available, memory has been exhausted. */
-- return 0;
-+ return NULL;
- }
-
- fl = tlsf_ffs(fl_map);
-@@ -563,7 +563,7 @@ static block_header_t* block_trim_free_leading(pool_t* pool, block_header_t* blo
- static block_header_t* block_locate_free(pool_t* pool, size_t size)
- {
- int fl = 0, sl = 0;
-- block_header_t* block = 0;
-+ block_header_t* block = NULL;
-
- if (size)
- {
-@@ -582,7 +582,7 @@ static block_header_t* block_locate_free(pool_t* pool, size_t size)
-
- static void* block_prepare_used(pool_t* pool, block_header_t* block, size_t size)
- {
-- void* p = 0;
-+ void* p = NULL;
- if (block)
- {
- block_trim_free(pool, block, size);
-@@ -737,7 +737,7 @@ size_t tlsf_block_size(void* ptr)
- ** tlsf_create, equal to the size of a pool_t plus overhead of the initial
- ** free block and the sentinel block.
- */
--size_t tlsf_overhead()
-+size_t tlsf_overhead(void)
- {
- const size_t pool_overhead = sizeof(pool_t) + 2 * block_header_overhead;
- return pool_overhead;
-@@ -790,7 +790,7 @@ tlsf_pool tlsf_create(void* mem, size_t bytes)
- (unsigned int)(pool_overhead + block_size_min),
- (unsigned int)(pool_overhead + block_size_max));
- #endif
-- return 0;
-+ return NULL;
- }
-
- /* Construct a valid pool object. */
-@@ -915,7 +915,7 @@ void tlsf_free(tlsf_pool tlsf, void* ptr)
- void* tlsf_realloc(tlsf_pool tlsf, void* ptr, size_t size)
- {
- pool_t* pool = tlsf_cast(pool_t*, tlsf);
-- void* p = 0;
-+ void* p = NULL;
-
- /* Zero-size requests are treated as free. */
- if (ptr && size == 0)
-diff --git a/common/uimage.c b/common/uimage.c
-index 945f3d6..43878b5 100644
---- a/common/uimage.c
-+++ b/common/uimage.c
-@@ -354,9 +354,9 @@ static struct resource *uimage_resource;
-
- static int uimage_sdram_flush(void *buf, unsigned int len)
- {
-- if (uimage_size + len > uimage_resource->size) {
-- resource_size_t start = uimage_resource->start;
-- resource_size_t size = uimage_resource->size + len;
-+ if (uimage_size + len > resource_size(uimage_resource)) {
-+ resource_size_t start = resource_size(uimage_resource);
-+ resource_size_t size = resource_size(uimage_resource) + len;
- release_sdram_region(uimage_resource);
-
- uimage_resource = request_sdram_region("uimage",
-diff --git a/defaultenv-2/base/bin/ifup b/defaultenv-2/base/bin/ifup
-index 9f6fd6b..37b986c 100644
---- a/defaultenv-2/base/bin/ifup
-+++ b/defaultenv-2/base/bin/ifup
-@@ -51,9 +51,17 @@ if [ "$ip" = static ]; then
- ${interface}.netmask=$netmask
- ${interface}.serverip=$serverip
- ${interface}.gateway=$gateway
-+ ret=0
- elif [ "$ip" = dhcp ]; then
- dhcp
-- exit $?
-+ ret=$?
-+ if [ $ret = 0 -a -n "$serverip" ]; then
-+ ${interface}.serverip=$serverip
-+ fi
-+fi
-+
-+if [ $ret = 0 ]; then
-+ echo -o /tmp/network/$interface up
- fi
-
--echo -o /tmp/network/$interface up
-+exit $ret
-diff --git a/defaultenv-2/base/bin/init b/defaultenv-2/base/bin/init
-index e293c62..9d7eb2e 100644
---- a/defaultenv-2/base/bin/init
-+++ b/defaultenv-2/base/bin/init
-@@ -4,8 +4,6 @@ export PATH=/env/bin
-
- global hostname=generic
- global user=none
--global tftp.server
--global tftp.path=/mnt/tftp-dhcp
- global autoboot_timeout=3
- global boot.default=net
- global allow_color=true
-diff --git a/defaultenv-2/base/boot/initrd b/defaultenv-2/base/boot/initrd
-index 1a1e629..79a353a 100644
---- a/defaultenv-2/base/boot/initrd
-+++ b/defaultenv-2/base/boot/initrd
-@@ -5,8 +5,9 @@ if [ "$1" = menu ]; then
- exit
- fi
-
--global.bootm.image="${global.tftp.path}/${global.user}-linux-${global.hostname}"
--global.bootm.initrd="${global.tftp.path}/initramfs"
-+path="/mnt/tftp"
-+global.bootm.image="${path}/${global.user}-linux-${global.hostname}"
-+global.bootm.initrd="${path}/initramfs"
- bootargs-root-initrd
- #global.bootm.oftree=<path to oftree>
-
-diff --git a/defaultenv-2/base/boot/net b/defaultenv-2/base/boot/net
-index 2684c20..922bef1 100644
---- a/defaultenv-2/base/boot/net
-+++ b/defaultenv-2/base/boot/net
-@@ -5,8 +5,10 @@ if [ "$1" = menu ]; then
- exit
- fi
-
--global.bootm.image="${global.tftp.path}/${global.user}-linux-${global.hostname}"
--#global.bootm.oftree="${global.tftp.path}/${global.user}-oftree-${global.hostname}"
-+path="/mnt/tftp"
-+
-+global.bootm.image="${path}/${global.user}-linux-${global.hostname}"
-+#global.bootm.oftree="${path}/${global.user}-oftree-${global.hostname}"
- nfsroot="/home/${global.user}/nfsroot/${global.hostname}"
- bootargs-ip
- bootargs-root-nfs -n "$nfsroot"
-diff --git a/defaultenv-2/base/init/automount b/defaultenv-2/base/init/automount
-index 63099f9..7b53309 100644
---- a/defaultenv-2/base/init/automount
-+++ b/defaultenv-2/base/init/automount
-@@ -5,10 +5,10 @@ if [ "$1" = menu ]; then
- exit
- fi
-
--# automount server returned from dhcp server
-+# automount tftp server based on $eth0.serverip
-
--mkdir -p /mnt/tftp-dhcp
--automount /mnt/tftp-dhcp 'ifup eth0 && mount $eth0.serverip tftp /mnt/tftp-dhcp'
-+mkdir -p /mnt/tftp
-+automount /mnt/tftp 'ifup eth0 && mount $eth0.serverip tftp /mnt/tftp'
-
- # automount nfs server example
-
-@@ -16,11 +16,6 @@ automount /mnt/tftp-dhcp 'ifup eth0 && mount $eth0.serverip tftp /mnt/tftp-dhcp'
- #mkdir -p /mnt/${nfshost}
- #automount /mnt/$nfshost "ifup eth0 && mount ${nfshost}:/tftpboot nfs /mnt/${nfshost}"
-
--# static tftp server example
--
--#mkdir -p /mnt/tftp
--#automount -d /mnt/tftp 'ifup eth0 && mount $serverip tftp /mnt/tftp'
--
- # FAT on usb disk example
-
- #mkdir -p /mnt/fat
-diff --git a/defaultenv-2/base/init/general b/defaultenv-2/base/init/general
-index ad6c860..98a92d1 100644
---- a/defaultenv-2/base/init/general
-+++ b/defaultenv-2/base/init/general
-@@ -13,6 +13,3 @@ global.autoboot_timeout=3
-
- # default boot entry (one of /env/boot/*)
- global.boot.default=net
--
--# default tftp path
--global.tftp.path=/mnt/tftp-dhcp
-diff --git a/defaultenv/bin/init b/defaultenv/bin/init
-index 6e85a82..f535e37 100644
---- a/defaultenv/bin/init
-+++ b/defaultenv/bin/init
-@@ -23,7 +23,7 @@ fi
-
- if [ -f /env/bin/boot_board ]; then
- . /env/bin/boot_board
--else
-+elif [ -n $autoboot_timeout ]; then
- echo
- echo -n "Hit any key to stop autoboot: "
- timeout -a $autoboot_timeout
-diff --git a/drivers/Kconfig b/drivers/Kconfig
-index c52c56a..883b0e7 100644
---- a/drivers/Kconfig
-+++ b/drivers/Kconfig
-@@ -15,7 +15,8 @@ source "drivers/mfd/Kconfig"
- source "drivers/led/Kconfig"
- source "drivers/eeprom/Kconfig"
- source "drivers/input/Kconfig"
--
-+source "drivers/watchdog/Kconfig"
- source "drivers/pwm/Kconfig"
-+source "drivers/dma/Kconfig"
-
- endmenu
-diff --git a/drivers/Makefile b/drivers/Makefile
-index 3aefc12..ea3263f 100644
---- a/drivers/Makefile
-+++ b/drivers/Makefile
-@@ -15,3 +15,5 @@ obj-$(CONFIG_LED) += led/
- obj-y += eeprom/
- obj-$(CONFIG_PWM) += pwm/
- obj-y += input/
-+obj-y += dma/
-+obj-y += watchdog/
-diff --git a/drivers/ata/disk_ata_drive.c b/drivers/ata/disk_ata_drive.c
-index 4602af3..d5c5837 100644
---- a/drivers/ata/disk_ata_drive.c
-+++ b/drivers/ata/disk_ata_drive.c
-@@ -231,7 +231,7 @@ static void __maybe_unused ata_dump_id(uint16_t *id)
- */
- static void ata_fix_endianess(uint16_t *buf, unsigned wds)
- {
--#if __BYTE_ORDER == __BIG_ENDIAN
-+#ifdef __BIG_ENDIAN
- unsigned u;
-
- for (u = 0; u < wds; u++)
-diff --git a/drivers/base/driver.c b/drivers/base/driver.c
-index 81cedca..6cd4286 100644
---- a/drivers/base/driver.c
-+++ b/drivers/base/driver.c
-@@ -241,15 +241,15 @@ static struct resource *dev_get_resource(struct device_d *dev, int num)
- return NULL;
- }
-
--void __iomem *dev_get_mem_region(struct device_d *dev, int num)
-+void *dev_get_mem_region(struct device_d *dev, int num)
- {
- struct resource *res;
-
- res = dev_get_resource(dev, num);
- if (!res)
-- return res;
-+ return NULL;
-
-- return (void __force __iomem *)res->start;
-+ return (void __force *)res->start;
- }
- EXPORT_SYMBOL(dev_get_mem_region);
-
-@@ -261,7 +261,7 @@ void __iomem *dev_request_mem_region(struct device_d *dev, int num)
- if (!res)
- return NULL;
-
-- res = request_iomem_region(dev_name(dev), res->start, res->size);
-+ res = request_iomem_region(dev_name(dev), res->start, res->end);
- if (!res)
- return NULL;
-
-@@ -339,7 +339,7 @@ static int do_devinfo_subtree(struct device_d *dev, int depth)
- list_for_each_entry(cdev, &dev->cdevs, devices_list) {
- for (i = 0; i < depth + 1; i++)
- printf(" ");
-- printf("`---- 0x%08lx-0x%08lx: /dev/%s\n",
-+ printf("`---- 0x%08llx-0x%08llx: /dev/%s\n",
- cdev->offset,
- cdev->offset + cdev->size - 1,
- cdev->name);
-@@ -392,7 +392,7 @@ static int do_devinfo(int argc, char *argv[])
- printf("name : %s\n", res->name);
- printf("start : " PRINTF_CONVERSION_RESOURCE "\nsize : "
- PRINTF_CONVERSION_RESOURCE "\n",
-- res->start, res->size);
-+ res->start, resource_size(res));
- }
-
- printf("driver: %s\n\n", dev->driver ?
-diff --git a/drivers/base/resource.c b/drivers/base/resource.c
-index 9844d1a..988d27e 100644
---- a/drivers/base/resource.c
-+++ b/drivers/base/resource.c
-@@ -47,7 +47,7 @@ struct device_d *add_generic_device(const char* devname, int id, const char *res
- if (resname)
- res[0].name = xstrdup(resname);
- res[0].start = start;
-- res[0].size = size;
-+ res[0].end = start + size - 1;
- res[0].flags = flags;
-
- return add_generic_device_res(devname, id, res, 1, pdata);
-@@ -94,10 +94,10 @@ struct device_d *add_dm9000_device(int id, resource_size_t base,
- }
-
- res[0].start = base;
-- res[0].size = size;
-+ res[0].end = base + size - 1;
- res[0].flags = IORESOURCE_MEM | flags;
- res[1].start = data;
-- res[1].size = size;
-+ res[1].end = data + size - 1;
- res[1].flags = IORESOURCE_MEM | flags;
-
- return add_generic_device_res("dm9000", id, res, 2, pdata);
-@@ -113,10 +113,10 @@ struct device_d *add_usb_ehci_device(int id, resource_size_t hccr,
-
- res = xzalloc(sizeof(struct resource) * 2);
- res[0].start = hccr;
-- res[0].size = 0x10;
-+ res[0].end = hccr + 0x10 - 1;
- res[0].flags = IORESOURCE_MEM;
- res[1].start = hcor;
-- res[1].size = 0xc0;
-+ res[1].end = hcor + 0xc0 - 1;
- res[1].flags = IORESOURCE_MEM;
-
- return add_generic_device_res("ehci", id, res, 2, pdata);
-@@ -146,10 +146,10 @@ struct device_d *add_ks8851_device(int id, resource_size_t addr,
- res = xzalloc(sizeof(struct resource) * 2);
-
- res[0].start = addr;
-- res[0].size = size;
-+ res[0].end = addr + size - 1;
- res[0].flags = IORESOURCE_MEM | flags;
- res[1].start = addr_cmd;
-- res[1].size = size;
-+ res[1].end = addr_cmd + size - 1;
- res[1].flags = IORESOURCE_MEM | flags;
-
- return add_generic_device_res("ks8851_mll", id, res, 2, pdata);
-diff --git a/drivers/dma/Kconfig b/drivers/dma/Kconfig
-new file mode 100644
-index 0000000..ec6c894
---- /dev/null
-+++ b/drivers/dma/Kconfig
-@@ -0,0 +1,8 @@
-+menu "DMA support"
-+
-+config MXS_APBH_DMA
-+ tristate "MXS APBH DMA ENGINE"
-+ depends on ARCH_IMX23 || ARCH_IMX28
-+ help
-+ Experimental!
-+endmenu
-diff --git a/drivers/dma/Makefile b/drivers/dma/Makefile
-new file mode 100644
-index 0000000..7a3a3b2
---- /dev/null
-+++ b/drivers/dma/Makefile
-@@ -0,0 +1 @@
-+obj-$(CONFIG_MXS_APBH_DMA) += apbh_dma.o
-diff --git a/drivers/dma/apbh_dma.c b/drivers/dma/apbh_dma.c
-new file mode 100644
-index 0000000..363878f
---- /dev/null
-+++ b/drivers/dma/apbh_dma.c
-@@ -0,0 +1,598 @@
-+/*
-+ * Freescale i.MX28 APBH DMA driver
-+ *
-+ * Copyright (C) 2011 Wolfram Sang <w.sang@pengutronix.de>
-+ *
-+ * Copyright (C) 2011 Marek Vasut <marek.vasut@gmail.com>
-+ * on behalf of DENX Software Engineering GmbH
-+ *
-+ * Based on code from LTIB:
-+ * Copyright (C) 2010 Freescale Semiconductor, Inc. All Rights Reserved.
-+ *
-+ * 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.
-+ */
-+
-+#include <linux/list.h>
-+
-+#include <common.h>
-+#include <malloc.h>
-+#include <errno.h>
-+#include <asm/mmu.h>
-+#include <asm/io.h>
-+#include <mach/clock.h>
-+#include <mach/imx-regs.h>
-+#include <mach/dma.h>
-+#include <mach/mxs.h>
-+
-+#define HW_APBHX_CTRL0 0x000
-+#define BM_APBH_CTRL0_APB_BURST8_EN (1 << 29)
-+#define BM_APBH_CTRL0_APB_BURST_EN (1 << 28)
-+#define BP_APBH_CTRL0_CLKGATE_CHANNEL 8
-+#define BP_APBH_CTRL0_RESET_CHANNEL 16
-+#define HW_APBHX_CTRL1 0x010
-+#define BP_APBHX_CTRL1_CH_CMDCMPLT_IRQ_EN 16
-+#define HW_APBHX_CTRL2 0x020
-+#define HW_APBHX_CHANNEL_CTRL 0x030
-+#define BP_APBHX_CHANNEL_CTRL_RESET_CHANNEL 16
-+#define HW_APBH_VERSION (cpu_is_mx23() ? 0x3f0 : 0x800)
-+#define HW_APBX_VERSION 0x800
-+#define BP_APBHX_VERSION_MAJOR 24
-+#define HW_APBHX_CHn_NXTCMDAR(n) \
-+ ((apbh_is_old ? 0x050 : 0x110) + (n) * 0x70)
-+#define HW_APBHX_CHn_SEMA(n) \
-+ ((apbh_is_old ? 0x080 : 0x140) + (n) * 0x70)
-+#define BM_APBHX_CHn_SEMA_PHORE (0xff << 16)
-+#define BP_APBHX_CHn_SEMA_PHORE 16
-+
-+static struct mxs_dma_chan mxs_dma_channels[MXS_MAX_DMA_CHANNELS];
-+static bool apbh_is_old;
-+
-+/*
-+ * Test is the DMA channel is valid channel
-+ */
-+int mxs_dma_validate_chan(int channel)
-+{
-+ struct mxs_dma_chan *pchan;
-+
-+ if ((channel < 0) || (channel >= MXS_MAX_DMA_CHANNELS))
-+ return -EINVAL;
-+
-+ pchan = mxs_dma_channels + channel;
-+ if (!(pchan->flags & MXS_DMA_FLAGS_ALLOCATED))
-+ return -EINVAL;
-+
-+ return 0;
-+}
-+
-+/*
-+ * Return the address of the command within a descriptor.
-+ */
-+static unsigned int mxs_dma_cmd_address(struct mxs_dma_desc *desc)
-+{
-+ return desc->address + offsetof(struct mxs_dma_desc, cmd);
-+}
-+
-+/*
-+ * Read a DMA channel's hardware semaphore.
-+ *
-+ * As used by the MXS platform's DMA software, the DMA channel's hardware
-+ * semaphore reflects the number of DMA commands the hardware will process, but
-+ * has not yet finished. This is a volatile value read directly from hardware,
-+ * so it must be be viewed as immediately stale.
-+ *
-+ * If the channel is not marked busy, or has finished processing all its
-+ * commands, this value should be zero.
-+ *
-+ * See mxs_dma_append() for details on how DMA command blocks must be configured
-+ * to maintain the expected behavior of the semaphore's value.
-+ */
-+static int mxs_dma_read_semaphore(int channel)
-+{
-+ void __iomem *apbh_regs = (void *)MXS_APBH_BASE;
-+ uint32_t tmp;
-+ int ret;
-+
-+ ret = mxs_dma_validate_chan(channel);
-+ if (ret)
-+ return ret;
-+
-+ tmp = readl(apbh_regs + HW_APBHX_CHn_SEMA(channel));
-+
-+ tmp &= BM_APBHX_CHn_SEMA_PHORE;
-+ tmp >>= BP_APBHX_CHn_SEMA_PHORE;
-+
-+ return tmp;
-+}
-+
-+/*
-+ * Enable a DMA channel.
-+ *
-+ * If the given channel has any DMA descriptors on its active list, this
-+ * function causes the DMA hardware to begin processing them.
-+ *
-+ * This function marks the DMA channel as "busy," whether or not there are any
-+ * descriptors to process.
-+ */
-+static int mxs_dma_enable(int channel)
-+{
-+ void __iomem *apbh_regs = (void *)MXS_APBH_BASE;
-+ unsigned int sem;
-+ struct mxs_dma_chan *pchan;
-+ struct mxs_dma_desc *pdesc;
-+ int channel_bit, ret;
-+
-+ ret = mxs_dma_validate_chan(channel);
-+ if (ret)
-+ return ret;
-+
-+ pchan = mxs_dma_channels + channel;
-+
-+ if (pchan->pending_num == 0) {
-+ pchan->flags |= MXS_DMA_FLAGS_BUSY;
-+ return 0;
-+ }
-+
-+ pdesc = list_first_entry(&pchan->active, struct mxs_dma_desc, node);
-+ if (pdesc == NULL)
-+ return -EFAULT;
-+
-+ if (pchan->flags & MXS_DMA_FLAGS_BUSY) {
-+ if (!(pdesc->cmd.data & MXS_DMA_DESC_CHAIN))
-+ return 0;
-+
-+ sem = mxs_dma_read_semaphore(channel);
-+ if (sem == 0)
-+ return 0;
-+
-+ if (sem == 1) {
-+ pdesc = list_entry(pdesc->node.next,
-+ struct mxs_dma_desc, node);
-+ writel(mxs_dma_cmd_address(pdesc),
-+ apbh_regs + HW_APBHX_CHn_NXTCMDAR(channel));
-+ }
-+ writel(pchan->pending_num,
-+ apbh_regs + HW_APBHX_CHn_SEMA(channel));
-+ pchan->active_num += pchan->pending_num;
-+ pchan->pending_num = 0;
-+ } else {
-+ pchan->active_num += pchan->pending_num;
-+ pchan->pending_num = 0;
-+ writel(mxs_dma_cmd_address(pdesc),
-+ apbh_regs + HW_APBHX_CHn_NXTCMDAR(channel));
-+ writel(pchan->active_num,
-+ apbh_regs + HW_APBHX_CHn_SEMA(channel));
-+ channel_bit = channel + (apbh_is_old ? BP_APBH_CTRL0_CLKGATE_CHANNEL : 0);
-+ writel(1 << channel_bit, apbh_regs + HW_APBHX_CTRL0 + BIT_CLR);
-+ }
-+
-+ pchan->flags |= MXS_DMA_FLAGS_BUSY;
-+ return 0;
-+}
-+
-+/*
-+ * Disable a DMA channel.
-+ *
-+ * This function shuts down a DMA channel and marks it as "not busy." Any
-+ * descriptors on the active list are immediately moved to the head of the
-+ * "done" list, whether or not they have actually been processed by the
-+ * hardware. The "ready" flags of these descriptors are NOT cleared, so they
-+ * still appear to be active.
-+ *
-+ * This function immediately shuts down a DMA channel's hardware, aborting any
-+ * I/O that may be in progress, potentially leaving I/O hardware in an undefined
-+ * state. It is unwise to call this function if there is ANY chance the hardware
-+ * is still processing a command.
-+ */
-+static int mxs_dma_disable(int channel)
-+{
-+ struct mxs_dma_chan *pchan;
-+ void __iomem *apbh_regs = (void *)MXS_APBH_BASE;
-+ int channel_bit, ret;
-+
-+ ret = mxs_dma_validate_chan(channel);
-+ if (ret)
-+ return ret;
-+
-+ pchan = mxs_dma_channels + channel;
-+
-+ if (!(pchan->flags & MXS_DMA_FLAGS_BUSY))
-+ return -EINVAL;
-+
-+ channel_bit = channel + (apbh_is_old ? BP_APBH_CTRL0_CLKGATE_CHANNEL : 0);
-+ writel(1 << channel_bit, apbh_regs + HW_APBHX_CTRL0 + BIT_SET);
-+
-+ pchan->flags &= ~MXS_DMA_FLAGS_BUSY;
-+ pchan->active_num = 0;
-+ pchan->pending_num = 0;
-+ list_splice_init(&pchan->active, &pchan->done);
-+
-+ return 0;
-+}
-+
-+/*
-+ * Resets the DMA channel hardware.
-+ */
-+static int mxs_dma_reset(int channel)
-+{
-+ void __iomem *apbh_regs = (void *)MXS_APBH_BASE;
-+ int ret;
-+
-+ ret = mxs_dma_validate_chan(channel);
-+ if (ret)
-+ return ret;
-+
-+ if (apbh_is_old)
-+ writel(1 << (channel + BP_APBH_CTRL0_RESET_CHANNEL),
-+ apbh_regs + HW_APBHX_CTRL0 + BIT_SET);
-+ else
-+ writel(1 << (channel + BP_APBHX_CHANNEL_CTRL_RESET_CHANNEL),
-+ apbh_regs + HW_APBHX_CHANNEL_CTRL + BIT_SET);
-+
-+ return 0;
-+}
-+
-+/*
-+ * Enable or disable DMA interrupt.
-+ *
-+ * This function enables the given DMA channel to interrupt the CPU.
-+ */
-+static int mxs_dma_enable_irq(int channel, int enable)
-+{
-+ void __iomem *apbh_regs = (void *)MXS_APBH_BASE;
-+ int ret;
-+
-+ ret = mxs_dma_validate_chan(channel);
-+ if (ret)
-+ return ret;
-+
-+ if (enable)
-+ writel(1 << (channel + BP_APBHX_CTRL1_CH_CMDCMPLT_IRQ_EN),
-+ apbh_regs + HW_APBHX_CTRL1 + BIT_SET);
-+ else
-+ writel(1 << (channel + BP_APBHX_CTRL1_CH_CMDCMPLT_IRQ_EN),
-+ apbh_regs + HW_APBHX_CTRL1 + BIT_CLR);
-+
-+ return 0;
-+}
-+
-+/*
-+ * Clear DMA interrupt.
-+ *
-+ * The software that is using the DMA channel must register to receive its
-+ * interrupts and, when they arrive, must call this function to clear them.
-+ */
-+static int mxs_dma_ack_irq(int channel)
-+{
-+ void __iomem *apbh_regs = (void *)MXS_APBH_BASE;
-+ int ret;
-+
-+ ret = mxs_dma_validate_chan(channel);
-+ if (ret)
-+ return ret;
-+
-+ writel(1 << channel, apbh_regs + HW_APBHX_CTRL1 + BIT_CLR);
-+ writel(1 << channel, apbh_regs + HW_APBHX_CTRL2 + BIT_CLR);
-+
-+ return 0;
-+}
-+
-+/*
-+ * Request to reserve a DMA channel
-+ */
-+static int mxs_dma_request(int channel)
-+{
-+ struct mxs_dma_chan *pchan;
-+
-+ if ((channel < 0) || (channel >= MXS_MAX_DMA_CHANNELS))
-+ return -EINVAL;
-+
-+ pchan = mxs_dma_channels + channel;
-+ if ((pchan->flags & MXS_DMA_FLAGS_VALID) != MXS_DMA_FLAGS_VALID)
-+ return -ENODEV;
-+
-+ if (pchan->flags & MXS_DMA_FLAGS_ALLOCATED)
-+ return -EBUSY;
-+
-+ pchan->flags |= MXS_DMA_FLAGS_ALLOCATED;
-+ pchan->active_num = 0;
-+ pchan->pending_num = 0;
-+
-+ INIT_LIST_HEAD(&pchan->active);
-+ INIT_LIST_HEAD(&pchan->done);
-+
-+ return 0;
-+}
-+
-+/*
-+ * Release a DMA channel.
-+ *
-+ * This function releases a DMA channel from its current owner.
-+ *
-+ * The channel will NOT be released if it's marked "busy" (see
-+ * mxs_dma_enable()).
-+ */
-+static int mxs_dma_release(int channel)
-+{
-+ struct mxs_dma_chan *pchan;
-+ int ret;
-+
-+ ret = mxs_dma_validate_chan(channel);
-+ if (ret)
-+ return ret;
-+
-+ pchan = mxs_dma_channels + channel;
-+
-+ if (pchan->flags & MXS_DMA_FLAGS_BUSY)
-+ return -EBUSY;
-+
-+ pchan->dev = 0;
-+ pchan->active_num = 0;
-+ pchan->pending_num = 0;
-+ pchan->flags &= ~MXS_DMA_FLAGS_ALLOCATED;
-+
-+ return 0;
-+}
-+
-+/*
-+ * Allocate DMA descriptor
-+ */
-+struct mxs_dma_desc *mxs_dma_desc_alloc(void)
-+{
-+ struct mxs_dma_desc *pdesc;
-+
-+ pdesc = dma_alloc_coherent(sizeof(struct mxs_dma_desc));
-+
-+ if (pdesc == NULL)
-+ return NULL;
-+
-+ memset(pdesc, 0, sizeof(*pdesc));
-+ pdesc->address = (dma_addr_t)pdesc;
-+
-+ return pdesc;
-+};
-+
-+/*
-+ * Free DMA descriptor
-+ */
-+void mxs_dma_desc_free(struct mxs_dma_desc *pdesc)
-+{
-+ if (pdesc == NULL)
-+ return;
-+
-+ free(pdesc);
-+}
-+
-+/*
-+ * Add a DMA descriptor to a channel.
-+ *
-+ * If the descriptor list for this channel is not empty, this function sets the
-+ * CHAIN bit and the NEXTCMD_ADDR fields in the last descriptor's DMA command so
-+ * it will chain to the new descriptor's command.
-+ *
-+ * Then, this function marks the new descriptor as "ready," adds it to the end
-+ * of the active descriptor list, and increments the count of pending
-+ * descriptors.
-+ *
-+ * The MXS platform DMA software imposes some rules on DMA commands to maintain
-+ * important invariants. These rules are NOT checked, but they must be carefully
-+ * applied by software that uses MXS DMA channels.
-+ *
-+ * Invariant:
-+ * The DMA channel's hardware semaphore must reflect the number of DMA
-+ * commands the hardware will process, but has not yet finished.
-+ *
-+ * Explanation:
-+ * A DMA channel begins processing commands when its hardware semaphore is
-+ * written with a value greater than zero, and it stops processing commands
-+ * when the semaphore returns to zero.
-+ *
-+ * When a channel finishes a DMA command, it will decrement its semaphore if
-+ * the DECREMENT_SEMAPHORE bit is set in that command's flags bits.
-+ *
-+ * In principle, it's not necessary for the DECREMENT_SEMAPHORE to be set,
-+ * unless it suits the purposes of the software. For example, one could
-+ * construct a series of five DMA commands, with the DECREMENT_SEMAPHORE
-+ * bit set only in the last one. Then, setting the DMA channel's hardware
-+ * semaphore to one would cause the entire series of five commands to be
-+ * processed. However, this example would violate the invariant given above.
-+ *
-+ * Rule:
-+ * ALL DMA commands MUST have the DECREMENT_SEMAPHORE bit set so that the DMA
-+ * channel's hardware semaphore will be decremented EVERY time a command is
-+ * processed.
-+ */
-+int mxs_dma_desc_append(int channel, struct mxs_dma_desc *pdesc)
-+{
-+ struct mxs_dma_chan *pchan;
-+ struct mxs_dma_desc *last;
-+ int ret;
-+
-+ ret = mxs_dma_validate_chan(channel);
-+ if (ret)
-+ return ret;
-+
-+ pchan = mxs_dma_channels + channel;
-+
-+ pdesc->cmd.next = mxs_dma_cmd_address(pdesc);
-+ pdesc->flags |= MXS_DMA_DESC_FIRST | MXS_DMA_DESC_LAST;
-+
-+ if (!list_empty(&pchan->active)) {
-+ last = list_entry(pchan->active.prev, struct mxs_dma_desc,
-+ node);
-+
-+ pdesc->flags &= ~MXS_DMA_DESC_FIRST;
-+ last->flags &= ~MXS_DMA_DESC_LAST;
-+
-+ last->cmd.next = mxs_dma_cmd_address(pdesc);
-+ last->cmd.data |= MXS_DMA_DESC_CHAIN;
-+ }
-+ pdesc->flags |= MXS_DMA_DESC_READY;
-+ if (pdesc->flags & MXS_DMA_DESC_FIRST)
-+ pchan->pending_num++;
-+ list_add_tail(&pdesc->node, &pchan->active);
-+
-+ return ret;
-+}
-+
-+/*
-+ * Clean up processed DMA descriptors.
-+ *
-+ * This function removes processed DMA descriptors from the "active" list. Pass
-+ * in a non-NULL list head to get the descriptors moved to your list. Pass NULL
-+ * to get the descriptors moved to the channel's "done" list. Descriptors on
-+ * the "done" list can be retrieved with mxs_dma_get_finished().
-+ *
-+ * This function marks the DMA channel as "not busy" if no unprocessed
-+ * descriptors remain on the "active" list.
-+ */
-+static int mxs_dma_finish(int channel, struct list_head *head)
-+{
-+ int sem;
-+ struct mxs_dma_chan *pchan;
-+ struct list_head *p, *q;
-+ struct mxs_dma_desc *pdesc;
-+ int ret;
-+
-+ ret = mxs_dma_validate_chan(channel);
-+ if (ret)
-+ return ret;
-+
-+ pchan = mxs_dma_channels + channel;
-+
-+ sem = mxs_dma_read_semaphore(channel);
-+ if (sem < 0)
-+ return sem;
-+
-+ if (sem == pchan->active_num)
-+ return 0;
-+
-+ list_for_each_safe(p, q, &pchan->active) {
-+ if ((pchan->active_num) <= sem)
-+ break;
-+
-+ pdesc = list_entry(p, struct mxs_dma_desc, node);
-+ pdesc->flags &= ~MXS_DMA_DESC_READY;
-+
-+ if (head)
-+ list_move_tail(p, head);
-+ else
-+ list_move_tail(p, &pchan->done);
-+
-+ if (pdesc->flags & MXS_DMA_DESC_LAST)
-+ pchan->active_num--;
-+ }
-+
-+ if (sem == 0)
-+ pchan->flags &= ~MXS_DMA_FLAGS_BUSY;
-+
-+ return 0;
-+}
-+
-+/*
-+ * Wait for DMA channel to complete
-+ */
-+static int mxs_dma_wait_complete(uint32_t timeout, unsigned int chan)
-+{
-+ void __iomem *apbh_regs = (void *)MXS_APBH_BASE;
-+ int ret;
-+
-+ ret = mxs_dma_validate_chan(chan);
-+ if (ret)
-+ return ret;
-+
-+ while (--timeout) {
-+ if (readl(apbh_regs + HW_APBHX_CTRL1) & (1 << chan))
-+ break;
-+ udelay(1);
-+ }
-+
-+ if (timeout == 0) {
-+ ret = -ETIMEDOUT;
-+ mxs_dma_reset(chan);
-+ }
-+
-+ return ret;
-+}
-+
-+/*
-+ * Execute the DMA channel
-+ */
-+int mxs_dma_go(int chan)
-+{
-+ uint32_t timeout = 10000;
-+ int ret;
-+
-+ LIST_HEAD(tmp_desc_list);
-+
-+ mxs_dma_enable_irq(chan, 1);
-+ mxs_dma_enable(chan);
-+
-+ /* Wait for DMA to finish. */
-+ ret = mxs_dma_wait_complete(timeout, chan);
-+
-+ /* Clear out the descriptors we just ran. */
-+ mxs_dma_finish(chan, &tmp_desc_list);
-+
-+ /* Shut the DMA channel down. */
-+ mxs_dma_ack_irq(chan);
-+ mxs_dma_reset(chan);
-+ mxs_dma_enable_irq(chan, 0);
-+ mxs_dma_disable(chan);
-+
-+ return ret;
-+}
-+
-+/*
-+ * Initialize the DMA hardware
-+ */
-+int mxs_dma_init(void)
-+{
-+ void __iomem *apbh_regs = (void *)MXS_APBH_BASE;
-+ struct mxs_dma_chan *pchan;
-+ int ret, channel;
-+ u32 val, reg;
-+
-+ mxs_reset_block(apbh_regs, 0);
-+
-+ /* HACK: Get CPUID and determine APBH version */
-+ val = readl(0x8001c310) >> 16;
-+ if (val == 0x2800)
-+ reg = MXS_APBH_BASE + 0x0800;
-+ else
-+ reg = MXS_APBH_BASE + 0x03f0;
-+
-+ apbh_is_old = (readl((void *)reg) >> 24) < 3;
-+
-+ writel(BM_APBH_CTRL0_APB_BURST8_EN,
-+ apbh_regs + HW_APBHX_CTRL0 + BIT_SET);
-+
-+ writel(BM_APBH_CTRL0_APB_BURST_EN,
-+ apbh_regs + HW_APBHX_CTRL0 + BIT_SET);
-+
-+ for (channel = 0; channel < MXS_MAX_DMA_CHANNELS; channel++) {
-+ pchan = mxs_dma_channels + channel;
-+ pchan->flags = MXS_DMA_FLAGS_VALID;
-+
-+ ret = mxs_dma_request(channel);
-+
-+ if (ret) {
-+ printf("MXS DMA: Can't acquire DMA channel %i\n",
-+ channel);
-+
-+ goto err;
-+ }
-+
-+ mxs_dma_reset(channel);
-+ mxs_dma_ack_irq(channel);
-+ }
-+
-+ return 0;
-+
-+err:
-+ while (--channel >= 0)
-+ mxs_dma_release(channel);
-+ return ret;
-+}
-diff --git a/drivers/eeprom/at25.c b/drivers/eeprom/at25.c
-index 8a979d5..03d191e 100644
---- a/drivers/eeprom/at25.c
-+++ b/drivers/eeprom/at25.c
-@@ -67,7 +67,7 @@ struct at25_data {
- static ssize_t at25_ee_read(struct cdev *cdev,
- void *buf,
- size_t count,
-- ulong offset,
-+ loff_t offset,
- ulong flags)
- {
- u8 command[EE_MAXADDRLEN + 1];
-@@ -117,7 +117,7 @@ static ssize_t at25_ee_read(struct cdev *cdev,
- */
- status = spi_sync(at25->spi, &m);
- dev_dbg(at25->cdev.dev,
-- "read %d bytes at %lu --> %d\n",
-+ "read %d bytes at %llu --> %d\n",
- count, offset, (int) status);
-
- return status ? status : count;
-@@ -126,7 +126,7 @@ static ssize_t at25_ee_read(struct cdev *cdev,
- static ssize_t at25_ee_write(struct cdev *cdev,
- const void *buf,
- size_t count,
-- ulong off,
-+ loff_t off,
- ulong flags)
- {
- ssize_t status = 0;
-@@ -232,7 +232,7 @@ static ssize_t at25_ee_write(struct cdev *cdev,
- return written ? written : status;
- }
-
--static off_t at25_ee_lseek(struct cdev *cdev, off_t off)
-+static loff_t at25_ee_lseek(struct cdev *cdev, loff_t off)
- {
- return off;
- }
-diff --git a/drivers/mci/imx-esdhc.c b/drivers/mci/imx-esdhc.c
-index ae3c805..585cab9 100644
---- a/drivers/mci/imx-esdhc.c
-+++ b/drivers/mci/imx-esdhc.c
-@@ -70,7 +70,7 @@ struct fsl_esdhc {
-
- struct fsl_esdhc_host {
- struct mci_host mci;
-- struct fsl_esdhc *regs;
-+ struct fsl_esdhc __iomem *regs;
- u32 no_snoop;
- unsigned long cur_clock;
- struct device_d *dev;
-@@ -81,7 +81,7 @@ struct fsl_esdhc_host {
- #define SDHCI_CMD_ABORTCMD (0xC0 << 16)
-
- /* Return the XFERTYP flags for a given command and data packet */
--u32 esdhc_xfertyp(struct mci_cmd *cmd, struct mci_data *data)
-+static u32 esdhc_xfertyp(struct mci_cmd *cmd, struct mci_data *data)
- {
- u32 xfertyp = 0;
-
-@@ -185,7 +185,7 @@ esdhc_pio_read_write(struct mci_host *mci, struct mci_data *data)
- static int esdhc_setup_data(struct mci_host *mci, struct mci_data *data)
- {
- struct fsl_esdhc_host *host = to_fsl_esdhc(mci);
-- struct fsl_esdhc *regs = host->regs;
-+ struct fsl_esdhc __iomem *regs = host->regs;
- #ifndef CONFIG_MCI_IMX_ESDHC_PIO
- u32 wml_value;
-
-@@ -237,7 +237,7 @@ esdhc_send_cmd(struct mci_host *mci, struct mci_cmd *cmd, struct mci_data *data)
- u32 xfertyp, mixctrl;
- u32 irqstat;
- struct fsl_esdhc_host *host = to_fsl_esdhc(mci);
-- struct fsl_esdhc *regs = host->regs;
-+ struct fsl_esdhc __iomem *regs = host->regs;
- int ret;
-
- esdhc_write32(&regs->irqstat, -1);
-@@ -353,11 +353,11 @@ esdhc_send_cmd(struct mci_host *mci, struct mci_cmd *cmd, struct mci_data *data)
- return 0;
- }
-
--void set_sysctl(struct mci_host *mci, u32 clock)
-+static void set_sysctl(struct mci_host *mci, u32 clock)
- {
- int div, pre_div;
- struct fsl_esdhc_host *host = to_fsl_esdhc(mci);
-- struct fsl_esdhc *regs = host->regs;
-+ struct fsl_esdhc __iomem *regs = host->regs;
- int sdhc_clk = imx_get_mmcclk();
- u32 clk;
-
-@@ -400,7 +400,7 @@ void set_sysctl(struct mci_host *mci, u32 clock)
- static void esdhc_set_ios(struct mci_host *mci, struct mci_ios *ios)
- {
- struct fsl_esdhc_host *host = to_fsl_esdhc(mci);
-- struct fsl_esdhc *regs = host->regs;
-+ struct fsl_esdhc __iomem *regs = host->regs;
-
- /* Set the clock speed */
- set_sysctl(mci, ios->clock);
-@@ -425,7 +425,7 @@ static void esdhc_set_ios(struct mci_host *mci, struct mci_ios *ios)
-
- static int esdhc_card_detect(struct fsl_esdhc_host *host)
- {
-- struct fsl_esdhc *regs = host->regs;
-+ struct fsl_esdhc __iomem *regs = host->regs;
- struct esdhc_platform_data *pdata = host->dev->platform_data;
- int ret;
-
-@@ -451,7 +451,7 @@ static int esdhc_card_detect(struct fsl_esdhc_host *host)
- static int esdhc_init(struct mci_host *mci, struct device_d *dev)
- {
- struct fsl_esdhc_host *host = to_fsl_esdhc(mci);
-- struct fsl_esdhc *regs = host->regs;
-+ struct fsl_esdhc __iomem *regs = host->regs;
- int timeout = 1000;
- int ret = 0;
-
-@@ -493,7 +493,7 @@ static int esdhc_init(struct mci_host *mci, struct device_d *dev)
- return ret;
- }
-
--static int esdhc_reset(struct fsl_esdhc *regs)
-+static int esdhc_reset(struct fsl_esdhc __iomem *regs)
- {
- uint64_t start;
-
-diff --git a/drivers/mci/imx-esdhc.h b/drivers/mci/imx-esdhc.h
-index 19fed5a..7d5ed85 100644
---- a/drivers/mci/imx-esdhc.h
-+++ b/drivers/mci/imx-esdhc.h
-@@ -39,7 +39,6 @@
- #define SYSCTL_PEREN 0x00000004
- #define SYSCTL_HCKEN 0x00000002
- #define SYSCTL_IPGEN 0x00000001
--#define SYSCTL_RSTA 0x01000000
-
- #define IRQSTAT 0x0002e030
- #define IRQSTAT_DMAE (0x10000000)
-diff --git a/drivers/mfd/lp3972.c b/drivers/mfd/lp3972.c
-index 9826699..0f3093b 100644
---- a/drivers/mfd/lp3972.c
-+++ b/drivers/mfd/lp3972.c
-@@ -58,7 +58,7 @@ static u32 lp_read_reg(struct lp_priv *lp, int reg)
- return buf;
- }
-
--static ssize_t lp_read(struct cdev *cdev, void *_buf, size_t count, ulong offset, ulong flags)
-+static ssize_t lp_read(struct cdev *cdev, void *_buf, size_t count, loff_t offset, ulong flags)
- {
- struct lp_priv *priv = to_lp_priv(cdev);
- int i = count;
-diff --git a/drivers/mfd/mc13xxx.c b/drivers/mfd/mc13xxx.c
-index f9477a3..2934e9d 100644
---- a/drivers/mfd/mc13xxx.c
-+++ b/drivers/mfd/mc13xxx.c
-@@ -160,7 +160,7 @@ int mc13xxx_set_bits(struct mc13xxx *mc13xxx, u8 reg, u32 mask, u32 val)
- }
- EXPORT_SYMBOL(mc13xxx_set_bits);
-
--static ssize_t mc_read(struct cdev *cdev, void *_buf, size_t count, ulong offset, ulong flags)
-+static ssize_t mc_read(struct cdev *cdev, void *_buf, size_t count, loff_t offset, ulong flags)
- {
- struct mc13xxx *priv = to_mc13xxx(cdev);
- u32 *buf = _buf;
-@@ -181,7 +181,7 @@ static ssize_t mc_read(struct cdev *cdev, void *_buf, size_t count, ulong offset
- return count;
- }
-
--static ssize_t mc_write(struct cdev *cdev, const void *_buf, size_t count, ulong offset, ulong flags)
-+static ssize_t mc_write(struct cdev *cdev, const void *_buf, size_t count, loff_t offset, ulong flags)
- {
- struct mc13xxx *mc13xxx = to_mc13xxx(cdev);
- const u32 *buf = _buf;
-diff --git a/drivers/mfd/mc34704.c b/drivers/mfd/mc34704.c
-index a2171b3..20c01e2 100644
---- a/drivers/mfd/mc34704.c
-+++ b/drivers/mfd/mc34704.c
-@@ -65,7 +65,7 @@ int mc34704_reg_write(struct mc34704 *mc34704, u8 reg, u8 val)
- EXPORT_SYMBOL(mc34704_reg_write)
-
- static ssize_t mc34704_read(struct cdev *cdev, void *_buf, size_t count,
-- ulong offset, ulong flags)
-+ loff_t offset, ulong flags)
- {
- struct mc34704 *priv = to_mc34704(cdev);
- u8 *buf = _buf;
-@@ -85,7 +85,7 @@ static ssize_t mc34704_read(struct cdev *cdev, void *_buf, size_t count,
- }
-
- static ssize_t mc34704_write(struct cdev *cdev, const void *_buf, size_t count,
-- ulong offset, ulong flags)
-+ loff_t offset, ulong flags)
- {
- struct mc34704 *mc34704 = to_mc34704(cdev);
- const u8 *buf = _buf;
-diff --git a/drivers/mfd/mc34708.c b/drivers/mfd/mc34708.c
-index e7f40c0..02c58a9 100644
---- a/drivers/mfd/mc34708.c
-+++ b/drivers/mfd/mc34708.c
-@@ -163,7 +163,8 @@ int mc34708_set_bits(struct mc34708 *mc34708, enum mc34708_reg reg, u32 mask, u3
- }
- EXPORT_SYMBOL(mc34708_set_bits);
-
--static ssize_t mc_read(struct cdev *cdev, void *_buf, size_t count, ulong offset, ulong flags)
-+static ssize_t mc_read(struct cdev *cdev, void *_buf, size_t count,
-+ loff_t offset, ulong flags)
- {
- struct mc34708 *priv = to_mc34708(cdev);
- u32 *buf = _buf;
-@@ -184,7 +185,8 @@ static ssize_t mc_read(struct cdev *cdev, void *_buf, size_t count, ulong offset
- return count;
- }
-
--static ssize_t mc_write(struct cdev *cdev, const void *_buf, size_t count, ulong offset, ulong flags)
-+static ssize_t mc_write(struct cdev *cdev, const void *_buf, size_t count,
-+ loff_t offset, ulong flags)
- {
- struct mc34708 *mc34708 = to_mc34708(cdev);
- const u32 *buf = _buf;
-diff --git a/drivers/mfd/mc9sdz60.c b/drivers/mfd/mc9sdz60.c
-index db208ec..0cd5007 100644
---- a/drivers/mfd/mc9sdz60.c
-+++ b/drivers/mfd/mc9sdz60.c
-@@ -78,7 +78,7 @@ int mc9sdz60_set_bits(struct mc9sdz60 *mc9sdz60, enum mc9sdz60_reg reg, u8 mask,
- }
- EXPORT_SYMBOL(mc9sdz60_set_bits);
-
--static ssize_t mc_read(struct cdev *cdev, void *_buf, size_t count, ulong offset, ulong flags)
-+static ssize_t mc_read(struct cdev *cdev, void *_buf, size_t count, loff_t offset, ulong flags)
- {
- struct mc9sdz60 *mc9sdz60 = to_mc9sdz60(cdev);
- u8 *buf = _buf;
-@@ -97,7 +97,7 @@ static ssize_t mc_read(struct cdev *cdev, void *_buf, size_t count, ulong offset
- return count;
- }
-
--static ssize_t mc_write(struct cdev *cdev, const void *_buf, size_t count, ulong offset, ulong flags)
-+static ssize_t mc_write(struct cdev *cdev, const void *_buf, size_t count, loff_t offset, ulong flags)
- {
- struct mc9sdz60 *mc9sdz60 = to_mc9sdz60(cdev);
- const u8 *buf = _buf;
-diff --git a/drivers/mfd/twl-core.c b/drivers/mfd/twl-core.c
-index cb2c03d..20bde2c 100644
---- a/drivers/mfd/twl-core.c
-+++ b/drivers/mfd/twl-core.c
-@@ -112,7 +112,7 @@ int twlcore_set_bits(struct twlcore *twlcore, u16 reg, u8 mask, u8 val)
- EXPORT_SYMBOL(twlcore_set_bits);
-
- static ssize_t twl_read(struct cdev *cdev, void *_buf, size_t count,
-- ulong offset, ulong flags)
-+ loff_t offset, ulong flags)
- {
- struct twlcore *priv = to_twlcore(cdev);
- u8 *buf = _buf;
-@@ -131,7 +131,7 @@ static ssize_t twl_read(struct cdev *cdev, void *_buf, size_t count,
- }
-
- static ssize_t twl_write(struct cdev *cdev, const void *_buf, size_t count,
-- ulong offset, ulong flags)
-+ loff_t offset, ulong flags)
- {
- struct twlcore *twlcore = to_twlcore(cdev);
- const u8 *buf = _buf;
-diff --git a/drivers/mtd/core.c b/drivers/mtd/core.c
-index 87dcba6..5510439 100644
---- a/drivers/mtd/core.c
-+++ b/drivers/mtd/core.c
-@@ -31,11 +31,12 @@
- static LIST_HEAD(mtd_register_hooks);
-
- static ssize_t mtd_read(struct cdev *cdev, void* buf, size_t count,
-- ulong offset, ulong flags)
-+ loff_t _offset, ulong flags)
- {
- struct mtd_info *mtd = cdev->priv;
- size_t retlen;
- int ret;
-+ unsigned long offset = _offset;
-
- debug("mtd_read: 0x%08lx 0x%08x\n", offset, count);
-
-@@ -64,13 +65,14 @@ static int all_ff(const void *buf, int len)
- }
-
- static ssize_t mtd_write(struct cdev* cdev, const void *buf, size_t _count,
-- ulong offset, ulong flags)
-+ loff_t _offset, ulong flags)
- {
- struct mtd_info *mtd = cdev->priv;
- size_t retlen, now;
- int ret = 0;
- void *wrbuf = NULL;
- size_t count = _count;
-+ unsigned long offset = _offset;
-
- if (NOTALIGNED(offset)) {
- printf("offset 0x%0lx not page aligned\n", offset);
-@@ -123,16 +125,17 @@ int mtd_ioctl(struct cdev *cdev, int request, void *buf)
- struct mtd_ecc_stats *ecc = buf;
- #endif
- struct region_info_user *reg = buf;
-+ loff_t *offset = buf;
-
- switch (request) {
- case MEMGETBADBLOCK:
-- dev_dbg(cdev->dev, "MEMGETBADBLOCK: 0x%08lx\n", (off_t)buf);
-- ret = mtd->block_isbad(mtd, (off_t)buf);
-+ dev_dbg(cdev->dev, "MEMGETBADBLOCK: 0x%08llx\n", *offset);
-+ ret = mtd->block_isbad(mtd, *offset);
- break;
- #ifdef CONFIG_MTD_WRITE
- case MEMSETBADBLOCK:
-- dev_dbg(cdev->dev, "MEMSETBADBLOCK: 0x%08lx\n", (off_t)buf);
-- ret = mtd->block_markbad(mtd, (off_t)buf);
-+ dev_dbg(cdev->dev, "MEMSETBADBLOCK: 0x%08llx\n", *offset);
-+ ret = mtd->block_markbad(mtd, *offset);
- break;
- #endif
- case MEMGETINFO:
-@@ -156,9 +159,10 @@ int mtd_ioctl(struct cdev *cdev, int request, void *buf)
- #endif
- case MEMGETREGIONINFO:
- if (cdev->mtd) {
-+ unsigned long size = cdev->size;
- reg->offset = cdev->offset;
- reg->erasesize = cdev->mtd->erasesize;
-- reg->numblocks = cdev->size/reg->erasesize;
-+ reg->numblocks = size / reg->erasesize;
- reg->regionindex = cdev->mtd->index;
- }
- break;
-@@ -170,7 +174,7 @@ int mtd_ioctl(struct cdev *cdev, int request, void *buf)
- }
-
- #ifdef CONFIG_MTD_WRITE
--static ssize_t mtd_erase(struct cdev *cdev, size_t count, unsigned long offset)
-+static ssize_t mtd_erase(struct cdev *cdev, size_t count, loff_t offset)
- {
- struct mtd_info *mtd = cdev->priv;
- struct erase_info erase;
-diff --git a/drivers/mtd/mtdoob.c b/drivers/mtd/mtdoob.c
-index be656a4..e4dd1a0 100644
---- a/drivers/mtd/mtdoob.c
-+++ b/drivers/mtd/mtdoob.c
-@@ -38,11 +38,12 @@ static struct mtd_info *to_mtd(struct cdev *cdev)
- }
-
- static ssize_t mtd_read_oob(struct cdev *cdev, void *buf, size_t count,
-- ulong offset, ulong flags)
-+ loff_t _offset, ulong flags)
- {
- struct mtd_info *mtd = to_mtd(cdev);
- struct mtd_oob_ops ops;
- int ret;
-+ unsigned long offset = _offset;
-
- if (count < mtd->oobsize)
- return -EINVAL;
-diff --git a/drivers/mtd/mtdraw.c b/drivers/mtd/mtdraw.c
-index 7abe235..24f7358 100644
---- a/drivers/mtd/mtdraw.c
-+++ b/drivers/mtd/mtdraw.c
-@@ -116,12 +116,13 @@ err:
- }
-
- static ssize_t mtdraw_read(struct cdev *cdev, void *buf, size_t count,
-- ulong offset, ulong flags)
-+ loff_t _offset, ulong flags)
- {
- struct mtd_info *mtd = to_mtd(cdev);
- ssize_t retlen = 0, ret = 1, toread;
- ulong numpage;
- int skip;
-+ unsigned long offset = _offset;
-
- numpage = offset / (mtd->writesize + mtd->oobsize);
- skip = offset % (mtd->writesize + mtd->oobsize);
-@@ -167,13 +168,14 @@ static void mtdraw_fillbuf(struct mtdraw *mtdraw, const void *src, int nbbytes)
- }
-
- static ssize_t mtdraw_write(struct cdev *cdev, const void *buf, size_t count,
-- ulong offset, ulong flags)
-+ loff_t _offset, ulong flags)
- {
- struct mtdraw *mtdraw = to_mtdraw(cdev);
- struct mtd_info *mtd = to_mtd(cdev);
- int bsz = mtd->writesize + mtd->oobsize;
- ulong numpage;
- size_t retlen = 0, tofill;
-+ unsigned long offset = _offset;
- int ret = 0;
-
- if (mtdraw->write_fill &&
-@@ -220,10 +222,11 @@ static ssize_t mtdraw_write(struct cdev *cdev, const void *buf, size_t count,
- }
- }
-
--static ssize_t mtdraw_erase(struct cdev *cdev, size_t count, ulong offset)
-+static ssize_t mtdraw_erase(struct cdev *cdev, size_t count, loff_t _offset)
- {
- struct mtd_info *mtd = to_mtd(cdev);
- struct erase_info erase;
-+ unsigned long offset = _offset;
- int ret;
-
- offset = offset / (mtd->writesize + mtd->oobsize) * mtd->writesize;
-diff --git a/drivers/mtd/nand/Kconfig b/drivers/mtd/nand/Kconfig
-index 926a64b..3f90643 100644
---- a/drivers/mtd/nand/Kconfig
-+++ b/drivers/mtd/nand/Kconfig
-@@ -53,6 +53,11 @@ config NAND_IMX
- prompt "i.MX NAND driver"
- depends on ARCH_IMX
-
-+config NAND_MXS
-+ bool
-+ prompt "i.MX23/28 NAND driver"
-+ depends on MXS_APBH_DMA
-+
- config NAND_OMAP_GPMC
- tristate "NAND Flash Support for GPMC based OMAP platforms"
- depends on OMAP_GPMC
-diff --git a/drivers/mtd/nand/Makefile b/drivers/mtd/nand/Makefile
-index 5c6d8b3..1dcfb76 100644
---- a/drivers/mtd/nand/Makefile
-+++ b/drivers/mtd/nand/Makefile
-@@ -15,3 +15,4 @@ obj-$(CONFIG_NAND_IMX) += nand_imx.o
- obj-$(CONFIG_NAND_OMAP_GPMC) += nand_omap_gpmc.o nand_omap_bch_decoder.o
- obj-$(CONFIG_NAND_ATMEL) += atmel_nand.o
- obj-$(CONFIG_NAND_S3C24XX) += nand_s3c24xx.o
-+obj-$(CONFIG_NAND_MXS) += nand_mxs.o
-diff --git a/drivers/mtd/nand/nand-bb.c b/drivers/mtd/nand/nand-bb.c
-index bd30438..519337e 100644
---- a/drivers/mtd/nand/nand-bb.c
-+++ b/drivers/mtd/nand/nand-bb.c
-@@ -42,9 +42,9 @@ struct nand_bb {
-
- struct mtd_info_user info;
-
-- size_t raw_size;
-- size_t size;
-- off_t offset;
-+ loff_t raw_size;
-+ loff_t size;
-+ loff_t offset;
- unsigned long flags;
- void *writebuf;
-
-@@ -54,27 +54,27 @@ struct nand_bb {
- };
-
- static ssize_t nand_bb_read(struct cdev *cdev, void *buf, size_t count,
-- unsigned long offset, ulong flags)
-+ loff_t offset, ulong flags)
- {
- struct nand_bb *bb = cdev->priv;
- struct cdev *parent = bb->cdev_parent;
- int ret, bytes = 0, now;
-
-- debug("%s %d %d\n", __func__, offset, count);
-+ debug("%s 0x%08llx %d\n", __func__, offset, count);
-
- while(count) {
-- ret = cdev_ioctl(parent, MEMGETBADBLOCK, (void *)bb->offset);
-+ ret = cdev_ioctl(parent, MEMGETBADBLOCK, &bb->offset);
- if (ret < 0)
- return ret;
-
- if (ret) {
-- printf("skipping bad block at 0x%08lx\n", bb->offset);
-+ printf("skipping bad block at 0x%08llx\n", bb->offset);
- bb->offset += bb->info.erasesize;
- continue;
- }
-
- now = min(count, (size_t)(bb->info.erasesize -
-- (bb->offset % bb->info.erasesize)));
-+ ((size_t)bb->offset % bb->info.erasesize)));
- ret = cdev_read(parent, buf, now, bb->offset, 0);
- if (ret < 0)
- return ret;
-@@ -96,15 +96,15 @@ static int nand_bb_write_buf(struct nand_bb *bb, size_t count)
- int ret, now;
- struct cdev *parent = bb->cdev_parent;
- void *buf = bb->writebuf;
-- int cur_ofs = bb->offset & ~(BB_WRITEBUF_SIZE - 1);
-+ loff_t cur_ofs = bb->offset & ~(BB_WRITEBUF_SIZE - 1);
-
- while (count) {
-- ret = cdev_ioctl(parent, MEMGETBADBLOCK, (void *)cur_ofs);
-+ ret = cdev_ioctl(parent, MEMGETBADBLOCK, &cur_ofs);
- if (ret < 0)
- return ret;
-
- if (ret) {
-- debug("skipping bad block at 0x%08x\n", cur_ofs);
-+ debug("skipping bad block at 0x%08llx\n", cur_ofs);
- bb->offset += bb->info.erasesize;
- cur_ofs += bb->info.erasesize;
- continue;
-@@ -123,12 +123,12 @@ static int nand_bb_write_buf(struct nand_bb *bb, size_t count)
- }
-
- static ssize_t nand_bb_write(struct cdev *cdev, const void *buf, size_t count,
-- unsigned long offset, ulong flags)
-+ loff_t offset, ulong flags)
- {
- struct nand_bb *bb = cdev->priv;
- int bytes = count, now, wroffs, ret;
-
-- debug("%s offset: 0x%08x count: 0x%08x\n", __func__, offset, count);
-+ debug("%s offset: 0x%08llx count: 0x%08x\n", __func__, offset, count);
-
- while (count) {
- wroffs = bb->offset % BB_WRITEBUF_SIZE;
-@@ -152,7 +152,7 @@ static ssize_t nand_bb_write(struct cdev *cdev, const void *buf, size_t count,
- return bytes;
- }
-
--static int nand_bb_erase(struct cdev *cdev, size_t count, unsigned long offset)
-+static int nand_bb_erase(struct cdev *cdev, size_t count, loff_t offset)
- {
- struct nand_bb *bb = cdev->priv;
-
-@@ -197,11 +197,11 @@ static int nand_bb_close(struct cdev *cdev)
-
- static int nand_bb_calc_size(struct nand_bb *bb)
- {
-- ulong pos = 0;
-+ loff_t pos = 0;
- int ret;
-
- while (pos < bb->raw_size) {
-- ret = cdev_ioctl(bb->cdev_parent, MEMGETBADBLOCK, (void *)pos);
-+ ret = cdev_ioctl(bb->cdev_parent, MEMGETBADBLOCK, &pos);
- if (ret < 0)
- return ret;
- if (!ret)
-@@ -213,10 +213,10 @@ static int nand_bb_calc_size(struct nand_bb *bb)
- return 0;
- }
-
--static off_t nand_bb_lseek(struct cdev *cdev, off_t __offset)
-+static loff_t nand_bb_lseek(struct cdev *cdev, loff_t __offset)
- {
- struct nand_bb *bb = cdev->priv;
-- unsigned long raw_pos = 0;
-+ loff_t raw_pos = 0;
- uint32_t offset = __offset;
- int ret;
-
-@@ -226,7 +226,7 @@ static off_t nand_bb_lseek(struct cdev *cdev, off_t __offset)
- while (raw_pos < bb->raw_size) {
- off_t now = min(offset, bb->info.erasesize);
-
-- ret = cdev_ioctl(bb->cdev_parent, MEMGETBADBLOCK, (void *)raw_pos);
-+ ret = cdev_ioctl(bb->cdev_parent, MEMGETBADBLOCK, &raw_pos);
- if (ret < 0)
- return ret;
- if (!ret) {
-diff --git a/drivers/mtd/nand/nand_mxs.c b/drivers/mtd/nand/nand_mxs.c
-new file mode 100644
-index 0000000..ba49287
---- /dev/null
-+++ b/drivers/mtd/nand/nand_mxs.c
-@@ -0,0 +1,1258 @@
-+/*
-+ * Freescale i.MX28 NAND flash driver
-+ *
-+ * Copyright (C) 2011 Wolfram Sang <w.sang@pengutronix.de>
-+ *
-+ * Copyright (C) 2011 Marek Vasut <marek.vasut@gmail.com>
-+ * on behalf of DENX Software Engineering GmbH
-+ *
-+ * Based on code from LTIB:
-+ * Freescale GPMI NFC NAND Flash Driver
-+ *
-+ * Copyright (C) 2010 Freescale Semiconductor, Inc.
-+ * Copyright (C) 2008 Embedded Alley Solutions, 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.
-+ */
-+
-+#include <linux/mtd/mtd.h>
-+#include <linux/mtd/nand.h>
-+#include <linux/types.h>
-+#include <common.h>
-+#include <malloc.h>
-+#include <errno.h>
-+#include <driver.h>
-+#include <init.h>
-+#include <asm/mmu.h>
-+#include <asm/io.h>
-+#include <mach/clock.h>
-+#include <mach/imx-regs.h>
-+#include <mach/dma.h>
-+#include <mach/mxs.h>
-+
-+#define MX28_BLOCK_SFTRST (1 << 31)
-+#define MX28_BLOCK_CLKGATE (1 << 30)
-+
-+#define GPMI_CTRL0 0x00000000
-+#define GPMI_CTRL0_RUN (1 << 29)
-+#define GPMI_CTRL0_DEV_IRQ_EN (1 << 28)
-+/* Disable for now since we don't need it and it is different on MX23.
-+#define GPMI_CTRL0_LOCK_CS (1 << 27)
-+*/
-+#define GPMI_CTRL0_UDMA (1 << 26)
-+#define GPMI_CTRL0_COMMAND_MODE_MASK (0x3 << 24)
-+#define GPMI_CTRL0_COMMAND_MODE_OFFSET 24
-+#define GPMI_CTRL0_COMMAND_MODE_WRITE (0x0 << 24)
-+#define GPMI_CTRL0_COMMAND_MODE_READ (0x1 << 24)
-+#define GPMI_CTRL0_COMMAND_MODE_READ_AND_COMPARE (0x2 << 24)
-+#define GPMI_CTRL0_COMMAND_MODE_WAIT_FOR_READY (0x3 << 24)
-+#define GPMI_CTRL0_WORD_LENGTH (1 << 23)
-+/* Careful: Is 0x3 on MX23
-+#define GPMI_CTRL0_CS_MASK (0x7 << 20)
-+*/
-+#define GPMI_CTRL0_CS_OFFSET 20
-+#define GPMI_CTRL0_ADDRESS_MASK (0x7 << 17)
-+#define GPMI_CTRL0_ADDRESS_OFFSET 17
-+#define GPMI_CTRL0_ADDRESS_NAND_DATA (0x0 << 17)
-+#define GPMI_CTRL0_ADDRESS_NAND_CLE (0x1 << 17)
-+#define GPMI_CTRL0_ADDRESS_NAND_ALE (0x2 << 17)
-+#define GPMI_CTRL0_ADDRESS_INCREMENT (1 << 16)
-+#define GPMI_CTRL0_XFER_COUNT_MASK 0xffff
-+#define GPMI_CTRL0_XFER_COUNT_OFFSET 0
-+
-+#define GPMI_CTRL1 0x00000060
-+#define GPMI_CTRL1_DECOUPLE_CS (1 << 24)
-+#define GPMI_CTRL1_WRN_DLY_SEL_MASK (0x3 << 22)
-+#define GPMI_CTRL1_WRN_DLY_SEL_OFFSET 22
-+#define GPMI_CTRL1_TIMEOUT_IRQ_EN (1 << 20)
-+#define GPMI_CTRL1_GANGED_RDYBUSY (1 << 19)
-+#define GPMI_CTRL1_BCH_MODE (1 << 18)
-+#define GPMI_CTRL1_DLL_ENABLE (1 << 17)
-+#define GPMI_CTRL1_HALF_PERIOD (1 << 16)
-+#define GPMI_CTRL1_RDN_DELAY_MASK (0xf << 12)
-+#define GPMI_CTRL1_RDN_DELAY_OFFSET 12
-+#define GPMI_CTRL1_DMA2ECC_MODE (1 << 11)
-+#define GPMI_CTRL1_DEV_IRQ (1 << 10)
-+#define GPMI_CTRL1_TIMEOUT_IRQ (1 << 9)
-+#define GPMI_CTRL1_BURST_EN (1 << 8)
-+#define GPMI_CTRL1_ABORT_WAIT_REQUEST (1 << 7)
-+#define GPMI_CTRL1_ABORT_WAIT_FOR_READY_CHANNEL_MASK (0x7 << 4)
-+#define GPMI_CTRL1_ABORT_WAIT_FOR_READY_CHANNEL_OFFSET 4
-+#define GPMI_CTRL1_DEV_RESET (1 << 3)
-+#define GPMI_CTRL1_ATA_IRQRDY_POLARITY (1 << 2)
-+#define GPMI_CTRL1_CAMERA_MODE (1 << 1)
-+#define GPMI_CTRL1_GPMI_MODE (1 << 0)
-+
-+#define GPMI_ECCCTRL_HANDLE_MASK (0xffff << 16)
-+#define GPMI_ECCCTRL_HANDLE_OFFSET 16
-+#define GPMI_ECCCTRL_ECC_CMD_MASK (0x3 << 13)
-+#define GPMI_ECCCTRL_ECC_CMD_OFFSET 13
-+#define GPMI_ECCCTRL_ECC_CMD_DECODE (0x0 << 13)
-+#define GPMI_ECCCTRL_ECC_CMD_ENCODE (0x1 << 13)
-+#define GPMI_ECCCTRL_ENABLE_ECC (1 << 12)
-+#define GPMI_ECCCTRL_BUFFER_MASK_MASK 0x1ff
-+#define GPMI_ECCCTRL_BUFFER_MASK_OFFSET 0
-+#define GPMI_ECCCTRL_BUFFER_MASK_BCH_AUXONLY 0x100
-+#define GPMI_ECCCTRL_BUFFER_MASK_BCH_PAGE 0x1ff
-+
-+#define GPMI_STAT 0x000000b0
-+#define GPMI_STAT_READY_BUSY_OFFSET 24
-+
-+#define GPMI_DEBUG 0x000000c0
-+#define GPMI_DEBUG_READY0_OFFSET 28
-+
-+#define GPMI_VERSION 0x000000d0
-+#define GPMI_VERSION_MINOR_OFFSET 16
-+#define GPMI_VERSION_TYPE_MX23 0x0300
-+
-+#define BCH_CTRL 0x00000000
-+#define BCH_CTRL_COMPLETE_IRQ (1 << 0)
-+#define BCH_CTRL_COMPLETE_IRQ_EN (1 << 8)
-+
-+#define BCH_LAYOUTSELECT 0x00000070
-+
-+#define BCH_FLASH0LAYOUT0 0x00000080
-+#define BCH_FLASHLAYOUT0_NBLOCKS_MASK (0xff << 24)
-+#define BCH_FLASHLAYOUT0_NBLOCKS_OFFSET 24
-+#define BCH_FLASHLAYOUT0_META_SIZE_MASK (0xff << 16)
-+#define BCH_FLASHLAYOUT0_META_SIZE_OFFSET 16
-+#define BCH_FLASHLAYOUT0_ECC0_MASK (0xf << 12)
-+#define BCH_FLASHLAYOUT0_ECC0_OFFSET 12
-+
-+#define BCH_FLASH0LAYOUT1 0x00000090
-+#define BCH_FLASHLAYOUT1_PAGE_SIZE_MASK (0xffff << 16)
-+#define BCH_FLASHLAYOUT1_PAGE_SIZE_OFFSET 16
-+#define BCH_FLASHLAYOUT1_ECCN_MASK (0xf << 12)
-+#define BCH_FLASHLAYOUT1_ECCN_OFFSET 12
-+
-+#define MXS_NAND_DMA_DESCRIPTOR_COUNT 4
-+
-+#define MXS_NAND_CHUNK_DATA_CHUNK_SIZE 512
-+#define MXS_NAND_METADATA_SIZE 10
-+
-+#define MXS_NAND_COMMAND_BUFFER_SIZE 32
-+
-+#define MXS_NAND_BCH_TIMEOUT 10000
-+
-+struct mxs_nand_info {
-+ struct nand_chip nand_chip;
-+ void __iomem *io_base;
-+ struct mtd_info mtd;
-+ u32 version;
-+
-+ int cur_chip;
-+
-+ uint32_t cmd_queue_len;
-+
-+ uint8_t *cmd_buf;
-+ uint8_t *data_buf;
-+ uint8_t *oob_buf;
-+
-+ uint8_t marking_block_bad;
-+ uint8_t raw_oob_mode;
-+
-+ /* Functions with altered behaviour */
-+ int (*hooked_read_oob)(struct mtd_info *mtd,
-+ loff_t from, struct mtd_oob_ops *ops);
-+ int (*hooked_write_oob)(struct mtd_info *mtd,
-+ loff_t to, struct mtd_oob_ops *ops);
-+ int (*hooked_block_markbad)(struct mtd_info *mtd,
-+ loff_t ofs);
-+
-+ /* DMA descriptors */
-+ struct mxs_dma_desc **desc;
-+ uint32_t desc_index;
-+};
-+
-+struct nand_ecclayout fake_ecc_layout;
-+
-+static struct mxs_dma_desc *mxs_nand_get_dma_desc(struct mxs_nand_info *info)
-+{
-+ struct mxs_dma_desc *desc;
-+
-+ if (info->desc_index >= MXS_NAND_DMA_DESCRIPTOR_COUNT) {
-+ printf("MXS NAND: Too many DMA descriptors requested\n");
-+ return NULL;
-+ }
-+
-+ desc = info->desc[info->desc_index];
-+ info->desc_index++;
-+
-+ return desc;
-+}
-+
-+static void mxs_nand_return_dma_descs(struct mxs_nand_info *info)
-+{
-+ int i;
-+ struct mxs_dma_desc *desc;
-+
-+ for (i = 0; i < info->desc_index; i++) {
-+ desc = info->desc[i];
-+ memset(desc, 0, sizeof(struct mxs_dma_desc));
-+ desc->address = (dma_addr_t)desc;
-+ }
-+
-+ info->desc_index = 0;
-+}
-+
-+static uint32_t mxs_nand_ecc_chunk_cnt(uint32_t page_data_size)
-+{
-+ return page_data_size / MXS_NAND_CHUNK_DATA_CHUNK_SIZE;
-+}
-+
-+static uint32_t mxs_nand_ecc_size_in_bits(uint32_t ecc_strength)
-+{
-+ return ecc_strength * 13;
-+}
-+
-+static uint32_t mxs_nand_aux_status_offset(void)
-+{
-+ return (MXS_NAND_METADATA_SIZE + 0x3) & ~0x3;
-+}
-+
-+static inline uint32_t mxs_nand_get_ecc_strength(uint32_t page_data_size,
-+ uint32_t page_oob_size)
-+{
-+ if (page_data_size == 2048)
-+ return 8;
-+
-+ if (page_data_size == 4096) {
-+ if (page_oob_size == 128)
-+ return 8;
-+
-+ if (page_oob_size == 218)
-+ return 16;
-+ }
-+
-+ return 0;
-+}
-+
-+static inline uint32_t mxs_nand_get_mark_offset(uint32_t page_data_size,
-+ uint32_t ecc_strength)
-+{
-+ uint32_t chunk_data_size_in_bits;
-+ uint32_t chunk_ecc_size_in_bits;
-+ uint32_t chunk_total_size_in_bits;
-+ uint32_t block_mark_chunk_number;
-+ uint32_t block_mark_chunk_bit_offset;
-+ uint32_t block_mark_bit_offset;
-+
-+ chunk_data_size_in_bits = MXS_NAND_CHUNK_DATA_CHUNK_SIZE * 8;
-+ chunk_ecc_size_in_bits = mxs_nand_ecc_size_in_bits(ecc_strength);
-+
-+ chunk_total_size_in_bits =
-+ chunk_data_size_in_bits + chunk_ecc_size_in_bits;
-+
-+ /* Compute the bit offset of the block mark within the physical page. */
-+ block_mark_bit_offset = page_data_size * 8;
-+
-+ /* Subtract the metadata bits. */
-+ block_mark_bit_offset -= MXS_NAND_METADATA_SIZE * 8;
-+
-+ /*
-+ * Compute the chunk number (starting at zero) in which the block mark
-+ * appears.
-+ */
-+ block_mark_chunk_number =
-+ block_mark_bit_offset / chunk_total_size_in_bits;
-+
-+ /*
-+ * Compute the bit offset of the block mark within its chunk, and
-+ * validate it.
-+ */
-+ block_mark_chunk_bit_offset = block_mark_bit_offset -
-+ (block_mark_chunk_number * chunk_total_size_in_bits);
-+
-+ if (block_mark_chunk_bit_offset > chunk_data_size_in_bits)
-+ return 1;
-+
-+ /*
-+ * Now that we know the chunk number in which the block mark appears,
-+ * we can subtract all the ECC bits that appear before it.
-+ */
-+ block_mark_bit_offset -=
-+ block_mark_chunk_number * chunk_ecc_size_in_bits;
-+
-+ return block_mark_bit_offset;
-+}
-+
-+static uint32_t mxs_nand_mark_byte_offset(struct mtd_info *mtd)
-+{
-+ uint32_t ecc_strength;
-+ ecc_strength = mxs_nand_get_ecc_strength(mtd->writesize, mtd->oobsize);
-+ return mxs_nand_get_mark_offset(mtd->writesize, ecc_strength) >> 3;
-+}
-+
-+static uint32_t mxs_nand_mark_bit_offset(struct mtd_info *mtd)
-+{
-+ uint32_t ecc_strength;
-+ ecc_strength = mxs_nand_get_ecc_strength(mtd->writesize, mtd->oobsize);
-+ return mxs_nand_get_mark_offset(mtd->writesize, ecc_strength) & 0x7;
-+}
-+
-+/*
-+ * Wait for BCH complete IRQ and clear the IRQ
-+ */
-+static int mxs_nand_wait_for_bch_complete(void)
-+{
-+ void __iomem *bch_regs = (void __iomem *)MXS_BCH_BASE;
-+ int timeout = MXS_NAND_BCH_TIMEOUT;
-+ int ret;
-+
-+ while (--timeout) {
-+ if (readl(bch_regs + BCH_CTRL) & BCH_CTRL_COMPLETE_IRQ)
-+ break;
-+ udelay(1);
-+ }
-+
-+ ret = (timeout == 0) ? -ETIMEDOUT : 0;
-+
-+ writel(BCH_CTRL_COMPLETE_IRQ, bch_regs + BCH_CTRL + BIT_CLR);
-+
-+ return ret;
-+}
-+
-+/*
-+ * This is the function that we install in the cmd_ctrl function pointer of the
-+ * owning struct nand_chip. The only functions in the reference implementation
-+ * that use these functions pointers are cmdfunc and select_chip.
-+ *
-+ * In this driver, we implement our own select_chip, so this function will only
-+ * be called by the reference implementation's cmdfunc. For this reason, we can
-+ * ignore the chip enable bit and concentrate only on sending bytes to the NAND
-+ * Flash.
-+ */
-+static void mxs_nand_cmd_ctrl(struct mtd_info *mtd, int data, unsigned int ctrl)
-+{
-+ struct nand_chip *nand = mtd->priv;
-+ struct mxs_nand_info *nand_info = nand->priv;
-+ struct mxs_dma_desc *d;
-+ uint32_t channel = MXS_DMA_CHANNEL_AHB_APBH_GPMI0 + nand_info->cur_chip;
-+ int ret;
-+
-+ /*
-+ * If this condition is true, something is _VERY_ wrong in MTD
-+ * subsystem!
-+ */
-+ if (nand_info->cmd_queue_len == MXS_NAND_COMMAND_BUFFER_SIZE) {
-+ printf("MXS NAND: Command queue too long\n");
-+ return;
-+ }
-+
-+ /*
-+ * Every operation begins with a command byte and a series of zero or
-+ * more address bytes. These are distinguished by either the Address
-+ * Latch Enable (ALE) or Command Latch Enable (CLE) signals being
-+ * asserted. When MTD is ready to execute the command, it will
-+ * deasert both latch enables.
-+ *
-+ * Rather than run a separate DMA operation for every single byte, we
-+ * queue them up and run a single DMA operation for the entire series
-+ * of command and data bytes.
-+ */
-+ if (ctrl & (NAND_ALE | NAND_CLE)) {
-+ if (data != NAND_CMD_NONE)
-+ nand_info->cmd_buf[nand_info->cmd_queue_len++] = data;
-+ return;
-+ }
-+
-+ /*
-+ * If control arrives here, MTD has deasserted both the ALE and CLE,
-+ * which means it's ready to run an operation. Check if we have any
-+ * bytes to send.
-+ */
-+ if (nand_info->cmd_queue_len == 0)
-+ return;
-+
-+ /* Compile the DMA descriptor -- a descriptor that sends command. */
-+ d = mxs_nand_get_dma_desc(nand_info);
-+ d->cmd.data =
-+ MXS_DMA_DESC_COMMAND_DMA_READ | MXS_DMA_DESC_IRQ |
-+ MXS_DMA_DESC_CHAIN | MXS_DMA_DESC_DEC_SEM |
-+ MXS_DMA_DESC_WAIT4END | (3 << MXS_DMA_DESC_PIO_WORDS_OFFSET) |
-+ (nand_info->cmd_queue_len << MXS_DMA_DESC_BYTES_OFFSET);
-+
-+ d->cmd.address = (dma_addr_t)nand_info->cmd_buf;
-+
-+ d->cmd.pio_words[0] =
-+ GPMI_CTRL0_COMMAND_MODE_WRITE |
-+ GPMI_CTRL0_WORD_LENGTH |
-+ (nand_info->cur_chip << GPMI_CTRL0_CS_OFFSET) |
-+ GPMI_CTRL0_ADDRESS_NAND_CLE |
-+ GPMI_CTRL0_ADDRESS_INCREMENT |
-+ nand_info->cmd_queue_len;
-+
-+ mxs_dma_desc_append(channel, d);
-+
-+ /* Execute the DMA chain. */
-+ ret = mxs_dma_go(channel);
-+ if (ret)
-+ printf("MXS NAND: Error sending command\n");
-+
-+ mxs_nand_return_dma_descs(nand_info);
-+
-+ /* Reset the command queue. */
-+ nand_info->cmd_queue_len = 0;
-+}
-+
-+/*
-+ * Test if the NAND flash is ready.
-+ */
-+static int mxs_nand_device_ready(struct mtd_info *mtd)
-+{
-+ struct nand_chip *chip = mtd->priv;
-+ struct mxs_nand_info *nand_info = chip->priv;
-+ void __iomem *gpmi_regs = (void *)MXS_GPMI_BASE;
-+ uint32_t tmp;
-+
-+ if (nand_info->version > GPMI_VERSION_TYPE_MX23) {
-+ tmp = readl(gpmi_regs + GPMI_STAT);
-+ tmp >>= (GPMI_STAT_READY_BUSY_OFFSET + nand_info->cur_chip);
-+ } else {
-+ tmp = readl(gpmi_regs + GPMI_DEBUG);
-+ tmp >>= (GPMI_DEBUG_READY0_OFFSET + nand_info->cur_chip);
-+ }
-+ return tmp & 1;
-+}
-+
-+/*
-+ * Select the NAND chip.
-+ */
-+static void mxs_nand_select_chip(struct mtd_info *mtd, int chip)
-+{
-+ struct nand_chip *nand = mtd->priv;
-+ struct mxs_nand_info *nand_info = nand->priv;
-+
-+ nand_info->cur_chip = chip;
-+}
-+
-+/*
-+ * Handle block mark swapping.
-+ *
-+ * Note that, when this function is called, it doesn't know whether it's
-+ * swapping the block mark, or swapping it *back* -- but it doesn't matter
-+ * because the the operation is the same.
-+ */
-+static void mxs_nand_swap_block_mark(struct mtd_info *mtd,
-+ uint8_t *data_buf, uint8_t *oob_buf)
-+{
-+ struct nand_chip *chip = mtd->priv;
-+ struct mxs_nand_info *nand_info = chip->priv;
-+
-+ uint32_t bit_offset;
-+ uint32_t buf_offset;
-+
-+ uint32_t src;
-+ uint32_t dst;
-+
-+ /* Don't do swapping on MX23 */
-+ if (nand_info->version == GPMI_VERSION_TYPE_MX23)
-+ return;
-+
-+ bit_offset = mxs_nand_mark_bit_offset(mtd);
-+ buf_offset = mxs_nand_mark_byte_offset(mtd);
-+
-+ /*
-+ * Get the byte from the data area that overlays the block mark. Since
-+ * the ECC engine applies its own view to the bits in the page, the
-+ * physical block mark won't (in general) appear on a byte boundary in
-+ * the data.
-+ */
-+ src = data_buf[buf_offset] >> bit_offset;
-+ src |= data_buf[buf_offset + 1] << (8 - bit_offset);
-+
-+ dst = oob_buf[0];
-+
-+ oob_buf[0] = src;
-+
-+ data_buf[buf_offset] &= ~(0xff << bit_offset);
-+ data_buf[buf_offset + 1] &= 0xff << bit_offset;
-+
-+ data_buf[buf_offset] |= dst << bit_offset;
-+ data_buf[buf_offset + 1] |= dst >> (8 - bit_offset);
-+}
-+
-+/*
-+ * Read data from NAND.
-+ */
-+static void mxs_nand_read_buf(struct mtd_info *mtd, uint8_t *buf, int length)
-+{
-+ struct nand_chip *nand = mtd->priv;
-+ struct mxs_nand_info *nand_info = nand->priv;
-+ struct mxs_dma_desc *d;
-+ uint32_t channel = MXS_DMA_CHANNEL_AHB_APBH_GPMI0 + nand_info->cur_chip;
-+ int ret;
-+
-+ if (length > NAND_MAX_PAGESIZE) {
-+ printf("MXS NAND: DMA buffer too big\n");
-+ return;
-+ }
-+
-+ if (!buf) {
-+ printf("MXS NAND: DMA buffer is NULL\n");
-+ return;
-+ }
-+
-+ /* Compile the DMA descriptor - a descriptor that reads data. */
-+ d = mxs_nand_get_dma_desc(nand_info);
-+ d->cmd.data =
-+ MXS_DMA_DESC_COMMAND_DMA_WRITE | MXS_DMA_DESC_IRQ |
-+ MXS_DMA_DESC_DEC_SEM | MXS_DMA_DESC_WAIT4END |
-+ (1 << MXS_DMA_DESC_PIO_WORDS_OFFSET) |
-+ (length << MXS_DMA_DESC_BYTES_OFFSET);
-+
-+ d->cmd.address = (dma_addr_t)nand_info->data_buf;
-+
-+ d->cmd.pio_words[0] =
-+ GPMI_CTRL0_COMMAND_MODE_READ |
-+ GPMI_CTRL0_WORD_LENGTH |
-+ (nand_info->cur_chip << GPMI_CTRL0_CS_OFFSET) |
-+ GPMI_CTRL0_ADDRESS_NAND_DATA |
-+ length;
-+
-+ mxs_dma_desc_append(channel, d);
-+
-+ /*
-+ * A DMA descriptor that waits for the command to end and the chip to
-+ * become ready.
-+ *
-+ * I think we actually should *not* be waiting for the chip to become
-+ * ready because, after all, we don't care. I think the original code
-+ * did that and no one has re-thought it yet.
-+ */
-+ d = mxs_nand_get_dma_desc(nand_info);
-+ d->cmd.data =
-+ MXS_DMA_DESC_COMMAND_NO_DMAXFER | MXS_DMA_DESC_IRQ |
-+ MXS_DMA_DESC_NAND_WAIT_4_READY | MXS_DMA_DESC_DEC_SEM |
-+ MXS_DMA_DESC_WAIT4END | (4 << MXS_DMA_DESC_PIO_WORDS_OFFSET);
-+
-+ d->cmd.address = 0;
-+
-+ d->cmd.pio_words[0] =
-+ GPMI_CTRL0_COMMAND_MODE_WAIT_FOR_READY |
-+ GPMI_CTRL0_WORD_LENGTH |
-+ (nand_info->cur_chip << GPMI_CTRL0_CS_OFFSET) |
-+ GPMI_CTRL0_ADDRESS_NAND_DATA;
-+
-+ mxs_dma_desc_append(channel, d);
-+
-+ /* Execute the DMA chain. */
-+ ret = mxs_dma_go(channel);
-+ if (ret) {
-+ printf("MXS NAND: DMA read error\n");
-+ goto rtn;
-+ }
-+
-+ memcpy(buf, nand_info->data_buf, length);
-+
-+rtn:
-+ mxs_nand_return_dma_descs(nand_info);
-+}
-+
-+/*
-+ * Write data to NAND.
-+ */
-+static void mxs_nand_write_buf(struct mtd_info *mtd, const uint8_t *buf,
-+ int length)
-+{
-+ struct nand_chip *nand = mtd->priv;
-+ struct mxs_nand_info *nand_info = nand->priv;
-+ struct mxs_dma_desc *d;
-+ uint32_t channel = MXS_DMA_CHANNEL_AHB_APBH_GPMI0 + nand_info->cur_chip;
-+ int ret;
-+
-+ if (length > NAND_MAX_PAGESIZE) {
-+ printf("MXS NAND: DMA buffer too big\n");
-+ return;
-+ }
-+
-+ if (!buf) {
-+ printf("MXS NAND: DMA buffer is NULL\n");
-+ return;
-+ }
-+
-+ memcpy(nand_info->data_buf, buf, length);
-+
-+ /* Compile the DMA descriptor - a descriptor that writes data. */
-+ d = mxs_nand_get_dma_desc(nand_info);
-+ d->cmd.data =
-+ MXS_DMA_DESC_COMMAND_DMA_READ | MXS_DMA_DESC_IRQ |
-+ MXS_DMA_DESC_DEC_SEM | MXS_DMA_DESC_WAIT4END |
-+ (4 << MXS_DMA_DESC_PIO_WORDS_OFFSET) |
-+ (length << MXS_DMA_DESC_BYTES_OFFSET);
-+
-+ d->cmd.address = (dma_addr_t)nand_info->data_buf;
-+
-+ d->cmd.pio_words[0] =
-+ GPMI_CTRL0_COMMAND_MODE_WRITE |
-+ GPMI_CTRL0_WORD_LENGTH |
-+ (nand_info->cur_chip << GPMI_CTRL0_CS_OFFSET) |
-+ GPMI_CTRL0_ADDRESS_NAND_DATA |
-+ length;
-+
-+ mxs_dma_desc_append(channel, d);
-+
-+ /* Execute the DMA chain. */
-+ ret = mxs_dma_go(channel);
-+ if (ret)
-+ printf("MXS NAND: DMA write error\n");
-+
-+ mxs_nand_return_dma_descs(nand_info);
-+}
-+
-+/*
-+ * Read a single byte from NAND.
-+ */
-+static uint8_t mxs_nand_read_byte(struct mtd_info *mtd)
-+{
-+ uint8_t buf;
-+ mxs_nand_read_buf(mtd, &buf, 1);
-+ return buf;
-+}
-+
-+/*
-+ * Read a page from NAND.
-+ */
-+static int mxs_nand_ecc_read_page(struct mtd_info *mtd, struct nand_chip *nand,
-+ uint8_t *buf)
-+{
-+ struct mxs_nand_info *nand_info = nand->priv;
-+ struct mxs_dma_desc *d;
-+ uint32_t channel = MXS_DMA_CHANNEL_AHB_APBH_GPMI0 + nand_info->cur_chip;
-+ uint32_t corrected = 0, failed = 0;
-+ uint8_t *status;
-+ int i, ret;
-+
-+ /* Compile the DMA descriptor - wait for ready. */
-+ d = mxs_nand_get_dma_desc(nand_info);
-+ d->cmd.data =
-+ MXS_DMA_DESC_COMMAND_NO_DMAXFER | MXS_DMA_DESC_CHAIN |
-+ MXS_DMA_DESC_NAND_WAIT_4_READY | MXS_DMA_DESC_WAIT4END |
-+ (1 << MXS_DMA_DESC_PIO_WORDS_OFFSET);
-+
-+ d->cmd.address = 0;
-+
-+ d->cmd.pio_words[0] =
-+ GPMI_CTRL0_COMMAND_MODE_WAIT_FOR_READY |
-+ GPMI_CTRL0_WORD_LENGTH |
-+ (nand_info->cur_chip << GPMI_CTRL0_CS_OFFSET) |
-+ GPMI_CTRL0_ADDRESS_NAND_DATA;
-+
-+ mxs_dma_desc_append(channel, d);
-+
-+ /* Compile the DMA descriptor - enable the BCH block and read. */
-+ d = mxs_nand_get_dma_desc(nand_info);
-+ d->cmd.data =
-+ MXS_DMA_DESC_COMMAND_NO_DMAXFER | MXS_DMA_DESC_CHAIN |
-+ MXS_DMA_DESC_WAIT4END | (6 << MXS_DMA_DESC_PIO_WORDS_OFFSET);
-+
-+ d->cmd.address = 0;
-+
-+ d->cmd.pio_words[0] =
-+ GPMI_CTRL0_COMMAND_MODE_READ |
-+ GPMI_CTRL0_WORD_LENGTH |
-+ (nand_info->cur_chip << GPMI_CTRL0_CS_OFFSET) |
-+ GPMI_CTRL0_ADDRESS_NAND_DATA |
-+ (mtd->writesize + mtd->oobsize);
-+ d->cmd.pio_words[1] = 0;
-+ d->cmd.pio_words[2] =
-+ GPMI_ECCCTRL_ENABLE_ECC |
-+ GPMI_ECCCTRL_ECC_CMD_DECODE |
-+ GPMI_ECCCTRL_BUFFER_MASK_BCH_PAGE;
-+ d->cmd.pio_words[3] = mtd->writesize + mtd->oobsize;
-+ d->cmd.pio_words[4] = (dma_addr_t)nand_info->data_buf;
-+ d->cmd.pio_words[5] = (dma_addr_t)nand_info->oob_buf;
-+
-+ mxs_dma_desc_append(channel, d);
-+
-+ /* Compile the DMA descriptor - disable the BCH block. */
-+ d = mxs_nand_get_dma_desc(nand_info);
-+ d->cmd.data =
-+ MXS_DMA_DESC_COMMAND_NO_DMAXFER | MXS_DMA_DESC_CHAIN |
-+ MXS_DMA_DESC_NAND_WAIT_4_READY | MXS_DMA_DESC_WAIT4END |
-+ (3 << MXS_DMA_DESC_PIO_WORDS_OFFSET);
-+
-+ d->cmd.address = 0;
-+
-+ d->cmd.pio_words[0] =
-+ GPMI_CTRL0_COMMAND_MODE_WAIT_FOR_READY |
-+ GPMI_CTRL0_WORD_LENGTH |
-+ (nand_info->cur_chip << GPMI_CTRL0_CS_OFFSET) |
-+ GPMI_CTRL0_ADDRESS_NAND_DATA |
-+ (mtd->writesize + mtd->oobsize);
-+ d->cmd.pio_words[1] = 0;
-+ d->cmd.pio_words[2] = 0;
-+
-+ mxs_dma_desc_append(channel, d);
-+
-+ /* Compile the DMA descriptor - deassert the NAND lock and interrupt. */
-+ d = mxs_nand_get_dma_desc(nand_info);
-+ d->cmd.data =
-+ MXS_DMA_DESC_COMMAND_NO_DMAXFER | MXS_DMA_DESC_IRQ |
-+ MXS_DMA_DESC_DEC_SEM;
-+
-+ d->cmd.address = 0;
-+
-+ mxs_dma_desc_append(channel, d);
-+
-+ /* Execute the DMA chain. */
-+ ret = mxs_dma_go(channel);
-+ if (ret) {
-+ printf("MXS NAND: DMA read error\n");
-+ goto rtn;
-+ }
-+
-+ ret = mxs_nand_wait_for_bch_complete();
-+ if (ret) {
-+ printf("MXS NAND: BCH read timeout\n");
-+ goto rtn;
-+ }
-+
-+ /* Read DMA completed, now do the mark swapping. */
-+ mxs_nand_swap_block_mark(mtd, nand_info->data_buf, nand_info->oob_buf);
-+
-+ /* Loop over status bytes, accumulating ECC status. */
-+ status = nand_info->oob_buf + mxs_nand_aux_status_offset();
-+ for (i = 0; i < mxs_nand_ecc_chunk_cnt(mtd->writesize); i++) {
-+ if (status[i] == 0x00)
-+ continue;
-+
-+ if (status[i] == 0xff)
-+ continue;
-+
-+ if (status[i] == 0xfe) {
-+ failed++;
-+ continue;
-+ }
-+
-+ corrected += status[i];
-+ }
-+
-+ /* Propagate ECC status to the owning MTD. */
-+ mtd->ecc_stats.failed += failed;
-+ mtd->ecc_stats.corrected += corrected;
-+
-+ /*
-+ * It's time to deliver the OOB bytes. See mxs_nand_ecc_read_oob() for
-+ * details about our policy for delivering the OOB.
-+ *
-+ * We fill the caller's buffer with set bits, and then copy the block
-+ * mark to the caller's buffer. Note that, if block mark swapping was
-+ * necessary, it has already been done, so we can rely on the first
-+ * byte of the auxiliary buffer to contain the block mark.
-+ */
-+ memset(nand->oob_poi, 0xff, mtd->oobsize);
-+
-+ nand->oob_poi[0] = nand_info->oob_buf[0];
-+
-+ memcpy(buf, nand_info->data_buf, mtd->writesize);
-+
-+rtn:
-+ mxs_nand_return_dma_descs(nand_info);
-+
-+ return ret;
-+}
-+
-+/*
-+ * Write a page to NAND.
-+ */
-+static void mxs_nand_ecc_write_page(struct mtd_info *mtd,
-+ struct nand_chip *nand, const uint8_t *buf)
-+{
-+ struct mxs_nand_info *nand_info = nand->priv;
-+ struct mxs_dma_desc *d;
-+ uint32_t channel = MXS_DMA_CHANNEL_AHB_APBH_GPMI0 + nand_info->cur_chip;
-+ int ret;
-+
-+ memcpy(nand_info->data_buf, buf, mtd->writesize);
-+ memcpy(nand_info->oob_buf, nand->oob_poi, mtd->oobsize);
-+
-+ /* Handle block mark swapping. */
-+ mxs_nand_swap_block_mark(mtd, nand_info->data_buf, nand_info->oob_buf);
-+
-+ /* Compile the DMA descriptor - write data. */
-+ d = mxs_nand_get_dma_desc(nand_info);
-+ d->cmd.data =
-+ MXS_DMA_DESC_COMMAND_NO_DMAXFER | MXS_DMA_DESC_IRQ |
-+ MXS_DMA_DESC_DEC_SEM | MXS_DMA_DESC_WAIT4END |
-+ (6 << MXS_DMA_DESC_PIO_WORDS_OFFSET);
-+
-+ d->cmd.address = 0;
-+
-+ d->cmd.pio_words[0] =
-+ GPMI_CTRL0_COMMAND_MODE_WRITE |
-+ GPMI_CTRL0_WORD_LENGTH |
-+ (nand_info->cur_chip << GPMI_CTRL0_CS_OFFSET) |
-+ GPMI_CTRL0_ADDRESS_NAND_DATA;
-+ d->cmd.pio_words[1] = 0;
-+ d->cmd.pio_words[2] =
-+ GPMI_ECCCTRL_ENABLE_ECC |
-+ GPMI_ECCCTRL_ECC_CMD_ENCODE |
-+ GPMI_ECCCTRL_BUFFER_MASK_BCH_PAGE;
-+ d->cmd.pio_words[3] = (mtd->writesize + mtd->oobsize);
-+ d->cmd.pio_words[4] = (dma_addr_t)nand_info->data_buf;
-+ d->cmd.pio_words[5] = (dma_addr_t)nand_info->oob_buf;
-+
-+ mxs_dma_desc_append(channel, d);
-+
-+ /* Execute the DMA chain. */
-+ ret = mxs_dma_go(channel);
-+ if (ret) {
-+ printf("MXS NAND: DMA write error\n");
-+ goto rtn;
-+ }
-+
-+ ret = mxs_nand_wait_for_bch_complete();
-+ if (ret) {
-+ printf("MXS NAND: BCH write timeout\n");
-+ goto rtn;
-+ }
-+
-+rtn:
-+ mxs_nand_return_dma_descs(nand_info);
-+}
-+
-+/*
-+ * Read OOB from NAND.
-+ *
-+ * This function is a veneer that replaces the function originally installed by
-+ * the NAND Flash MTD code.
-+ */
-+static int mxs_nand_hook_read_oob(struct mtd_info *mtd, loff_t from,
-+ struct mtd_oob_ops *ops)
-+{
-+ struct nand_chip *chip = mtd->priv;
-+ struct mxs_nand_info *nand_info = chip->priv;
-+ int ret;
-+
-+ if (ops->mode == MTD_OOB_RAW)
-+ nand_info->raw_oob_mode = 1;
-+ else
-+ nand_info->raw_oob_mode = 0;
-+
-+ ret = nand_info->hooked_read_oob(mtd, from, ops);
-+
-+ nand_info->raw_oob_mode = 0;
-+
-+ return ret;
-+}
-+
-+/*
-+ * Write OOB to NAND.
-+ *
-+ * This function is a veneer that replaces the function originally installed by
-+ * the NAND Flash MTD code.
-+ */
-+static int mxs_nand_hook_write_oob(struct mtd_info *mtd, loff_t to,
-+ struct mtd_oob_ops *ops)
-+{
-+ struct nand_chip *chip = mtd->priv;
-+ struct mxs_nand_info *nand_info = chip->priv;
-+ int ret;
-+
-+ if (ops->mode == MTD_OOB_RAW)
-+ nand_info->raw_oob_mode = 1;
-+ else
-+ nand_info->raw_oob_mode = 0;
-+
-+ ret = nand_info->hooked_write_oob(mtd, to, ops);
-+
-+ nand_info->raw_oob_mode = 0;
-+
-+ return ret;
-+}
-+
-+/*
-+ * Mark a block bad in NAND.
-+ *
-+ * This function is a veneer that replaces the function originally installed by
-+ * the NAND Flash MTD code.
-+ */
-+static int mxs_nand_hook_block_markbad(struct mtd_info *mtd, loff_t ofs)
-+{
-+ struct nand_chip *chip = mtd->priv;
-+ struct mxs_nand_info *nand_info = chip->priv;
-+ int ret;
-+
-+ nand_info->marking_block_bad = 1;
-+
-+ ret = nand_info->hooked_block_markbad(mtd, ofs);
-+
-+ nand_info->marking_block_bad = 0;
-+
-+ return ret;
-+}
-+
-+/*
-+ * There are several places in this driver where we have to handle the OOB and
-+ * block marks. This is the function where things are the most complicated, so
-+ * this is where we try to explain it all. All the other places refer back to
-+ * here.
-+ *
-+ * These are the rules, in order of decreasing importance:
-+ *
-+ * 1) Nothing the caller does can be allowed to imperil the block mark, so all
-+ * write operations take measures to protect it.
-+ *
-+ * 2) In read operations, the first byte of the OOB we return must reflect the
-+ * true state of the block mark, no matter where that block mark appears in
-+ * the physical page.
-+ *
-+ * 3) ECC-based read operations return an OOB full of set bits (since we never
-+ * allow ECC-based writes to the OOB, it doesn't matter what ECC-based reads
-+ * return).
-+ *
-+ * 4) "Raw" read operations return a direct view of the physical bytes in the
-+ * page, using the conventional definition of which bytes are data and which
-+ * are OOB. This gives the caller a way to see the actual, physical bytes
-+ * in the page, without the distortions applied by our ECC engine.
-+ *
-+ * What we do for this specific read operation depends on whether we're doing
-+ * "raw" read, or an ECC-based read.
-+ *
-+ * It turns out that knowing whether we want an "ECC-based" or "raw" read is not
-+ * easy. When reading a page, for example, the NAND Flash MTD code calls our
-+ * ecc.read_page or ecc.read_page_raw function. Thus, the fact that MTD wants an
-+ * ECC-based or raw view of the page is implicit in which function it calls
-+ * (there is a similar pair of ECC-based/raw functions for writing).
-+ *
-+ * Since MTD assumes the OOB is not covered by ECC, there is no pair of
-+ * ECC-based/raw functions for reading or or writing the OOB. The fact that the
-+ * caller wants an ECC-based or raw view of the page is not propagated down to
-+ * this driver.
-+ *
-+ * Since our OOB *is* covered by ECC, we need this information. So, we hook the
-+ * ecc.read_oob and ecc.write_oob function pointers in the owning
-+ * struct mtd_info with our own functions. These hook functions set the
-+ * raw_oob_mode field so that, when control finally arrives here, we'll know
-+ * what to do.
-+ */
-+static int mxs_nand_ecc_read_oob(struct mtd_info *mtd, struct nand_chip *nand,
-+ int page, int cmd)
-+{
-+ struct mxs_nand_info *nand_info = nand->priv;
-+ int column;
-+
-+ /*
-+ * First, fill in the OOB buffer. If we're doing a raw read, we need to
-+ * get the bytes from the physical page. If we're not doing a raw read,
-+ * we need to fill the buffer with set bits.
-+ */
-+ if (nand_info->raw_oob_mode && nand_info->version > GPMI_VERSION_TYPE_MX23) {
-+ /*
-+ * If control arrives here, we're doing a "raw" read. Send the
-+ * command to read the conventional OOB and read it.
-+ */
-+ nand->cmdfunc(mtd, NAND_CMD_READ0, mtd->writesize, page);
-+ nand->read_buf(mtd, nand->oob_poi, mtd->oobsize);
-+ } else {
-+ /*
-+ * If control arrives here, we're not doing a "raw" read. Fill
-+ * the OOB buffer with set bits and correct the block mark.
-+ */
-+ memset(nand->oob_poi, 0xff, mtd->oobsize);
-+
-+ column = nand_info->version == GPMI_VERSION_TYPE_MX23 ? 0 : mtd->writesize;
-+ nand->cmdfunc(mtd, NAND_CMD_READ0, column, page);
-+ mxs_nand_read_buf(mtd, nand->oob_poi, 1);
-+ }
-+
-+ return 0;
-+
-+}
-+
-+/*
-+ * Write OOB data to NAND.
-+ */
-+static int mxs_nand_ecc_write_oob(struct mtd_info *mtd, struct nand_chip *nand,
-+ int page)
-+{
-+ struct mxs_nand_info *nand_info = nand->priv;
-+ int column;
-+ uint8_t block_mark = 0;
-+
-+ /*
-+ * There are fundamental incompatibilities between the i.MX GPMI NFC and
-+ * the NAND Flash MTD model that make it essentially impossible to write
-+ * the out-of-band bytes.
-+ *
-+ * We permit *ONE* exception. If the *intent* of writing the OOB is to
-+ * mark a block bad, we can do that.
-+ */
-+
-+ if (!nand_info->marking_block_bad) {
-+ printf("NXS NAND: Writing OOB isn't supported\n");
-+ return -EIO;
-+ }
-+
-+ column = nand_info->version == GPMI_VERSION_TYPE_MX23 ? 0 : mtd->writesize;
-+ /* Write the block mark. */
-+ nand->cmdfunc(mtd, NAND_CMD_SEQIN, column, page);
-+ nand->write_buf(mtd, &block_mark, 1);
-+ nand->cmdfunc(mtd, NAND_CMD_PAGEPROG, -1, -1);
-+
-+ /* Check if it worked. */
-+ if (nand->waitfunc(mtd, nand) & NAND_STATUS_FAIL)
-+ return -EIO;
-+
-+ return 0;
-+}
-+
-+/*
-+ * Claims all blocks are good.
-+ *
-+ * In principle, this function is *only* called when the NAND Flash MTD system
-+ * isn't allowed to keep an in-memory bad block table, so it is forced to ask
-+ * the driver for bad block information.
-+ *
-+ * In fact, we permit the NAND Flash MTD system to have an in-memory BBT, so
-+ * this function is *only* called when we take it away.
-+ *
-+ * Thus, this function is only called when we want *all* blocks to look good,
-+ * so it *always* return success.
-+ */
-+static int mxs_nand_block_bad(struct mtd_info *mtd, loff_t ofs, int getchip)
-+{
-+ return 0;
-+}
-+
-+/*
-+ * Nominally, the purpose of this function is to look for or create the bad
-+ * block table. In fact, since the we call this function at the very end of
-+ * the initialization process started by nand_scan(), and we doesn't have a
-+ * more formal mechanism, we "hook" this function to continue init process.
-+ *
-+ * At this point, the physical NAND Flash chips have been identified and
-+ * counted, so we know the physical geometry. This enables us to make some
-+ * important configuration decisions.
-+ *
-+ * The return value of this function propogates directly back to this driver's
-+ * call to nand_scan(). Anything other than zero will cause this driver to
-+ * tear everything down and declare failure.
-+ */
-+static int mxs_nand_scan_bbt(struct mtd_info *mtd)
-+{
-+ struct nand_chip *nand = mtd->priv;
-+ struct mxs_nand_info *nand_info = nand->priv;
-+ void __iomem *bch_regs = (void __iomem *)MXS_BCH_BASE;
-+ uint32_t tmp;
-+
-+ /* Reset BCH. Don't use SFTRST on MX23 due to Errata #2847 */
-+ mxs_reset_block(bch_regs + BCH_CTRL, nand_info->version == GPMI_VERSION_TYPE_MX23);
-+
-+ /* Configure layout 0 */
-+ tmp = (mxs_nand_ecc_chunk_cnt(mtd->writesize) - 1)
-+ << BCH_FLASHLAYOUT0_NBLOCKS_OFFSET;
-+ tmp |= MXS_NAND_METADATA_SIZE << BCH_FLASHLAYOUT0_META_SIZE_OFFSET;
-+ tmp |= (mxs_nand_get_ecc_strength(mtd->writesize, mtd->oobsize) >> 1)
-+ << BCH_FLASHLAYOUT0_ECC0_OFFSET;
-+ tmp |= MXS_NAND_CHUNK_DATA_CHUNK_SIZE;
-+ writel(tmp, bch_regs + BCH_FLASH0LAYOUT0);
-+
-+ tmp = (mtd->writesize + mtd->oobsize)
-+ << BCH_FLASHLAYOUT1_PAGE_SIZE_OFFSET;
-+ tmp |= (mxs_nand_get_ecc_strength(mtd->writesize, mtd->oobsize) >> 1)
-+ << BCH_FLASHLAYOUT1_ECCN_OFFSET;
-+ tmp |= MXS_NAND_CHUNK_DATA_CHUNK_SIZE;
-+ writel(tmp, bch_regs + BCH_FLASH0LAYOUT1);
-+
-+ /* Set *all* chip selects to use layout 0 */
-+ writel(0, bch_regs + BCH_LAYOUTSELECT);
-+
-+ /* Enable BCH complete interrupt */
-+ writel(BCH_CTRL_COMPLETE_IRQ_EN, bch_regs + BCH_CTRL + BIT_SET);
-+
-+ /* Hook some operations at the MTD level. */
-+ if (mtd->read_oob != mxs_nand_hook_read_oob) {
-+ nand_info->hooked_read_oob = mtd->read_oob;
-+ mtd->read_oob = mxs_nand_hook_read_oob;
-+ }
-+
-+ if (mtd->write_oob != mxs_nand_hook_write_oob) {
-+ nand_info->hooked_write_oob = mtd->write_oob;
-+ mtd->write_oob = mxs_nand_hook_write_oob;
-+ }
-+
-+ if (mtd->block_markbad != mxs_nand_hook_block_markbad) {
-+ nand_info->hooked_block_markbad = mtd->block_markbad;
-+ mtd->block_markbad = mxs_nand_hook_block_markbad;
-+ }
-+
-+ /* We use the reference implementation for bad block management. */
-+ return nand_default_bbt(mtd);
-+}
-+
-+/*
-+ * Allocate DMA buffers
-+ */
-+int mxs_nand_alloc_buffers(struct mxs_nand_info *nand_info)
-+{
-+ uint8_t *buf;
-+ const int size = NAND_MAX_PAGESIZE + NAND_MAX_OOBSIZE;
-+
-+ /* DMA buffers */
-+ buf = dma_alloc_coherent(size);
-+ if (!buf) {
-+ printf("MXS NAND: Error allocating DMA buffers\n");
-+ return -ENOMEM;
-+ }
-+
-+ memset(buf, 0, size);
-+
-+ nand_info->data_buf = buf;
-+ nand_info->oob_buf = buf + NAND_MAX_PAGESIZE;
-+
-+ /* Command buffers */
-+ nand_info->cmd_buf = dma_alloc_coherent(MXS_NAND_COMMAND_BUFFER_SIZE);
-+ if (!nand_info->cmd_buf) {
-+ free(buf);
-+ printf("MXS NAND: Error allocating command buffers\n");
-+ return -ENOMEM;
-+ }
-+ memset(nand_info->cmd_buf, 0, MXS_NAND_COMMAND_BUFFER_SIZE);
-+ nand_info->cmd_queue_len = 0;
-+
-+ return 0;
-+}
-+
-+/*
-+ * Initializes the NFC hardware.
-+ */
-+int mxs_nand_hw_init(struct mxs_nand_info *info)
-+{
-+ void __iomem *gpmi_regs = (void *)MXS_GPMI_BASE;
-+ int i = 0;
-+ u32 val;
-+
-+ info->desc = malloc(sizeof(struct mxs_dma_desc *) *
-+ MXS_NAND_DMA_DESCRIPTOR_COUNT);
-+ if (!info->desc)
-+ goto err1;
-+
-+ /* Allocate the DMA descriptors. */
-+ for (i = 0; i < MXS_NAND_DMA_DESCRIPTOR_COUNT; i++) {
-+ info->desc[i] = mxs_dma_desc_alloc();
-+ if (!info->desc[i])
-+ goto err2;
-+ }
-+
-+ /* Init the DMA controller. */
-+ mxs_dma_init();
-+
-+ imx_enable_nandclk();
-+
-+ /* Reset the GPMI block. */
-+ mxs_reset_block(gpmi_regs + GPMI_CTRL0, 0);
-+
-+ /*
-+ * Choose NAND mode, set IRQ polarity, disable write protection and
-+ * select BCH ECC.
-+ */
-+ val = readl(gpmi_regs + GPMI_CTRL1);
-+ val &= ~GPMI_CTRL1_GPMI_MODE;
-+ val |= GPMI_CTRL1_ATA_IRQRDY_POLARITY | GPMI_CTRL1_DEV_RESET |
-+ GPMI_CTRL1_BCH_MODE;
-+ writel(val, gpmi_regs + GPMI_CTRL1);
-+
-+ val = readl(gpmi_regs + GPMI_VERSION);
-+ info->version = val >> GPMI_VERSION_MINOR_OFFSET;
-+
-+ return 0;
-+
-+err2:
-+ free(info->desc);
-+err1:
-+ for (--i; i >= 0; i--)
-+ mxs_dma_desc_free(info->desc[i]);
-+ printf("MXS NAND: Unable to allocate DMA descriptors\n");
-+ return -ENOMEM;
-+}
-+
-+static int mxs_nand_probe(struct device_d *dev)
-+{
-+ struct mxs_nand_info *nand_info;
-+ struct nand_chip *nand;
-+ struct mtd_info *mtd;
-+ int err;
-+
-+ nand_info = kzalloc(sizeof(struct mxs_nand_info), GFP_KERNEL);
-+ if (!nand_info) {
-+ printf("MXS NAND: Failed to allocate private data\n");
-+ return -ENOMEM;
-+ }
-+
-+ /* XXX: Remove u-boot specific access pointers and use io_base instead? */
-+ nand_info->io_base = dev_request_mem_region(dev, 0);
-+
-+ err = mxs_nand_alloc_buffers(nand_info);
-+ if (err)
-+ goto err1;
-+
-+ err = mxs_nand_hw_init(nand_info);
-+ if (err)
-+ goto err2;
-+
-+ memset(&fake_ecc_layout, 0, sizeof(fake_ecc_layout));
-+
-+ /* structures must be linked */
-+ nand = &nand_info->nand_chip;
-+ mtd = &nand_info->mtd;
-+ mtd->priv = nand;
-+
-+ nand->priv = nand_info;
-+ nand->options |= NAND_NO_SUBPAGE_WRITE;
-+
-+ nand->cmd_ctrl = mxs_nand_cmd_ctrl;
-+
-+ nand->dev_ready = mxs_nand_device_ready;
-+ nand->select_chip = mxs_nand_select_chip;
-+ nand->block_bad = mxs_nand_block_bad;
-+ nand->scan_bbt = mxs_nand_scan_bbt;
-+
-+ nand->read_byte = mxs_nand_read_byte;
-+
-+ nand->read_buf = mxs_nand_read_buf;
-+ nand->write_buf = mxs_nand_write_buf;
-+
-+ nand->ecc.read_page = mxs_nand_ecc_read_page;
-+ nand->ecc.write_page = mxs_nand_ecc_write_page;
-+ nand->ecc.read_oob = mxs_nand_ecc_read_oob;
-+ nand->ecc.write_oob = mxs_nand_ecc_write_oob;
-+
-+ nand->ecc.layout = &fake_ecc_layout;
-+ nand->ecc.mode = NAND_ECC_HW;
-+ nand->ecc.bytes = 9;
-+ nand->ecc.size = 512;
-+
-+ /* Scan to find existence of the device */
-+ err = nand_scan(mtd, 1);
-+ if (err)
-+ goto err2;
-+
-+ return add_mtd_device(mtd, "nand");
-+err2:
-+ free(nand_info->data_buf);
-+ free(nand_info->cmd_buf);
-+err1:
-+ free(nand_info);
-+ return err;
-+}
-+
-+static struct driver_d mxs_nand_driver = {
-+ .name = "mxs_nand",
-+ .probe = mxs_nand_probe,
-+};
-+
-+static int __init mxs_nand_init(void)
-+{
-+ return register_driver(&mxs_nand_driver);
-+}
-+
-+device_initcall(mxs_nand_init);
-+
-+MODULE_AUTHOR("Denx Software Engeneering and Wolfram Sang");
-+MODULE_DESCRIPTION("MXS NAND MTD driver");
-+MODULE_LICENSE("GPL");
-diff --git a/drivers/mtd/ubi/cdev.c b/drivers/mtd/ubi/cdev.c
-index 95bef1f..c99b64d 100644
---- a/drivers/mtd/ubi/cdev.c
-+++ b/drivers/mtd/ubi/cdev.c
-@@ -12,7 +12,7 @@ struct ubi_volume_cdev_priv {
- };
-
- static ssize_t ubi_volume_cdev_read(struct cdev *cdev, void *buf, size_t size,
-- unsigned long offset, unsigned long flags)
-+ loff_t offset, unsigned long flags)
- {
- struct ubi_volume_cdev_priv *priv = cdev->priv;
- struct ubi_volume *vol = priv->vol;
-@@ -23,7 +23,7 @@ static ssize_t ubi_volume_cdev_read(struct cdev *cdev, void *buf, size_t size,
- loff_t offp = offset;
- int usable_leb_size = vol->usable_leb_size;
-
-- printf("%s: %d @ 0x%08lx\n", __func__, size, offset);
-+ printf("%s: %d @ 0x%08llx\n", __func__, size, offset);
-
- len = size > usable_leb_size ? usable_leb_size : size;
-
-@@ -56,7 +56,7 @@ static ssize_t ubi_volume_cdev_read(struct cdev *cdev, void *buf, size_t size,
- }
-
- static ssize_t ubi_volume_cdev_write(struct cdev* cdev, const void *buf,
-- size_t size, unsigned long offset, unsigned long flags)
-+ size_t size, loff_t offset, unsigned long flags)
- {
- struct ubi_volume_cdev_priv *priv = cdev->priv;
- struct ubi_volume *vol = priv->vol;
-@@ -121,7 +121,7 @@ static int ubi_volume_cdev_close(struct cdev *cdev)
- return 0;
- }
-
--static off_t ubi_volume_cdev_lseek(struct cdev *cdev, off_t ofs)
-+static loff_t ubi_volume_cdev_lseek(struct cdev *cdev, loff_t ofs)
- {
- struct ubi_volume_cdev_priv *priv = cdev->priv;
-
-diff --git a/drivers/mtd/ubi/ubi-barebox.h b/drivers/mtd/ubi/ubi-barebox.h
-index d23228f..72f29a6 100644
---- a/drivers/mtd/ubi/ubi-barebox.h
-+++ b/drivers/mtd/ubi/ubi-barebox.h
-@@ -135,7 +135,6 @@ struct kmem_cache { int i; };
- #define GFP_KERNEL 0
- #define GFP_NOFS 1
-
--#define __user
- #define __init
- #define __exit
-
-diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig
-index 172cc39..749ea6a 100644
---- a/drivers/net/Kconfig
-+++ b/drivers/net/Kconfig
-@@ -13,6 +13,9 @@ config HAS_AT91_ETHER
- config HAS_NETX_ETHER
- bool
-
-+config HAS_DESIGNWARE_ETH
-+ bool
-+
- config ARCH_HAS_FEC_IMX
- bool
-
-@@ -108,6 +111,19 @@ config DRIVER_NET_KS8851_MLL
- This option enables support for the Micrel KS8851 MLL
- ethernet chip.
-
-+config DRIVER_NET_DESIGNWARE
-+ bool "Designware Universal MAC ethernet driver"
-+ select MIIDEV
-+ depends on HAS_DESIGNWARE_ETH
-+ help
-+ This option enables support for the Synopsys
-+ Designware Core Univesal MAC 10M/100M/1G ethernet IP.
-+
-+config DRIVER_NET_DESIGNWARE_ALTDESCRIPTOR
-+ bool
-+ depends on DRIVER_NET_DESIGNWARE
-+ default n
-+
- source "drivers/net/usb/Kconfig"
-
- endmenu
-diff --git a/drivers/net/Makefile b/drivers/net/Makefile
-index 34dbee9..29727b7 100644
---- a/drivers/net/Makefile
-+++ b/drivers/net/Makefile
-@@ -13,3 +13,4 @@ obj-$(CONFIG_MIIDEV) += miidev.o
- obj-$(CONFIG_NET_USB) += usb/
- obj-$(CONFIG_DRIVER_NET_TSE) += altera_tse.o
- obj-$(CONFIG_DRIVER_NET_KS8851_MLL) += ks8851_mll.o
-+obj-$(CONFIG_DRIVER_NET_DESIGNWARE) += designware.o
-diff --git a/drivers/net/designware.c b/drivers/net/designware.c
-new file mode 100644
-index 0000000..379b4e3
---- /dev/null
-+++ b/drivers/net/designware.c
-@@ -0,0 +1,436 @@
-+/*
-+ * (C) Copyright 2010
-+ * Vipin Kumar, ST Micoelectronics, vipin.kumar@st.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
-+ */
-+
-+/*
-+ * Designware ethernet IP driver for u-boot
-+ */
-+
-+#include <common.h>
-+#include <init.h>
-+#include <io.h>
-+#include <net.h>
-+#include <miidev.h>
-+#include <asm/mmu.h>
-+#include <net/designware.h>
-+#include "designware.h"
-+
-+
-+struct dw_eth_dev {
-+ struct eth_device netdev;
-+ struct mii_device miidev;
-+
-+ void (*fix_mac_speed)(int speed);
-+ u8 macaddr[6];
-+ u32 tx_currdescnum;
-+ u32 rx_currdescnum;
-+
-+ struct dmamacdescr *tx_mac_descrtable;
-+ struct dmamacdescr *rx_mac_descrtable;
-+
-+ u8 *txbuffs;
-+ u8 *rxbuffs;
-+
-+ struct eth_mac_regs *mac_regs_p;
-+ struct eth_dma_regs *dma_regs_p;
-+};
-+
-+/* Speed specific definitions */
-+#define SPEED_10M 1
-+#define SPEED_100M 2
-+#define SPEED_1000M 3
-+
-+/* Duplex mode specific definitions */
-+#define HALF_DUPLEX 1
-+#define FULL_DUPLEX 2
-+
-+
-+static int dwc_ether_mii_read(struct mii_device *dev, int addr, int reg)
-+{
-+ struct dw_eth_dev *priv = dev->edev->priv;
-+ struct eth_mac_regs *mac_p = priv->mac_regs_p;
-+ u64 start;
-+ u32 miiaddr;
-+
-+ miiaddr = ((addr << MIIADDRSHIFT) & MII_ADDRMSK) | \
-+ ((reg << MIIREGSHIFT) & MII_REGMSK);
-+
-+ writel(miiaddr | MII_CLKRANGE_150_250M | MII_BUSY, &mac_p->miiaddr);
-+
-+ start = get_time_ns();
-+ while (readl(&mac_p->miiaddr) & MII_BUSY) {
-+ if (is_timeout(start, 10 * MSECOND)) {
-+ dev_err(&priv->netdev.dev, "MDIO timeout\n");
-+ return -EIO;
-+ }
-+ }
-+ return readl(&mac_p->miidata) & 0xffff;
-+}
-+
-+static int dwc_ether_mii_write(struct mii_device *dev, int addr, int reg, int val)
-+{
-+ struct dw_eth_dev *priv = dev->edev->priv;
-+ struct eth_mac_regs *mac_p = priv->mac_regs_p;
-+ u64 start;
-+ u32 miiaddr;
-+
-+ writel(val, &mac_p->miidata);
-+ miiaddr = ((addr << MIIADDRSHIFT) & MII_ADDRMSK) | \
-+ ((reg << MIIREGSHIFT) & MII_REGMSK) | MII_WRITE;
-+
-+ writel(miiaddr | MII_CLKRANGE_150_250M | MII_BUSY, &mac_p->miiaddr);
-+
-+ start = get_time_ns();
-+ while (readl(&mac_p->miiaddr) & MII_BUSY) {
-+ if (is_timeout(start, 10 * MSECOND)) {
-+ dev_err(&priv->netdev.dev, "MDIO timeout\n");
-+ return -EIO;
-+ }
-+ }
-+
-+ /* Needed as a fix for ST-Phy */
-+ dwc_ether_mii_read(dev, addr, reg);
-+ return 0;
-+}
-+
-+
-+static int mac_reset(struct eth_device *dev)
-+{
-+ struct dw_eth_dev *priv = dev->priv;
-+ struct eth_mac_regs *mac_p = priv->mac_regs_p;
-+ struct eth_dma_regs *dma_p = priv->dma_regs_p;
-+ u64 start;
-+
-+ writel(DMAMAC_SRST, &dma_p->busmode);
-+ writel(MII_PORTSELECT, &mac_p->conf);
-+
-+ start = get_time_ns();
-+ while (readl(&dma_p->busmode) & DMAMAC_SRST) {
-+ if (is_timeout(start, 10 * MSECOND)) {
-+ dev_err(&priv->netdev.dev, "MAC reset timeout\n");
-+ return -EIO;
-+ }
-+ }
-+ return 0;
-+}
-+
-+static void tx_descs_init(struct eth_device *dev)
-+{
-+ struct dw_eth_dev *priv = dev->priv;
-+ struct eth_dma_regs *dma_p = priv->dma_regs_p;
-+ struct dmamacdescr *desc_table_p = &priv->tx_mac_descrtable[0];
-+ char *txbuffs = &priv->txbuffs[0];
-+ struct dmamacdescr *desc_p;
-+ u32 idx;
-+
-+ for (idx = 0; idx < CONFIG_TX_DESCR_NUM; idx++) {
-+ desc_p = &desc_table_p[idx];
-+ desc_p->dmamac_addr = &txbuffs[idx * CONFIG_ETH_BUFSIZE];
-+ desc_p->dmamac_next = &desc_table_p[idx + 1];
-+
-+#if defined(CONFIG_DRIVER_NET_DESIGNWARE_ALTDESCRIPTOR)
-+ desc_p->txrx_status &= ~(DESC_TXSTS_TXINT | DESC_TXSTS_TXLAST |
-+ DESC_TXSTS_TXFIRST | DESC_TXSTS_TXCRCDIS | \
-+ DESC_TXSTS_TXCHECKINSCTRL | \
-+ DESC_TXSTS_TXRINGEND | DESC_TXSTS_TXPADDIS);
-+
-+ desc_p->txrx_status |= DESC_TXSTS_TXCHAIN;
-+ desc_p->dmamac_cntl = 0;
-+ desc_p->txrx_status &= ~(DESC_TXSTS_MSK | DESC_TXSTS_OWNBYDMA);
-+#else
-+ desc_p->dmamac_cntl = DESC_TXCTRL_TXCHAIN;
-+ desc_p->txrx_status = 0;
-+#endif
-+ }
-+
-+ /* Correcting the last pointer of the chain */
-+ desc_p->dmamac_next = &desc_table_p[0];
-+
-+ writel((ulong)&desc_table_p[0], &dma_p->txdesclistaddr);
-+}
-+
-+static void rx_descs_init(struct eth_device *dev)
-+{
-+ struct dw_eth_dev *priv = dev->priv;
-+ struct eth_dma_regs *dma_p = priv->dma_regs_p;
-+ struct dmamacdescr *desc_table_p = &priv->rx_mac_descrtable[0];
-+ char *rxbuffs = &priv->rxbuffs[0];
-+ struct dmamacdescr *desc_p;
-+ u32 idx;
-+
-+ for (idx = 0; idx < CONFIG_RX_DESCR_NUM; idx++) {
-+ desc_p = &desc_table_p[idx];
-+ desc_p->dmamac_addr = &rxbuffs[idx * CONFIG_ETH_BUFSIZE];
-+ desc_p->dmamac_next = &desc_table_p[idx + 1];
-+
-+ desc_p->dmamac_cntl =
-+ (MAC_MAX_FRAME_SZ & DESC_RXCTRL_SIZE1MASK) | \
-+ DESC_RXCTRL_RXCHAIN;
-+
-+ dma_inv_range((unsigned long)desc_p->dmamac_addr,
-+ (unsigned long)desc_p->dmamac_addr + CONFIG_ETH_BUFSIZE);
-+ desc_p->txrx_status = DESC_RXSTS_OWNBYDMA;
-+ }
-+
-+ /* Correcting the last pointer of the chain */
-+ desc_p->dmamac_next = &desc_table_p[0];
-+
-+ writel((ulong)&desc_table_p[0], &dma_p->rxdesclistaddr);
-+}
-+
-+static void descs_init(struct eth_device *dev)
-+{
-+ tx_descs_init(dev);
-+ rx_descs_init(dev);
-+}
-+
-+static int dwc_ether_init(struct eth_device *dev)
-+{
-+ struct dw_eth_dev *priv = dev->priv;
-+ struct eth_mac_regs *mac_p = priv->mac_regs_p;
-+ struct eth_dma_regs *dma_p = priv->dma_regs_p;
-+
-+ if (mac_reset(dev) < 0)
-+ return -1;
-+
-+ /* HW MAC address is lost during MAC reset */
-+ dev->set_ethaddr(dev, priv->macaddr);
-+
-+ writel(FIXEDBURST | PRIORXTX_41 | BURST_16, &dma_p->busmode);
-+ writel(FLUSHTXFIFO | readl(&dma_p->opmode), &dma_p->opmode);
-+ writel(STOREFORWARD | TXSECONDFRAME, &dma_p->opmode);
-+ writel(FRAMEBURSTENABLE | DISABLERXOWN, &mac_p->conf);
-+ return 0;
-+}
-+
-+static int dwc_ether_open(struct eth_device *dev)
-+{
-+ struct dw_eth_dev *priv = dev->priv;
-+ struct eth_mac_regs *mac_p = priv->mac_regs_p;
-+ struct eth_dma_regs *dma_p = priv->dma_regs_p;
-+ u32 conf;
-+ int link, speed;
-+
-+ miidev_wait_aneg(&priv->miidev);
-+ miidev_print_status(&priv->miidev);
-+ link = miidev_get_status(&priv->miidev);
-+
-+ if (priv->fix_mac_speed) {
-+ speed = link & MIIDEV_STATUS_IS_1000MBIT ? 1000 :
-+ (link & MIIDEV_STATUS_IS_100MBIT ? 100 : 10);
-+ priv->fix_mac_speed(speed);
-+ }
-+
-+ conf = readl(&mac_p->conf);
-+ if (link & MIIDEV_STATUS_IS_FULL_DUPLEX)
-+ conf |= FULLDPLXMODE;
-+ else
-+ conf &= ~FULLDPLXMODE;
-+ if (link & MIIDEV_STATUS_IS_1000MBIT)
-+ conf &= ~MII_PORTSELECT;
-+ else
-+ conf |= MII_PORTSELECT;
-+ writel(conf, &mac_p->conf);
-+
-+ descs_init(dev);
-+
-+ /*
-+ * Start/Enable xfer at dma as well as mac level
-+ */
-+ writel(readl(&dma_p->opmode) | RXSTART, &dma_p->opmode);
-+ writel(readl(&dma_p->opmode) | TXSTART, &dma_p->opmode);
-+ writel(readl(&mac_p->conf) | RXENABLE | TXENABLE, &mac_p->conf);
-+ return 0;
-+}
-+
-+static int dwc_ether_send(struct eth_device *dev, void *packet, int length)
-+{
-+ struct dw_eth_dev *priv = dev->priv;
-+ struct eth_dma_regs *dma_p = priv->dma_regs_p;
-+ u32 desc_num = priv->tx_currdescnum;
-+ struct dmamacdescr *desc_p = &priv->tx_mac_descrtable[desc_num];
-+
-+ /* Check if the descriptor is owned by CPU */
-+ if (desc_p->txrx_status & DESC_TXSTS_OWNBYDMA) {
-+ dev_err(&dev->dev, "CPU not owner of tx frame\n");
-+ return -1;
-+ }
-+
-+ memcpy((void *)desc_p->dmamac_addr, packet, length);
-+ dma_flush_range((unsigned long)desc_p->dmamac_addr,
-+ (unsigned long)desc_p->dmamac_addr + length);
-+
-+#if defined(CONFIG_DRIVER_NET_DESIGNWARE_ALTDESCRIPTOR)
-+ desc_p->txrx_status |= DESC_TXSTS_TXFIRST | DESC_TXSTS_TXLAST;
-+ desc_p->dmamac_cntl |= (length << DESC_TXCTRL_SIZE1SHFT) & \
-+ DESC_TXCTRL_SIZE1MASK;
-+
-+ desc_p->txrx_status &= ~(DESC_TXSTS_MSK);
-+ desc_p->txrx_status |= DESC_TXSTS_OWNBYDMA;
-+#else
-+ desc_p->dmamac_cntl |= ((length << DESC_TXCTRL_SIZE1SHFT) & \
-+ DESC_TXCTRL_SIZE1MASK) | DESC_TXCTRL_TXLAST | \
-+ DESC_TXCTRL_TXFIRST;
-+
-+ desc_p->txrx_status = DESC_TXSTS_OWNBYDMA;
-+#endif
-+
-+ /* Test the wrap-around condition. */
-+ if (++desc_num >= CONFIG_TX_DESCR_NUM)
-+ desc_num = 0;
-+
-+ priv->tx_currdescnum = desc_num;
-+
-+ /* Start the transmission */
-+ writel(POLL_DATA, &dma_p->txpolldemand);
-+ return 0;
-+}
-+
-+static int dwc_ether_rx(struct eth_device *dev)
-+{
-+ struct dw_eth_dev *priv = dev->priv;
-+ u32 desc_num = priv->rx_currdescnum;
-+ struct dmamacdescr *desc_p = &priv->rx_mac_descrtable[desc_num];
-+
-+ u32 status = desc_p->txrx_status;
-+ int length = 0;
-+
-+ /* Check if the owner is the CPU */
-+ if (status & DESC_RXSTS_OWNBYDMA)
-+ return 0;
-+
-+ length = (status & DESC_RXSTS_FRMLENMSK) >> \
-+ DESC_RXSTS_FRMLENSHFT;
-+
-+ net_receive(desc_p->dmamac_addr, length);
-+
-+ /*
-+ * Make the current descriptor valid again and go to
-+ * the next one
-+ */
-+ dma_inv_range((unsigned long)desc_p->dmamac_addr,
-+ (unsigned long)desc_p->dmamac_addr + length);
-+ desc_p->txrx_status |= DESC_RXSTS_OWNBYDMA;
-+
-+ /* Test the wrap-around condition. */
-+ if (++desc_num >= CONFIG_RX_DESCR_NUM)
-+ desc_num = 0;
-+
-+ priv->rx_currdescnum = desc_num;
-+
-+ return length;
-+}
-+
-+static void dwc_ether_halt (struct eth_device *dev)
-+{
-+ struct dw_eth_dev *priv = dev->priv;
-+
-+ mac_reset(dev);
-+ priv->tx_currdescnum = priv->rx_currdescnum = 0;
-+}
-+
-+static int dwc_ether_get_ethaddr(struct eth_device *dev, u8 adr[6])
-+{
-+ /* we have no EEPROM */
-+ return -1;
-+}
-+
-+static int dwc_ether_set_ethaddr(struct eth_device *dev, u8 adr[6])
-+{
-+ struct dw_eth_dev *priv = dev->priv;
-+ struct eth_mac_regs *mac_p = priv->mac_regs_p;
-+ u32 macid_lo, macid_hi;
-+
-+ macid_lo = adr[0] + (adr[1] << 8) + \
-+ (adr[2] << 16) + (adr[3] << 24);
-+ macid_hi = adr[4] + (adr[5] << 8);
-+ writel(macid_hi, &mac_p->macaddr0hi);
-+ writel(macid_lo, &mac_p->macaddr0lo);
-+ memcpy(priv->macaddr, adr, 6);
-+ return 0;
-+}
-+
-+static int dwc_ether_probe(struct device_d *dev)
-+{
-+ struct dw_eth_dev *priv;
-+ struct eth_device *edev;
-+ struct mii_device *miidev;
-+ void __iomem *base;
-+ struct dwc_ether_platform_data *pdata = dev->platform_data;
-+
-+ if (!pdata) {
-+ printf("dwc_ether: no platform_data\n");
-+ return -ENODEV;
-+ }
-+
-+ priv = xzalloc(sizeof(struct dw_eth_dev));
-+
-+ base = dev_request_mem_region(dev, 0);
-+ priv->mac_regs_p = base;
-+ dev_info(dev, "MAC version %08x\n", readl(&priv->mac_regs_p->version));
-+ priv->dma_regs_p = base + DW_DMA_BASE_OFFSET;
-+ priv->tx_mac_descrtable = dma_alloc_coherent(
-+ CONFIG_TX_DESCR_NUM * sizeof(struct dmamacdescr));
-+ priv->rx_mac_descrtable = dma_alloc_coherent(
-+ CONFIG_RX_DESCR_NUM * sizeof(struct dmamacdescr));
-+ priv->txbuffs = malloc(TX_TOTAL_BUFSIZE);
-+ priv->rxbuffs = malloc(RX_TOTAL_BUFSIZE);
-+ priv->fix_mac_speed = pdata->fix_mac_speed;
-+
-+ edev = &priv->netdev;
-+ miidev = &priv->miidev;
-+ edev->priv = priv;
-+
-+ edev->init = dwc_ether_init;
-+ edev->open = dwc_ether_open;
-+ edev->send = dwc_ether_send;
-+ edev->recv = dwc_ether_rx;
-+ edev->halt = dwc_ether_halt;
-+ edev->get_ethaddr = dwc_ether_get_ethaddr;
-+ edev->set_ethaddr = dwc_ether_set_ethaddr;
-+
-+ miidev->address = pdata->phy_addr;
-+ miidev->read = dwc_ether_mii_read;
-+ miidev->write = dwc_ether_mii_write;
-+ miidev->edev = edev;
-+
-+ mii_register(miidev);
-+ eth_register(edev);
-+ return 0;
-+}
-+
-+static void dwc_ether_remove(struct device_d *dev)
-+{
-+}
-+
-+static struct driver_d dwc_ether_driver = {
-+ .name = "designware_eth",
-+ .probe = dwc_ether_probe,
-+ .remove = dwc_ether_remove,
-+};
-+
-+static int dwc_ether_driver_init(void)
-+{
-+ register_driver(&dwc_ether_driver);
-+ return 0;
-+}
-+device_initcall(dwc_ether_driver_init);
-diff --git a/drivers/net/designware.h b/drivers/net/designware.h
-new file mode 100644
-index 0000000..db2ead4
---- /dev/null
-+++ b/drivers/net/designware.h
-@@ -0,0 +1,230 @@
-+/*
-+ * (C) Copyright 2010
-+ * Vipin Kumar, ST Micoelectronics, vipin.kumar@st.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
-+ */
-+
-+#ifndef __DESIGNWARE_ETH_H
-+#define __DESIGNWARE_ETH_H
-+
-+#define CONFIG_TX_DESCR_NUM 16
-+#define CONFIG_RX_DESCR_NUM 16
-+#define CONFIG_ETH_BUFSIZE 2048
-+#define TX_TOTAL_BUFSIZE (CONFIG_ETH_BUFSIZE * CONFIG_TX_DESCR_NUM)
-+#define RX_TOTAL_BUFSIZE (CONFIG_ETH_BUFSIZE * CONFIG_RX_DESCR_NUM)
-+
-+struct eth_mac_regs {
-+ u32 conf; /* 0x00 */
-+ u32 framefilt; /* 0x04 */
-+ u32 hashtablehigh; /* 0x08 */
-+ u32 hashtablelow; /* 0x0c */
-+ u32 miiaddr; /* 0x10 */
-+ u32 miidata; /* 0x14 */
-+ u32 flowcontrol; /* 0x18 */
-+ u32 vlantag; /* 0x1c */
-+ u32 version; /* 0x20 */
-+ u8 reserved_1[20];
-+ u32 intreg; /* 0x38 */
-+ u32 intmask; /* 0x3c */
-+ u32 macaddr0hi; /* 0x40 */
-+ u32 macaddr0lo; /* 0x44 */
-+};
-+
-+/* MAC configuration register definitions */
-+#define FRAMEBURSTENABLE (1 << 21)
-+#define MII_PORTSELECT (1 << 15)
-+#define FES_100 (1 << 14)
-+#define DISABLERXOWN (1 << 13)
-+#define FULLDPLXMODE (1 << 11)
-+#define RXENABLE (1 << 2)
-+#define TXENABLE (1 << 3)
-+
-+/* MII address register definitions */
-+#define MII_BUSY (1 << 0)
-+#define MII_WRITE (1 << 1)
-+#define MII_CLKRANGE_60_100M (0)
-+#define MII_CLKRANGE_100_150M (0x4)
-+#define MII_CLKRANGE_20_35M (0x8)
-+#define MII_CLKRANGE_35_60M (0xC)
-+#define MII_CLKRANGE_150_250M (0x10)
-+#define MII_CLKRANGE_250_300M (0x14)
-+
-+#define MIIADDRSHIFT (11)
-+#define MIIREGSHIFT (6)
-+#define MII_REGMSK (0x1F << 6)
-+#define MII_ADDRMSK (0x1F << 11)
-+
-+
-+struct eth_dma_regs {
-+ u32 busmode; /* 0x00 */
-+ u32 txpolldemand; /* 0x04 */
-+ u32 rxpolldemand; /* 0x08 */
-+ u32 rxdesclistaddr; /* 0x0c */
-+ u32 txdesclistaddr; /* 0x10 */
-+ u32 status; /* 0x14 */
-+ u32 opmode; /* 0x18 */
-+ u32 intenable; /* 0x1c */
-+ u8 reserved[40];
-+ u32 currhosttxdesc; /* 0x48 */
-+ u32 currhostrxdesc; /* 0x4c */
-+ u32 currhosttxbuffaddr; /* 0x50 */
-+ u32 currhostrxbuffaddr; /* 0x54 */
-+};
-+
-+#define DW_DMA_BASE_OFFSET (0x1000)
-+
-+/* Bus mode register definitions */
-+#define FIXEDBURST (1 << 16)
-+#define PRIORXTX_41 (3 << 14)
-+#define PRIORXTX_31 (2 << 14)
-+#define PRIORXTX_21 (1 << 14)
-+#define PRIORXTX_11 (0 << 14)
-+#define BURST_1 (1 << 8)
-+#define BURST_2 (2 << 8)
-+#define BURST_4 (4 << 8)
-+#define BURST_8 (8 << 8)
-+#define BURST_16 (16 << 8)
-+#define BURST_32 (32 << 8)
-+#define RXHIGHPRIO (1 << 1)
-+#define DMAMAC_SRST (1 << 0)
-+
-+/* Poll demand definitions */
-+#define POLL_DATA (0xFFFFFFFF)
-+
-+/* Operation mode definitions */
-+#define STOREFORWARD (1 << 21)
-+#define FLUSHTXFIFO (1 << 20)
-+#define TXSTART (1 << 13)
-+#define TXSECONDFRAME (1 << 2)
-+#define RXSTART (1 << 1)
-+
-+/* Descriptior related definitions */
-+#define MAC_MAX_FRAME_SZ (1600)
-+
-+struct dmamacdescr {
-+ u32 txrx_status;
-+ u32 dmamac_cntl;
-+ void *dmamac_addr;
-+ struct dmamacdescr *dmamac_next;
-+};
-+
-+/*
-+ * txrx_status definitions
-+ */
-+
-+/* tx status bits definitions */
-+#if defined(CONFIG_DRIVER_NET_DESIGNWARE_ALTDESCRIPTOR)
-+
-+#define DESC_TXSTS_OWNBYDMA (1 << 31)
-+#define DESC_TXSTS_TXINT (1 << 30)
-+#define DESC_TXSTS_TXLAST (1 << 29)
-+#define DESC_TXSTS_TXFIRST (1 << 28)
-+#define DESC_TXSTS_TXCRCDIS (1 << 27)
-+
-+#define DESC_TXSTS_TXPADDIS (1 << 26)
-+#define DESC_TXSTS_TXCHECKINSCTRL (3 << 22)
-+#define DESC_TXSTS_TXRINGEND (1 << 21)
-+#define DESC_TXSTS_TXCHAIN (1 << 20)
-+#define DESC_TXSTS_MSK (0x1FFFF << 0)
-+
-+#else
-+
-+#define DESC_TXSTS_OWNBYDMA (1 << 31)
-+#define DESC_TXSTS_MSK (0x1FFFF << 0)
-+
-+#endif
-+
-+/* rx status bits definitions */
-+#define DESC_RXSTS_OWNBYDMA (1 << 31)
-+#define DESC_RXSTS_DAFILTERFAIL (1 << 30)
-+#define DESC_RXSTS_FRMLENMSK (0x3FFF << 16)
-+#define DESC_RXSTS_FRMLENSHFT (16)
-+
-+#define DESC_RXSTS_ERROR (1 << 15)
-+#define DESC_RXSTS_RXTRUNCATED (1 << 14)
-+#define DESC_RXSTS_SAFILTERFAIL (1 << 13)
-+#define DESC_RXSTS_RXIPC_GIANTFRAME (1 << 12)
-+#define DESC_RXSTS_RXDAMAGED (1 << 11)
-+#define DESC_RXSTS_RXVLANTAG (1 << 10)
-+#define DESC_RXSTS_RXFIRST (1 << 9)
-+#define DESC_RXSTS_RXLAST (1 << 8)
-+#define DESC_RXSTS_RXIPC_GIANT (1 << 7)
-+#define DESC_RXSTS_RXCOLLISION (1 << 6)
-+#define DESC_RXSTS_RXFRAMEETHER (1 << 5)
-+#define DESC_RXSTS_RXWATCHDOG (1 << 4)
-+#define DESC_RXSTS_RXMIIERROR (1 << 3)
-+#define DESC_RXSTS_RXDRIBBLING (1 << 2)
-+#define DESC_RXSTS_RXCRC (1 << 1)
-+
-+/*
-+ * dmamac_cntl definitions
-+ */
-+
-+/* tx control bits definitions */
-+#if defined(CONFIG_DRIVER_NET_DESIGNWARE_ALTDESCRIPTOR)
-+
-+#define DESC_TXCTRL_SIZE1MASK (0x1FFF << 0)
-+#define DESC_TXCTRL_SIZE1SHFT (0)
-+#define DESC_TXCTRL_SIZE2MASK (0x1FFF << 16)
-+#define DESC_TXCTRL_SIZE2SHFT (16)
-+
-+#else
-+
-+#define DESC_TXCTRL_TXINT (1 << 31)
-+#define DESC_TXCTRL_TXLAST (1 << 30)
-+#define DESC_TXCTRL_TXFIRST (1 << 29)
-+#define DESC_TXCTRL_TXCHECKINSCTRL (3 << 27)
-+#define DESC_TXCTRL_TXCRCDIS (1 << 26)
-+#define DESC_TXCTRL_TXRINGEND (1 << 25)
-+#define DESC_TXCTRL_TXCHAIN (1 << 24)
-+
-+#define DESC_TXCTRL_SIZE1MASK (0x7FF << 0)
-+#define DESC_TXCTRL_SIZE1SHFT (0)
-+#define DESC_TXCTRL_SIZE2MASK (0x7FF << 11)
-+#define DESC_TXCTRL_SIZE2SHFT (11)
-+
-+#endif
-+
-+/* rx control bits definitions */
-+#if defined(CONFIG_DRIVER_NET_DESIGNWARE_ALTDESCRIPTOR)
-+
-+#define DESC_RXCTRL_RXINTDIS (1 << 31)
-+#define DESC_RXCTRL_RXRINGEND (1 << 15)
-+#define DESC_RXCTRL_RXCHAIN (1 << 14)
-+
-+#define DESC_RXCTRL_SIZE1MASK (0x1FFF << 0)
-+#define DESC_RXCTRL_SIZE1SHFT (0)
-+#define DESC_RXCTRL_SIZE2MASK (0x1FFF << 16)
-+#define DESC_RXCTRL_SIZE2SHFT (16)
-+
-+#else
-+
-+#define DESC_RXCTRL_RXINTDIS (1 << 31)
-+#define DESC_RXCTRL_RXRINGEND (1 << 25)
-+#define DESC_RXCTRL_RXCHAIN (1 << 24)
-+
-+#define DESC_RXCTRL_SIZE1MASK (0x7FF << 0)
-+#define DESC_RXCTRL_SIZE1SHFT (0)
-+#define DESC_RXCTRL_SIZE2MASK (0x7FF << 11)
-+#define DESC_RXCTRL_SIZE2SHFT (11)
-+
-+#endif
-+
-+#endif
-diff --git a/drivers/net/miidev.c b/drivers/net/miidev.c
-index f47fc9e..b49944b 100644
---- a/drivers/net/miidev.c
-+++ b/drivers/net/miidev.c
-@@ -123,7 +123,7 @@ int miidev_wait_aneg(struct mii_device *mdev)
-
- int miidev_get_status(struct mii_device *mdev)
- {
-- int ret, status;
-+ int ret, status, adv, lpa;
-
- ret = mii_read(mdev, mdev->address, MII_BMSR);
- if (ret < 0)
-@@ -136,13 +136,31 @@ int miidev_get_status(struct mii_device *mdev)
- goto err_out;
-
- if (ret & BMCR_ANENABLE) {
-- ret = mii_read(mdev, mdev->address, MII_LPA);
-- if (ret < 0)
-+ if (mdev->capabilities & MIIDEV_CAPABLE_1000M) {
-+ lpa = mii_read(mdev, mdev->address, MII_STAT1000);
-+ if (lpa < 0)
-+ goto err_out;
-+ adv = mii_read(mdev, mdev->address, MII_CTRL1000);
-+ if (adv < 0)
-+ goto err_out;
-+ lpa &= adv << 2;
-+ if (lpa & (LPA_1000FULL | LPA_1000HALF)) {
-+ if (lpa & LPA_1000FULL)
-+ status |= MIIDEV_STATUS_IS_FULL_DUPLEX;
-+ status |= MIIDEV_STATUS_IS_1000MBIT;
-+ return status;
-+ }
-+ }
-+ lpa = mii_read(mdev, mdev->address, MII_LPA);
-+ if (lpa < 0)
- goto err_out;
--
-- status |= ret & LPA_DUPLEX ? MIIDEV_STATUS_IS_FULL_DUPLEX : 0;
-- status |= ret & LPA_100 ? MIIDEV_STATUS_IS_100MBIT :
-- MIIDEV_STATUS_IS_10MBIT;
-+ adv = mii_read(mdev, mdev->address, MII_ADVERTISE);
-+ if (adv < 0)
-+ goto err_out;
-+ lpa &= adv;
-+ status |= lpa & LPA_DUPLEX ? MIIDEV_STATUS_IS_FULL_DUPLEX : 0;
-+ status |= lpa & LPA_100 ? MIIDEV_STATUS_IS_100MBIT :
-+ MIIDEV_STATUS_IS_10MBIT;
- } else {
- status |= ret & BMCR_FULLDPLX ? MIIDEV_STATUS_IS_FULL_DUPLEX : 0;
- status |= ret & BMCR_SPEED100 ? MIIDEV_STATUS_IS_100MBIT :
-@@ -170,8 +188,8 @@ int miidev_print_status(struct mii_device *mdev)
- return status;
-
- duplex = status & MIIDEV_STATUS_IS_FULL_DUPLEX ? "Full" : "Half";
-- speed = status & MIIDEV_STATUS_IS_100MBIT ? 100 : 10;
--
-+ speed = status & MIIDEV_STATUS_IS_1000MBIT ? 1000 :
-+ (status & MIIDEV_STATUS_IS_100MBIT ? 100 : 10);
-
- printf("%s: Link is %s", mdev->cdev.name,
- status & MIIDEV_STATUS_IS_UP ? "up" : "down");
-@@ -180,33 +198,33 @@ int miidev_print_status(struct mii_device *mdev)
- return 0;
- }
-
--static ssize_t miidev_read(struct cdev *cdev, void *_buf, size_t count, ulong offset, ulong flags)
-+static ssize_t miidev_read(struct cdev *cdev, void *_buf, size_t count, loff_t offset, ulong flags)
- {
- int i = count;
- uint16_t *buf = _buf;
- struct mii_device *mdev = cdev->priv;
-
-- while (i > 1) {
-- *buf = mii_read(mdev, mdev->address, offset);
-+ while (i > 0) {
-+ *buf = mii_read(mdev, mdev->address, offset / 2);
- buf++;
- i -= 2;
-- offset++;
-+ offset += 2;
- }
-
- return count;
- }
-
--static ssize_t miidev_write(struct cdev *cdev, const void *_buf, size_t count, ulong offset, ulong flags)
-+static ssize_t miidev_write(struct cdev *cdev, const void *_buf, size_t count, loff_t offset, ulong flags)
- {
- int i = count;
- const uint16_t *buf = _buf;
- struct mii_device *mdev = cdev->priv;
-
-- while (i > 1) {
-- mii_write(mdev, mdev->address, offset, *buf);
-+ while (i > 0) {
-+ mii_write(mdev, mdev->address, offset / 2, *buf);
- buf++;
- i -= 2;
-- offset++;
-+ offset += 2;
- }
-
- return count;
-@@ -221,7 +239,27 @@ static struct file_operations miidev_ops = {
- static int miidev_probe(struct device_d *dev)
- {
- struct mii_device *mdev = dev->priv;
-+ int val;
-+ int caps = 0;
-
-+ val = mii_read(mdev, mdev->address, MII_PHYSID1);
-+ if (val < 0 || val == 0xffff)
-+ goto err_out;
-+ val = mii_read(mdev, mdev->address, MII_PHYSID2);
-+ if (val < 0 || val == 0xffff)
-+ goto err_out;
-+ val = mii_read(mdev, mdev->address, MII_BMSR);
-+ if (val < 0)
-+ goto err_out;
-+ if (val & BMSR_ESTATEN) {
-+ val = mii_read(mdev, mdev->address, MII_ESTATUS);
-+ if (val < 0)
-+ goto err_out;
-+ if (val & (ESTATUS_1000_TFULL | ESTATUS_1000_THALF))
-+ caps = MIIDEV_CAPABLE_1000M;
-+ }
-+
-+ mdev->capabilities = caps;
- mdev->cdev.name = asprintf("phy%d", dev->id);
- mdev->cdev.size = 64;
- mdev->cdev.ops = &miidev_ops;
-@@ -230,6 +268,10 @@ static int miidev_probe(struct device_d *dev)
- devfs_create(&mdev->cdev);
- list_add_tail(&mdev->list, &miidev_list);
- return 0;
-+
-+err_out:
-+ dev_err(dev, "cannot read PHY registers (addr %d)\n", mdev->address);
-+ return -ENODEV;
- }
-
- static void miidev_remove(struct device_d *dev)
-diff --git a/drivers/net/smc911x.c b/drivers/net/smc911x.c
-index 800c188..7dddbbc 100644
---- a/drivers/net/smc911x.c
-+++ b/drivers/net/smc911x.c
-@@ -691,7 +691,7 @@ static int smc911x_probe(struct device_d *dev)
- struct smc911x_priv *priv;
- uint32_t val;
- int i;
-- void *base;
-+ void __iomem *base;
-
- base = dev_request_mem_region(dev, 0);
-
-diff --git a/drivers/nor/cfi_flash.c b/drivers/nor/cfi_flash.c
-index 654e647..16885c0 100644
---- a/drivers/nor/cfi_flash.c
-+++ b/drivers/nor/cfi_flash.c
-@@ -82,9 +82,9 @@ static void flash_add_byte (struct flash_info *info, cfiword_t * cword, uchar c)
- return;
- }
-
--#if __BYTE_ORDER == __BIG_ENDIAN
-+#ifdef __BIG_ENDIAN
- *cword = (*cword << 8) | c;
--#else
-+#elif defined __LITTLE_ENDIAN
-
- if (bankwidth_is_2(info))
- *cword = (*cword >> 8) | (u16)c << 8;
-@@ -92,6 +92,8 @@ static void flash_add_byte (struct flash_info *info, cfiword_t * cword, uchar c)
- *cword = (*cword >> 8) | (u32)c << 24;
- else if (bankwidth_is_8(info))
- *cword = (*cword >> 8) | (u64)c << 56;
-+#else
-+#error "could not determine byte order"
- #endif
- }
-
-@@ -167,7 +169,7 @@ static void flash_printqry (struct cfi_qry *qry)
- uchar flash_read_uchar (struct flash_info *info, uint offset)
- {
- uchar *cp = flash_make_addr(info, 0, offset);
--#if __BYTE_ORDER == __LITTLE_ENDIAN
-+#if defined __LITTLE_ENDIAN
- return flash_read8(cp);
- #else
- return flash_read8(cp + info->portwidth - 1);
-@@ -195,7 +197,7 @@ static ulong flash_read_long (struct flash_info *info, flash_sect_t sect, uint o
- debug ("addr[%x] = 0x%x\n", x, flash_read8(addr + x));
- }
- #endif
--#if __BYTE_ORDER == __LITTLE_ENDIAN
-+#if defined __LITTLE_ENDIAN
- retval = ((flash_read8(addr) << 16) |
- (flash_read8(addr + info->portwidth) << 24) |
- (flash_read8(addr + 2 * info->portwidth)) |
-@@ -456,7 +458,7 @@ flash_sect_t find_sector (struct flash_info *info, ulong addr)
- return sector;
- }
-
--static int __cfi_erase(struct cdev *cdev, size_t count, unsigned long offset,
-+static int __cfi_erase(struct cdev *cdev, size_t count, loff_t offset,
- int verbose)
- {
- struct flash_info *finfo = (struct flash_info *)cdev->priv;
-@@ -491,7 +493,7 @@ out:
- return ret;
- }
-
--static int cfi_erase(struct cdev *cdev, size_t count, unsigned long offset)
-+static int cfi_erase(struct cdev *cdev, size_t count, loff_t offset)
- {
- return __cfi_erase(cdev, count, offset, 1);
- }
-@@ -628,7 +630,7 @@ static int flash_real_protect (struct flash_info *info, long sector, int prot)
- return retcode;
- }
-
--static int cfi_protect(struct cdev *cdev, size_t count, unsigned long offset, int prot)
-+static int cfi_protect(struct cdev *cdev, size_t count, loff_t offset, int prot)
- {
- struct flash_info *finfo = (struct flash_info *)cdev->priv;
- unsigned long start, end;
-@@ -651,7 +653,7 @@ out:
- return ret;
- }
-
--static ssize_t cfi_write(struct cdev *cdev, const void *buf, size_t count, unsigned long offset, ulong flags)
-+static ssize_t cfi_write(struct cdev *cdev, const void *buf, size_t count, loff_t offset, ulong flags)
- {
- struct flash_info *finfo = (struct flash_info *)cdev->priv;
- int ret;
-diff --git a/drivers/nor/m25p80.c b/drivers/nor/m25p80.c
-index 77669c2..1440227 100644
---- a/drivers/nor/m25p80.c
-+++ b/drivers/nor/m25p80.c
-@@ -194,13 +194,14 @@ static int erase_sector(struct m25p *flash, u32 offset)
- * Erase an address range on the flash chip. The address range may extend
- * one or more erase sectors. Return an error is there is a problem erasing.
- */
--static ssize_t m25p80_erase(struct cdev *cdev, size_t count, unsigned long offset)
-+static ssize_t m25p80_erase(struct cdev *cdev, size_t count, loff_t offset)
- {
- struct m25p *flash = cdev->priv;
- u32 addr, len;
- u32 start_sector;
- u32 end_sector;
- u32 progress = 0;
-+ int eraseshift = ffs(flash->erasesize) - 1;
-
- dev_dbg(&flash->spi->dev, "%s %s 0x%llx, len %lld\n",
- __func__, "at", (long long)offset, (long long)count);
-@@ -212,8 +213,8 @@ static ssize_t m25p80_erase(struct cdev *cdev, size_t count, unsigned long offse
- addr = offset;
- len = count;
-
-- start_sector = offset / flash->erasesize;
-- end_sector = (offset + count - 1) / flash->erasesize;
-+ start_sector = offset >> eraseshift;
-+ end_sector = (offset + count - 1) >> eraseshift;
- init_progression_bar(end_sector - start_sector + 1);
-
- /* whole-chip erase? */
-@@ -250,7 +251,8 @@ static ssize_t m25p80_erase(struct cdev *cdev, size_t count, unsigned long offse
- return 0;
- }
-
--ssize_t m25p80_read(struct cdev *cdev, void *buf, size_t count, ulong offset, ulong flags)
-+ssize_t m25p80_read(struct cdev *cdev, void *buf, size_t count, loff_t offset,
-+ ulong flags)
- {
- struct m25p *flash = cdev->priv;
- struct spi_transfer t[2];
-@@ -302,7 +304,8 @@ ssize_t m25p80_read(struct cdev *cdev, void *buf, size_t count, ulong offset, ul
- return retlen;
- }
-
--ssize_t m25p80_write(struct cdev *cdev, const void *buf, size_t count, ulong offset, ulong flags)
-+ssize_t m25p80_write(struct cdev *cdev, const void *buf, size_t count,
-+ loff_t offset, ulong flags)
- {
- struct m25p *flash = cdev->priv;
- struct spi_transfer t[2];
-@@ -381,7 +384,8 @@ ssize_t m25p80_write(struct cdev *cdev, const void *buf, size_t count, ulong off
- return retlen;
- }
- #ifdef CONFIG_MTD_SST25L
--ssize_t sst_write(struct cdev *cdev, const void *buf, size_t count, ulong offset, ulong flags)
-+ssize_t sst_write(struct cdev *cdev, const void *buf, size_t count, loff_t offset,
-+ ulong flags)
- {
- struct m25p *flash = cdev->priv;
- struct spi_transfer t[2];
-diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c
-index bd2938d..a5075d5 100644
---- a/drivers/usb/core/usb.c
-+++ b/drivers/usb/core/usb.c
-@@ -52,6 +52,7 @@
- #include <asm/byteorder.h>
- #include <xfuncs.h>
- #include <init.h>
-+#include <dma.h>
-
- #include <usb/usb.h>
-
-@@ -67,7 +68,6 @@
-
- static int dev_index;
- static int asynch_allowed;
--static struct devrequest setup_packet;
-
- static int usb_hub_probe(struct usb_device *dev, int ifnum);
- static int hub_port_reset(struct usb_device *dev, int port,
-@@ -80,8 +80,8 @@ static void print_usb_device(struct usb_device *dev)
- {
- printf("Bus %03d Device %03d: ID %04x:%04x %s\n",
- dev->host->busnum, dev->devnum,
-- dev->descriptor.idVendor,
-- dev->descriptor.idProduct,
-+ dev->descriptor->idVendor,
-+ dev->descriptor->idProduct,
- dev->prod);
- }
-
-@@ -299,12 +299,14 @@ static int usb_new_device(struct usb_device *dev)
- {
- int addr, err;
- int tmp;
-- unsigned char tmpbuf[USB_BUFSIZ];
-+ void *buf;
- struct usb_device_descriptor *desc;
- int port = -1;
- struct usb_device *parent = dev->parent;
- unsigned short portstatus;
-
-+ buf = dma_alloc(USB_BUFSIZ);
-+
- /* We still haven't set the Address yet */
- addr = dev->devnum;
- dev->devnum = 0;
-@@ -322,8 +324,8 @@ static int usb_new_device(struct usb_device *dev)
- * the maxpacket size is 8 or 16 the device may be waiting to transmit
- * some more, or keeps on retransmitting the 8 byte header. */
-
-- desc = (struct usb_device_descriptor *)tmpbuf;
-- dev->descriptor.bMaxPacketSize0 = 64; /* Start off at 64 bytes */
-+ desc = buf;
-+ dev->descriptor->bMaxPacketSize0 = 64; /* Start off at 64 bytes */
- /* Default to 64 byte max packet size */
- dev->maxpacketsize = PACKET_SIZE_64;
- dev->epmaxpacketin[0] = 64;
-@@ -332,10 +334,10 @@ static int usb_new_device(struct usb_device *dev)
- err = usb_get_descriptor(dev, USB_DT_DEVICE, 0, desc, 64);
- if (err < 0) {
- USB_PRINTF("%s: usb_get_descriptor() failed with %d\n", __func__, err);
-- return 1;
-+ goto err_out;
- }
-
-- dev->descriptor.bMaxPacketSize0 = desc->bMaxPacketSize0;
-+ dev->descriptor->bMaxPacketSize0 = desc->bMaxPacketSize0;
-
- /* find the port number we're at */
- if (parent) {
-@@ -349,20 +351,21 @@ static int usb_new_device(struct usb_device *dev)
- }
- if (port < 0) {
- printf("%s: cannot locate device's port.\n", __func__);
-- return 1;
-+ err = -ENODEV;
-+ goto err_out;
- }
-
- /* reset the port for the second time */
- err = hub_port_reset(dev->parent, port, &portstatus);
- if (err < 0) {
- printf("\n Couldn't reset port %i\n", port);
-- return 1;
-+ goto err_out;
- }
- }
-
-- dev->epmaxpacketin[0] = dev->descriptor.bMaxPacketSize0;
-- dev->epmaxpacketout[0] = dev->descriptor.bMaxPacketSize0;
-- switch (dev->descriptor.bMaxPacketSize0) {
-+ dev->epmaxpacketin[0] = dev->descriptor->bMaxPacketSize0;
-+ dev->epmaxpacketout[0] = dev->descriptor->bMaxPacketSize0;
-+ switch (dev->descriptor->bMaxPacketSize0) {
- case 8:
- dev->maxpacketsize = PACKET_SIZE_8;
- break;
-@@ -383,15 +386,15 @@ static int usb_new_device(struct usb_device *dev)
- if (err < 0) {
- printf("\n USB device not accepting new address " \
- "(error=%lX)\n", dev->status);
-- return 1;
-+ goto err_out;
- }
-
- wait_ms(10); /* Let the SET_ADDRESS settle */
-
-- tmp = sizeof(dev->descriptor);
-+ tmp = sizeof(*dev->descriptor);
-
- err = usb_get_descriptor(dev, USB_DT_DEVICE, 0,
-- &dev->descriptor, sizeof(dev->descriptor));
-+ dev->descriptor, sizeof(*dev->descriptor));
- if (err < tmp) {
- if (err < 0)
- printf("unable to get device descriptor (error=%d)\n",
-@@ -399,37 +402,37 @@ static int usb_new_device(struct usb_device *dev)
- else
- printf("USB device descriptor short read " \
- "(expected %i, got %i)\n", tmp, err);
-- return 1;
-+ goto err_out;
- }
- /* correct le values */
-- le16_to_cpus(&dev->descriptor.bcdUSB);
-- le16_to_cpus(&dev->descriptor.idVendor);
-- le16_to_cpus(&dev->descriptor.idProduct);
-- le16_to_cpus(&dev->descriptor.bcdDevice);
-+ le16_to_cpus(&dev->descriptor->bcdUSB);
-+ le16_to_cpus(&dev->descriptor->idVendor);
-+ le16_to_cpus(&dev->descriptor->idProduct);
-+ le16_to_cpus(&dev->descriptor->bcdDevice);
- /* only support for one config for now */
-- usb_get_configuration_no(dev, &tmpbuf[0], 0);
-- usb_parse_config(dev, &tmpbuf[0], 0);
-+ usb_get_configuration_no(dev, buf, 0);
-+ usb_parse_config(dev, buf, 0);
- usb_set_maxpacket(dev);
- /* we set the default configuration here */
- if (usb_set_configuration(dev, dev->config.bConfigurationValue)) {
- printf("failed to set default configuration " \
- "len %d, status %lX\n", dev->act_len, dev->status);
-- return -1;
-+ goto err_out;
- }
- USB_PRINTF("new device: Mfr=%d, Product=%d, SerialNumber=%d\n",
-- dev->descriptor.iManufacturer, dev->descriptor.iProduct,
-- dev->descriptor.iSerialNumber);
-+ dev->descriptor->iManufacturer, dev->descriptor->iProduct,
-+ dev->descriptor->iSerialNumber);
- memset(dev->mf, 0, sizeof(dev->mf));
- memset(dev->prod, 0, sizeof(dev->prod));
- memset(dev->serial, 0, sizeof(dev->serial));
-- if (dev->descriptor.iManufacturer)
-- usb_string(dev, dev->descriptor.iManufacturer,
-+ if (dev->descriptor->iManufacturer)
-+ usb_string(dev, dev->descriptor->iManufacturer,
- dev->mf, sizeof(dev->mf));
-- if (dev->descriptor.iProduct)
-- usb_string(dev, dev->descriptor.iProduct,
-+ if (dev->descriptor->iProduct)
-+ usb_string(dev, dev->descriptor->iProduct,
- dev->prod, sizeof(dev->prod));
-- if (dev->descriptor.iSerialNumber)
-- usb_string(dev, dev->descriptor.iSerialNumber,
-+ if (dev->descriptor->iSerialNumber)
-+ usb_string(dev, dev->descriptor->iSerialNumber,
- dev->serial, sizeof(dev->serial));
- /* now prode if the device is a hub */
- usb_hub_probe(dev, 0);
-@@ -441,7 +444,11 @@ static int usb_new_device(struct usb_device *dev)
- register_device(&dev->dev);
- list_add_tail(&dev->list, &usb_device_list);
-
-- return 0;
-+ err = 0;
-+
-+err_out:
-+ dma_free(buf);
-+ return err;
- }
-
- static struct usb_device *usb_alloc_new_device(void)
-@@ -454,6 +461,8 @@ static struct usb_device *usb_alloc_new_device(void)
- usbdev->devnum = dev_index + 1;
- usbdev->maxchild = 0;
- usbdev->dev.bus = &usb_bus_type;
-+ usbdev->setup_packet = dma_alloc(sizeof(*usbdev->setup_packet));
-+ usbdev->descriptor = dma_alloc(sizeof(*usbdev->descriptor));
-
- dev_index++;
-
-@@ -471,6 +480,8 @@ void usb_rescan(void)
- unregister_device(&dev->dev);
- if (dev->hub)
- free(dev->hub);
-+ dma_free(dev->setup_packet);
-+ dma_free(dev->descriptor);
- free(dev);
- }
-
-@@ -532,6 +543,7 @@ int usb_control_msg(struct usb_device *dev, unsigned int pipe,
- {
- struct usb_host *host = dev->host;
- int ret;
-+ struct devrequest *setup_packet = dev->setup_packet;
-
- if ((timeout == 0) && (!asynch_allowed)) {
- /* request for a asynch control pipe is not allowed */
-@@ -539,17 +551,18 @@ int usb_control_msg(struct usb_device *dev, unsigned int pipe,
- }
-
- /* set setup command */
-- setup_packet.requesttype = requesttype;
-- setup_packet.request = request;
-- setup_packet.value = cpu_to_le16(value);
-- setup_packet.index = cpu_to_le16(index);
-- setup_packet.length = cpu_to_le16(size);
-+ setup_packet->requesttype = requesttype;
-+ setup_packet->request = request;
-+ setup_packet->value = cpu_to_le16(value);
-+ setup_packet->index = cpu_to_le16(index);
-+ setup_packet->length = cpu_to_le16(size);
- USB_PRINTF("usb_control_msg: request: 0x%X, requesttype: 0x%X, " \
- "value 0x%X index 0x%X length 0x%X\n",
- request, requesttype, value, index, size);
- dev->status = USB_ST_NOT_PROC; /*not yet processed */
-
-- ret = host->submit_control_msg(dev, pipe, data, size, &setup_packet, timeout);
-+ ret = host->submit_control_msg(dev, pipe, data, size, setup_packet,
-+ timeout);
- if (ret)
- return ret;
-
-@@ -1284,11 +1297,11 @@ int usb_driver_register(struct usb_driver *drv)
- static int usb_match_device(struct usb_device *dev, const struct usb_device_id *id)
- {
- if ((id->match_flags & USB_DEVICE_ID_MATCH_VENDOR) &&
-- id->idVendor != le16_to_cpu(dev->descriptor.idVendor))
-+ id->idVendor != le16_to_cpu(dev->descriptor->idVendor))
- return 0;
-
- if ((id->match_flags & USB_DEVICE_ID_MATCH_PRODUCT) &&
-- id->idProduct != le16_to_cpu(dev->descriptor.idProduct))
-+ id->idProduct != le16_to_cpu(dev->descriptor->idProduct))
- return 0;
-
- return 1;
-@@ -1311,7 +1324,7 @@ static int usb_match_one_id(struct usb_device *usbdev,
- /* The interface class, subclass, and protocol should never be
- * checked for a match if the device class is Vendor Specific,
- * unless the match record specifies the Vendor ID. */
-- if (usbdev->descriptor.bDeviceClass == USB_CLASS_VENDOR_SPEC &&
-+ if (usbdev->descriptor->bDeviceClass == USB_CLASS_VENDOR_SPEC &&
- !(id->match_flags & USB_DEVICE_ID_MATCH_VENDOR) &&
- (id->match_flags & USB_DEVICE_ID_MATCH_INT_INFO))
- return 0;
-@@ -1371,7 +1384,8 @@ static int usb_match(struct device_d *dev, struct driver_d *drv)
- struct usb_driver *usbdrv = container_of(dev->driver, struct usb_driver, driver);
- const struct usb_device_id *id;
-
-- debug("matching: 0x%04x 0x%04x\n", usbdev->descriptor.idVendor, usbdev->descriptor.idProduct);
-+ debug("matching: 0x%04x 0x%04x\n", usbdev->descriptor->idVendor,
-+ usbdev->descriptor->idProduct);
-
- id = usb_match_id(usbdev, usbdrv->id_table);
- if (id) {
-diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c
-index fd70e62..44e58d7 100644
---- a/drivers/usb/gadget/composite.c
-+++ b/drivers/usb/gadget/composite.c
-@@ -22,6 +22,7 @@
-
- #include <common.h>
- #include <errno.h>
-+#include <dma.h>
- #include <usb/composite.h>
- #include <asm/byteorder.h>
-
-@@ -867,7 +868,7 @@ composite_unbind(struct usb_gadget *gadget)
- composite->unbind(cdev);
-
- if (cdev->req) {
-- kfree(cdev->req->buf);
-+ dma_free(cdev->req->buf);
- usb_ep_free_request(gadget->ep0, cdev->req);
- }
- kfree(cdev);
-@@ -911,7 +912,7 @@ static int __init composite_bind(struct usb_gadget *gadget)
- cdev->req = usb_ep_alloc_request(gadget->ep0);
- if (!cdev->req)
- goto fail;
-- cdev->req->buf = malloc(USB_BUFSIZ);
-+ cdev->req->buf = dma_alloc(USB_BUFSIZ);
- if (!cdev->req->buf)
- goto fail;
- cdev->req->complete = composite_setup_complete;
-diff --git a/drivers/usb/gadget/dfu.c b/drivers/usb/gadget/dfu.c
-index f26c1e4..e205c65 100644
---- a/drivers/usb/gadget/dfu.c
-+++ b/drivers/usb/gadget/dfu.c
-@@ -40,6 +40,7 @@
- * - make 'dnstate' attached to 'struct usb_device_instance'
- */
-
-+#include <dma.h>
- #include <asm/byteorder.h>
- #include <usb/composite.h>
- #include <linux/types.h>
-@@ -183,7 +184,7 @@ dfu_unbind(struct usb_configuration *c, struct usb_function *f)
- if (gadget_is_dualspeed(c->cdev->gadget))
- free(f->hs_descriptors);
-
-- free(dfu->dnreq->buf);
-+ dma_free(dfu->dnreq->buf);
- usb_ep_free_request(c->cdev->gadget->ep0, dfu->dnreq);
- free(dfu);
- }
-@@ -602,7 +603,7 @@ static int dfu_bind_config(struct usb_configuration *c)
- dfu->dnreq = usb_ep_alloc_request(c->cdev->gadget->ep0);
- if (!dfu->dnreq)
- printf("usb_ep_alloc_request failed\n");
-- dfu->dnreq->buf = xmalloc(CONFIG_USBD_DFU_XFER_SIZE);
-+ dfu->dnreq->buf = dma_alloc(CONFIG_USBD_DFU_XFER_SIZE);
- dfu->dnreq->complete = dn_complete;
- dfu->dnreq->zero = 0;
-
-diff --git a/drivers/usb/gadget/fsl_udc.c b/drivers/usb/gadget/fsl_udc.c
-index 5b64ec2..5537a0e 100644
---- a/drivers/usb/gadget/fsl_udc.c
-+++ b/drivers/usb/gadget/fsl_udc.c
-@@ -1,5 +1,6 @@
- #include <common.h>
- #include <errno.h>
-+#include <dma.h>
- #include <init.h>
- #include <clock.h>
- #include <usb/ch9.h>
-@@ -8,7 +9,6 @@
- #include <io.h>
- #include <poller.h>
- #include <asm/byteorder.h>
--#include <asm/mmu.h>
-
- /* ### define USB registers here
- */
-@@ -519,7 +519,7 @@ static void dump_msg(const char *label, const u8 * buf, unsigned int length)
- * 2 + ((windex & USB_DIR_IN) ? 1 : 0))
- #define get_pipe_by_ep(EP) (ep_index(EP) * 2 + ep_is_in(EP))
-
--static struct usb_dr_device *dr_regs;
-+static struct usb_dr_device __iomem *dr_regs;
- static struct fsl_udc *udc_controller = NULL;
-
- static const struct usb_endpoint_descriptor
-@@ -2109,7 +2109,8 @@ static int struct_udc_setup(struct fsl_udc *udc,
- udc->status_req = container_of(fsl_alloc_request(NULL),
- struct fsl_req, req);
- /* allocate a small amount of memory to get valid address */
-- udc->status_req->req.buf = xmalloc(8);
-+ udc->status_req->req.buf = dma_alloc(8);
-+ udc->status_req->req.length = 8;
- udc->resume_state = USB_STATE_NOTATTACHED;
- udc->usb_state = USB_STATE_POWERED;
- udc->ep0_dir = 0;
-diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c
-index a2473a9..c2f48ce 100644
---- a/drivers/usb/host/ehci-hcd.c
-+++ b/drivers/usb/host/ehci-hcd.c
-@@ -120,63 +120,6 @@ static struct descriptor {
-
- #define ehci_is_TDI() (ehci->flags & EHCI_HAS_TT)
-
--#ifdef CONFIG_MMU
--/*
-- * Routines to handle (flush/invalidate) the dcache for the QH and qTD
-- * structures and data buffers. This is needed on platforms using this
-- * EHCI support with dcache enabled.
-- */
--static void flush_invalidate(void *addr, int size, int flush)
--{
-- if (flush) {
-- dma_flush_range((unsigned long)addr, (unsigned long)(addr + size));
-- } else {
-- dma_inv_range((unsigned long)addr, (unsigned long)(addr + size));
-- }
--}
--
--static void cache_qtd(struct qTD *qtd, int flush)
--{
-- u32 *ptr = (u32 *)qtd->qt_buffer[0];
-- int len = (qtd->qt_token & 0x7fff0000) >> 16;
--
-- if (ptr && len)
-- flush_invalidate(ptr, len, flush);
--}
--
--static void cache_qh(struct ehci_priv *ehci, int flush)
--{
-- int i;
--
-- flush_invalidate(ehci->qh_list, sizeof(struct QH) * NUM_QH, flush);
-- flush_invalidate(ehci->td, sizeof(struct qTD) * NUM_TD, flush);
--
-- for (i = 0; i < NUM_TD; i ++)
-- cache_qtd(&ehci->td[i], flush);
--}
--
--static inline void ehci_flush_dcache(struct ehci_priv *ehci)
--{
-- cache_qh(ehci, 1);
--}
--
--static inline void ehci_invalidate_dcache(struct ehci_priv *ehci)
--{
-- cache_qh(ehci, 0);
--}
--#else /* CONFIG_MMU */
--/*
-- *
-- */
--static inline void ehci_flush_dcache(struct ehci_priv *ehci)
--{
--}
--
--static inline void ehci_invalidate_dcache(struct ehci_priv *ehci)
--{
--}
--#endif /* CONFIG_MMU */
--
- static int handshake(uint32_t *ptr, uint32_t mask, uint32_t done, int usec)
- {
- uint32_t result;
-@@ -231,6 +174,9 @@ static int ehci_td_buffer(struct qTD *td, void *buf, size_t sz)
- int idx;
-
- addr = (uint32_t) buf;
-+ td->qtd_dma = addr;
-+ td->length = sz;
-+
- idx = 0;
- while (idx < 5) {
- td->qt_buffer[idx] = cpu_to_hc32(addr);
-@@ -264,7 +210,7 @@ ehci_submit_async(struct usb_device *dev, unsigned long pipe, void *buffer,
- uint32_t endpt, token, usbsts;
- uint32_t c, toggle;
- uint32_t cmd;
-- int ret = 0;
-+ int ret = 0, i;
- uint64_t start, timeout_val;
-
- debug("dev=%p, pipe=%lx, buffer=%p, length=%d, req=%p\n", dev, pipe,
-@@ -296,11 +242,11 @@ ehci_submit_async(struct usb_device *dev, unsigned long pipe, void *buffer,
- (dev->portnr << 23) |
- (dev->parent->devnum << 16) | (0 << 8) | (0 << 0);
- qh->qh_endpt2 = cpu_to_hc32(endpt);
-- qh->qh_overlay.qt_next = cpu_to_hc32(QT_NEXT_TERMINATE);
-- qh->qh_overlay.qt_altnext = cpu_to_hc32(QT_NEXT_TERMINATE);
-+ qh->qt_next = cpu_to_hc32(QT_NEXT_TERMINATE);
-+ qh->qt_altnext = cpu_to_hc32(QT_NEXT_TERMINATE);
-
- td = NULL;
-- tdp = &qh->qh_overlay.qt_next;
-+ tdp = &qh->qt_next;
-
- toggle =
- usb_gettoggle(dev, usb_pipeendpoint(pipe), usb_pipeout(pipe));
-@@ -363,7 +309,14 @@ ehci_submit_async(struct usb_device *dev, unsigned long pipe, void *buffer,
- ehci->qh_list->qh_link = cpu_to_hc32((uint32_t) qh | QH_LINK_TYPE_QH);
-
- /* Flush dcache */
-- ehci_flush_dcache(ehci);
-+ if (IS_ENABLED(CONFIG_MMU)) {
-+ for (i = 0; i < NUM_TD; i ++) {
-+ struct qTD *qtd = &ehci->td[i];
-+ if (!qtd->qtd_dma)
-+ continue;
-+ dma_flush_range(qtd->qtd_dma, qtd->qtd_dma + qtd->length);
-+ }
-+ }
-
- usbsts = ehci_readl(&ehci->hcor->or_usbsts);
- ehci_writel(&ehci->hcor->or_usbsts, (usbsts & 0x3f));
-@@ -384,8 +337,6 @@ ehci_submit_async(struct usb_device *dev, unsigned long pipe, void *buffer,
- start = get_time_ns();
- vtd = td;
- do {
-- /* Invalidate dcache */
-- ehci_invalidate_dcache(ehci);
- token = hc32_to_cpu(vtd->qt_token);
- if (is_timeout(start, timeout_val)) {
- /* Disable async schedule. */
-@@ -394,11 +345,20 @@ ehci_submit_async(struct usb_device *dev, unsigned long pipe, void *buffer,
- ehci_writel(&ehci->hcor->or_usbcmd, cmd);
-
- ret = handshake(&ehci->hcor->or_usbsts, STD_ASS, 0, 100 * 1000);
-- ehci_writel(&qh->qh_overlay.qt_token, 0);
-+ ehci_writel(&qh->qt_token, 0);
- return -ETIMEDOUT;
- }
- } while (token & 0x80);
-
-+ if (IS_ENABLED(CONFIG_MMU)) {
-+ for (i = 0; i < NUM_TD; i ++) {
-+ struct qTD *qtd = &ehci->td[i];
-+ if (!qtd->qtd_dma)
-+ continue;
-+ dma_inv_range(qtd->qtd_dma, qtd->qtd_dma + qtd->length);
-+ }
-+ }
-+
- /* Disable async schedule. */
- cmd = ehci_readl(&ehci->hcor->or_usbcmd);
- cmd &= ~CMD_ASE;
-@@ -413,7 +373,7 @@ ehci_submit_async(struct usb_device *dev, unsigned long pipe, void *buffer,
-
- ehci->qh_list->qh_link = cpu_to_hc32((uint32_t)ehci->qh_list | QH_LINK_TYPE_QH);
-
-- token = hc32_to_cpu(qh->qh_overlay.qt_token);
-+ token = hc32_to_cpu(qh->qt_token);
- if (!(token & 0x80)) {
- debug("TOKEN=0x%08x\n", token);
- switch (token & 0xfc) {
-@@ -451,10 +411,10 @@ ehci_submit_async(struct usb_device *dev, unsigned long pipe, void *buffer,
-
- fail:
- printf("fail1\n");
-- td = (void *)hc32_to_cpu(qh->qh_overlay.qt_next);
-+ td = (void *)hc32_to_cpu(qh->qt_next);
- while (td != (void *)QT_NEXT_TERMINATE) {
-- qh->qh_overlay.qt_next = td->qt_next;
-- td = (void *)hc32_to_cpu(qh->qh_overlay.qt_next);
-+ qh->qt_next = td->qt_next;
-+ td = (void *)hc32_to_cpu(qh->qt_next);
- }
- return -1;
- }
-@@ -770,9 +730,9 @@ static int ehci_init(struct usb_host *host)
- ehci->qh_list->qh_link = cpu_to_hc32((uint32_t)ehci->qh_list | QH_LINK_TYPE_QH);
- ehci->qh_list->qh_endpt1 = cpu_to_hc32((1 << 15) | (USB_SPEED_HIGH << 12));
- ehci->qh_list->qh_curtd = cpu_to_hc32(QT_NEXT_TERMINATE);
-- ehci->qh_list->qh_overlay.qt_next = cpu_to_hc32(QT_NEXT_TERMINATE);
-- ehci->qh_list->qh_overlay.qt_altnext = cpu_to_hc32(QT_NEXT_TERMINATE);
-- ehci->qh_list->qh_overlay.qt_token = cpu_to_hc32(0x40);
-+ ehci->qh_list->qt_next = cpu_to_hc32(QT_NEXT_TERMINATE);
-+ ehci->qh_list->qt_altnext = cpu_to_hc32(QT_NEXT_TERMINATE);
-+ ehci->qh_list->qt_token = cpu_to_hc32(0x40);
-
- /* Set async. queue head pointer. */
- ehci_writel(&ehci->hcor->or_asynclistaddr, (uint32_t)ehci->qh_list);
-@@ -878,8 +838,8 @@ static int ehci_probe(struct device_d *dev)
- ehci->hccr = dev_request_mem_region(dev, 0);
- ehci->hcor = dev_request_mem_region(dev, 1);
-
-- ehci->qh_list = xmemalign(32, sizeof(struct QH) * NUM_QH);
-- ehci->td = xmemalign(32, sizeof(struct qTD) * NUM_TD);
-+ ehci->qh_list = dma_alloc_coherent(sizeof(struct QH) * NUM_TD);
-+ ehci->td = dma_alloc_coherent(sizeof(struct qTD) * NUM_TD);
-
- host->init = ehci_init;
- host->submit_int_msg = submit_int_msg;
-diff --git a/drivers/usb/host/ehci.h b/drivers/usb/host/ehci.h
-index eac93db..b127b95 100644
---- a/drivers/usb/host/ehci.h
-+++ b/drivers/usb/host/ehci.h
-@@ -166,7 +166,9 @@ struct qTD {
- uint32_t qt_altnext;
- uint32_t qt_token;
- uint32_t qt_buffer[5];
--};
-+ unsigned long qtd_dma;
-+ size_t length;
-+} __attribute__ ((aligned (32)));
-
- /* Queue Head (QH). */
- struct QH {
-@@ -179,7 +181,11 @@ struct QH {
- uint32_t qh_endpt1;
- uint32_t qh_endpt2;
- uint32_t qh_curtd;
-- struct qTD qh_overlay;
-+ /* qtd overlay (hardware parts of a struct qTD) */
-+ uint32_t qt_next;
-+ uint32_t qt_altnext;
-+ uint32_t qt_token;
-+ uint32_t qt_buffer[5];
- /*
- * Add dummy fill value to make the size of this struct
- * aligned to 32 bytes
-diff --git a/drivers/usb/host/ohci-at91.c b/drivers/usb/host/ohci-at91.c
-index 2ce7c6e..b3e9909 100644
---- a/drivers/usb/host/ohci-at91.c
-+++ b/drivers/usb/host/ohci-at91.c
-@@ -64,7 +64,7 @@ static int at91_ohci_probe(struct device_d *dev)
- writel(0, &regs->control);
-
- add_generic_device("ohci", DEVICE_ID_DYNAMIC, NULL, dev->resource[0].start,
-- dev->resource[0].size, IORESOURCE_MEM, NULL);
-+ resource_size(&dev->resource[0]), IORESOURCE_MEM, NULL);
-
- return 0;
- }
-diff --git a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c
-index 05e4094..f10d827 100644
---- a/drivers/usb/host/ohci-hcd.c
-+++ b/drivers/usb/host/ohci-hcd.c
-@@ -415,7 +415,7 @@ static void ohci_dump(struct ohci *controller, int verbose)
-
- /* get a transfer request */
-
--int sohci_submit_job(struct urb_priv *urb, struct devrequest *setup)
-+static int sohci_submit_job(struct urb_priv *urb, struct devrequest *setup)
- {
- struct ed *ed;
- int i, size = 0;
-@@ -498,7 +498,7 @@ int sohci_submit_job(struct urb_priv *urb, struct devrequest *setup)
- static inline int sohci_return_job(struct ohci *hc, struct urb_priv *urb)
- {
- #ifdef ENBALE_PIPE_INTERRUPT
-- struct ohci_regs *regs = hc->regs;
-+ struct ohci_regs __iomem *regs = hc->regs;
- #endif
-
- switch (usb_pipetype(urb->pipe)) {
-@@ -848,7 +848,7 @@ static void td_fill(struct ohci *ohci, unsigned int info,
- }
- #endif
- if (!len)
-- data = 0;
-+ data = NULL;
-
- td->hwINFO = m32_swap(info);
- td->hwCBP = virt_to_phys((void *)m32_swap((unsigned long)data));
-@@ -894,7 +894,7 @@ static void td_submit_job(struct usb_device *dev, unsigned long pipe,
- if (data_len)
- data = buffer;
- else
-- data = 0;
-+ data = NULL;
-
- switch (usb_pipetype(pipe)) {
- case PIPE_BULK:
-@@ -1214,32 +1214,6 @@ static inline void wr_rh_portstat(struct ohci *ohci, int wIndex, __u32 value)
- writel(value, &ohci->regs->roothub.portstatus[wIndex-1]);
- }
-
--/* request to virtual root hub */
--
--int rh_check_port_status(struct ohci *controller)
--{
-- __u32 temp, ndp, i;
-- int res;
--
-- res = -1;
-- temp = roothub_a(controller);
-- ndp = (temp & RH_A_NDP);
--#ifdef CONFIG_AT91C_PQFP_UHPBUG
-- ndp = (ndp == 2) ? 1 : 0;
--#endif
-- for (i = 0; i < ndp; i++) {
-- temp = roothub_portstatus(controller, i);
-- /* check for a device disconnect */
-- if (((temp & (RH_PS_PESC | RH_PS_CSC)) ==
-- (RH_PS_PESC | RH_PS_CSC)) &&
-- ((temp & RH_PS_CCS) == 0)) {
-- res = i;
-- break;
-- }
-- }
-- return res;
--}
--
- static int ohci_submit_rh_msg(struct usb_device *dev, unsigned long pipe,
- void *buffer, int transfer_len, struct devrequest *cmd)
- {
-@@ -1502,7 +1476,7 @@ static int ohci_submit_rh_msg(struct usb_device *dev, unsigned long pipe,
-
- /* common code for handling submit messages - used for all but root hub */
- /* accesses. */
--int submit_common_msg(struct usb_device *dev, unsigned long pipe, void *buffer,
-+static int submit_common_msg(struct usb_device *dev, unsigned long pipe, void *buffer,
- int transfer_len, struct devrequest *setup, int interval,
- int timeout)
- {
-@@ -1721,7 +1695,7 @@ static int hc_start(struct ohci *ohci)
-
- static int hc_interrupt(struct ohci *ohci)
- {
-- struct ohci_regs *regs = ohci->regs;
-+ struct ohci_regs __iomem *regs = ohci->regs;
- int ints;
- int stat = 0;
-
-@@ -1840,7 +1814,7 @@ static int ohci_probe(struct device_d *dev)
-
- usb_register_host(host);
-
-- ohci->regs = (void *)dev->resource[0].start;
-+ ohci->regs = dev_request_mem_region(dev, 0);
-
- return 0;
- }
-diff --git a/drivers/usb/host/ohci.h b/drivers/usb/host/ohci.h
-index 9132963..9c9b837 100644
---- a/drivers/usb/host/ohci.h
-+++ b/drivers/usb/host/ohci.h
-@@ -408,7 +408,7 @@ struct ohci {
- int disabled; /* e.g. got a UE, we're hung */
- unsigned long flags; /* for HC bugs */
-
-- struct ohci_regs *regs; /* OHCI controller's memory */
-+ struct ohci_regs __iomem *regs; /* OHCI controller's memory */
-
- int ohci_int_load[32]; /* load of the 32 Interrupt Chains (for load balancing)*/
- struct ed *ed_rm_list[2]; /* lists of all endpoints to be removed */
-diff --git a/drivers/usb/storage/transport.c b/drivers/usb/storage/transport.c
-index e7a5972..68170b6 100644
---- a/drivers/usb/storage/transport.c
-+++ b/drivers/usb/storage/transport.c
-@@ -26,6 +26,7 @@
- #include <clock.h>
- #include <scsi.h>
- #include <errno.h>
-+#include <dma.h>
-
- #undef USB_STOR_DEBUG
-
-@@ -65,8 +66,8 @@ int usb_stor_Bulk_clear_endpt_stall(struct us_data *us, unsigned int pipe)
- /* Determine what the maximum LUN supported is */
- int usb_stor_Bulk_max_lun(struct us_data *us)
- {
-- int len;
-- unsigned char iobuf[1];
-+ int len, ret = 0;
-+ unsigned char *iobuf = dma_alloc(1);
-
- /* issue the command */
- iobuf[0] = 0;
-@@ -81,7 +82,9 @@ int usb_stor_Bulk_max_lun(struct us_data *us)
-
- /* if we have a successful request, return the result */
- if (len > 0)
-- return (int)iobuf[0];
-+ ret = iobuf[0];
-+
-+ dma_free(iobuf);
-
- /*
- * Some devices don't like GetMaxLUN. They may STALL the control
-@@ -90,7 +93,7 @@ int usb_stor_Bulk_max_lun(struct us_data *us)
- * ways. In these cases the best approach is to use the default
- * value: only one LUN.
- */
-- return 0;
-+ return ret;
- }
-
- int usb_stor_Bulk_transport(ccb *srb, struct us_data *us)
-diff --git a/drivers/video/fb.c b/drivers/video/fb.c
-index 0be465f..d885570 100644
---- a/drivers/video/fb.c
-+++ b/drivers/video/fb.c
-@@ -86,7 +86,7 @@ static int fb_setup_mode(struct device_d *dev, struct param_d *param,
- if (!ret) {
- dev->resource[0].start = (resource_size_t)info->screen_base;
- info->cdev.size = info->xres * info->yres * (info->bits_per_pixel >> 3);
-- dev->resource[0].size = info->cdev.size;
-+ dev->resource[0].end = info->cdev.size - 1;
- dev_param_set_generic(dev, param, val);
- } else
- info->cdev.size = 0;
-@@ -116,7 +116,7 @@ int register_framebuffer(struct fb_info *info)
- info->cdev.priv = info;
- dev->resource = xzalloc(sizeof(struct resource));
- dev->resource[0].start = (resource_size_t)info->screen_base;
-- dev->resource[0].size = info->cdev.size;
-+ dev->resource[0].end = info->cdev.size - 1;
- dev->resource[0].flags = IORESOURCE_MEM;
- dev->num_resources = 1;
-
-diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig
-new file mode 100644
-index 0000000..8fdc7a5
---- /dev/null
-+++ b/drivers/watchdog/Kconfig
-@@ -0,0 +1,15 @@
-+menuconfig WATCHDOG
-+ bool "Watchdog support "
-+ help
-+ Many platforms support a watchdog to keep track of a working machine.
-+ This framework provides routines to handle these watchdogs.
-+
-+if WATCHDOG
-+
-+config WATCHDOG_MXS28
-+ bool "i.MX28"
-+ depends on ARCH_IMX28
-+ help
-+ Add support for watchdog management for the i.MX28 SoC.
-+
-+endif
-diff --git a/drivers/watchdog/Makefile b/drivers/watchdog/Makefile
-new file mode 100644
-index 0000000..b29103b
---- /dev/null
-+++ b/drivers/watchdog/Makefile
-@@ -0,0 +1,2 @@
-+obj-$(CONFIG_WATCHDOG) += wd_core.o
-+obj-$(CONFIG_WATCHDOG_MXS28) += im28wd.o
-diff --git a/drivers/watchdog/im28wd.c b/drivers/watchdog/im28wd.c
-new file mode 100644
-index 0000000..b016910
---- /dev/null
-+++ b/drivers/watchdog/im28wd.c
-@@ -0,0 +1,124 @@
-+/*
-+ * (c) 2012 Juergen Beisert <kernel@pengutronix.de>
-+ *
-+ * 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.
-+ *
-+ * Note: this driver works for the i.MX28 SoC. It might work for the
-+ * i.MX23 Soc as well, but is not tested yet.
-+ */
-+
-+#include <common.h>
-+#include <init.h>
-+#include <io.h>
-+#include <errno.h>
-+#include <malloc.h>
-+#include <watchdog.h>
-+
-+#define MXS_RTC_CTRL 0x0
-+#define MXS_RTC_SET_ADDR 0x4
-+#define MXS_RTC_CLR_ADDR 0x8
-+# define MXS_RTC_CTRL_WATCHDOGEN (1 << 4)
-+
-+#define MXS_RTC_STAT 0x10
-+# define MXS_RTC_STAT_WD_PRESENT (1 << 29)
-+
-+#define MXS_RTC_WATCHDOG 0x50
-+
-+#define MXS_RTC_PERSISTENT0 0x60
-+/* dubious meaning from inside the SoC's firmware ROM */
-+# define MXS_RTC_PERSISTENT0_EXT_RST (1 << 21)
-+/* dubious meaning from inside the SoC's firmware ROM */
-+# define MXS_RTC_PERSISTENT0_THM_RST (1 << 20)
-+
-+#define MXS_RTC_PERSISTENT1 0x70
-+/* dubious meaning from inside the SoC's firmware ROM */
-+# define MXS_RTC_PERSISTENT1_FORCE_UPDATER (1 << 31)
-+
-+#define MXS_RTC_DEBUG 0xc0
-+
-+#define WDOG_TICK_RATE 1000 /* the watchdog uses a 1 kHz clock rate */
-+
-+struct imx28_wd {
-+ struct watchdog wd;
-+ void __iomem *regs;
-+};
-+
-+#define to_imx28_wd(h) container_of(h, struct imx28_wd, wd)
-+
-+static int imx28_watchdog_set_timeout(struct watchdog *wd, unsigned timeout)
-+{
-+ struct imx28_wd *pwd = (struct imx28_wd *)to_imx28_wd(wd);
-+ void __iomem *base;
-+
-+ if (timeout > (ULONG_MAX / WDOG_TICK_RATE))
-+ return -EINVAL;
-+
-+ if (timeout) {
-+ writel(timeout * WDOG_TICK_RATE, pwd->regs + MXS_RTC_WATCHDOG);
-+ base = pwd->regs + MXS_RTC_SET_ADDR;
-+ } else {
-+ base = pwd->regs + MXS_RTC_CLR_ADDR;
-+ }
-+ writel(MXS_RTC_CTRL_WATCHDOGEN, base + MXS_RTC_CTRL);
-+ writel(MXS_RTC_PERSISTENT1_FORCE_UPDATER, base + MXS_RTC_PERSISTENT1);
-+
-+ return 0;
-+}
-+
-+static int imx28_wd_probe(struct device_d *dev)
-+{
-+ struct imx28_wd *priv;
-+ int rc;
-+
-+ priv = xzalloc(sizeof(struct imx28_wd));
-+ priv->regs = dev_request_mem_region(dev, 0);
-+ priv->wd.set_timeout = imx28_watchdog_set_timeout;
-+
-+ if (!(readl(priv->regs + MXS_RTC_STAT) & MXS_RTC_STAT_WD_PRESENT)) {
-+ rc = -ENODEV;
-+ goto on_error;
-+ }
-+
-+ /* disable the debug feature to ensure a working WD */
-+ writel(0x00000000, priv->regs + MXS_RTC_DEBUG);
-+
-+ rc = watchdog_register(&priv->wd);
-+ if (rc != 0)
-+ goto on_error;
-+
-+ dev->priv = priv;
-+ return 0;
-+
-+on_error:
-+ free(priv);
-+ return rc;
-+}
-+
-+static void imx28_wd_remove(struct device_d *dev)
-+{
-+ struct imx28_wd *priv= dev->priv;
-+ watchdog_deregister(&priv->wd);
-+ free(priv);
-+}
-+
-+static struct driver_d imx28_wd_driver = {
-+ .name = "im28wd",
-+ .probe = imx28_wd_probe,
-+ .remove = imx28_wd_remove,
-+};
-+
-+static int imx28_wd_init(void)
-+{
-+ register_driver(&imx28_wd_driver);
-+ return 0;
-+}
-+
-+device_initcall(imx28_wd_init);
-diff --git a/drivers/watchdog/wd_core.c b/drivers/watchdog/wd_core.c
-new file mode 100644
-index 0000000..3d0cfc6
---- /dev/null
-+++ b/drivers/watchdog/wd_core.c
-@@ -0,0 +1,57 @@
-+/*
-+ * (c) 2012 Juergen Beisert <kernel@pengutronix.de>
-+ *
-+ * 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.
-+ */
-+
-+#include <common.h>
-+#include <command.h>
-+#include <errno.h>
-+#include <linux/ctype.h>
-+#include <watchdog.h>
-+
-+/*
-+ * Note: this simple framework supports one watchdog only.
-+ */
-+static struct watchdog *watchdog;
-+
-+int watchdog_register(struct watchdog *wd)
-+{
-+ if (watchdog != NULL)
-+ return -EBUSY;
-+
-+ watchdog = wd;
-+ return 0;
-+}
-+EXPORT_SYMBOL(watchdog_register);
-+
-+int watchdog_deregister(struct watchdog *wd)
-+{
-+ if (watchdog == NULL || wd != watchdog)
-+ return -ENODEV;
-+
-+ watchdog = NULL;
-+ return 0;
-+}
-+EXPORT_SYMBOL(watchdog_deregister);
-+
-+/*
-+ * start, stop or retrigger the watchdog
-+ * timeout in [seconds]. timeout of '0' will disable the watchdog (if possible)
-+ */
-+int watchdog_set_timeout(unsigned timeout)
-+{
-+ if (watchdog == NULL)
-+ return -ENODEV;
-+
-+ return watchdog->set_timeout(watchdog, timeout);
-+}
-+EXPORT_SYMBOL(watchdog_set_timeout);
-diff --git a/fs/cramfs/cramfs.c b/fs/cramfs/cramfs.c
-index c7c798b..99f6d49 100644
---- a/fs/cramfs/cramfs.c
-+++ b/fs/cramfs/cramfs.c
-@@ -358,7 +358,7 @@ static int cramfs_read(struct device_d *_dev, FILE *f, void *buf, size_t size)
- return outsize;
- }
-
--static off_t cramfs_lseek(struct device_d *dev, FILE *f, off_t pos)
-+static loff_t cramfs_lseek(struct device_d *dev, FILE *f, loff_t pos)
- {
- f->pos = pos;
- return f->pos;
-diff --git a/fs/devfs-core.c b/fs/devfs-core.c
-index ff6a976..cdb8f79 100644
---- a/fs/devfs-core.c
-+++ b/fs/devfs-core.c
-@@ -96,7 +96,7 @@ void cdev_close(struct cdev *cdev)
- cdev->ops->close(cdev);
- }
-
--ssize_t cdev_read(struct cdev *cdev, void *buf, size_t count, ulong offset, ulong flags)
-+ssize_t cdev_read(struct cdev *cdev, void *buf, size_t count, loff_t offset, ulong flags)
- {
- if (!cdev->ops->read)
- return -ENOSYS;
-@@ -104,7 +104,7 @@ ssize_t cdev_read(struct cdev *cdev, void *buf, size_t count, ulong offset, ulon
- return cdev->ops->read(cdev, buf, count, cdev->offset +offset, flags);
- }
-
--ssize_t cdev_write(struct cdev *cdev, const void *buf, size_t count, ulong offset, ulong flags)
-+ssize_t cdev_write(struct cdev *cdev, const void *buf, size_t count, loff_t offset, ulong flags)
- {
- if (!cdev->ops->write)
- return -ENOSYS;
-@@ -123,15 +123,15 @@ int cdev_flush(struct cdev *cdev)
- static int partition_ioctl(struct cdev *cdev, int request, void *buf)
- {
- int ret = 0;
-- size_t offset;
-+ loff_t offset, *_buf = buf;
- struct mtd_info_user *user = buf;
-
- switch (request) {
- case MEMSETBADBLOCK:
- case MEMGETBADBLOCK:
-- offset = (off_t)buf;
-+ offset = *_buf;
- offset += cdev->offset;
-- ret = cdev->ops->ioctl(cdev, request, (void *)offset);
-+ ret = cdev->ops->ioctl(cdev, request, &offset);
- break;
- case MEMGETINFO:
- if (cdev->mtd) {
-@@ -165,10 +165,11 @@ static int partition_ioctl(struct cdev *cdev, int request, void *buf)
- case MEMGETREGIONINFO:
- if (cdev->mtd) {
- struct region_info_user *reg = buf;
-+ int erasesize_shift = ffs(cdev->mtd->erasesize) - 1;
-
- reg->offset = cdev->offset;
- reg->erasesize = cdev->mtd->erasesize;
-- reg->numblocks = cdev->size/reg->erasesize;
-+ reg->numblocks = cdev->size >> erasesize_shift;
- reg->regionindex = cdev->mtd->index;
- }
- break;
-@@ -191,7 +192,7 @@ int cdev_ioctl(struct cdev *cdev, int request, void *buf)
- return cdev->ops->ioctl(cdev, request, buf);
- }
-
--int cdev_erase(struct cdev *cdev, size_t count, unsigned long offset)
-+int cdev_erase(struct cdev *cdev, size_t count, loff_t offset)
- {
- if (!cdev->ops->erase)
- return -ENOSYS;
-@@ -226,7 +227,7 @@ int devfs_remove(struct cdev *cdev)
- return 0;
- }
-
--int devfs_add_partition(const char *devname, unsigned long offset, size_t size,
-+int devfs_add_partition(const char *devname, loff_t offset, loff_t size,
- int flags, const char *name)
- {
- struct cdev *cdev, *new;
-diff --git a/fs/devfs.c b/fs/devfs.c
-index ae48451..fccf25a 100644
---- a/fs/devfs.c
-+++ b/fs/devfs.c
-@@ -49,13 +49,16 @@ static int devfs_write(struct device_d *_dev, FILE *f, const void *buf, size_t s
- {
- struct cdev *cdev = f->inode;
-
-+ if (cdev->flags & DEVFS_PARTITION_READONLY)
-+ return -EPERM;
-+
- return cdev_write(cdev, buf, size, f->pos, f->flags);
- }
-
--static off_t devfs_lseek(struct device_d *_dev, FILE *f, off_t pos)
-+static loff_t devfs_lseek(struct device_d *_dev, FILE *f, loff_t pos)
- {
- struct cdev *cdev = f->inode;
-- off_t ret = -1;
-+ loff_t ret = -1;
-
- if (cdev->ops->lseek)
- ret = cdev->ops->lseek(cdev, pos + cdev->offset);
-@@ -66,10 +69,13 @@ static off_t devfs_lseek(struct device_d *_dev, FILE *f, off_t pos)
- return ret - cdev->offset;
- }
-
--static int devfs_erase(struct device_d *_dev, FILE *f, size_t count, unsigned long offset)
-+static int devfs_erase(struct device_d *_dev, FILE *f, size_t count, loff_t offset)
- {
- struct cdev *cdev = f->inode;
-
-+ if (cdev->flags & DEVFS_PARTITION_READONLY)
-+ return -EPERM;
-+
- if (!cdev->ops->erase)
- return -ENOSYS;
-
-@@ -79,7 +85,7 @@ static int devfs_erase(struct device_d *_dev, FILE *f, size_t count, unsigned lo
- return cdev->ops->erase(cdev, count, offset + cdev->offset);
- }
-
--static int devfs_protect(struct device_d *_dev, FILE *f, size_t count, unsigned long offset, int prot)
-+static int devfs_protect(struct device_d *_dev, FILE *f, size_t count, loff_t offset, int prot)
- {
- struct cdev *cdev = f->inode;
-
-@@ -100,7 +106,7 @@ static int devfs_memmap(struct device_d *_dev, FILE *f, void **map, int flags)
- ret = cdev->ops->memmap(cdev, map, flags);
-
- if (!ret)
-- *map = (void *)((unsigned long)*map + cdev->offset);
-+ *map = (void *)((unsigned long)*map + (unsigned long)cdev->offset);
-
- return ret;
- }
-@@ -115,7 +121,8 @@ static int devfs_open(struct device_d *_dev, FILE *f, const char *filename)
- if (!cdev)
- return -ENOENT;
-
-- f->size = cdev->size;
-+ f->size = cdev->flags & DEVFS_IS_CHARACTER_DEV ?
-+ FILE_SIZE_STREAM : cdev->size;
- f->inode = cdev;
-
- if (cdev->ops->open) {
-@@ -166,7 +173,7 @@ static int devfs_truncate(struct device_d *dev, FILE *f, ulong size)
- {
- if (f->dev->num_resources < 1)
- return -ENOSPC;
-- if (size > f->dev->resource[0].size)
-+ if (size > resource_size(&f->dev->resource[0]))
- return -ENOSPC;
- return 0;
- }
-diff --git a/fs/fat/fat.c b/fs/fat/fat.c
-index 21464bd..5e6c81c 100644
---- a/fs/fat/fat.c
-+++ b/fs/fat/fat.c
-@@ -49,7 +49,7 @@ DRESULT disk_read(FATFS *fat, BYTE *buf, DWORD sector, BYTE count)
-
- debug("%s: sector: %ld count: %d\n", __func__, sector, count);
-
-- ret = cdev_read(priv->cdev, buf, count << 9, sector * 512, 0);
-+ ret = cdev_read(priv->cdev, buf, count << 9, (loff_t)sector * 512, 0);
- if (ret != count << 9)
- return ret;
-
-@@ -64,7 +64,7 @@ DRESULT disk_write(FATFS *fat, const BYTE *buf, DWORD sector, BYTE count)
- debug("%s: buf: %p sector: %ld count: %d\n",
- __func__, buf, sector, count);
-
-- ret = cdev_write(priv->cdev, buf, count << 9, sector * 512, 0);
-+ ret = cdev_write(priv->cdev, buf, count << 9, (loff_t)sector * 512, 0);
- if (ret != count << 9)
- return ret;
-
-@@ -271,7 +271,7 @@ static int fat_read(struct device_d *_dev, FILE *f, void *buf, size_t insize)
- return outsize;
- }
-
--static off_t fat_lseek(struct device_d *dev, FILE *f, off_t pos)
-+static loff_t fat_lseek(struct device_d *dev, FILE *f, loff_t pos)
- {
- FIL *f_file = f->inode;
- int ret;
-diff --git a/fs/fat/ff.c b/fs/fat/ff.c
-index 2d476ee..66db1d6 100644
---- a/fs/fat/ff.c
-+++ b/fs/fat/ff.c
-@@ -1043,7 +1043,7 @@ int dir_register ( /* 0:Successful, FR_DENIED:No free entry or too many SFN coll
-
- if (sn[NS] & NS_LOSS) {
- /* When LFN is out of 8.3 format, generate a numbered name */
-- fn[NS] = 0; dj->lfn = 0; /* Find only SFN */
-+ fn[NS] = 0; dj->lfn = NULL; /* Find only SFN */
- for (n = 1; n < 100; n++) {
- gen_numname(fn, sn, lfn, n); /* Generate a numbered name */
- res = dir_find(dj); /* Check if the name collides with existing SFN */
-@@ -1496,7 +1496,7 @@ int follow_path ( /* 0(0): successful, !=0: error code */
- if ((UINT)*path < ' ') {
- /* Nul path means the start directory itself */
- res = dir_sdi(dj, 0);
-- dj->dir = 0;
-+ dj->dir = NULL;
- return res;
- }
-
-@@ -1718,7 +1718,7 @@ int f_open (
- DEF_NAMEBUF;
-
-
-- fp->fs = 0; /* Clear file object */
-+ fp->fs = NULL; /* Clear file object */
-
- #ifdef CONFIG_FS_FAT_WRITE
- mode &= FA_READ | FA_WRITE | FA_CREATE_ALWAYS | FA_OPEN_ALWAYS | FA_CREATE_NEW;
-@@ -2059,7 +2059,7 @@ int f_close (
- /* Flush cached data */
- res = f_sync(fp);
- if (res == 0)
-- fp->fs = 0; /* Discard file object */
-+ fp->fs = NULL; /* Discard file object */
- return res;
- #endif
- }
-@@ -2308,7 +2308,7 @@ int f_getfree (
- } else {
- clst = fatfs->n_fatent;
- sect = fatfs->fatbase;
-- i = 0; p = 0;
-+ i = 0; p = NULL;
- do {
- if (!i) {
- res = move_window(fatfs, sect++);
-diff --git a/fs/fs.c b/fs/fs.c
-index af73c8c..0b376a5 100644
---- a/fs/fs.c
-+++ b/fs/fs.c
-@@ -33,6 +33,7 @@
- #include <libbb.h>
- #include <magicvar.h>
- #include <environment.h>
-+#include <libgen.h>
-
- void *read_file(const char *filename, size_t *size)
- {
-@@ -427,6 +428,25 @@ out:
- return ret;
- }
-
-+static int parent_check_directory(const char *path)
-+{
-+ struct stat s;
-+ int ret;
-+ char *dir = dirname(xstrdup(path));
-+
-+ ret = stat(dir, &s);
-+
-+ free(dir);
-+
-+ if (ret)
-+ return -ENOENT;
-+
-+ if (!S_ISDIR(s.st_mode))
-+ return -ENOTDIR;
-+
-+ return 0;
-+}
-+
- const char *getcwd(void)
- {
- return cwd;
-@@ -515,6 +535,12 @@ int open(const char *pathname, int flags, ...)
- goto out1;
- }
-
-+ if (exist_err) {
-+ ret = parent_check_directory(path);
-+ if (ret)
-+ goto out1;
-+ }
-+
- f = get_file();
- if (!f) {
- ret = -EMFILE;
-@@ -617,7 +643,7 @@ int read(int fd, void *buf, size_t count)
-
- fsdrv = dev_to_fs_driver(dev);
-
-- if (f->pos + count > f->size)
-+ if (f->size != FILE_SIZE_STREAM && f->pos + count > f->size)
- count = f->size - f->pos;
-
- if (!count)
-@@ -646,7 +672,7 @@ ssize_t write(int fd, const void *buf, size_t count)
- dev = f->dev;
-
- fsdrv = dev_to_fs_driver(dev);
-- if (f->pos + count > f->size) {
-+ if (f->size != FILE_SIZE_STREAM && f->pos + count > f->size) {
- ret = fsdrv->truncate(dev, f, f->pos + count);
- if (ret) {
- if (ret != -ENOSPC)
-@@ -692,12 +718,12 @@ int flush(int fd)
- return ret;
- }
-
--off_t lseek(int fildes, off_t offset, int whence)
-+loff_t lseek(int fildes, loff_t offset, int whence)
- {
- struct device_d *dev;
- struct fs_driver_d *fsdrv;
- FILE *f = &files[fildes];
-- off_t pos;
-+ loff_t pos;
- int ret;
-
- if (check_fd(fildes))
-@@ -714,12 +740,12 @@ off_t lseek(int fildes, off_t offset, int whence)
-
- switch (whence) {
- case SEEK_SET:
-- if (offset > f->size)
-+ if (f->size != FILE_SIZE_STREAM && offset > f->size)
- goto out;
- pos = offset;
- break;
- case SEEK_CUR:
-- if (offset + f->pos > f->size)
-+ if (f->size != FILE_SIZE_STREAM && offset + f->pos > f->size)
- goto out;
- pos = f->pos + offset;
- break;
-@@ -1153,6 +1179,10 @@ int mkdir (const char *pathname, mode_t mode)
- char *freep = p;
- int ret;
-
-+ ret = parent_check_directory(p);
-+ if (ret)
-+ goto out;
-+
- ret = path_check_prereq(pathname, S_UB_DOES_NOT_EXIST);
- if (ret)
- goto out;
-@@ -1243,7 +1273,7 @@ static void memcpy_sz(void *_dst, const void *_src, ulong count, ulong rwsize)
- }
- }
-
--ssize_t mem_read(struct cdev *cdev, void *buf, size_t count, ulong offset, ulong flags)
-+ssize_t mem_read(struct cdev *cdev, void *buf, size_t count, loff_t offset, ulong flags)
- {
- ulong size;
- struct device_d *dev;
-@@ -1252,13 +1282,13 @@ ssize_t mem_read(struct cdev *cdev, void *buf, size_t count, ulong offset, ulong
- return -1;
- dev = cdev->dev;
-
-- size = min((ulong)count, dev->resource[0].size - offset);
-+ size = min((loff_t)count, resource_size(&dev->resource[0]) - offset);
- memcpy_sz(buf, dev_get_mem_region(dev, 0) + offset, size, flags & O_RWSIZE_MASK);
- return size;
- }
- EXPORT_SYMBOL(mem_read);
-
--ssize_t mem_write(struct cdev *cdev, const void *buf, size_t count, ulong offset, ulong flags)
-+ssize_t mem_write(struct cdev *cdev, const void *buf, size_t count, loff_t offset, ulong flags)
- {
- ulong size;
- struct device_d *dev;
-@@ -1267,7 +1297,7 @@ ssize_t mem_write(struct cdev *cdev, const void *buf, size_t count, ulong offset
- return -1;
- dev = cdev->dev;
-
-- size = min((ulong)count, dev->resource[0].size - offset);
-+ size = min((loff_t)count, resource_size(&dev->resource[0]) - offset);
- memcpy_sz(dev_get_mem_region(dev, 0) + offset, buf, size, flags & O_RWSIZE_MASK);
- return size;
- }
-diff --git a/fs/nfs.c b/fs/nfs.c
-index 75a8f25..79e667f 100644
---- a/fs/nfs.c
-+++ b/fs/nfs.c
-@@ -805,7 +805,7 @@ static int nfs_read(struct device_d *dev, FILE *file, void *buf, size_t insize)
- return outsize;
- }
-
--static off_t nfs_lseek(struct device_d *dev, FILE *file, off_t pos)
-+static loff_t nfs_lseek(struct device_d *dev, FILE *file, loff_t pos)
- {
- struct file_priv *priv = file->inode;
-
-diff --git a/fs/ramfs.c b/fs/ramfs.c
-index cec5e76..91d06b8 100644
---- a/fs/ramfs.c
-+++ b/fs/ramfs.c
-@@ -428,7 +428,7 @@ static int ramfs_write(struct device_d *_dev, FILE *f, const void *buf, size_t i
- return insize;
- }
-
--static off_t ramfs_lseek(struct device_d *dev, FILE *f, off_t pos)
-+static loff_t ramfs_lseek(struct device_d *dev, FILE *f, loff_t pos)
- {
- f->pos = pos;
- return f->pos;
-diff --git a/fs/tftp.c b/fs/tftp.c
-index 6586270..b58d6fc 100644
---- a/fs/tftp.c
-+++ b/fs/tftp.c
-@@ -569,7 +569,7 @@ static int tftp_read(struct device_d *dev, FILE *f, void *buf, size_t insize)
- return outsize;
- }
-
--static off_t tftp_lseek(struct device_d *dev, FILE *f, off_t pos)
-+static loff_t tftp_lseek(struct device_d *dev, FILE *f, loff_t pos)
- {
- /* not implemented in tftp protocol */
- return -ENOSYS;
-diff --git a/include/clock.h b/include/clock.h
-index 123f874..c01a8d0 100644
---- a/include/clock.h
-+++ b/include/clock.h
-@@ -3,6 +3,8 @@
- #ifndef CLOCK_H
- #define CLOCK_H
-
-+#include <linux/time.h>
-+
- #define CLOCKSOURCE_MASK(bits) (uint64_t)((bits) < 64 ? ((1ULL<<(bits))-1) : -1)
-
- struct clocksource {
-diff --git a/include/common.h b/include/common.h
-index d2347f8..df12083 100644
---- a/include/common.h
-+++ b/include/common.h
-@@ -34,6 +34,24 @@
- #include <linux/stddef.h>
- #include <asm/common.h>
-
-+/*
-+ * sanity check. The Linux Kernel defines only one of __LITTLE_ENDIAN and
-+ * __BIG_ENDIAN. Endianess can then be tested with #ifdef __xx_ENDIAN. Userspace
-+ * always defined both __LITTLE_ENDIAN and __BIG_ENDIAN and byteorder can then
-+ * be tested with #if __BYTE_ORDER == __xx_ENDIAN.
-+ *
-+ * As we tend to use a lot of Kernel code in barebox we use the kernel way of
-+ * determing the byte order. Make sure here that architecture code properly
-+ * defines it.
-+ */
-+#include <asm/byteorder.h>
-+#if defined __LITTLE_ENDIAN && defined __BIG_ENDIAN
-+#error "both __LITTLE_ENDIAN and __BIG_ENDIAN are defined"
-+#endif
-+#if !defined __LITTLE_ENDIAN && !defined __BIG_ENDIAN
-+#error "None of __LITTLE_ENDIAN and __BIG_ENDIAN are defined"
-+#endif
-+
- #define pr_info(fmt, arg...) printf(fmt, ##arg)
- #define pr_notice(fmt, arg...) printf(fmt, ##arg)
- #define pr_err(fmt, arg...) printf(fmt, ##arg)
-@@ -102,6 +120,7 @@ long get_ram_size (volatile long *, long);
-
- /* $(CPU)/cpu.c */
- void __noreturn reset_cpu(unsigned long addr);
-+void __noreturn poweroff(void);
-
- /* lib_$(ARCH)/time.c */
- void udelay (unsigned long);
-@@ -138,10 +157,11 @@ struct memarea_info {
- unsigned long flags;
- };
-
--int parse_area_spec(const char *str, ulong *start, ulong *size);
-+int parse_area_spec(const char *str, loff_t *start, loff_t *size);
-
- /* Just like simple_strtoul(), but this one honors a K/M/G suffix */
- unsigned long strtoul_suffix(const char *str, char **endp, int base);
-+unsigned long long strtoull_suffix(const char *str, char **endp, int base);
-
- void start_barebox(void);
- void shutdown_barebox(void);
-@@ -210,7 +230,7 @@ int run_shell(void);
- #define PAGE_SIZE 4096
- #define PAGE_SHIFT 12
-
--int memory_display(char *addr, ulong offs, ulong nbytes, int size);
-+int memory_display(char *addr, loff_t offs, ulong nbytes, int size);
-
- extern const char version_string[];
- #ifdef CONFIG_BANNER
-diff --git a/include/complete.h b/include/complete.h
-index 8248c64..33b848c 100644
---- a/include/complete.h
-+++ b/include/complete.h
-@@ -15,7 +15,7 @@ int command_complete(struct string_list *sl, char *instr);
- int device_complete(struct string_list *sl, char *instr);
- int empty_complete(struct string_list *sl, char *instr);
- int eth_complete(struct string_list *sl, char *instr);
--int cammand_var_complete(struct string_list *sl, char *instr);
-+int command_var_complete(struct string_list *sl, char *instr);
- int devfs_partition_complete(struct string_list *sl, char *instr);
-
- #endif /* __COMPLETE_ */
-diff --git a/include/cramfs/cramfs_fs.h b/include/cramfs/cramfs_fs.h
-index af2940b..8c53fc7 100644
---- a/include/cramfs/cramfs_fs.h
-+++ b/include/cramfs/cramfs_fs.h
-@@ -84,11 +84,7 @@ struct cramfs_super {
- | CRAMFS_FLAG_WRONG_SIGNATURE \
- | CRAMFS_FLAG_SHIFTED_ROOT_OFFSET )
-
--#ifndef __BYTE_ORDER
--#error "No byte order defined in __BYTE_ORDER"
--#endif
--
--#if __BYTE_ORDER == __LITTLE_ENDIAN
-+#ifdef __LITTLE_ENDIAN
- #define CRAMFS_16(x) (x)
- #define CRAMFS_24(x) (x)
- #define CRAMFS_32(x) (x)
-@@ -96,7 +92,7 @@ struct cramfs_super {
- #define CRAMFS_GET_OFFSET(x) ((x)->offset)
- #define CRAMFS_SET_OFFSET(x,y) ((x)->offset = (y))
- #define CRAMFS_SET_NAMELEN(x,y) ((x)->namelen = (y))
--#elif __BYTE_ORDER ==__BIG_ENDIAN
-+#elif defined __BIG_ENDIAN
- #ifdef __KERNEL__
- #define CRAMFS_16(x) swab16(x)
- #define CRAMFS_24(x) ((swab32(x)) >> 8)
-diff --git a/include/dma.h b/include/dma.h
-new file mode 100644
-index 0000000..899f831
---- /dev/null
-+++ b/include/dma.h
-@@ -0,0 +1,30 @@
-+/*
-+ * Copyright (C) 2012 by Marc Kleine-Budde <mkl@pengutronix.de>
-+ *
-+ * This file is released under the GPLv2
-+ *
-+ */
-+
-+#ifndef __DMA_H
-+#define __DMA_H
-+
-+#include <malloc.h>
-+#include <xfuncs.h>
-+
-+#include <asm/dma.h>
-+
-+#ifndef dma_alloc
-+static inline void *dma_alloc(size_t size)
-+{
-+ return xmalloc(size);
-+}
-+#endif
-+
-+#ifndef dma_free
-+static inline void dma_free(void *mem)
-+{
-+ free(mem);
-+}
-+#endif
-+
-+#endif /* __DMA_H */
-diff --git a/include/driver.h b/include/driver.h
-index 09dd1e4..7d597b4 100644
---- a/include/driver.h
-+++ b/include/driver.h
-@@ -183,7 +183,7 @@ static inline const char *dev_name(const struct device_d *dev)
- /*
- * get register base 'num' for a device
- */
--void __iomem *dev_get_mem_region(struct device_d *dev, int num);
-+void *dev_get_mem_region(struct device_d *dev, int num);
-
- /*
- * exlusively request register base 'num' for a device
-@@ -301,8 +301,8 @@ struct cdev;
- int dev_protect(struct device_d *dev, size_t count, unsigned long offset, int prot);
-
- /* These are used by drivers which work with direct memory accesses */
--ssize_t mem_read(struct cdev *cdev, void *buf, size_t count, ulong offset, ulong flags);
--ssize_t mem_write(struct cdev *cdev, const void *buf, size_t count, ulong offset, ulong flags);
-+ssize_t mem_read(struct cdev *cdev, void *buf, size_t count, loff_t offset, ulong flags);
-+ssize_t mem_write(struct cdev *cdev, const void *buf, size_t count, loff_t offset, ulong flags);
- int mem_memmap(struct cdev *cdev, void **map, int flags);
-
- /* Use this if you have nothing to do in your drivers probe function */
-@@ -316,7 +316,7 @@ void devices_shutdown(void);
- int generic_memmap_ro(struct cdev *dev, void **map, int flags);
- int generic_memmap_rw(struct cdev *dev, void **map, int flags);
-
--static inline off_t dev_lseek_default(struct cdev *cdev, off_t ofs)
-+static inline loff_t dev_lseek_default(struct cdev *cdev, loff_t ofs)
- {
- return ofs;
- }
-@@ -373,18 +373,18 @@ extern struct bus_type platform_bus;
-
- struct file_operations {
- /*! Called in response of reading from this device. Required */
-- ssize_t (*read)(struct cdev*, void* buf, size_t count, ulong offset, ulong flags);
-+ ssize_t (*read)(struct cdev*, void* buf, size_t count, loff_t offset, ulong flags);
-
- /*! Called in response of write to this device. Required */
-- ssize_t (*write)(struct cdev*, const void* buf, size_t count, ulong offset, ulong flags);
-+ ssize_t (*write)(struct cdev*, const void* buf, size_t count, loff_t offset, ulong flags);
-
- int (*ioctl)(struct cdev*, int, void *);
-- off_t (*lseek)(struct cdev*, off_t);
-+ loff_t (*lseek)(struct cdev*, loff_t);
- int (*open)(struct cdev*, unsigned long flags);
- int (*close)(struct cdev*);
- int (*flush)(struct cdev*);
-- int (*erase)(struct cdev*, size_t count, unsigned long offset);
-- int (*protect)(struct cdev*, size_t count, unsigned long offset, int prot);
-+ int (*erase)(struct cdev*, size_t count, loff_t offset);
-+ int (*protect)(struct cdev*, size_t count, loff_t offset, int prot);
- int (*memmap)(struct cdev*, void **map, int flags);
- };
-
-@@ -395,8 +395,8 @@ struct cdev {
- struct list_head list;
- struct list_head devices_list;
- char *name;
-- unsigned long offset;
-- size_t size;
-+ loff_t offset;
-+ loff_t size;
- unsigned int flags;
- int open;
- struct mtd_info *mtd;
-@@ -409,16 +409,17 @@ struct cdev *cdev_by_name(const char *filename);
- struct cdev *cdev_open(const char *name, unsigned long flags);
- void cdev_close(struct cdev *cdev);
- int cdev_flush(struct cdev *cdev);
--ssize_t cdev_read(struct cdev *cdev, void *buf, size_t count, ulong offset, ulong flags);
--ssize_t cdev_write(struct cdev *cdev, const void *buf, size_t count, ulong offset, ulong flags);
-+ssize_t cdev_read(struct cdev *cdev, void *buf, size_t count, loff_t offset, ulong flags);
-+ssize_t cdev_write(struct cdev *cdev, const void *buf, size_t count, loff_t offset, ulong flags);
- int cdev_ioctl(struct cdev *cdev, int cmd, void *buf);
--int cdev_erase(struct cdev *cdev, size_t count, unsigned long offset);
-+int cdev_erase(struct cdev *cdev, size_t count, loff_t offset);
-
- #define DEVFS_PARTITION_FIXED (1 << 0)
- #define DEVFS_PARTITION_READONLY (1 << 1)
- #define DEVFS_IS_PARTITION (1 << 2)
-+#define DEVFS_IS_CHARACTER_DEV (1 << 3)
-
--int devfs_add_partition(const char *devname, unsigned long offset, size_t size,
-+int devfs_add_partition(const char *devname, loff_t offset, loff_t size,
- int flags, const char *name);
- int devfs_del_partition(const char *name);
-
-diff --git a/include/envfs.h b/include/envfs.h
-index 67b8902..ba976d6 100644
---- a/include/envfs.h
-+++ b/include/envfs.h
-@@ -34,11 +34,25 @@ struct envfs_super {
- uint32_t sb_crc; /* crc for the superblock */
- };
-
--#ifndef __BYTE_ORDER
--#error "No byte order defined in __BYTE_ORDER"
-+#ifdef __BAREBOX__
-+# ifdef __LITTLE_ENDIAN
-+# define ENVFS_ORDER_LITTLE
-+# elif defined __BIG_ENDIAN
-+# define ENVFS_ORDER_BIG
-+# else
-+# error "could not determine byte order"
-+# endif
-+#else
-+# if __BYTE_ORDER == __LITTLE_ENDIAN
-+# define ENVFS_ORDER_LITTLE
-+# elif __BYTE_ORDER == __BIG_ENDIAN
-+# define ENVFS_ORDER_BIG
-+# else
-+# error "could not determine byte order"
-+# endif
- #endif
-
--#if __BYTE_ORDER == __LITTLE_ENDIAN
-+#ifdef ENVFS_ORDER_LITTLE
- #define ENVFS_16(x) (x)
- #define ENVFS_24(x) (x)
- #define ENVFS_32(x) (x)
-@@ -46,7 +60,7 @@ struct envfs_super {
- #define ENVFS_GET_OFFSET(x) ((x)->offset)
- #define ENVFS_SET_OFFSET(x,y) ((x)->offset = (y))
- #define ENVFS_SET_NAMELEN(x,y) ((x)->namelen = (y))
--#elif __BYTE_ORDER == __BIG_ENDIAN
-+#elif defined ENVFS_ORDER_BIG
- #ifdef __KERNEL__
- #define ENVFS_16(x) swab16(x)
- #define ENVFS_24(x) ((swab32(x)) >> 8)
-diff --git a/include/fs.h b/include/fs.h
-index d82f026..c0b9f71 100644
---- a/include/fs.h
-+++ b/include/fs.h
-@@ -23,8 +23,9 @@ typedef struct dir {
-
- typedef struct filep {
- struct device_d *dev; /* The device this FILE belongs to */
-- ulong pos; /* current position in stream */
-- ulong size; /* The size of this inode */
-+ loff_t pos; /* current position in stream */
-+#define FILE_SIZE_STREAM ((loff_t) -1)
-+ loff_t size; /* The size of this inode */
- ulong flags; /* the O_* flags from open */
-
- void *inode; /* private to the filesystem driver */
-@@ -54,7 +55,7 @@ struct fs_driver_d {
- int (*read)(struct device_d *dev, FILE *f, void *buf, size_t size);
- int (*write)(struct device_d *dev, FILE *f, const void *buf, size_t size);
- int (*flush)(struct device_d *dev, FILE *f);
-- off_t (*lseek)(struct device_d *dev, FILE *f, off_t pos);
-+ loff_t (*lseek)(struct device_d *dev, FILE *f, loff_t pos);
-
- struct dir* (*opendir)(struct device_d *dev, const char *pathname);
- struct dirent* (*readdir)(struct device_d *dev, struct dir *dir);
-@@ -63,9 +64,9 @@ struct fs_driver_d {
-
- int (*ioctl)(struct device_d *dev, FILE *f, int request, void *buf);
- int (*erase)(struct device_d *dev, FILE *f, size_t count,
-- unsigned long offset);
-+ loff_t offset);
- int (*protect)(struct device_d *dev, FILE *f, size_t count,
-- unsigned long offset, int prot);
-+ loff_t offset, int prot);
-
- int (*memmap)(struct device_d *dev, FILE *f, void **map, int flags);
-
-@@ -109,7 +110,7 @@ ssize_t write(int fd, const void *buf, size_t count);
- #define SEEK_CUR 2
- #define SEEK_END 3
-
--off_t lseek(int fildes, off_t offset, int whence);
-+loff_t lseek(int fildes, loff_t offset, int whence);
- int mkdir (const char *pathname, mode_t mode);
-
- /* Create a directory and its parents */
-diff --git a/include/linux/byteorder/generic.h b/include/linux/byteorder/generic.h
-index aab8f4b..2d68d99 100644
---- a/include/linux/byteorder/generic.h
-+++ b/include/linux/byteorder/generic.h
-@@ -78,13 +78,6 @@
- *
- */
-
--#ifndef __LITTLE_ENDIAN
--#define __LITTLE_ENDIAN 1234
--#endif
--#ifndef __BIG_ENDIAN
--#define __BIG_ENDIAN 4321
--#endif
--
- #if defined(__KERNEL__)
- /*
- * inside the kernel, we can use nicknames;
-diff --git a/include/linux/compiler.h b/include/linux/compiler.h
-index 5be3dab..cc8c4de 100644
---- a/include/linux/compiler.h
-+++ b/include/linux/compiler.h
-@@ -4,7 +4,7 @@
- #ifndef __ASSEMBLY__
-
- #ifdef __CHECKER__
--# define __user __attribute__((noderef, address_space(1)))
-+# define __user /* no user address space in barebox */
- # define __kernel /* default address space */
- # define __safe __attribute__((safe))
- # define __force __attribute__((force))
-diff --git a/include/linux/ioport.h b/include/linux/ioport.h
-index 3f95ddd..6d6cd68 100644
---- a/include/linux/ioport.h
-+++ b/include/linux/ioport.h
-@@ -17,7 +17,7 @@
- */
- struct resource {
- resource_size_t start;
-- resource_size_t size;
-+ resource_size_t end;
- const char *name;
- unsigned long flags;
- struct resource *parent;
-@@ -113,7 +113,7 @@ struct resource {
-
- static inline resource_size_t resource_size(const struct resource *res)
- {
-- return res->size;
-+ return res->end - res->start + 1;
- }
- static inline unsigned long resource_type(const struct resource *res)
- {
-@@ -121,10 +121,10 @@ static inline unsigned long resource_type(const struct resource *res)
- }
-
- struct resource *request_iomem_region(const char *name,
-- resource_size_t start, resource_size_t size);
-+ resource_size_t start, resource_size_t end);
-
- struct resource *request_region(struct resource *parent,
-- const char *name, resource_size_t start,
-+ const char *name, resource_size_t end,
- resource_size_t size);
-
- int release_region(struct resource *res);
-diff --git a/include/linux/stat.h b/include/linux/stat.h
-index bc7dce4..af022c5 100644
---- a/include/linux/stat.h
-+++ b/include/linux/stat.h
-@@ -52,7 +52,7 @@ struct stat {
- unsigned short st_gid;
- unsigned short st_rdev;
- unsigned short __pad2;
-- unsigned long st_size;
-+ loff_t st_size;
- unsigned long st_blksize;
- unsigned long st_blocks;
- unsigned long st_atime;
-diff --git a/include/linux/time.h b/include/linux/time.h
-index bf12b99..3942e82 100644
---- a/include/linux/time.h
-+++ b/include/linux/time.h
-@@ -3,156 +3,6 @@
-
- #include <linux/types.h>
-
--#define _DEFUN(a,b,c) a(c)
--#define _CONST const
--#define _AND ,
--
--#define _REENT_ONLY
--
--#define SECSPERMIN 60L
--#define MINSPERHOUR 60L
--#define HOURSPERDAY 24L
--#define SECSPERHOUR (SECSPERMIN * MINSPERHOUR)
--#define SECSPERDAY (SECSPERHOUR * HOURSPERDAY)
--#define DAYSPERWEEK 7
--#define MONSPERYEAR 12
--
--#define YEAR_BASE 1900
--#define EPOCH_YEAR 1970
--#define EPOCH_WDAY 4
--
--#define isleap(y) ((((y) % 4) == 0 && ((y) % 100) != 0) || ((y) % 400) == 0)
--
--
--/* Used by other time functions. */
--struct tm {
-- int tm_sec; /* Seconds. [0-60] (1 leap second) */
-- int tm_min; /* Minutes. [0-59] */
-- int tm_hour; /* Hours. [0-23] */
-- int tm_mday; /* Day. [1-31] */
-- int tm_mon; /* Month. [0-11] */
-- int tm_year; /* Year - 1900. */
-- int tm_wday; /* Day of week. [0-6] */
-- int tm_yday; /* Days in year.[0-365] */
-- int tm_isdst; /* DST. [-1/0/1]*/
--
--# ifdef __USE_BSD
-- long int tm_gmtoff; /* Seconds east of UTC. */
-- __const char *tm_zone; /* Timezone abbreviation. */
--# else
-- long int __tm_gmtoff; /* Seconds east of UTC. */
-- __const char *__tm_zone; /* Timezone abbreviation. */
--# endif
--};
--
--static inline char *
--_DEFUN (asctime_r, (tim_p, result),
-- _CONST struct tm *tim_p _AND
-- char *result)
--{
-- static _CONST char day_name[7][3] = {
-- "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
-- };
-- static _CONST char mon_name[12][3] = {
-- "Jan", "Feb", "Mar", "Apr", "May", "Jun",
-- "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
-- };
--
-- sprintf (result, "%.3s %.3s %.2d %.2d:%.2d:%.2d %d\n",
-- day_name[tim_p->tm_wday],
-- mon_name[tim_p->tm_mon],
-- tim_p->tm_mday, tim_p->tm_hour, tim_p->tm_min,
-- tim_p->tm_sec, 1900 + tim_p->tm_year);
-- return result;
--}
--
--static inline struct tm *
--_DEFUN (localtime_r, (tim_p, res),
-- _CONST time_t * tim_p _AND
-- struct tm *res)
--{
-- static _CONST int mon_lengths[2][MONSPERYEAR] = {
-- {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
-- {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
-- } ;
--
-- static _CONST int year_lengths[2] = {
-- 365,
-- 366
-- } ;
--
-- long days, rem;
-- int y;
-- int yleap;
-- _CONST int *ip;
--
-- days = ((long) *tim_p) / SECSPERDAY;
-- rem = ((long) *tim_p) % SECSPERDAY;
-- while (rem < 0)
-- {
-- rem += SECSPERDAY;
-- --days;
-- }
-- while (rem >= SECSPERDAY)
-- {
-- rem -= SECSPERDAY;
-- ++days;
-- }
--
-- /* compute hour, min, and sec */
-- res->tm_hour = (int) (rem / SECSPERHOUR);
-- rem %= SECSPERHOUR;
-- res->tm_min = (int) (rem / SECSPERMIN);
-- res->tm_sec = (int) (rem % SECSPERMIN);
--
-- /* compute day of week */
-- if ((res->tm_wday = ((EPOCH_WDAY + days) % DAYSPERWEEK)) < 0)
-- res->tm_wday += DAYSPERWEEK;
--
-- /* compute year & day of year */
-- y = EPOCH_YEAR;
-- if (days >= 0)
-- {
-- for (;;)
-- {
-- yleap = isleap(y);
-- if (days < year_lengths[yleap])
-- break;
-- y++;
-- days -= year_lengths[yleap];
-- }
-- }
-- else
-- {
-- do
-- {
-- --y;
-- yleap = isleap(y);
-- days += year_lengths[yleap];
-- } while (days < 0);
-- }
--
-- res->tm_year = y - YEAR_BASE;
-- res->tm_yday = days;
-- ip = mon_lengths[yleap];
-- for (res->tm_mon = 0; days >= ip[res->tm_mon]; ++res->tm_mon)
-- days -= ip[res->tm_mon];
-- res->tm_mday = days + 1;
--
-- /* set daylight saving time flag */
-- res->tm_isdst = -1;
--
-- return (res);
--}
--
--static inline char *
--_DEFUN (ctime_r, (tim_p, result),
-- _CONST time_t * tim_p _AND
-- char * result)
--
--{
-- struct tm tm;
-- return asctime_r (localtime_r (tim_p, &tm), result);
--}
-+#define NSEC_PER_SEC 1000000000L
-
- #endif
-diff --git a/include/menu.h b/include/menu.h
-index 74abcfb..40f8eab 100644
---- a/include/menu.h
-+++ b/include/menu.h
-@@ -60,9 +60,6 @@ struct menu {
- struct list_head entries;
-
- int nb_entries;
-- int width;
-- char *display_buffer;
-- int display_buffer_size;
-
- struct menu_entry *selected;
- void *priv;
-diff --git a/include/miidev.h b/include/miidev.h
-index 622784f..4bbf94c 100644
---- a/include/miidev.h
-+++ b/include/miidev.h
-@@ -31,6 +31,8 @@
- #define MIIDEV_FORCE_10 (1 << 0)
- #define MIIDEV_FORCE_LINK (1 << 1)
-
-+#define MIIDEV_CAPABLE_1000M (1 << 0)
-+
- struct mii_device {
- struct device_d dev;
- struct device_d *parent;
-@@ -40,6 +42,7 @@ struct mii_device {
- int (*write) (struct mii_device *dev, int addr, int reg, int value);
-
- int flags;
-+ int capabilities;
-
- struct eth_device *edev;
- struct cdev cdev;
-@@ -55,6 +58,7 @@ int miidev_get_status(struct mii_device *mdev);
- #define MIIDEV_STATUS_IS_FULL_DUPLEX (1 << 1)
- #define MIIDEV_STATUS_IS_10MBIT (1 << 2)
- #define MIIDEV_STATUS_IS_100MBIT (1 << 3)
-+#define MIIDEV_STATUS_IS_1000MBIT (1 << 4)
- int miidev_print_status(struct mii_device *mdev);
-
- static int inline mii_write(struct mii_device *dev, int addr, int reg, int value)
-diff --git a/include/net.h b/include/net.h
-index 08f897e..9152943 100644
---- a/include/net.h
-+++ b/include/net.h
-@@ -38,8 +38,8 @@ struct eth_device {
- int (*send) (struct eth_device*, void *packet, int length);
- int (*recv) (struct eth_device*);
- void (*halt) (struct eth_device*);
-- int (*get_ethaddr) (struct eth_device*, unsigned char *adr);
-- int (*set_ethaddr) (struct eth_device*, unsigned char *adr);
-+ int (*get_ethaddr) (struct eth_device*, u8 adr[6]);
-+ int (*set_ethaddr) (struct eth_device*, u8 adr[6]);
-
- struct eth_device *next;
- void *priv;
-@@ -287,8 +287,8 @@ int string_to_ip(const char *s, IPaddr_t *ip);
- IPaddr_t getenv_ip(const char *name);
- int setenv_ip(const char *name, IPaddr_t ip);
-
--int string_to_ethaddr(const char *str, char *enetaddr);
--void ethaddr_to_string(const unsigned char *enetaddr, char *str);
-+int string_to_ethaddr(const char *str, u8 enetaddr[6]);
-+void ethaddr_to_string(const u8 enetaddr[6], char *str);
-
- #ifdef CONFIG_NET_RESOLV
- IPaddr_t resolv(char *host);
-diff --git a/include/net/designware.h b/include/net/designware.h
-new file mode 100644
-index 0000000..3f9f5b9
---- /dev/null
-+++ b/include/net/designware.h
-@@ -0,0 +1,9 @@
-+#ifndef __DWC_UNIMAC_H
-+#define __DWC_UNIMAC_H
-+
-+struct dwc_ether_platform_data {
-+ u8 phy_addr;
-+ void (*fix_mac_speed)(int speed);
-+};
-+
-+#endif
-diff --git a/include/partition.h b/include/partition.h
-index 0827bb4..8ad7490 100644
---- a/include/partition.h
-+++ b/include/partition.h
-@@ -8,7 +8,7 @@ struct partition {
-
- int flags;
-
-- unsigned long offset;
-+ loff_t offset;
-
- struct device_d *physdev;
- struct device_d device;
-diff --git a/include/qsort.h b/include/qsort.h
-index bbb2359..d279dc2 100644
---- a/include/qsort.h
-+++ b/include/qsort.h
-@@ -4,4 +4,6 @@
- void qsort(void *base, size_t nel, size_t width,
- int (*comp)(const void *, const void *));
-
-+int strcmp_compar(const void *p1, const void *p2);
-+
- #endif /* __QSORT_H */
-diff --git a/include/usb/usb.h b/include/usb/usb.h
-index 296e4e8..19b092e 100644
---- a/include/usb/usb.h
-+++ b/include/usb/usb.h
-@@ -159,8 +159,9 @@ struct usb_device {
- int epmaxpacketout[16]; /* OUTput endpoint specific maximums */
-
- int configno; /* selected config number */
-- struct usb_device_descriptor descriptor; /* Device Descriptor */
-+ struct usb_device_descriptor *descriptor; /* Device Descriptor */
- struct usb_config_descriptor config; /* config descriptor */
-+ struct devrequest *setup_packet;
-
- int have_langid; /* whether string_langid is valid yet */
- int string_langid; /* language ID for strings */
-@@ -270,12 +271,14 @@ void usb_rescan(void);
- ((x_ & 0xFF000000UL) >> 24)); \
- })
-
--#if __BYTE_ORDER == __LITTLE_ENDIAN
-+#ifdef __LITTLE_ENDIAN
- # define swap_16(x) (x)
- # define swap_32(x) (x)
--#else
-+#elif defined BIG_ENDIAN
- # define swap_16(x) __swap_16(x)
- # define swap_32(x) __swap_32(x)
-+#else
-+#error "could not determine byte order"
- #endif
-
- /*
-diff --git a/include/watchdog.h b/include/watchdog.h
-new file mode 100644
-index 0000000..3e2d08e
---- /dev/null
-+++ b/include/watchdog.h
-@@ -0,0 +1,24 @@
-+/*
-+ * 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.
-+ */
-+
-+#ifndef INCLUDE_WATCHDOG_H
-+# define INCLUDE_WATCHDOG_H
-+
-+struct watchdog {
-+ int (*set_timeout)(struct watchdog *, unsigned);
-+};
-+
-+int watchdog_register(struct watchdog *);
-+int watchdog_deregister(struct watchdog *);
-+int watchdog_set_timeout(unsigned);
-+
-+#endif /* INCLUDE_WATCHDOG_H */
-diff --git a/lib/misc.c b/lib/misc.c
-index 549b960..8a95396 100644
---- a/lib/misc.c
-+++ b/lib/misc.c
-@@ -27,15 +27,15 @@
- #include <linux/ctype.h>
-
- /*
-- * Like simple_strtoul() but handles an optional G, M, K or k
-+ * Like simple_strtoull() but handles an optional G, M, K or k
- * suffix for Gigabyte, Megabyte or Kilobyte
- */
--unsigned long strtoul_suffix(const char *str, char **endp, int base)
-+unsigned long long strtoull_suffix(const char *str, char **endp, int base)
- {
-- unsigned long val;
-+ unsigned long long val;
- char *end;
-
-- val = simple_strtoul(str, &end, base);
-+ val = simple_strtoull(str, &end, base);
-
- switch (*end) {
- case 'G':
-@@ -55,6 +55,12 @@ unsigned long strtoul_suffix(const char *str, char **endp, int base)
-
- return val;
- }
-+EXPORT_SYMBOL(strtoull_suffix);
-+
-+unsigned long strtoul_suffix(const char *str, char **endp, int base)
-+{
-+ return strtoull_suffix(str, endp, base);
-+}
- EXPORT_SYMBOL(strtoul_suffix);
-
- /*
-@@ -69,15 +75,15 @@ EXPORT_SYMBOL(strtoul_suffix);
- * 0x1000 -> start = 0x1000, size = ~0
- * 1M+1k -> start = 0x100000, size = 0x400
- */
--int parse_area_spec(const char *str, ulong *start, ulong *size)
-+int parse_area_spec(const char *str, loff_t *start, loff_t *size)
- {
- char *endp;
-- ulong end;
-+ loff_t end;
-
- if (!isdigit(*str))
- return -1;
-
-- *start = strtoul_suffix(str, &endp, 0);
-+ *start = strtoull_suffix(str, &endp, 0);
-
- str = endp;
-
-@@ -89,7 +95,7 @@ int parse_area_spec(const char *str, ulong *start, ulong *size)
-
- if (*str == '-') {
- /* beginning and end given */
-- end = strtoul_suffix(str + 1, NULL, 0);
-+ end = strtoull_suffix(str + 1, NULL, 0);
- if (end < *start) {
- printf("end < start\n");
- return -1;
-@@ -100,7 +106,7 @@ int parse_area_spec(const char *str, ulong *start, ulong *size)
-
- if (*str == '+') {
- /* beginning and size given */
-- *size = strtoul_suffix(str + 1, NULL, 0);
-+ *size = strtoull_suffix(str + 1, NULL, 0);
- return 0;
- }
-
-diff --git a/lib/vsprintf.c b/lib/vsprintf.c
-index 9763515..17c1973 100644
---- a/lib/vsprintf.c
-+++ b/lib/vsprintf.c
-@@ -83,6 +83,7 @@ unsigned long long simple_strtoull (const char *cp, char **endp, unsigned int ba
- *endp = (char *) cp;
- return result;
- }
-+EXPORT_SYMBOL(simple_strtoll);
-
- /* we use this so that we can do without the ctype library */
- #define is_digit(c) ((c) >= '0' && (c) <= '9')
-diff --git a/net/eth.c b/net/eth.c
-index 2b492ad..c034eaa 100644
---- a/net/eth.c
-+++ b/net/eth.c
-@@ -100,11 +100,9 @@ struct eth_device * eth_get_current(void)
- struct eth_device *eth_get_byname(char *ethname)
- {
- struct eth_device *edev;
-- char name[MAX_DRIVER_NAME];
-
- list_for_each_entry(edev, &netdev_list, list) {
-- sprintf(name, "%s%d", edev->dev.name, edev->dev.id);
-- if (!strcmp(ethname, name))
-+ if (!strcmp(ethname, dev_name(&edev->dev)))
- return edev;
- }
- return NULL;
-@@ -169,7 +167,7 @@ int eth_rx(void)
- static int eth_set_ethaddr(struct device_d *dev, struct param_d *param, const char *val)
- {
- struct eth_device *edev = dev_to_edev(dev);
-- char ethaddr[sizeof("xx:xx:xx:xx:xx:xx")];
-+ u8 ethaddr[6];
-
- if (!val)
- return dev_param_set_generic(dev, param, NULL);
-diff --git a/net/net.c b/net/net.c
-index c803c48..54d8c25 100644
---- a/net/net.c
-+++ b/net/net.c
-@@ -159,7 +159,7 @@ void print_IPaddr (IPaddr_t x)
- puts(ip_to_string(x));
- }
-
--int string_to_ethaddr(const char *str, char *enetaddr)
-+int string_to_ethaddr(const char *str, u8 enetaddr[6])
- {
- int reg;
- char *e;
-@@ -181,7 +181,7 @@ int string_to_ethaddr(const char *str, char *enetaddr)
- return 0;
- }
-
--void ethaddr_to_string(const unsigned char *enetaddr, char *str)
-+void ethaddr_to_string(const u8 enetaddr[6], char *str)
- {
- sprintf(str, "%02X:%02X:%02X:%02X:%02X:%02X",
- enetaddr[0], enetaddr[1], enetaddr[2], enetaddr[3],
diff --git a/patches/barebox-2012.07.0/0001-WIP-beaglebone-add-support-for-AM335x-and-board.patch b/patches/barebox-2012.07.0/0001-WIP-beaglebone-add-support-for-AM335x-and-board.patch
deleted file mode 100644
index 4959538..0000000
--- a/patches/barebox-2012.07.0/0001-WIP-beaglebone-add-support-for-AM335x-and-board.patch
+++ /dev/null
@@ -1,3688 +0,0 @@
-From 0513a2da4d48ed0c573384335f7f2ff71b44422d Mon Sep 17 00:00:00 2001
-From: Jan Luebbe <jluebbe@debian.org>
-Date: Sat, 23 Jun 2012 21:39:36 +0200
-Subject: [PATCH] WIP beaglebone: add support for AM335x and board
-
-Signed-off-by: Jan Luebbe <jluebbe@debian.org>
----
- Makefile | 5 +
- arch/arm/Makefile | 1 +
- arch/arm/boards/beaglebone/Makefile | 1 +
- arch/arm/boards/beaglebone/board.c | 509 ++++++++++++++
- arch/arm/boards/beaglebone/clock.h | 36 +
- arch/arm/boards/beaglebone/clocks_am335x.h | 65 ++
- arch/arm/boards/beaglebone/clocks_ti814x.h | 72 ++
- arch/arm/boards/beaglebone/clocks_ti816x.h | 162 +++++
- arch/arm/boards/beaglebone/common_def.h | 48 ++
- arch/arm/boards/beaglebone/config.h | 24 +
- arch/arm/boards/beaglebone/cpu.h | 726 ++++++++++++++++++++
- arch/arm/boards/beaglebone/ddr_defs.h | 362 ++++++++++
- arch/arm/boards/beaglebone/env/boot/sd | 16 +
- arch/arm/boards/beaglebone/env/init/bootargs-base | 8 +
- arch/arm/boards/beaglebone/env/init/general | 18 +
- arch/arm/boards/beaglebone/hardware.h | 117 ++++
- arch/arm/boards/beaglebone/mux.c | 707 +++++++++++++++++++
- arch/arm/boards/beaglebone/pll.c | 293 ++++++++
- arch/arm/configs/am335x_beaglebone_defconfig | 58 ++
- .../configs/am335x_beaglebone_mlo_large_defconfig | 50 ++
- .../configs/am335x_beaglebone_mlo_small_defconfig | 32 +
- arch/arm/cpu/start.c | 14 +-
- arch/arm/mach-omap/Kconfig | 11 +-
- arch/arm/mach-omap/omap3_generic.c | 2 +
- arch/arm/mach-omap/s32k_clksource.c | 5 +-
- arch/arm/mach-omap/xload.c | 5 +-
- common/startup.c | 5 +
- 27 files changed, 3348 insertions(+), 4 deletions(-)
- create mode 100644 arch/arm/boards/beaglebone/Makefile
- create mode 100644 arch/arm/boards/beaglebone/board.c
- create mode 100644 arch/arm/boards/beaglebone/clock.h
- create mode 100644 arch/arm/boards/beaglebone/clocks_am335x.h
- create mode 100644 arch/arm/boards/beaglebone/clocks_ti814x.h
- create mode 100644 arch/arm/boards/beaglebone/clocks_ti816x.h
- create mode 100644 arch/arm/boards/beaglebone/common_def.h
- create mode 100644 arch/arm/boards/beaglebone/config.h
- create mode 100644 arch/arm/boards/beaglebone/cpu.h
- create mode 100644 arch/arm/boards/beaglebone/ddr_defs.h
- create mode 100644 arch/arm/boards/beaglebone/env/boot/sd
- create mode 100644 arch/arm/boards/beaglebone/env/init/bootargs-base
- create mode 100644 arch/arm/boards/beaglebone/env/init/general
- create mode 100644 arch/arm/boards/beaglebone/hardware.h
- create mode 100644 arch/arm/boards/beaglebone/mux.c
- create mode 100644 arch/arm/boards/beaglebone/pll.c
- create mode 100644 arch/arm/configs/am335x_beaglebone_defconfig
- create mode 100644 arch/arm/configs/am335x_beaglebone_mlo_large_defconfig
- create mode 100644 arch/arm/configs/am335x_beaglebone_mlo_small_defconfig
-
-diff --git a/Makefile b/Makefile
-index ebcf9bf..8355da3 100644
---- a/Makefile
-+++ b/Makefile
-@@ -672,6 +672,11 @@ barebox.bin: barebox FORCE
- $(call if_changed,objcopy)
- $(call cmd,check_file_size,$(CONFIG_BAREBOX_MAX_IMAGE_SIZE))
-
-+barebox.img: barebox.bin
-+ $(srctree)/scripts/mkimage -A $(ARCH) -T firmware -C none \
-+ -O barebox -a $(CONFIG_TEXT_BASE) -e $(CONFIG_TEXT_BASE) \
-+ -n "barebox $(KERNELRELEASE)" -d $< $@
-+
- ifdef CONFIG_X86
- barebox.S: barebox
- ifdef CONFIG_X86_HDBOOT
-diff --git a/arch/arm/Makefile b/arch/arm/Makefile
-index 1225df7..92f5ef7 100644
---- a/arch/arm/Makefile
-+++ b/arch/arm/Makefile
-@@ -99,6 +99,7 @@ board-$(CONFIG_MACH_NOMADIK_8815NHK) := nhk8815
- board-$(CONFIG_MACH_NXDB500) := netx
- board-$(CONFIG_MACH_OMAP343xSDP) := omap343xdsp
- board-$(CONFIG_MACH_BEAGLE) := beagle
-+board-$(CONFIG_MACH_BEAGLEBONE) := beaglebone
- board-$(CONFIG_MACH_OMAP3EVM) := omap3evm
- board-$(CONFIG_MACH_PANDA) := panda
- board-$(CONFIG_MACH_PCM049) := pcm049
-diff --git a/arch/arm/boards/beaglebone/Makefile b/arch/arm/boards/beaglebone/Makefile
-new file mode 100644
-index 0000000..529eb26
---- /dev/null
-+++ b/arch/arm/boards/beaglebone/Makefile
-@@ -0,0 +1 @@
-+obj-y += board.o mux.o pll.o
-diff --git a/arch/arm/boards/beaglebone/board.c b/arch/arm/boards/beaglebone/board.c
-new file mode 100644
-index 0000000..ca94060
---- /dev/null
-+++ b/arch/arm/boards/beaglebone/board.c
-@@ -0,0 +1,509 @@
-+/*
-+ * (C) Copyright 2008
-+ * Texas Instruments, <www.ti.com>
-+ * Raghavendra KH <r-khandenahally@ti.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
-+ */
-+
-+/**
-+ * @file
-+ * @brief Beagle Specific Board Initialization routines
-+ */
-+
-+/**
-+ * @page ti_beagle Texas Instruments Beagle Board
-+ *
-+ * FileName: arch/arm/boards/omap/board-beagle.c
-+ *
-+ * Beagle Board from Texas Instruments as described here:
-+ * http://www.beagleboard.org
-+ *
-+ * This board is based on OMAP3530.
-+ * More on OMAP3530 (including documentation can be found here):
-+ * http://focus.ti.com/docs/prod/folders/print/omap3530.html
-+ *
-+ * This file provides initialization in two stages:
-+ * @li boot time initialization - do basics required to get SDRAM working.
-+ * This is run from SRAM - so no case constructs and global vars can be used.
-+ * @li run time initialization - this is for the rest of the initializations
-+ * such as flash, uart etc.
-+ *
-+ * Boot time initialization includes:
-+ * @li SDRAM initialization.
-+ * @li Pin Muxing relevant for Beagle.
-+ *
-+ * Run time initialization includes
-+ * @li serial @ref serial_ns16550.c driver device definition
-+ *
-+ * Originally from arch/arm/boards/omap/board-sdp343x.c
-+ */
-+
-+#include <common.h>
-+#include <console.h>
-+#include <init.h>
-+#include <driver.h>
-+#include <fs.h>
-+#include <linux/stat.h>
-+#include <environment.h>
-+#include <sizes.h>
-+#include <io.h>
-+#include <ns16550.h>
-+#include <asm/armlinux.h>
-+#include <generated/mach-types.h>
-+#include <mach/silicon.h>
-+#include <mach/sdrc.h>
-+#include <mach/sys_info.h>
-+#include <mach/syslib.h>
-+#include <mach/control.h>
-+#include <mach/omap3-mux.h>
-+#include <mach/gpmc.h>
-+#include <mach/ehci.h>
-+#include <i2c/i2c.h>
-+#include <linux/err.h>
-+#include <usb/ehci.h>
-+#include <mach/xload.h>
-+
-+#include "config.h"
-+#include "common_def.h"
-+#include "cpu.h"
-+#include "ddr_defs.h"
-+
-+/* from U-Boot's board/ti/am335x/evm.c */
-+
-+/* UART Defines */
-+#define UART_SYSCFG_OFFSET (0x54)
-+#define UART_SYSSTS_OFFSET (0x58)
-+
-+#define UART_RESET (0x1 << 1)
-+#define UART_CLK_RUNNING_MASK 0x1
-+#define UART_SMART_IDLE_EN (0x1 << 0x3)
-+
-+static void Data_Macro_Config(int dataMacroNum)
-+{
-+ u32 BaseAddrOffset = 0x00;;
-+
-+ if (dataMacroNum == 1)
-+ BaseAddrOffset = 0xA4;
-+
-+ __raw_writel(((DDR2_RD_DQS<<30)|(DDR2_RD_DQS<<20)
-+ |(DDR2_RD_DQS<<10)|(DDR2_RD_DQS<<0)),
-+ (DATA0_RD_DQS_SLAVE_RATIO_0 + BaseAddrOffset));
-+ __raw_writel(DDR2_RD_DQS>>2,
-+ (DATA0_RD_DQS_SLAVE_RATIO_1 + BaseAddrOffset));
-+ __raw_writel(((DDR2_WR_DQS<<30)|(DDR2_WR_DQS<<20)
-+ |(DDR2_WR_DQS<<10)|(DDR2_WR_DQS<<0)),
-+ (DATA0_WR_DQS_SLAVE_RATIO_0 + BaseAddrOffset));
-+ __raw_writel(DDR2_WR_DQS>>2,
-+ (DATA0_WR_DQS_SLAVE_RATIO_1 + BaseAddrOffset));
-+ __raw_writel(((DDR2_PHY_WRLVL<<30)|(DDR2_PHY_WRLVL<<20)
-+ |(DDR2_PHY_WRLVL<<10)|(DDR2_PHY_WRLVL<<0)),
-+ (DATA0_WRLVL_INIT_RATIO_0 + BaseAddrOffset));
-+ __raw_writel(DDR2_PHY_WRLVL>>2,
-+ (DATA0_WRLVL_INIT_RATIO_1 + BaseAddrOffset));
-+ __raw_writel(((DDR2_PHY_GATELVL<<30)|(DDR2_PHY_GATELVL<<20)
-+ |(DDR2_PHY_GATELVL<<10)|(DDR2_PHY_GATELVL<<0)),
-+ (DATA0_GATELVL_INIT_RATIO_0 + BaseAddrOffset));
-+ __raw_writel(DDR2_PHY_GATELVL>>2,
-+ (DATA0_GATELVL_INIT_RATIO_1 + BaseAddrOffset));
-+ __raw_writel(((DDR2_PHY_FIFO_WE<<30)|(DDR2_PHY_FIFO_WE<<20)
-+ |(DDR2_PHY_FIFO_WE<<10)|(DDR2_PHY_FIFO_WE<<0)),
-+ (DATA0_FIFO_WE_SLAVE_RATIO_0 + BaseAddrOffset));
-+ __raw_writel(DDR2_PHY_FIFO_WE>>2,
-+ (DATA0_FIFO_WE_SLAVE_RATIO_1 + BaseAddrOffset));
-+ __raw_writel(((DDR2_PHY_WR_DATA<<30)|(DDR2_PHY_WR_DATA<<20)
-+ |(DDR2_PHY_WR_DATA<<10)|(DDR2_PHY_WR_DATA<<0)),
-+ (DATA0_WR_DATA_SLAVE_RATIO_0 + BaseAddrOffset));
-+ __raw_writel(DDR2_PHY_WR_DATA>>2,
-+ (DATA0_WR_DATA_SLAVE_RATIO_1 + BaseAddrOffset));
-+ __raw_writel(PHY_DLL_LOCK_DIFF,
-+ (DATA0_DLL_LOCK_DIFF_0 + BaseAddrOffset));
-+}
-+
-+static void Cmd_Macro_Config(void)
-+{
-+ __raw_writel(DDR2_RATIO, CMD0_CTRL_SLAVE_RATIO_0);
-+ __raw_writel(CMD_FORCE, CMD0_CTRL_SLAVE_FORCE_0);
-+ __raw_writel(CMD_DELAY, CMD0_CTRL_SLAVE_DELAY_0);
-+ __raw_writel(DDR2_DLL_LOCK_DIFF, CMD0_DLL_LOCK_DIFF_0);
-+ __raw_writel(DDR2_INVERT_CLKOUT, CMD0_INVERT_CLKOUT_0);
-+
-+ __raw_writel(DDR2_RATIO, CMD1_CTRL_SLAVE_RATIO_0);
-+ __raw_writel(CMD_FORCE, CMD1_CTRL_SLAVE_FORCE_0);
-+ __raw_writel(CMD_DELAY, CMD1_CTRL_SLAVE_DELAY_0);
-+ __raw_writel(DDR2_DLL_LOCK_DIFF, CMD1_DLL_LOCK_DIFF_0);
-+ __raw_writel(DDR2_INVERT_CLKOUT, CMD1_INVERT_CLKOUT_0);
-+
-+ __raw_writel(DDR2_RATIO, CMD2_CTRL_SLAVE_RATIO_0);
-+ __raw_writel(CMD_FORCE, CMD2_CTRL_SLAVE_FORCE_0);
-+ __raw_writel(CMD_DELAY, CMD2_CTRL_SLAVE_DELAY_0);
-+ __raw_writel(DDR2_DLL_LOCK_DIFF, CMD2_DLL_LOCK_DIFF_0);
-+ __raw_writel(DDR2_INVERT_CLKOUT, CMD2_INVERT_CLKOUT_0);
-+}
-+
-+static void config_vtp(void)
-+{
-+ __raw_writel(__raw_readl(VTP0_CTRL_REG) | VTP_CTRL_ENABLE,
-+ VTP0_CTRL_REG);
-+ __raw_writel(__raw_readl(VTP0_CTRL_REG) & (~VTP_CTRL_START_EN),
-+ VTP0_CTRL_REG);
-+ __raw_writel(__raw_readl(VTP0_CTRL_REG) | VTP_CTRL_START_EN,
-+ VTP0_CTRL_REG);
-+
-+ /* Poll for READY */
-+ while ((__raw_readl(VTP0_CTRL_REG) & VTP_CTRL_READY) != VTP_CTRL_READY);
-+}
-+
-+static void config_emif_ddr2(void)
-+{
-+ u32 i;
-+
-+ /*Program EMIF0 CFG Registers*/
-+ __raw_writel(EMIF_READ_LATENCY, EMIF4_0_DDR_PHY_CTRL_1);
-+ __raw_writel(EMIF_READ_LATENCY, EMIF4_0_DDR_PHY_CTRL_1_SHADOW);
-+ __raw_writel(EMIF_READ_LATENCY, EMIF4_0_DDR_PHY_CTRL_2);
-+ __raw_writel(EMIF_TIM1, EMIF4_0_SDRAM_TIM_1);
-+ __raw_writel(EMIF_TIM1, EMIF4_0_SDRAM_TIM_1_SHADOW);
-+ __raw_writel(EMIF_TIM2, EMIF4_0_SDRAM_TIM_2);
-+ __raw_writel(EMIF_TIM2, EMIF4_0_SDRAM_TIM_2_SHADOW);
-+ __raw_writel(EMIF_TIM3, EMIF4_0_SDRAM_TIM_3);
-+ __raw_writel(EMIF_TIM3, EMIF4_0_SDRAM_TIM_3_SHADOW);
-+
-+ __raw_writel(EMIF_SDCFG, EMIF4_0_SDRAM_CONFIG);
-+ __raw_writel(EMIF_SDCFG, EMIF4_0_SDRAM_CONFIG2);
-+
-+ /* __raw_writel(EMIF_SDMGT, EMIF0_0_SDRAM_MGMT_CTRL);
-+ __raw_writel(EMIF_SDMGT, EMIF0_0_SDRAM_MGMT_CTRL_SHD); */
-+ __raw_writel(0x00004650, EMIF4_0_SDRAM_REF_CTRL);
-+ __raw_writel(0x00004650, EMIF4_0_SDRAM_REF_CTRL_SHADOW);
-+
-+ for (i = 0; i < 5000; i++) {
-+
-+ }
-+
-+ /* __raw_writel(EMIF_SDMGT, EMIF0_0_SDRAM_MGMT_CTRL);
-+ __raw_writel(EMIF_SDMGT, EMIF0_0_SDRAM_MGMT_CTRL_SHD); */
-+ __raw_writel(EMIF_SDREF, EMIF4_0_SDRAM_REF_CTRL);
-+ __raw_writel(EMIF_SDREF, EMIF4_0_SDRAM_REF_CTRL_SHADOW);
-+
-+ __raw_writel(EMIF_SDCFG, EMIF4_0_SDRAM_CONFIG);
-+ __raw_writel(EMIF_SDCFG, EMIF4_0_SDRAM_CONFIG2);
-+}
-+
-+/* void DDR2_EMIF_Config(void); */
-+static void config_am335x_ddr(void)
-+{
-+ int data_macro_0 = 0;
-+ int data_macro_1 = 1;
-+
-+ enable_ddr_clocks();
-+
-+ config_vtp();
-+
-+ Cmd_Macro_Config();
-+
-+ Data_Macro_Config(data_macro_0);
-+ Data_Macro_Config(data_macro_1);
-+
-+ __raw_writel(PHY_RANK0_DELAY, DATA0_RANK0_DELAYS_0);
-+ __raw_writel(PHY_RANK0_DELAY, DATA1_RANK0_DELAYS_0);
-+
-+ __raw_writel(DDR_IOCTRL_VALUE, DDR_CMD0_IOCTRL);
-+ __raw_writel(DDR_IOCTRL_VALUE, DDR_CMD1_IOCTRL);
-+ __raw_writel(DDR_IOCTRL_VALUE, DDR_CMD2_IOCTRL);
-+ __raw_writel(DDR_IOCTRL_VALUE, DDR_DATA0_IOCTRL);
-+ __raw_writel(DDR_IOCTRL_VALUE, DDR_DATA1_IOCTRL);
-+
-+ __raw_writel(__raw_readl(DDR_IO_CTRL) & 0xefffffff, DDR_IO_CTRL);
-+ __raw_writel(__raw_readl(DDR_CKE_CTRL) | 0x00000001, DDR_CKE_CTRL);
-+
-+ config_emif_ddr2();
-+}
-+
-+/**
-+ * @brief Do the pin muxing required for Board operation.
-+ * We enable ONLY the pins we require to set. OMAP provides pins which do not
-+ * have alternate modes. Such pins done need to be set.
-+ *
-+ * See @ref MUX_VAL for description of the muxing mode.
-+ *
-+ * @return void
-+ */
-+static void mux_config(void)
-+{
-+ /* SDRC_D0 - SDRC_D31 default mux mode is mode0 */
-+
-+ /* GPMC */
-+ MUX_VAL(CP(GPMC_A1), (IDIS | PTD | DIS | M0));
-+ MUX_VAL(CP(GPMC_A2), (IDIS | PTD | DIS | M0));
-+ MUX_VAL(CP(GPMC_A3), (IDIS | PTD | DIS | M0));
-+ MUX_VAL(CP(GPMC_A4), (IDIS | PTD | DIS | M0));
-+ MUX_VAL(CP(GPMC_A5), (IDIS | PTD | DIS | M0));
-+ MUX_VAL(CP(GPMC_A6), (IDIS | PTD | DIS | M0));
-+ MUX_VAL(CP(GPMC_A7), (IDIS | PTD | DIS | M0));
-+ MUX_VAL(CP(GPMC_A8), (IDIS | PTD | DIS | M0));
-+ MUX_VAL(CP(GPMC_A9), (IDIS | PTD | DIS | M0));
-+ MUX_VAL(CP(GPMC_A10), (IDIS | PTD | DIS | M0));
-+
-+ /* D0-D7 default mux mode is mode0 */
-+ MUX_VAL(CP(GPMC_D8), (IEN | PTD | DIS | M0));
-+ MUX_VAL(CP(GPMC_D9), (IEN | PTD | DIS | M0));
-+ MUX_VAL(CP(GPMC_D10), (IEN | PTD | DIS | M0));
-+ MUX_VAL(CP(GPMC_D11), (IEN | PTD | DIS | M0));
-+ MUX_VAL(CP(GPMC_D12), (IEN | PTD | DIS | M0));
-+ MUX_VAL(CP(GPMC_D13), (IEN | PTD | DIS | M0));
-+ MUX_VAL(CP(GPMC_D14), (IEN | PTD | DIS | M0));
-+ MUX_VAL(CP(GPMC_D15), (IEN | PTD | DIS | M0));
-+ MUX_VAL(CP(GPMC_CLK), (IDIS | PTD | DIS | M0));
-+ /* GPMC_NADV_ALE default mux mode is mode0 */
-+ /* GPMC_NOE default mux mode is mode0 */
-+ /* GPMC_NWE default mux mode is mode0 */
-+ /* GPMC_NBE0_CLE default mux mode is mode0 */
-+ MUX_VAL(CP(GPMC_NBE0_CLE), (IDIS | PTD | DIS | M0));
-+ MUX_VAL(CP(GPMC_NBE1), (IEN | PTD | DIS | M0));
-+ MUX_VAL(CP(GPMC_NWP), (IEN | PTD | DIS | M0));
-+ /* GPMC_WAIT0 default mux mode is mode0 */
-+ MUX_VAL(CP(GPMC_WAIT1), (IEN | PTU | EN | M0));
-+
-+ /* SERIAL INTERFACE */
-+ MUX_VAL(CP(UART3_CTS_RCTX), (IEN | PTD | EN | M0));
-+ MUX_VAL(CP(UART3_RTS_SD), (IDIS | PTD | DIS | M0));
-+ MUX_VAL(CP(UART3_RX_IRRX), (IEN | PTD | DIS | M0));
-+ MUX_VAL(CP(UART3_TX_IRTX), (IDIS | PTD | DIS | M0));
-+ MUX_VAL(CP(HSUSB0_CLK), (IEN | PTD | DIS | M0));
-+ MUX_VAL(CP(HSUSB0_STP), (IDIS | PTU | EN | M0));
-+ MUX_VAL(CP(HSUSB0_DIR), (IEN | PTD | DIS | M0));
-+ MUX_VAL(CP(HSUSB0_NXT), (IEN | PTD | DIS | M0));
-+ MUX_VAL(CP(HSUSB0_DATA0), (IEN | PTD | DIS | M0));
-+ MUX_VAL(CP(HSUSB0_DATA1), (IEN | PTD | DIS | M0));
-+ MUX_VAL(CP(HSUSB0_DATA2), (IEN | PTD | DIS | M0));
-+ MUX_VAL(CP(HSUSB0_DATA3), (IEN | PTD | DIS | M0));
-+ MUX_VAL(CP(HSUSB0_DATA4), (IEN | PTD | DIS | M0));
-+ MUX_VAL(CP(HSUSB0_DATA5), (IEN | PTD | DIS | M0));
-+ MUX_VAL(CP(HSUSB0_DATA6), (IEN | PTD | DIS | M0));
-+ MUX_VAL(CP(HSUSB0_DATA7), (IEN | PTD | DIS | M0));
-+ /* I2C1_SCL default mux mode is mode0 */
-+ /* I2C1_SDA default mux mode is mode0 */
-+ /* USB EHCI (port 2) */
-+ MUX_VAL(CP(MCSPI1_CS3), (IEN | PTU | DIS | M3));
-+ MUX_VAL(CP(MCSPI2_CLK), (IEN | PTU | DIS | M3));
-+ MUX_VAL(CP(MCSPI2_SIMO), (IEN | PTU | DIS | M3));
-+ MUX_VAL(CP(MCSPI2_SOMI), (IEN | PTU | DIS | M3));
-+ MUX_VAL(CP(MCSPI2_CS0), (IEN | PTU | DIS | M3));
-+ MUX_VAL(CP(MCSPI2_CS1), (IEN | PTU | DIS | M3));
-+ MUX_VAL(CP(ETK_D10_ES2), (IDIS | PTU | DIS | M3));
-+ MUX_VAL(CP(ETK_D11_ES2), (IDIS | PTU | DIS | M3));
-+ MUX_VAL(CP(ETK_D12_ES2), (IEN | PTU | DIS | M3));
-+ MUX_VAL(CP(ETK_D13_ES2), (IEN | PTU | DIS | M3));
-+ MUX_VAL(CP(ETK_D14_ES2), (IEN | PTU | DIS | M3));
-+ MUX_VAL(CP(ETK_D15_ES2), (IEN | PTU | DIS | M3));
-+ MUX_VAL(CP(UART2_RX), (IEN | PTD | DIS | M4)) /*GPIO_147*/;
-+}
-+
-+
-+/*
-+ * early system init of muxing and clocks.
-+ */
-+void s_init(void)
-+{
-+ u32 regVal, uart_base;
-+
-+ /* Setup the PLLs and the clocks for the peripherals */
-+ pll_init();
-+
-+ /* UART softreset */
-+ uart_base = DEFAULT_UART_BASE;
-+
-+ enable_uart0_pin_mux();
-+
-+ regVal = __raw_readl(uart_base + UART_SYSCFG_OFFSET);
-+ regVal |= UART_RESET;
-+ __raw_writel(regVal, (uart_base + UART_SYSCFG_OFFSET) );
-+ while ((__raw_readl(uart_base + UART_SYSSTS_OFFSET) &
-+ UART_CLK_RUNNING_MASK) != UART_CLK_RUNNING_MASK);
-+
-+ /* Disable smart idle */
-+ regVal = __raw_readl((uart_base + UART_SYSCFG_OFFSET));
-+ regVal |= UART_SMART_IDLE_EN;
-+ __raw_writel(regVal, (uart_base + UART_SYSCFG_OFFSET));
-+
-+ /* Initialize the Timer */
-+ //init_timer();
-+
-+ //preloader_console_init();
-+
-+ config_am335x_ddr();
-+}
-+
-+
-+/**
-+ * @brief The basic entry point for board initialization.
-+ *
-+ * This is called as part of machine init (after arch init).
-+ * This is again called with stack in SRAM, so not too many
-+ * constructs possible here.
-+ *
-+ * @return void
-+ */
-+static int beagle_board_init(void)
-+{
-+ int in_sdram = running_in_sdram();
-+
-+ /* Can be removed as A8 comes up with L2 enabled */
-+ //l2_cache_enable();
-+
-+ /* WDT1 is already running when the bootloader gets control
-+ * Disable it to avoid "random" resets
-+ */
-+ writel(0xFEED0075, 0x4030b000);
-+ __raw_writel(0xAAAA, WDT_WSPR);
-+ while(__raw_readl(WDT_WWPS) != 0x0);
-+ __raw_writel(0x5555, WDT_WSPR);
-+ while(__raw_readl(WDT_WWPS) != 0x0);
-+
-+ //omap3_core_init();
-+ writel(in_sdram, 0x4030b004);
-+ writel(0xFEED0080, 0x4030b000);
-+
-+ //mux_config();
-+ enable_uart0_pin_mux();
-+ /* Dont reconfigure SDRAM while running in SDRAM! */
-+ if (!in_sdram)
-+ s_init();
-+
-+ writel(0xFEED0090, 0x4030b000);
-+ //writel(0xFEED03FF, 0x4030b000); while(1);
-+ return 0;
-+}
-+pure_initcall(beagle_board_init);
-+
-+/******************** Board Run Time *******************/
-+
-+#ifdef CONFIG_DRIVER_SERIAL_NS16550
-+
-+static struct NS16550_plat serial_plat = {
-+ .clock = 48000000, /* 48MHz (APLL96/2) */
-+ .shift = 2,
-+};
-+
-+/**
-+ * @brief UART serial port initialization - remember to enable COM clocks in
-+ * arch
-+ *
-+ * @return result of device registration
-+ */
-+static int beagle_console_init(void)
-+{
-+ /* Register the serial port */
-+ add_ns16550_device(-1, 0x44e09000, 1024, IORESOURCE_MEM_8BIT,
-+ &serial_plat);
-+
-+ return 0;
-+}
-+console_initcall(beagle_console_init);
-+#endif /* CONFIG_DRIVER_SERIAL_NS16550 */
-+
-+#ifdef CONFIG_USB_EHCI_OMAP
-+static struct omap_hcd omap_ehci_pdata = {
-+ .port_mode[0] = EHCI_HCD_OMAP_MODE_PHY,
-+ .port_mode[1] = EHCI_HCD_OMAP_MODE_PHY,
-+ .port_mode[2] = EHCI_HCD_OMAP_MODE_UNKNOWN,
-+ .phy_reset = 1,
-+ .reset_gpio_port[0] = -EINVAL,
-+ .reset_gpio_port[1] = 147,
-+ .reset_gpio_port[2] = -EINVAL
-+};
-+
-+static struct ehci_platform_data ehci_pdata = {
-+ .flags = 0,
-+};
-+#endif /* CONFIG_USB_EHCI_OMAP */
-+
-+static struct i2c_board_info i2c_devices[] = {
-+ {
-+ I2C_BOARD_INFO("twl4030", 0x48),
-+ },
-+};
-+
-+static int beagle_mem_init(void)
-+{
-+ arm_add_mem_device("ram0", 0x80000000, 256 * 1024 * 1024);
-+
-+ return 0;
-+}
-+mem_initcall(beagle_mem_init);
-+
-+static int beagle_devices_init(void)
-+{
-+// i2c_register_board_info(0, i2c_devices, ARRAY_SIZE(i2c_devices));
-+// add_generic_device("i2c-omap", DEVICE_ID_DYNAMIC, NULL, OMAP_I2C1_BASE, SZ_4K,
-+// IORESOURCE_MEM, NULL);
-+
-+#ifdef CONFIG_USB_EHCI_OMAP
-+// if (ehci_omap_init(&omap_ehci_pdata) >= 0)
-+// add_usb_ehci_device(DEVICE_ID_DYNAMIC, OMAP_EHCI_BASE,
-+// OMAP_EHCI_BASE + 0x10, &ehci_pdata);
-+#endif /* CONFIG_USB_EHCI_OMAP */
-+#ifdef CONFIG_OMAP_GPMC
-+ /* WP is made high and WAIT1 active Low */
-+ //gpmc_generic_init(0x10);
-+#endif
-+
-+ add_generic_device("omap-hsmmc", DEVICE_ID_DYNAMIC, NULL, 0x48060100, SZ_4K,
-+ IORESOURCE_MEM, NULL);
-+
-+ armlinux_set_bootparams((void *)0x80000100);
-+ //armlinux_set_architecture(MACH_TYPE_OMAP_GENERIC);
-+ armlinux_set_architecture(3589);
-+
-+ return 0;
-+}
-+device_initcall(beagle_devices_init);
-+
-+#ifdef CONFIG_DEFAULT_ENVIRONMENT
-+static int beaglebone_env_init(void)
-+{
-+ struct stat s;
-+ char *diskdev = "/dev/disk0.0";
-+ int ret;
-+
-+ ret = stat(diskdev, &s);
-+ if (ret) {
-+ printf("device %s not found. Using default environment\n", diskdev);
-+ return 0;
-+ }
-+
-+ mkdir ("/boot", 0666);
-+ ret = mount(diskdev, "fat", "/boot");
-+ if (ret) {
-+ printf("failed to mount %s\n", diskdev);
-+ return 0;
-+ }
-+
-+ default_environment_path = "/boot/barebox.env";
-+
-+ return 0;
-+}
-+late_initcall(beaglebone_env_init);
-+#endif
-+
-+void __noreturn reset_cpu(unsigned long addr)
-+{
-+ writel(PRM_RSTCTRL_RESET, PRM_RSTCTRL);
-+
-+ while (1);
-+}
-+EXPORT_SYMBOL(reset_cpu);
-diff --git a/arch/arm/boards/beaglebone/clock.h b/arch/arm/boards/beaglebone/clock.h
-new file mode 100644
-index 0000000..0aeaa5f
---- /dev/null
-+++ b/arch/arm/boards/beaglebone/clock.h
-@@ -0,0 +1,36 @@
-+/*
-+ * (C) Copyright 2006-2008
-+ * Texas Instruments, <www.ti.com>
-+ * Richard Woodruff <r-woodruff2@ti.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 _CLOCKS_H_
-+#define _CLOCKS_H_
-+
-+#ifdef CONFIG_TI816X
-+#include "clocks_ti816x.h"
-+#endif
-+
-+#ifdef CONFIG_TI814X
-+#include "clocks_ti814x.h"
-+#endif
-+
-+#ifdef CONFIG_AM335X
-+#include "clocks_am335x.h"
-+#endif
-+#endif
-+
-diff --git a/arch/arm/boards/beaglebone/clocks_am335x.h b/arch/arm/boards/beaglebone/clocks_am335x.h
-new file mode 100644
-index 0000000..b5fbc29
---- /dev/null
-+++ b/arch/arm/boards/beaglebone/clocks_am335x.h
-@@ -0,0 +1,65 @@
-+/*
-+ * clocks_am335x.h
-+ *
-+ * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.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 _CLOCKS_AM335X_H_
-+#define _CLOCKS_AM335X_H_
-+
-+/* Put the pll config values over here */
-+
-+#define OSC 24
-+
-+/* MAIN PLL Fdll = 1 GHZ, */
-+#define MPUPLL_M_500 500 /* 125 * n */
-+#define MPUPLL_M_550 550 /* 125 * n */
-+#define MPUPLL_M_600 600 /* 125 * n */
-+#define MPUPLL_M_720 720 /* 125 * n */
-+
-+#define MPUPLL_N 23 /* (n -1 ) */
-+#define MPUPLL_M2 1
-+
-+/* Core PLL Fdll = 1 GHZ, */
-+#define COREPLL_M 1000 /* 125 * n */
-+#define COREPLL_N 23 /* (n -1 ) */
-+
-+#define COREPLL_M4 10 /* CORE_CLKOUTM4 = 200 MHZ */
-+#define COREPLL_M5 8 /* CORE_CLKOUTM5 = 250 MHZ */
-+#define COREPLL_M6 4 /* CORE_CLKOUTM6 = 500 MHZ */
-+
-+/*
-+ * USB PHY clock is 960 MHZ. Since, this comes directly from Fdll, Fdll
-+ * frequency needs to be set to 960 MHZ. Hence,
-+ * For clkout = 192 MHZ, Fdll = 960 MHZ, divider values are given below
-+ */
-+#define PERPLL_M 960
-+#define PERPLL_N 23
-+#define PERPLL_M2 5
-+
-+/* DDR Freq is 166 MHZ for now*/
-+/* Set Fdll = 400 MHZ , Fdll = M * 2 * CLKINP/ N + 1; clkout = Fdll /(2 * M2) */
-+#if (CONFIG_AM335X_EVM_IS_13x13 == 1)
-+#define DDRPLL_M 166 /* M/N + 1 = 25/3 */
-+#else
-+#define DDRPLL_M 266
-+#endif
-+
-+#define DDRPLL_N 23
-+#define DDRPLL_M2 1
-+
-+#endif /* endif _CLOCKS_AM335X_H_ */
-diff --git a/arch/arm/boards/beaglebone/clocks_ti814x.h b/arch/arm/boards/beaglebone/clocks_ti814x.h
-new file mode 100644
-index 0000000..1b41c6f
---- /dev/null
-+++ b/arch/arm/boards/beaglebone/clocks_ti814x.h
-@@ -0,0 +1,72 @@
-+/*
-+ * (C) Copyright 2006-2008
-+ * Texas Instruments, <www.ti.com>
-+ * Richard Woodruff <r-woodruff2@ti.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 _CLOCKS_TI814X_H_
-+#define _CLOCKS_TI814X_H_
-+
-+/* CLK_SRC */
-+#define OSC_SRC0 0
-+#define OSC_SRC1 1
-+
-+#define L3_OSC_SRC OSC_SRC0
-+#define AUDIO_OSC_SRC OSC_SRC0
-+
-+/* Put the pll config values over here */
-+#define AUDIO_N 19
-+#define AUDIO_M 500
-+#define AUDIO_M2 2
-+#define AUDIO_CLKCTRL 0x801
-+
-+#define MODENA_N 0x10001
-+#define MODENA_M 0x3C
-+#define MODENA_M2 1
-+#define MODENA_CLKCTRL 0x1
-+
-+#define L3_N 19
-+#define L3_M 880
-+#define L3_M2 4
-+#define L3_CLKCTRL 0x801
-+
-+#define DDR_N 19
-+#define DDR_M 666
-+#define DDR_M2 2
-+#define DDR_CLKCTRL 0x801
-+
-+#define DSP_N 19
-+#define DSP_M 500
-+#define DSP_M2 1
-+#define DSP_CLKCTRL 0x801
-+
-+#define IVA_N 19
-+#define IVA_M 640
-+#define IVA_M2 2
-+#define IVA_CLKCTRL 0x801
-+
-+#define ISS_N 19
-+#define ISS_M 800
-+#define ISS_M2 2
-+#define ISS_CLKCTRL 0x801
-+
-+#define USB_N 19
-+#define USB_M 960
-+#define USB_M2 1
-+#define USB_CLKCTRL 0x200a0801
-+#endif /* endif _CLOCKS_TI814X_H_ */
-+
-diff --git a/arch/arm/boards/beaglebone/clocks_ti816x.h b/arch/arm/boards/beaglebone/clocks_ti816x.h
-new file mode 100644
-index 0000000..8590c2f
---- /dev/null
-+++ b/arch/arm/boards/beaglebone/clocks_ti816x.h
-@@ -0,0 +1,162 @@
-+/*
-+ * (C) Copyright 2006-2008
-+ * Texas Instruments, <www.ti.com>
-+ * Richard Woodruff <r-woodruff2@ti.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 _CLOCKS_TI816X_H_
-+#define _CLOCKS_TI816X_H_
-+
-+/*
-+ * In TI816x the 27MHz crystal generates various root clks (main pll, audio pll, video pll and ddr pll)
-+ * From these root clks the SYSCLKs are generated by making use of dividers and multipliers
-+ */
-+
-+#define FAPLL_K 8
-+#define SYSCLK_2_DIV 1
-+#define OSC_FREQ 27
-+#define DDR_PLL_400 /* Values supported 400,531,675,796 */
-+
-+/* Main PLL */
-+#define MAIN_N 64
-+#define MAIN_P 0x1
-+#define MAIN_INTFREQ1 0x8
-+#define MAIN_FRACFREQ1 0x800000
-+#define MAIN_MDIV1 0x2
-+#define MAIN_INTFREQ2 0xE
-+#define MAIN_FRACFREQ2 0x0
-+#define MAIN_MDIV2 0x1
-+#define MAIN_INTFREQ3 0x8
-+#define MAIN_FRACFREQ3 0xAAAAB0
-+#define MAIN_MDIV3 0x3
-+#define MAIN_INTFREQ4 0x9
-+#define MAIN_FRACFREQ4 0x55554F
-+#define MAIN_MDIV4 0x3
-+#define MAIN_INTFREQ5 0x9
-+#define MAIN_FRACFREQ5 0x374BC6
-+#define MAIN_MDIV5 0xC
-+#define MAIN_MDIV6 0x48
-+#define MAIN_MDIV7 0x4
-+
-+/* DDR PLL */
-+/* For 400 MHz */
-+#if defined(DDR_PLL_400)
-+#define DDR_N 59
-+#define DDR_P 0x1
-+#define DDR_MDIV1 0x4
-+#define DDR_INTFREQ2 0x8
-+#define DDR_FRACFREQ2 0xD99999
-+#define DDR_MDIV2 0x1E
-+#define DDR_INTFREQ3 0x8
-+#define DDR_FRACFREQ3 0x0
-+#define DDR_MDIV3 0x4
-+#define DDR_INTFREQ4 0xE /* Expansion DDR clk */
-+#define DDR_FRACFREQ4 0x0
-+#define DDR_MDIV4 0x4
-+#define DDR_INTFREQ5 0xE /* Expansion DDR clk */
-+#define DDR_FRACFREQ5 0x0
-+#define DDR_MDIV5 0x4
-+#endif
-+
-+/* For 531 MHz */
-+#if defined(DDR_PLL_531)
-+#define DDR_N 59
-+#define DDR_P 0x1
-+#define DDR_MDIV1 0x3
-+#define DDR_INTFREQ2 0x8
-+#define DDR_FRACFREQ2 0xD99999
-+#define DDR_MDIV2 0x1E
-+#define DDR_INTFREQ3 0x8
-+#define DDR_FRACFREQ3 0x0
-+#define DDR_MDIV3 0x4
-+#define DDR_INTFREQ4 0xE /* Expansion DDR clk */
-+#define DDR_FRACFREQ4 0x0
-+#define DDR_MDIV4 0x4
-+#define DDR_INTFREQ5 0xE /* Expansion DDR clk */
-+#define DDR_FRACFREQ5 0x0
-+#define DDR_MDIV5 0x4
-+#endif
-+
-+/* For 675 MHz */
-+#if defined(DDR_PLL_675)
-+#define DDR_N 50
-+#define DDR_P 0x1
-+#define DDR_MDIV1 0x2
-+#define DDR_INTFREQ2 0x9
-+#define DDR_FRACFREQ2 0x0
-+#define DDR_MDIV2 0x19
-+#define DDR_INTFREQ3 0x13
-+#define DDR_FRACFREQ3 0x800000
-+#define DDR_MDIV3 0x2
-+#define DDR_INTFREQ4 0xE /* Expansion DDR clk */
-+#define DDR_FRACFREQ4 0x0
-+#define DDR_MDIV4 0x4
-+#define DDR_INTFREQ5 0xE /* Expansion DDR clk */
-+#define DDR_FRACFREQ5 0x0
-+#define DDR_MDIV5 0x4
-+#endif
-+
-+/* For 796 MHz */
-+#if defined(DDR_PLL_796)
-+#define DDR_N 59
-+#define DDR_P 0x1
-+#define DDR_MDIV1 0x2
-+#define DDR_INTFREQ2 0x8
-+#define DDR_FRACFREQ2 0xD99999
-+#define DDR_MDIV2 0x1E
-+#define DDR_INTFREQ3 0x8
-+#define DDR_FRACFREQ3 0x0
-+#define DDR_MDIV3 0x4
-+#define DDR_INTFREQ4 0xE /* Expansion DDR clk */
-+#define DDR_FRACFREQ4 0x0
-+#define DDR_MDIV4 0x4
-+#define DDR_INTFREQ5 0xE /* Expansion DDR clk */
-+#define DDR_FRACFREQ5 0x0
-+#define DDR_MDIV5 0x4
-+#endif
-+
-+/* Video PLL */
-+#define VIDEO_N 110
-+#define VIDEO_P 0x2
-+#define VIDEO_INTFREQ1 0xB
-+#define VIDEO_FRACFREQ1 0x0
-+#define VIDEO_MDIV1 0x5
-+#define VIDEO_INTFREQ2 0xA
-+#define VIDEO_FRACFREQ2 0x0
-+#define VIDEO_MDIV2 0x2
-+#define VIDEO_INTFREQ3 0xA
-+#define VIDEO_FRACFREQ3 0x0
-+#define VIDEO_MDIV3 0x2
-+
-+/* Audio PLL */
-+#define AUDIO_N 64
-+#define AUDIO_P 0x19
-+#define AUDIO_INTFREQ2 0xE
-+#define AUDIO_FRACFREQ2 0x0
-+#define AUDIO_MDIV2 0x4
-+#define AUDIO_INTFREQ3 0x9
-+#define AUDIO_FRACFREQ3 0x0
-+#define AUDIO_MDIV3 0x5
-+#define AUDIO_INTFREQ4 0x9
-+#define AUDIO_FRACFREQ4 0xCBC148
-+#define AUDIO_MDIV4 0x14
-+#define AUDIO_INTFREQ5 0xD
-+#define AUDIO_FRACFREQ5 0x800000
-+#define AUDIO_MDIV5 0x14
-+
-+#endif /* endif _CLOCKS_TI816X_H_ */
-+
-diff --git a/arch/arm/boards/beaglebone/common_def.h b/arch/arm/boards/beaglebone/common_def.h
-new file mode 100644
-index 0000000..21a50dd
---- /dev/null
-+++ b/arch/arm/boards/beaglebone/common_def.h
-@@ -0,0 +1,48 @@
-+/*
-+ * common_def.h
-+ *
-+ * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.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 version 2.
-+ *
-+ * This program is distributed "as is" WITHOUT ANY WARRANTY of any
-+ * kind, whether express or implied; without even the implied warranty
-+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ */
-+#ifndef __COMMON_DEF_H__
-+#define __COMMON_DEF_H__
-+
-+/* AM335X type */
-+#define BONE_BOARD 0
-+#define GP_BOARD 1
-+#define IA_BOARD 2
-+#define IPP_BOARD 3
-+#define BASE_BOARD 4
-+
-+/* Profiles */
-+#define PROFILE_NONE 0x0
-+#define PROFILE_0 (1 << 0)
-+#define PROFILE_1 (1 << 1)
-+#define PROFILE_2 (1 << 2)
-+#define PROFILE_3 (1 << 3)
-+#define PROFILE_4 (1 << 4)
-+#define PROFILE_5 (1 << 5)
-+#define PROFILE_6 (1 << 6)
-+#define PROFILE_7 (1 << 7)
-+#define PROFILE_ALL 0xFF
-+
-+extern void pll_init(void);
-+extern void mpu_pll_config(int mpupll_M);
-+extern void enable_ddr_clocks(void);
-+
-+extern void enable_i2c0_pin_mux(void);
-+extern void enable_uart0_pin_mux(void);
-+extern void configure_evm_pin_mux(unsigned char daughter_board_id,
-+ char daughter_board_version[],
-+ unsigned short daughter_board_profile,
-+ unsigned int daughter_board_flag);
-+
-+#endif/*__COMMON_DEF_H__ */
-diff --git a/arch/arm/boards/beaglebone/config.h b/arch/arm/boards/beaglebone/config.h
-new file mode 100644
-index 0000000..80be07a
---- /dev/null
-+++ b/arch/arm/boards/beaglebone/config.h
-@@ -0,0 +1,24 @@
-+/**
-+ * 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_AM335X
-+#define CONFIG_TI81XX
-+
-+#endif /* __CONFIG_H */
-diff --git a/arch/arm/boards/beaglebone/cpu.h b/arch/arm/boards/beaglebone/cpu.h
-new file mode 100644
-index 0000000..da22b1d
---- /dev/null
-+++ b/arch/arm/boards/beaglebone/cpu.h
-@@ -0,0 +1,726 @@
-+/*
-+ * (C) Copyright 2006
-+ * Texas Instruments, <www.ti.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
-+ *
-+ */
-+
-+#ifndef _TI81XX_CPU_H
-+#define _TI81XX_CPU_H
-+
-+#if !(defined(__KERNEL_STRICT_NAMES) || defined(__ASSEMBLY__))
-+#include <asm/types.h>
-+#endif /* !(__KERNEL_STRICT_NAMES || __ASSEMBLY__) */
-+
-+#include "hardware.h"
-+
-+//#define BIT(x) (1 << x)
-+#define CL_BIT(x) (0 << x)
-+
-+/* Timer registers */
-+#define TIMER_TCLR 0x38 /* Timer control register */
-+#define TIMER_TCRR 0x3C /* Timer counter register */
-+#define TIMER_TLDR 0x40 /* Timer load value register*/
-+
-+/* Timer 32 bit registers */
-+#ifndef __KERNEL_STRICT_NAMES
-+#ifndef __ASSEMBLY__
-+struct gptimer {
-+ u32 tidr; /* 0x00 r */
-+ u8 res1[0xc];
-+ u32 tiocp_cfg; /* 0x10 rw */
-+ u8 res2[0xc];
-+ u32 tier; /* 0x20 rw */
-+ u32 tistatr;/* 0x24 r */
-+ u32 tistat; /* 0x28 r */
-+ u32 tisr; /* 0x2c rw */
-+ u32 tcicr; /* 0x30 rw */
-+ u32 twer; /* 0x34 rw */
-+ u32 tclr; /* 0x38 rw - control reg */
-+ u32 tcrr; /* 0x3c rw - counter reg */
-+ u32 tldr; /* 0x40 rw - load reg */
-+ u32 ttgr; /* 0x44 rw */
-+ u32 twpc; /* 0x48 r*/
-+ u32 tmar; /* 0x4c rw*/
-+ u32 tcar1; /* 0x50 r */
-+ u32 tscir; /* 0x54 r */
-+ u32 tcar2; /* 0x58 r */
-+};
-+#endif /* __ASSEMBLY__ */
-+#endif /* __KERNEL_STRICT_NAMES */
-+
-+/* Timer register bits */
-+#define TCLR_ST BIT(0) /* Start=1 Stop=0 */
-+#define TCLR_AR BIT(1) /* Auto reload */
-+#define TCLR_PRE BIT(5) /* Pre-scaler enable */
-+#define TCLR_PTV_SHIFT (2) /* Pre-scaler shift value */
-+#define TCLR_PRE_DISABLE CL_BIT(5) /* Pre-scalar disable */
-+
-+/* Control */
-+#define CONTROL_STATUS (CTRL_BASE + 0x40)
-+
-+/* device type */
-+#define DEVICE_MASK (BIT(8) | BIT(9) | BIT(10))
-+#define TST_DEVICE 0x0
-+#define EMU_DEVICE 0x1
-+#define HS_DEVICE 0x2
-+#define GP_DEVICE 0x3
-+
-+/* rom boot device/mode id */
-+#define BOOT_DEVICE_OFFSET 8
-+#define BOOT_DEVICE_MASK 0xff
-+
-+/* cpu-id for TI81XX family */
-+#define TI8168 0xb81e
-+#define AM335X 0xB944
-+
-+#define DEVICE_ID (CTRL_BASE + 0x0600)
-+/* This gives the status of the boot mode pins on the evm */
-+#define SYSBOOT_MASK (BIT(0) | BIT(1) | BIT(2) |BIT(3) |BIT(4))
-+
-+/* Reset control */
-+#ifdef CONFIG_AM335X
-+#define PRM_RSTCTRL (PRCM_BASE + 0x0F00)
-+#else
-+#define PRM_RSTCTRL (PRCM_BASE + 0x00A0)
-+#endif
-+#define PRM_RSTCTRL_RESET 0x01
-+
-+/* TI816X specific bits for PRM_DEVICE module */
-+#define GLOBAL_RST_COLD BIT(1)
-+
-+/* PLL related registers */
-+#ifdef CONFIG_TI816X
-+#define MAINPLL_CTRL (CTRL_BASE + 0x0400)
-+#define MAINPLL_PWD (CTRL_BASE + 0x0404)
-+#define MAINPLL_FREQ1 (CTRL_BASE + 0x0408)
-+#define MAINPLL_DIV1 (CTRL_BASE + 0x040C)
-+#define MAINPLL_FREQ2 (CTRL_BASE + 0x0410)
-+#define MAINPLL_DIV2 (CTRL_BASE + 0x0414)
-+#define MAINPLL_FREQ3 (CTRL_BASE + 0x0418)
-+#define MAINPLL_DIV3 (CTRL_BASE + 0x041C)
-+#define MAINPLL_FREQ4 (CTRL_BASE + 0x0420)
-+#define MAINPLL_DIV4 (CTRL_BASE + 0x0424)
-+#define MAINPLL_FREQ5 (CTRL_BASE + 0x0428)
-+#define MAINPLL_DIV5 (CTRL_BASE + 0x042C)
-+#define MAINPLL_DIV6 (CTRL_BASE + 0x0434)
-+#define MAINPLL_DIV7 (CTRL_BASE + 0x043C)
-+
-+#define DDRPLL_CTRL (CTRL_BASE + 0x0440)
-+#define DDRPLL_PWD (CTRL_BASE + 0x0444)
-+#define DDRPLL_DIV1 (CTRL_BASE + 0x044C)
-+#define DDRPLL_FREQ2 (CTRL_BASE + 0x0450)
-+#define DDRPLL_DIV2 (CTRL_BASE + 0x0454)
-+#define DDRPLL_FREQ3 (CTRL_BASE + 0x0458)
-+#define DDRPLL_DIV3 (CTRL_BASE + 0x045C)
-+#define DDRPLL_FREQ4 (CTRL_BASE + 0x0460)
-+#define DDRPLL_DIV4 (CTRL_BASE + 0x0464)
-+#define DDRPLL_FREQ5 (CTRL_BASE + 0x0468)
-+#define DDRPLL_DIV5 (CTRL_BASE + 0x046C)
-+
-+#define DDR_RCD (CTRL_BASE + 0x070C)
-+
-+#define VIDEOPLL_CTRL (CTRL_BASE + 0x0470)
-+#define VIDEOPLL_PWD (CTRL_BASE + 0x0474)
-+#define VIDEOPLL_FREQ1 (CTRL_BASE + 0x0478)
-+#define VIDEOPLL_DIV1 (CTRL_BASE + 0x047C)
-+#define VIDEOPLL_FREQ2 (CTRL_BASE + 0x0480)
-+#define VIDEOPLL_DIV2 (CTRL_BASE + 0x0484)
-+#define VIDEOPLL_FREQ3 (CTRL_BASE + 0x0488)
-+#define VIDEOPLL_DIV3 (CTRL_BASE + 0x048C)
-+
-+#define AUDIOPLL_CTRL (CTRL_BASE + 0x04A0)
-+#define AUDIOPLL_PWD (CTRL_BASE + 0x04A4)
-+#define AUDIOPLL_FREQ2 (CTRL_BASE + 0x04B0)
-+#define AUDIOPLL_DIV2 (CTRL_BASE + 0x04B4)
-+#define AUDIOPLL_FREQ3 (CTRL_BASE + 0x04B8)
-+#define AUDIOPLL_DIV3 (CTRL_BASE + 0x04BC)
-+#define AUDIOPLL_FREQ4 (CTRL_BASE + 0x04C0)
-+#define AUDIOPLL_DIV4 (CTRL_BASE + 0x04C4)
-+#define AUDIOPLL_FREQ5 (CTRL_BASE + 0x04C8)
-+#define AUDIOPLL_DIV5 (CTRL_BASE + 0x04CC)
-+
-+#endif
-+
-+#ifdef CONFIG_TI814X
-+
-+#define GMII_SEL (CTRL_BASE + 0x650)
-+
-+#define PCIE_PLLCFG0 (CTRL_BASE + 0x6D8)
-+#define PCIE_PLLCFG1 (CTRL_BASE + 0x6DC)
-+#define PCIE_PLLCFG2 (CTRL_BASE + 0x6E0)
-+#define PCIE_PLLCFG3 (CTRL_BASE + 0x6E4)
-+#define PCIE_PLLCFG4 (CTRL_BASE + 0x6E8)
-+#define PCIE_PLLSTATUS (CTRL_BASE + 0x6EC)
-+#define PCIE_RXSTATUS (CTRL_BASE + 0x6F0)
-+#define PCIE_TXSTATUS (CTRL_BASE + 0x6F4)
-+#define SERDES_REFCLK_CTRL (CTRL_BASE + 0xE24)
-+
-+#define SATA_PLLCFG0 (CTRL_BASE + 0x720)
-+#define SATA_PLLCFG1 (CTRL_BASE + 0x724)
-+#define SATA_PLLCFG2 (CTRL_BASE + 0x728)
-+#define SATA_PLLCFG3 (CTRL_BASE + 0x72C)
-+#define SATA_PLLCFG4 (CTRL_BASE + 0x730)
-+#define SATA_PLLSTATUS (CTRL_BASE + 0x734)
-+#define SATA_RXSTATUS (CTRL_BASE + 0x738)
-+#define SATA_TXSTATUS (CTRL_BASE + 0x73C)
-+
-+/* pin muxing registers */
-+#define PIN_CTRL_BASE (CTRL_BASE + 0x800)
-+#define N_PINS (271) /* PIN1=800, PIN 271=800+270*4=C38) */
-+
-+/* Clocks are derived from ADPLLJ */
-+#define ADPLLJ_CLKCTRL 0x4
-+#define ADPLLJ_TENABLE 0x8
-+#define ADPLLJ_TENABLEDIV 0xC
-+#define ADPLLJ_M2NDIV 0x10
-+#define ADPLLJ_MN2DIV 0x14
-+#define ADPLLJ_STATUS 0x24
-+
-+/* ADPLLJ register values */
-+#define ADPLLJ_CLKCTRL_HS2 0x00000801 /* HS2 mode, TINT2 = 1 */
-+#define ADPLLJ_CLKCTRL_HS1 0x00001001 /* HS1 mode, TINT2 = 1 */
-+#define ADPLLJ_CLKCTRL_CLKDCO 0x200A0000 /* Enable CLKDCOEN, CLKLDOEN, CLKDCOPWDNZ */
-+
-+#define MODENA_PLL_BASE (PLL_SUBSYS_BASE + 0x048)
-+#define DSP_PLL_BASE (PLL_SUBSYS_BASE + 0x080)
-+#define SGX_PLL_BASE (PLL_SUBSYS_BASE + 0x0B0)
-+#define IVA_PLL_BASE (PLL_SUBSYS_BASE + 0x0E0)
-+#define L3_PLL_BASE (PLL_SUBSYS_BASE + 0x110)
-+#define ISS_PLL_BASE (PLL_SUBSYS_BASE + 0x140)
-+#define DSS_PLL_BASE (PLL_SUBSYS_BASE + 0x170)
-+#define VIDEO0_PLL_BASE (PLL_SUBSYS_BASE + 0x1A0)
-+#define VIDEO1_PLL_BASE (PLL_SUBSYS_BASE + 0x1D0)
-+#define HDMI_PLL_BASE (PLL_SUBSYS_BASE + 0x200)
-+#define AUDIO_PLL_BASE (PLL_SUBSYS_BASE + 0x230)
-+#define USB_PLL_BASE (PLL_SUBSYS_BASE + 0x260)
-+#define DDR_PLL_BASE (PLL_SUBSYS_BASE + 0x290)
-+
-+#define OSC_SRC_CTRL (PLL_SUBSYS_BASE + 0x2C0)
-+#define ARM_CLKSRC (PLL_SUBSYS_BASE + 0x2C4)
-+#define VIDEO_PLL_CLKSRC (PLL_SUBSYS_BASE + 0x2C8)
-+#define MLB_ATL_CLKSRC (PLL_SUBSYS_BASE + 0x2CC)
-+#define McASP235_AUX_CLKSRC (PLL_SUBSYS_BASE + 0x2D0)
-+#define McASP_AHCLK_CLKSRC (PLL_SUBSYS_BASE + 0x2D4)
-+#define McBSP_UART_CLKSRC (PLL_SUBSYS_BASE + 0x2D8)
-+#define HDMI_I2S_CLKSRC (PLL_SUBSYS_BASE + 0x2DC)
-+#define DMTIMER_CLKSRC (PLL_SUBSYS_BASE + 0x2E0)
-+#define CLKOUT_MUX (PLL_SUBSYS_BASE + 0x2E4)
-+#define RMII_REFCLK_SRC (PLL_SUBSYS_BASE + 0x2E8)
-+#define SECSS_CLKSRC (PLL_SUBSYS_BASE + 0x2EC)
-+#define SYSCLK18_SRC (PLL_SUBSYS_BASE + 0x2F0)
-+#define WDT0_CLKSRC (PLL_SUBSYS_BASE + 0x2F4)
-+
-+#endif
-+
-+#ifdef CONFIG_AM335X
-+/* Module Offsets */
-+#define CM_PER (PRCM_BASE + 0x0)
-+#define CM_WKUP (PRCM_BASE + 0x400)
-+#define CM_DPLL (PRCM_BASE + 0x500)
-+#define CM_DEVICE (PRCM_BASE + 0x0700)
-+#define CM_CEFUSE (PRCM_BASE + 0x0A00)
-+#define PRM_DEVICE (PRCM_BASE + 0x0F00)
-+
-+/* Register Offsets */
-+/* Core PLL ADPLLS */
-+#define CM_CLKSEL_DPLL_CORE (CM_WKUP + 0x68)
-+#define CM_CLKMODE_DPLL_CORE (CM_WKUP + 0x90)
-+
-+/* Core HSDIV */
-+#define CM_DIV_M4_DPLL_CORE (CM_WKUP + 0x80)
-+#define CM_DIV_M5_DPLL_CORE (CM_WKUP + 0x84)
-+#define CM_DIV_M6_DPLL_CORE (CM_WKUP + 0xD8)
-+#define CM_IDLEST_DPLL_CORE (CM_WKUP + 0x5c)
-+
-+/* Peripheral PLL */
-+#define CM_CLKSEL_DPLL_PER (CM_WKUP + 0x9c)
-+#define CM_CLKMODE_DPLL_PER (CM_WKUP + 0x8c)
-+#define CM_DIV_M2_DPLL_PER (CM_WKUP + 0xAC)
-+#define CM_IDLEST_DPLL_PER (CM_WKUP + 0x70)
-+
-+/* Display PLL */
-+#define CM_CLKSEL_DPLL_DISP (CM_WKUP + 0x54)
-+#define CM_CLKMODE_DPLL_DISP (CM_WKUP + 0x98)
-+#define CM_DIV_M2_DPLL_DISP (CM_WKUP + 0xA4)
-+
-+/* DDR PLL */
-+#define CM_CLKSEL_DPLL_DDR (CM_WKUP + 0x40)
-+#define CM_CLKMODE_DPLL_DDR (CM_WKUP + 0x94)
-+#define CM_DIV_M2_DPLL_DDR (CM_WKUP + 0xA0)
-+#define CM_IDLEST_DPLL_DDR (CM_WKUP + 0x34)
-+
-+/* MPU PLL */
-+#define CM_CLKSEL_DPLL_MPU (CM_WKUP + 0x2c)
-+#define CM_CLKMODE_DPLL_MPU (CM_WKUP + 0x88)
-+#define CM_DIV_M2_DPLL_MPU (CM_WKUP + 0xA8)
-+#define CM_IDLEST_DPLL_MPU (CM_WKUP + 0x20)
-+
-+/* TIMER Clock Source Select */
-+#define CLKSEL_TIMER2_CLK (CM_DPLL + 0x8)
-+
-+/* Interconnect clocks */
-+#define CM_PER_L4LS_CLKCTRL (CM_PER + 0x60) /* EMIF */
-+#define CM_PER_L4FW_CLKCTRL (CM_PER + 0x64) /* EMIF FW */
-+#define CM_PER_L3_CLKCTRL (CM_PER + 0xE0) /* OCMC RAM */
-+#define CM_PER_L3_INSTR_CLKCTRL (CM_PER + 0xDC)
-+#define CM_PER_L4HS_CLKCTRL (CM_PER + 0x120)
-+#define CM_WKUP_L4WKUP_CLKCTRL (CM_WKUP + 0x0c)/* UART0 */
-+
-+/* Domain Wake UP */
-+#define CM_WKUP_CLKSTCTRL (CM_WKUP + 0) /* UART0 */
-+#define CM_PER_L4LS_CLKSTCTRL (CM_PER + 0x0) /* TIMER2 */
-+#define CM_PER_L3_CLKSTCTRL (CM_PER + 0x0c) /* EMIF */
-+#define CM_PER_L4FW_CLKSTCTRL (CM_PER + 0x08) /* EMIF FW */
-+#define CM_PER_L3S_CLKSTCTRL (CM_PER + 0x4)
-+#define CM_PER_L4HS_CLKSTCTRL (CM_PER + 0x011c)
-+#define CM_CEFUSE_CLKSTCTRL (CM_CEFUSE + 0x0)
-+
-+/* Module Enable Registers */
-+#define CM_PER_TIMER2_CLKCTRL (CM_PER + 0x80) /* Timer2 */
-+#define CM_WKUP_UART0_CLKCTRL (CM_WKUP + 0xB4)/* UART0 */
-+#define CM_WKUP_CONTROL_CLKCTRL (CM_WKUP + 0x4) /* Control Module */
-+#define CM_PER_EMIF_CLKCTRL (CM_PER + 0x28) /* EMIF */
-+#define CM_PER_EMIF_FW_CLKCTRL (CM_PER + 0xD0) /* EMIF FW */
-+#define CM_PER_GPMC_CLKCTRL (CM_PER + 0x30) /* GPMC */
-+#define CM_PER_ELM_CLKCTRL (CM_PER + 0x40) /* ELM */
-+#define CM_PER_SPI0_CLKCTRL (CM_PER + 0x4c) /* SPI0 */
-+#define CM_PER_SPI1_CLKCTRL (CM_PER + 0x50) /* SPI1 */
-+#define CM_WKUP_I2C0_CLKCTRL (CM_WKUP + 0xB8) /* I2C0 */
-+#define CM_PER_CPGMAC0_CLKCTRL (CM_PER + 0x14) /* Ethernet */
-+#define CM_PER_CPSW_CLKSTCTRL (CM_PER + 0x144)/* Ethernet */
-+#define CM_PER_OCMCRAM_CLKCTRL (CM_PER + 0x2C) /* OCMC RAM */
-+#define CM_PER_GPIO2_CLKCTRL (CM_PER + 0xB0) /* GPIO2 */
-+#define CM_PER_UART3_CLKCTRL (CM_PER + 0x74) /* UART3 */
-+#define CM_PER_I2C1_CLKCTRL (CM_PER + 0x48) /* I2C1 */
-+#define CM_PER_I2C2_CLKCTRL (CM_PER + 0x44) /* I2C2 */
-+#define CM_WKUP_GPIO0_CLKCTRL (CM_WKUP + 0x8) /* GPIO0 */
-+
-+#define CM_PER_MMC0_CLKCTRL (CM_PER + 0x3C)
-+#define CM_PER_MMC1_CLKCTRL (CM_PER + 0xF4)
-+#define CM_PER_MMC2_CLKCTRL (CM_PER + 0xF8)
-+
-+#endif /* CONFIG_AM335X */
-+
-+/* PRCM */
-+#define CM_DPLL_OFFSET (PRCM_BASE + 0x0300)
-+
-+#ifdef CONFIG_TI816X
-+#define CM_TIMER1_CLKSEL (CM_DPLL_OFFSET + 0x90)
-+
-+/* Timers */
-+#define CM_ALWON_TIMER_0_CLKCTRL (PRCM_BASE + 0x156C)
-+#define CM_ALWON_TIMER_1_CLKCTRL (PRCM_BASE + 0x1570)
-+#define CM_ALWON_TIMER_2_CLKCTRL (PRCM_BASE + 0x1574)
-+#define CM_ALWON_TIMER_3_CLKCTRL (PRCM_BASE + 0x1578)
-+#define CM_ALWON_TIMER_4_CLKCTRL (PRCM_BASE + 0x157C)
-+#define CM_ALWON_TIMER_5_CLKCTRL (PRCM_BASE + 0x1580)
-+#define CM_ALWON_TIMER_6_CLKCTRL (PRCM_BASE + 0x1584)
-+#define CM_ALWON_TIMER_7_CLKCTRL (PRCM_BASE + 0x1588)
-+#endif
-+
-+#define CM_ALWON_WDTIMER_CLKCTRL (PRCM_BASE + 0x158C)
-+#define CM_ALWON_SPI_CLKCTRL (PRCM_BASE + 0x1590)
-+#define CM_ALWON_CONTROL_CLKCTRL (PRCM_BASE + 0x15C4)
-+
-+#define CM_ALWON_L3_SLOW_CLKSTCTRL (PRCM_BASE + 0x1400)
-+
-+#ifdef CONFIG_TI816X
-+#define CM_ALWON_CUST_EFUSE_CLKCTRL (PRCM_BASE + 0x1628)
-+#endif
-+
-+#define CM_ALWON_GPIO_0_CLKCTRL (PRCM_BASE + 0x155c)
-+#define CM_ALWON_GPIO_0_OPTFCLKEN_DBCLK (PRCM_BASE + 0x155c)
-+
-+/* Ethernet */
-+#define CM_ETHERNET_CLKSTCTRL (PRCM_BASE + 0x1404)
-+#define CM_ALWON_ETHERNET_0_CLKCTRL (PRCM_BASE + 0x15D4)
-+#define CM_ALWON_ETHERNET_1_CLKCTRL (PRCM_BASE + 0x15D8)
-+
-+/* UARTs */
-+#define CM_ALWON_UART_0_CLKCTRL (PRCM_BASE + 0x1550)
-+#define CM_ALWON_UART_1_CLKCTRL (PRCM_BASE + 0x1554)
-+#define CM_ALWON_UART_2_CLKCTRL (PRCM_BASE + 0x1558)
-+
-+/* I2C */
-+/* Note: In ti814x I2C0 and I2C2 have common clk control */
-+#define CM_ALWON_I2C_0_CLKCTRL (PRCM_BASE + 0x1564)
-+
-+/* HSMMC */
-+#ifdef CONFIG_TI816X
-+#define CM_ALWON_HSMMC_CLKCTRL (PRCM_BASE + 0x15B0)
-+#endif
-+
-+#ifdef CONFIG_TI814X
-+#define CM_ALWON_HSMMC_CLKCTRL (PRCM_BASE + 0x1620)
-+#endif
-+
-+/* UART2 registers */
-+#ifdef CONFIG_TI816X
-+#define DEFAULT_UART_BASE UART2_BASE
-+#endif
-+
-+#ifdef CONFIG_TI814X
-+#define DEFAULT_UART_BASE UART0_BASE
-+#endif
-+
-+#ifdef CONFIG_AM335X
-+#define DEFAULT_UART_BASE UART0_BASE
-+#endif
-+/* UART registers */
-+/*TODO:Move to a new file */
-+#define UART_SYSCFG (DEFAULT_UART_BASE + 0x54)
-+#define UART_SYSSTS (DEFAULT_UART_BASE + 0x58)
-+#define UART_LCR (DEFAULT_UART_BASE + 0x0C)
-+#define UART_EFR (DEFAULT_UART_BASE + 0x08)
-+#define UART_MCR (DEFAULT_UART_BASE + 0x10)
-+#define UART_SCR (DEFAULT_UART_BASE + 0x40)
-+#define UART_TCR (DEFAULT_UART_BASE + 0x18)
-+#define UART_FCR (DEFAULT_UART_BASE + 0x08)
-+#define UART_DLL (DEFAULT_UART_BASE + 0x00)
-+#define UART_DLH (DEFAULT_UART_BASE + 0x04)
-+#define UART_MDR (DEFAULT_UART_BASE + 0x20)
-+
-+/*DMM & EMIF4 MMR Declaration*/
-+/*TODO: Move to a new file */
-+#define DMM_LISA_MAP__0 (DMM_BASE + 0x40)
-+#define DMM_LISA_MAP__1 (DMM_BASE + 0x44)
-+#define DMM_LISA_MAP__2 (DMM_BASE + 0x48)
-+#define DMM_LISA_MAP__3 (DMM_BASE + 0x4C)
-+#define DMM_PAT_BASE_ADDR (DMM_BASE + 0x460)
-+
-+#ifdef CONFIG_AM335X
-+#define EMIF_MOD_ID_REV (EMIF4_0_CFG_BASE + 0x0)
-+#define EMIF4_0_SDRAM_STATUS (EMIF4_0_CFG_BASE + 0x04)
-+#define EMIF4_0_SDRAM_CONFIG (EMIF4_0_CFG_BASE + 0x08)
-+#define EMIF4_0_SDRAM_CONFIG2 (EMIF4_0_CFG_BASE + 0x0C)
-+#define EMIF4_0_SDRAM_REF_CTRL (EMIF4_0_CFG_BASE + 0x10)
-+#define EMIF4_0_SDRAM_REF_CTRL_SHADOW (EMIF4_0_CFG_BASE + 0x14)
-+#define EMIF4_0_SDRAM_TIM_1 (EMIF4_0_CFG_BASE + 0x18)
-+#define EMIF4_0_SDRAM_TIM_1_SHADOW (EMIF4_0_CFG_BASE + 0x1C)
-+#define EMIF4_0_SDRAM_TIM_2 (EMIF4_0_CFG_BASE + 0x20)
-+#define EMIF4_0_SDRAM_TIM_2_SHADOW (EMIF4_0_CFG_BASE + 0x24)
-+#define EMIF4_0_SDRAM_TIM_3 (EMIF4_0_CFG_BASE + 0x28)
-+#define EMIF4_0_SDRAM_TIM_3_SHADOW (EMIF4_0_CFG_BASE + 0x2C)
-+#define EMIF0_0_SDRAM_MGMT_CTRL (EMIF4_0_CFG_BASE + 0x38)
-+#define EMIF0_0_SDRAM_MGMT_CTRL_SHD (EMIF4_0_CFG_BASE + 0x3C)
-+#define EMIF4_0_DDR_PHY_CTRL_1 (EMIF4_0_CFG_BASE + 0xE4)
-+#define EMIF4_0_DDR_PHY_CTRL_1_SHADOW (EMIF4_0_CFG_BASE + 0xE8)
-+#define EMIF4_0_DDR_PHY_CTRL_2 (EMIF4_0_CFG_BASE + 0xEC)
-+#define EMIF4_0_IODFT_TLGC (EMIF4_0_CFG_BASE + 0x60)
-+#else
-+#define EMIF4_0_SDRAM_CONFIG (EMIF4_0_CFG_BASE + 0x08)
-+#define EMIF4_0_SDRAM_CONFIG2 (EMIF4_0_CFG_BASE + 0x0C)
-+#define EMIF4_0_SDRAM_REF_CTRL (EMIF4_0_CFG_BASE + 0x10)
-+#define EMIF4_0_SDRAM_REF_CTRL_SHADOW (EMIF4_0_CFG_BASE + 0x14)
-+#define EMIF4_0_SDRAM_TIM_1 (EMIF4_0_CFG_BASE + 0x18)
-+#define EMIF4_0_SDRAM_TIM_1_SHADOW (EMIF4_0_CFG_BASE + 0x1C)
-+#define EMIF4_0_SDRAM_TIM_2 (EMIF4_0_CFG_BASE + 0x20)
-+#define EMIF4_0_SDRAM_TIM_2_SHADOW (EMIF4_0_CFG_BASE + 0x24)
-+#define EMIF4_0_SDRAM_TIM_3 (EMIF4_0_CFG_BASE + 0x28)
-+#define EMIF4_0_SDRAM_TIM_3_SHADOW (EMIF4_0_CFG_BASE + 0x2C)
-+#define EMIF4_0_DDR_PHY_CTRL_1 (EMIF4_0_CFG_BASE + 0xE4)
-+#define EMIF4_0_DDR_PHY_CTRL_1_SHADOW (EMIF4_0_CFG_BASE + 0xE8)
-+#define EMIF4_0_IODFT_TLGC (EMIF4_0_CFG_BASE + 0x60)
-+#endif
-+
-+#define EMIF4_1_SDRAM_CONFIG (EMIF4_1_CFG_BASE + 0x08)
-+#define EMIF4_1_SDRAM_CONFIG2 (EMIF4_1_CFG_BASE + 0x0C)
-+#define EMIF4_1_SDRAM_REF_CTRL (EMIF4_1_CFG_BASE + 0x10)
-+#define EMIF4_1_SDRAM_REF_CTRL_SHADOW (EMIF4_1_CFG_BASE + 0x14)
-+#define EMIF4_1_SDRAM_TIM_1 (EMIF4_1_CFG_BASE + 0x18)
-+#define EMIF4_1_SDRAM_TIM_1_SHADOW (EMIF4_1_CFG_BASE + 0x1C)
-+#define EMIF4_1_SDRAM_TIM_2 (EMIF4_1_CFG_BASE + 0x20)
-+#define EMIF4_1_SDRAM_TIM_2_SHADOW (EMIF4_1_CFG_BASE + 0x24)
-+#define EMIF4_1_SDRAM_TIM_3 (EMIF4_1_CFG_BASE + 0x28)
-+#define EMIF4_1_SDRAM_TIM_3_SHADOW (EMIF4_1_CFG_BASE + 0x2C)
-+#define EMIF4_1_DDR_PHY_CTRL_1 (EMIF4_1_CFG_BASE + 0xE4)
-+#define EMIF4_1_DDR_PHY_CTRL_1_SHADOW (EMIF4_1_CFG_BASE + 0xE8)
-+#define EMIF4_1_IODFT_TLGC (EMIF4_1_CFG_BASE + 0x60)
-+
-+#ifdef CONFIG_AM335X
-+#define VTP0_CTRL_REG 0x44E10E0C
-+#else
-+#define VTP0_CTRL_REG 0x48140E0C
-+#endif
-+#define VTP1_CTRL_REG 0x48140E10
-+
-+/*EMIF4 PRCM Defintion*/
-+#define CM_DEFAULT_L3_FAST_CLKSTCTRL (PRCM_BASE + 0x0508)
-+#define CM_DEFAULT_EMIF_0_CLKCTRL (PRCM_BASE + 0x0520)
-+#define CM_DEFAULT_EMIF_1_CLKCTRL (PRCM_BASE + 0x0524)
-+#define CM_DEFAULT_DMM_CLKCTRL (PRCM_BASE + 0x0528)
-+#define CM_DEFAULT_FW_CLKCTRL (PRCM_BASE + 0x052C)
-+
-+/* Smartreflex Registers */
-+#define TI816X_SMRT_SCALE_ADDR (CTRL_BASE + 0x06A0)
-+#define TI816X_SMRT_OPP_SVT_ADDR (CTRL_BASE + 0x06A8)
-+#define TI816X_SMRT_OPP_HVT_ADDR (CTRL_BASE + 0x06AC)
-+
-+
-+/* ALWON PRCM */
-+#ifdef CONFIG_AM335X
-+#define CM_ALWON_OCMC_0_CLKSTCTRL CM_PER_L3_CLKSTCTRL
-+#define CM_ALWON_OCMC_0_CLKCTRL CM_PER_OCMCRAM_CLKCTRL
-+#else
-+#define CM_ALWON_OCMC_0_CLKSTCTRL (PRCM_BASE + 0x1414)
-+#define CM_ALWON_OCMC_0_CLKCTRL (PRCM_BASE + 0x15B4)
-+#endif
-+
-+#ifdef CONFIG_TI816X
-+#define CM_ALWON_OCMC_1_CLKSTCTRL (PRCM_BASE + 0x1418)
-+#define CM_ALWON_OCMC_1_CLKCTRL (PRCM_BASE + 0x15B8)
-+#endif
-+
-+#ifdef CONFIG_AM335X
-+#define CM_ALWON_GPMC_CLKCTRL CM_PER_GPMC_CLKCTRL
-+#else
-+#define CM_ALWON_GPMC_CLKCTRL (PRCM_BASE + 0x15D0)
-+#endif
-+
-+/* OCMC */
-+#ifdef CONFIG_TI816X
-+#define SRAM0_SIZE (0x40000)
-+#define SRAM_GPMC_STACK_SIZE (0x40)
-+#endif
-+
-+#if defined(CONFIG_AM335X) || defined(CONFIG_TI814X)
-+#define SRAM0_SIZE (0x1B400) /* 109 KB */
-+#define SRAM_GPMC_STACK_SIZE (0x40)
-+#endif
-+
-+#define LOW_LEVEL_SRAM_STACK (SRAM0_START + SRAM0_SIZE - 4)
-+
-+/* GPMC related */
-+#define GPMC_CONFIG_CS0 (0x60)
-+#define GPMC_CONFIG_CS0_BASE (GPMC_BASE + GPMC_CONFIG_CS0)
-+#define GPMC_CONFIG1 (0x00)
-+#define GPMC_CONFIG2 (0x04)
-+#define GPMC_CONFIG3 (0x08)
-+#define GPMC_CONFIG4 (0x0C)
-+#define GPMC_CONFIG5 (0x10)
-+#define GPMC_CONFIG6 (0x14)
-+#define GPMC_CONFIG7 (0x18)
-+
-+/* PAD configuration register offsets and values for gpmc address
-+ * lines a12 - a26
-+ */
-+#ifdef CONFIG_TI816X
-+
-+#define TIM7_OUT (CTRL_BASE + 0xb34) /* a12 */
-+#define UART1_CTSN (CTRL_BASE + 0xadc) /* a13 */
-+#define UART1_RTSN (CTRL_BASE + 0xad8) /* a14 */
-+#define UART2_RTSN (CTRL_BASE + 0xae8) /* a15 */
-+#define SC1_RST (CTRL_BASE + 0xb10) /* a15 */
-+#define UART2_CTSN (CTRL_BASE + 0xaec) /* a16 */
-+#define UART0_RIN (CTRL_BASE + 0xacc) /* a17 */
-+#define UART0_DCDN (CTRL_BASE + 0xac8) /* a18 */
-+#define UART0_DSRN (CTRL_BASE + 0xac4) /* a19 */
-+#define UART0_DTRN (CTRL_BASE + 0xac0) /* a20 */
-+#define SPI_SCS3 (CTRL_BASE + 0xaa4) /* a21 */
-+#define SPI_SC2 (CTRL_BASE + 0xaa0) /* a22 */
-+#define GPO_IO6 (CTRL_BASE + 0xca0) /* a23 */
-+#define TIM6_OUT (CTRL_BASE + 0xb30) /* a24 */
-+#define SC0_DATA (CTRL_BASE + 0xafc) /* a25 */
-+#define GPMC_A27 (CTRL_BASE + 0xba0) /* a27 */
-+
-+/* MMC Pad register offsets */
-+#define MMC_POW (CTRL_BASE + 0xa70)
-+#define MMC_CLK (CTRL_BASE + 0xa74)
-+#define MMC_CMD (CTRL_BASE + 0xa78)
-+#define MMC_DAT0 (CTRL_BASE + 0xa7c)
-+#define MMC_DAT1_SDIRQ (CTRL_BASE + 0xa80)
-+#define MMC_DAT2_SDRW (CTRL_BASE + 0xa84)
-+#define MMC_DAT3 (CTRL_BASE + 0xa88)
-+
-+#define GPMC_A12 TIM7_OUT
-+#define GPMC_A13 UART1_CTSN
-+#define GPMC_A14 UART1_RTSN
-+#define GPMC_A15 UART2_RTSN
-+#define GPMC_A16 UART2_CTSN
-+#define GPMC_A17 UART0_RIN
-+#define GPMC_A18 UART0_DCDN
-+#define GPMC_A19 UART0_DSRN
-+#define GPMC_A20 UART0_DTRN
-+#define GPMC_A21 SPI_SCS3
-+#define GPMC_A22 SPI_SC2
-+#define GPMC_A23 GPO_IO6
-+#define GPMC_A24 TIM6_OUT
-+#define GPMC_A25 SC0_DATA
-+#endif
-+
-+#ifdef CONFIG_AM335X
-+#define GPMC_A12 (CTRL_BASE + 0x8c0) /* LCD_DATA8 */
-+#define GPMC_A13 (CTRL_BASE + 0x8c4) /* LCD_DATA9 */
-+#define GPMC_A14 (CTRL_BASE + 0x8c8) /* LCD_DATA10 */
-+#define GPMC_A15 (CTRL_BASE + 0x8cc) /* LCD_DATA11 */
-+#define GPMC_A16 (CTRL_BASE + 0x8d0) /* LCD_DATA12 */
-+#define GPMC_A17 (CTRL_BASE + 0x8d4) /* LCD_DATA13 */
-+#define GPMC_A18 (CTRL_BASE + 0x8d8) /* LCD_DATA14 */
-+#define GPMC_A19 (CTRL_BASE + 0x8dc) /* LCD_DATA15 */
-+#define GPMC_A20 (CTRL_BASE + 0x850) /* GPMC_A4 */
-+#define GPMC_A21 (CTRL_BASE + 0x854) /* GPMC_A5 */
-+#define GPMC_A22 (CTRL_BASE + 0x858) /* GPMC_A6 */
-+
-+/* DDR offsets */
-+#define DDR_PHY_BASE_ADDR 0x44E12000
-+#define DDR_IO_CTRL 0x44E10E04
-+#define DDR_CKE_CTRL 0x44E1131C
-+#define CONTROL_BASE_ADDR 0x44E10000
-+
-+#define DDR_CMD0_IOCTRL (CONTROL_BASE_ADDR + 0x1404)
-+#define DDR_CMD1_IOCTRL (CONTROL_BASE_ADDR + 0x1408)
-+#define DDR_CMD2_IOCTRL (CONTROL_BASE_ADDR + 0x140C)
-+#define DDR_DATA0_IOCTRL (CONTROL_BASE_ADDR + 0x1440)
-+#define DDR_DATA1_IOCTRL (CONTROL_BASE_ADDR + 0x1444)
-+
-+#define CMD0_CTRL_SLAVE_RATIO_0 (DDR_PHY_BASE_ADDR + 0x01C)
-+#define CMD0_CTRL_SLAVE_FORCE_0 (DDR_PHY_BASE_ADDR + 0x020)
-+#define CMD0_CTRL_SLAVE_DELAY_0 (DDR_PHY_BASE_ADDR + 0x024)
-+#define CMD0_DLL_LOCK_DIFF_0 (DDR_PHY_BASE_ADDR + 0x028)
-+#define CMD0_INVERT_CLKOUT_0 (DDR_PHY_BASE_ADDR + 0x02C)
-+
-+#define CMD1_CTRL_SLAVE_RATIO_0 (DDR_PHY_BASE_ADDR + 0x050)
-+#define CMD1_CTRL_SLAVE_FORCE_0 (DDR_PHY_BASE_ADDR + 0x054)
-+#define CMD1_CTRL_SLAVE_DELAY_0 (DDR_PHY_BASE_ADDR + 0x058)
-+#define CMD1_DLL_LOCK_DIFF_0 (DDR_PHY_BASE_ADDR + 0x05C)
-+#define CMD1_INVERT_CLKOUT_0 (DDR_PHY_BASE_ADDR + 0x060)
-+
-+#define CMD2_CTRL_SLAVE_RATIO_0 (DDR_PHY_BASE_ADDR + 0x084)
-+#define CMD2_CTRL_SLAVE_FORCE_0 (DDR_PHY_BASE_ADDR + 0x088)
-+#define CMD2_CTRL_SLAVE_DELAY_0 (DDR_PHY_BASE_ADDR + 0x08C)
-+#define CMD2_DLL_LOCK_DIFF_0 (DDR_PHY_BASE_ADDR + 0x090)
-+#define CMD2_INVERT_CLKOUT_0 (DDR_PHY_BASE_ADDR + 0x094)
-+
-+#define DATA0_RD_DQS_SLAVE_RATIO_0 (DDR_PHY_BASE_ADDR + 0x0C8)
-+#define DATA0_RD_DQS_SLAVE_RATIO_1 (DDR_PHY_BASE_ADDR + 0x0CC)
-+#define DATA0_WR_DQS_SLAVE_RATIO_0 (DDR_PHY_BASE_ADDR + 0x0DC)
-+
-+#define DATA0_WR_DQS_SLAVE_RATIO_1 (DDR_PHY_BASE_ADDR + 0x0E0)
-+#define DATA0_WRLVL_INIT_RATIO_0 (DDR_PHY_BASE_ADDR + 0x0F0)
-+
-+#define DATA0_WRLVL_INIT_RATIO_1 (DDR_PHY_BASE_ADDR + 0x0F4)
-+#define DATA0_GATELVL_INIT_RATIO_0 (DDR_PHY_BASE_ADDR + 0x0FC)
-+
-+#define DATA0_GATELVL_INIT_RATIO_1 (DDR_PHY_BASE_ADDR + 0x100)
-+#define DATA0_FIFO_WE_SLAVE_RATIO_0 (DDR_PHY_BASE_ADDR + 0x108)
-+
-+#define DATA0_FIFO_WE_SLAVE_RATIO_1 (DDR_PHY_BASE_ADDR + 0x10C)
-+#define DATA0_WR_DATA_SLAVE_RATIO_0 (DDR_PHY_BASE_ADDR + 0x120)
-+
-+#define DATA0_WR_DATA_SLAVE_RATIO_1 (DDR_PHY_BASE_ADDR + 0x124)
-+#define DATA0_DLL_LOCK_DIFF_0 (DDR_PHY_BASE_ADDR + 0x138)
-+
-+#define DATA0_RANK0_DELAYS_0 (DDR_PHY_BASE_ADDR + 0x134)
-+#define DATA1_RANK0_DELAYS_0 (DDR_PHY_BASE_ADDR + 0x1D8)
-+
-+#endif
-+
-+#ifndef __KERNEL_STRICT_NAMES
-+#ifndef __ASSEMBLY__
-+struct gpmc_cs {
-+ u32 config1; /* 0x00 */
-+ u32 config2; /* 0x04 */
-+ u32 config3; /* 0x08 */
-+ u32 config4; /* 0x0C */
-+ u32 config5; /* 0x10 */
-+ u32 config6; /* 0x14 */
-+ u32 config7; /* 0x18 */
-+ u32 nand_cmd; /* 0x1C */
-+ u32 nand_adr; /* 0x20 */
-+ u32 nand_dat; /* 0x24 */
-+ u8 res[8]; /* blow up to 0x30 byte */
-+};
-+
-+struct bch_res_0_3 {
-+ u32 bch_result_x[4];
-+};
-+
-+
-+
-+struct gpmc {
-+ u8 res1[0x10];
-+ u32 sysconfig; /* 0x10 */
-+ u8 res2[0x4];
-+ u32 irqstatus; /* 0x18 */
-+ u32 irqenable; /* 0x1C */
-+ u8 res3[0x20];
-+ u32 timeout_control; /* 0x40 */
-+ u8 res4[0xC];
-+ u32 config; /* 0x50 */
-+ u32 status; /* 0x54 */
-+ u8 res5[0x8]; /* 0x58 */
-+ struct gpmc_cs cs[8]; /* 0x60, 0x90, .. */
-+ u8 res6[0x14]; /* 0x1E0 */
-+ u32 ecc_config; /* 0x1F4 */
-+ u32 ecc_control; /* 0x1F8 */
-+ u32 ecc_size_config; /* 0x1FC */
-+ u32 ecc1_result; /* 0x200 */
-+ u32 ecc2_result; /* 0x204 */
-+ u32 ecc3_result; /* 0x208 */
-+ u32 ecc4_result; /* 0x20C */
-+ u32 ecc5_result; /* 0x210 */
-+ u32 ecc6_result; /* 0x214 */
-+ u32 ecc7_result; /* 0x218 */
-+ u32 ecc8_result; /* 0x21C */
-+ u32 ecc9_result; /* 0x220 */
-+ u8 res7[12]; /* 0x224 */
-+ u32 testmomde_ctrl; /* 0x230 */
-+ u8 res8[12]; /* 0x234 */
-+ struct bch_res_0_3 bch_result_0_3[2]; /* 0x240 */
-+};
-+
-+/* Used for board specific gpmc initialization */
-+extern struct gpmc *gpmc_cfg;
-+
-+#endif /* __ASSEMBLY__ */
-+#endif /* __KERNEL_STRICT_NAMES */
-+
-+/* Ethernet MAC ID from EFuse */
-+#define MAC_ID0_LO (CTRL_BASE + 0x630)
-+#define MAC_ID0_HI (CTRL_BASE + 0x634)
-+#define MAC_ID1_LO (CTRL_BASE + 0x638)
-+#define MAC_ID1_HI (CTRL_BASE + 0x63c)
-+#define MAC_MII_SEL (CTRL_BASE + 0x650)
-+
-+/* WDT related */
-+/* TODO: Move to a new file */
-+#define WDT_WDSC (WDT_BASE + 0x010)
-+#define WDT_WDST (WDT_BASE + 0x014)
-+#define WDT_WISR (WDT_BASE + 0x018)
-+#define WDT_WIER (WDT_BASE + 0x01C)
-+#define WDT_WWER (WDT_BASE + 0x020)
-+#define WDT_WCLR (WDT_BASE + 0x024)
-+#define WDT_WCRR (WDT_BASE + 0x028)
-+#define WDT_WLDR (WDT_BASE + 0x02C)
-+#define WDT_WTGR (WDT_BASE + 0x030)
-+#define WDT_WWPS (WDT_BASE + 0x034)
-+#define WDT_WDLY (WDT_BASE + 0x044)
-+#define WDT_WSPR (WDT_BASE + 0x048)
-+#define WDT_WIRQEOI (WDT_BASE + 0x050)
-+#define WDT_WIRQSTATRAW (WDT_BASE + 0x054)
-+#define WDT_WIRQSTAT (WDT_BASE + 0x058)
-+#define WDT_WIRQENSET (WDT_BASE + 0x05C)
-+#define WDT_WIRQENCLR (WDT_BASE + 0x060)
-+
-+#define WDT_UNFREEZE (CTRL_BASE + 0x100)
-+
-+#endif /* _TI816X_CPU_H */
-+
-diff --git a/arch/arm/boards/beaglebone/ddr_defs.h b/arch/arm/boards/beaglebone/ddr_defs.h
-new file mode 100644
-index 0000000..4ae1e10
---- /dev/null
-+++ b/arch/arm/boards/beaglebone/ddr_defs.h
-@@ -0,0 +1,362 @@
-+/*
-+ * Copyright (C) 2010 Texas Instruments
-+ *
-+ * 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 _DDR_DEFS_H
-+#define _DDR_DEFS_H
-+
-+#include "hardware.h"
-+
-+#ifdef CONFIG_TI816X_EVM_DDR3
-+
-+#define CONFIG_TI816X_DDR3_400 /* Values supported 400,531,675,796 */
-+#define CONFIG_TI816X_DDR3_SW_LEVELING /* Enable software leveling as part of DDR3 init*/
-+
-+
-+/*
-+ * DDR3 force values. These are board dependent
-+ */
-+
-+/* EVM 400 MHz clock Settings
-+ * EVM has only a single RANK (chip select) */
-+#define N_RANK 1
-+
-+/*
-+ * Invert clock adds an additional half cycle delay on the command
-+ * interface. The additional half cycle, is usually meant to enable
-+ * leveling in the situation that DQS is later than CK on the board. It
-+ * also helps provide some additional margin for leveling.
-+ *
-+ * For the EVM this is helping us with additional room for the write
-+ * leveling. Since the dqs delays are very small.
-+ */
-+#define INVERT_CLOCK 1
-+
-+/*
-+ * CMD_SLAVE_RATIO determines where is the command placed with respect
-+ * to the clock edge. This is a ratio, implying 0x100 is one cycle.
-+ * Ideally the command is centered so - this should be half cycle
-+ * delay (0x80). But if invert clock is in use, an additional half
-+ * cycle must be added
-+ */
-+#define CMD_SLAVE_FROM_INV_CLOCK(i) (((i)==0) ? 0x80 : 0x100)
-+#define CMD_SLAVE_RATIO CMD_SLAVE_FROM_INV_CLOCK(INVERT_CLOCK)
-+
-+#ifdef TI816X_DDR3_PG_1_0
-+/*
-+ * EMIF PHY allows for controlling write DQS delay w.r.t. clock. The
-+ * value may be forced or use values determined from the leveling
-+ * process. Since we are doing the leveling - these are actually
-+ * don't care and are not used. The force is in delay units
-+ */
-+#define WR_DQS_FORCE_3 0x00000010
-+#define WR_DQS_FORCE_2 0x00000010
-+#define WR_DQS_FORCE_1 0x00000010
-+#define WR_DQS_FORCE_0 0x00000010
-+
-+/*
-+ * EMIF PHY allows for controlling how much the read DQS must be
-+ * delayed to sample the data correctly. Ideally this is about half a
-+ * cycle. The force here is delay units. The value here is in use -
-+ * as the current leveling process may not obtain this reliably. The
-+ * value has been determined via various tests on the EVM and changing
-+ * this setting is no recomended.
-+ */
-+#define RD_DQS_FORCE_0 0x00000028
-+#define RD_DQS_FORCE_1 0x00000028
-+#define RD_DQS_FORCE_2 0x00000028
-+#define RD_DQS_FORCE_3 0x00000028
-+
-+/*
-+ * read gate represents the round trip delay from command to read data
-+ * on the board + some package delay. This is the period for which
-+ * the bust may be tristated between a write and a read command and
-+ * hence must not be sampled (gated off). This is actually determined
-+ * via the read leveling process and hence this value is a don't care
-+ * for the EVM
-+ */
-+#define RD_GATE_FORCE_3 0x44
-+#define RD_GATE_FORCE_2 0x44
-+#define RD_GATE_FORCE_1 0x44
-+#define RD_GATE_FORCE_0 0x44
-+
-+#endif
-+
-+/*
-+ * This represents the initial value for the leveling process. The
-+ * value is a ratio - so 0x100 represents one cycle. The real delay
-+ * is determined through the leveling process.
-+ *
-+ * During the leveling process, 0x20 is subtracted from the value, so
-+ * we have added that to the value we want to set. We also set the
-+ * values such that byte3 completes leveling after byte2 and byte1
-+ * after byte0.
-+ */
-+#define WR_DQS_RATIO_0 0x20
-+#define WR_DQS_RATIO_1 0x20
-+#define WR_DQS_RATIO_2 0x20
-+#define WR_DQS_RATIO_3 0x20
-+
-+#ifdef TI816X_DDR3_PG_1_0
-+/*
-+ * read dqs ratio is only used in DDR2
-+ */
-+#define RD_DQS_RATIO_0 0x40
-+#define RD_DQS_RATIO_1 0x40
-+#define RD_DQS_RATIO_2 0x40
-+#define RD_DQS_RATIO_3 0x40
-+#endif
-+
-+/*
-+ * This represents the initial value for the leveling process. The
-+ * value is a ratio - so 0x100 represents one cycle. The real delay
-+ * is determined through the leveling process.
-+ *
-+ * During the leveling process, 0x20 is subtracted from the value, so
-+ * we have added that to the value we want to set. We also set the
-+ * values such that byte3 completes leveling after byte2 and byte1
-+ * after byte0.
-+ */
-+#define RD_GATE_RATIO_0 0x20
-+#define RD_GATE_RATIO_1 0x20
-+#define RD_GATE_RATIO_2 0x20
-+#define RD_GATE_RATIO_3 0x20
-+
-+#ifdef TI816X_DDR3_PG_1_0
-+/*
-+ * currently there is an issue with the automatic training process for
-+ * DDR3 by setting the initial leveling ratios appropriately we are
-+ * able to work arround write leveling and read gate leveling. How
-+ * ever the automatic process may not work well for the read eye
-+ * training (determining rd dqs delay). To work arround this - we
-+ * leverage the pre-knowledge of a working RD DQS delay and make the
-+ * leveling process complete by forcing good and bad values
-+ * This is enabled via HACK_EYE_TRAINING
-+ */
-+#define HACK_EYE_TRAINING 0
-+
-+/*
-+ * only the rd dqs delay needs to be forced. Others are determined via the leveling process
-+ */
-+#define USE_WR_DQS_FORCE 0
-+#define USE_RD_DQS_FORCE HACK_EYE_TRAINING
-+#define USE_RD_GATE_FORCE 0
-+
-+#endif
-+/*
-+ * data rate in MHz. The DDR clock will be 1/2 of this value
-+ */
-+#define DDR_DATA_RATE 800
-+
-+#define USE_EMIF0 1
-+#define USE_EMIF1 1
-+
-+/*
-+ * EMIF Paramters. Refer the EMIF register documentation and the
-+ * memory datasheet for details
-+ */
-+/* For 400 MHz */
-+#if defined(CONFIG_TI816X_DDR3_400)
-+#define EMIF_TIM1 0x0CCCE524
-+#define EMIF_TIM2 0x30308023
-+#define EMIF_TIM3 0x009F82CF
-+#define EMIF_SDREF 0x10000C30
-+#define EMIF_SDCFG 0x62A41032
-+#define EMIF_PHYCFG 0x0000010B
-+
-+#if defined(CONFIG_TI816X_DDR3_SW_LEVELING)
-+/* These values are obtained from the CCS app */
-+#define RD_DQS_GATE 0x12A
-+#define RD_DQS 0x3B
-+#define WR_DQS 0xA6
-+#endif
-+
-+#endif /* CONFIG_TI816X_DDR3_400 */
-+
-+/* For 531 MHz */
-+#if defined(CONFIG_TI816X_DDR3_531)
-+#define EMIF_TIM1 0x0EF136AC
-+#define EMIF_TIM2 0x30408063
-+#define EMIF_TIM3 0x009F83AF
-+#define EMIF_SDREF 0x1000102E
-+#define EMIF_SDCFG 0x62A51832
-+#define EMIF_PHYCFG 0x0000010C
-+
-+#if defined(CONFIG_TI816X_DDR3_SW_LEVELING)
-+/* These values are obtained from the CCS app */
-+#define RD_DQS_GATE 0x13D
-+#define RD_DQS 0x39
-+#define WR_DQS 0xB4
-+#endif
-+
-+#endif /* CONFIG_TI816X_DDR_531 */
-+
-+/* For 675 MHz */
-+#if defined(CONFIG_TI816X_DDR3_675)
-+#define EMIF_TIM1 0x13358875
-+#define EMIF_TIM2 0x5051806C
-+#define EMIF_TIM3 0x009F84AF
-+#define EMIF_SDREF 0x10001491
-+#define EMIF_SDCFG 0x62A63032
-+#define EMIF_PHYCFG 0x0000010F
-+
-+#if defined(CONFIG_TI816X_DDR3_SW_LEVELING)
-+/* These values are obtained from the CCS app */
-+#define RD_DQS_GATE 0x196
-+#define RD_DQS 0x39
-+#define WR_DQS 0x91
-+
-+#endif
-+
-+#endif /* CONFIG_TI816X_DDR3_675 */
-+
-+/* For 796 MHz */
-+#if defined(CONFIG_TI816X_DDR3_796)
-+#define EMIF_TIM1 0x1779C9FE
-+#define EMIF_TIM2 0x50608074
-+#define EMIF_TIM3 0x009F857F
-+#define EMIF_SDREF 0x10001841
-+#define EMIF_SDCFG 0x62A73832
-+#define EMIF_PHYCFG 0x00000110
-+
-+#if defined(CONFIG_TI816X_DDR3_SW_LEVELING)
-+/* These values are obtained from the CCS app */
-+#define RD_DQS_GATE 0x1B3
-+#define RD_DQS 0x35
-+#define WR_DQS 0x93
-+
-+#endif
-+
-+#endif /* CONFIG_TI816X_DDR_796 */
-+
-+
-+#if defined(CONFIG_TI816X_DDR3_SW_LEVELING)
-+#define WR_DQS_RATIO_BYTE_LANE3 ((WR_DQS << 10) | WR_DQS)
-+#define WR_DQS_RATIO_BYTE_LANE2 ((WR_DQS << 10) | WR_DQS)
-+#define WR_DQS_RATIO_BYTE_LANE1 ((WR_DQS << 10) | WR_DQS)
-+#define WR_DQS_RATIO_BYTE_LANE0 ((WR_DQS << 10) | WR_DQS)
-+
-+#define WR_DATA_RATIO_BYTE_LANE3 (((WR_DQS + 0x40) << 10) | (WR_DQS + 0x40))
-+#define WR_DATA_RATIO_BYTE_LANE2 (((WR_DQS + 0x40) << 10) | (WR_DQS + 0x40))
-+#define WR_DATA_RATIO_BYTE_LANE1 (((WR_DQS + 0x40) << 10) | (WR_DQS + 0x40))
-+#define WR_DATA_RATIO_BYTE_LANE0 (((WR_DQS + 0x40) << 10) | (WR_DQS + 0x40))
-+
-+#define RD_DQS_RATIO ((RD_DQS << 10) | RD_DQS)
-+
-+#define DQS_GATE_BYTE_LANE0 ((RD_DQS_GATE << 10) | RD_DQS_GATE)
-+#define DQS_GATE_BYTE_LANE1 ((RD_DQS_GATE << 10) | RD_DQS_GATE)
-+#define DQS_GATE_BYTE_LANE2 ((RD_DQS_GATE << 10) | RD_DQS_GATE)
-+#define DQS_GATE_BYTE_LANE3 ((RD_DQS_GATE << 10) | RD_DQS_GATE)
-+
-+#endif /* CONFIG_TI816X_DDR3_SW_LEVELING */
-+
-+#endif /* CONFIG_TI816X_EVM_DDR3 */
-+
-+#ifdef CONFIG_TI816X_EVM_DDR2
-+
-+#define INVERT_CLK_OUT 0x0
-+#define CMD_SLAVE_RATIO 0x80
-+/*
-+ * DDR2 ratio values. These are board dependent
-+ * obtained from sweep experiments
-+ */
-+
-+/* EVM 400 MHz clock Settings */
-+
-+#define WR_DQS_RATIO_BYTE_LANE3 ((0x4a << 10) | 0x4a)
-+#define WR_DQS_RATIO_BYTE_LANE2 ((0x4a << 10) | 0x4a)
-+#define WR_DQS_RATIO_BYTE_LANE1 ((0x4a << 10) | 0x4a)
-+#define WR_DQS_RATIO_BYTE_LANE0 ((0x4a << 10) | 0x4a)
-+
-+#define WR_DATA_RATIO_BYTE_LANE3 (((0x4a + 0x40) << 10) | (0x4a + 0x40))
-+#define WR_DATA_RATIO_BYTE_LANE2 (((0x4a + 0x40) << 10) | (0x4a + 0x40))
-+#define WR_DATA_RATIO_BYTE_LANE1 (((0x4a + 0x40) << 10) | (0x4a + 0x40))
-+#define WR_DATA_RATIO_BYTE_LANE0 (((0x4a + 0x40) << 10) | (0x4a + 0x40))
-+
-+#define RD_DQS_RATIO ((0x40 << 10) | 0x40)
-+
-+#define DQS_GATE_BYTE_LANE0 ((0x13a << 10) | 0x13a)
-+#define DQS_GATE_BYTE_LANE1 ((0x13a << 10) | 0x13a)
-+#define DQS_GATE_BYTE_LANE2 ((0x13a << 10) | 0x13a)
-+#define DQS_GATE_BYTE_LANE3 ((0x13a << 10) | 0x13a)
-+
-+/*
-+ * EMIF Paramters
-+ */
-+#define EMIF_TIM1 0xAAB15E2
-+#define EMIF_TIM2 0x423631D2
-+#define EMIF_TIM3 0x80032F
-+#define EMIF_SDREF 0x10000C30
-+#define EMIF_SDCFG 0x43801A3A /* 32 bit ddr2, CL=6, CWL=5, 13 rows, 8 banks, 10 bit column, 2 CS */
-+#define EMIF_PHYCFG 0x0000010B /* local odt = 1, read latency = 11 (max = 12, min=6) */
-+
-+#endif /* CONFIG_TI816X_EVM_DDR2 */
-+
-+#ifdef CONFIG_TI814X_EVM_DDR2
-+/* ti814x specific settings to be added */
-+#endif
-+
-+/* AM335X EMIF Register values */
-+#ifdef CONFIG_AM335X
-+#define EMIF_SDMGT 0x80000000
-+#define EMIF_SDRAM 0x00004650
-+#define EMIF_PHYCFG 0x2
-+#define DDR_PHY_RESET (0x1 << 10)
-+#define DDR_FUNCTIONAL_MODE_EN 0x1
-+#define DDR_PHY_READY (0x1 << 2)
-+#define VTP_CTRL_READY (0x1 << 5)
-+#define VTP_CTRL_ENABLE (0x1 << 6)
-+#define VTP_CTRL_LOCK_EN (0x1 << 4)
-+#define VTP_CTRL_START_EN (0x1)
-+#define DDR2_RATIO 0x80 /* for mDDR */
-+#define CMD_FORCE 0x00 /* common #def */
-+#define CMD_DELAY 0x00
-+#if (CONFIG_AM335X_EVM_IS_13x13 == 1)
-+#define EMIF_READ_LATENCY 0x05
-+#define EMIF_TIM1 0x04446249
-+#define EMIF_TIM2 0x101731C0
-+#define EMIF_TIM3 0x137
-+#define EMIF_SDCFG 0x20004EA3
-+#define EMIF_SDREF 0x57c
-+#define DDR2_DLL_LOCK_DIFF 0x4
-+#define DDR2_RD_DQS 0x40
-+#define DDR2_PHY_FIFO_WE 0x56
-+#else
-+#define EMIF_READ_LATENCY 0x05
-+#define EMIF_TIM1 0x0666B3D6
-+#define EMIF_TIM2 0x143731DA
-+#define EMIF_TIM3 0x00000347
-+#define EMIF_SDCFG 0x43805332
-+#define EMIF_SDREF 0x0000081a
-+#define DDR2_DLL_LOCK_DIFF 0x0
-+#define DDR2_RD_DQS 0x12
-+#define DDR2_PHY_FIFO_WE 0x80
-+#endif
-+#define DDR2_INVERT_CLKOUT 0x00
-+#define DDR2_WR_DQS 0x00
-+#define DDR2_PHY_WRLVL 0x00
-+#define DDR2_PHY_GATELVL 0x00
-+#define DDR2_PHY_WR_DATA 0x40
-+#define PHY_RANK0_DELAY 0x01
-+#define PHY_DLL_LOCK_DIFF 0x0
-+#define DDR_IOCTRL_VALUE 0x18B
-+#endif
-+
-+#endif /* _DDR_DEFS_H */
-+
-diff --git a/arch/arm/boards/beaglebone/env/boot/sd b/arch/arm/boards/beaglebone/env/boot/sd
-new file mode 100644
-index 0000000..f3f276c
---- /dev/null
-+++ b/arch/arm/boards/beaglebone/env/boot/sd
-@@ -0,0 +1,16 @@
-+#!/bin/sh
-+
-+if [ "$1" = menu ]; then
-+ boot-menu-add-entry "$0" "kernel & rootfs on SD card"
-+ exit
-+fi
-+
-+global.bootm.image=/boot/uImage
-+#global.bootm.oftree=<path to oftree>
-+#global.bootm.initrd=<path to initrd>
-+
-+#bootargs-root-nfs -n "<path on server>" -s <serverip>
-+#bootargs-root-jffs2 -m <mtdname>
-+#bootargs-root-ubi -r <volume> -m <mtdname>
-+
-+global.linux.bootargs.root="root=/dev/mmcblk0p2 rootfstype=ext4 rootwait ro"
-diff --git a/arch/arm/boards/beaglebone/env/init/bootargs-base b/arch/arm/boards/beaglebone/env/init/bootargs-base
-new file mode 100644
-index 0000000..333856e
---- /dev/null
-+++ b/arch/arm/boards/beaglebone/env/init/bootargs-base
-@@ -0,0 +1,8 @@
-+#!/bin/sh
-+
-+if [ "$1" = menu ]; then
-+ init-menu-add-entry "$0" "Base bootargs"
-+ exit
-+fi
-+
-+global.linux.bootargs.base="console=ttyO0,115200n8"
-diff --git a/arch/arm/boards/beaglebone/env/init/general b/arch/arm/boards/beaglebone/env/init/general
-new file mode 100644
-index 0000000..bbd7ee3
---- /dev/null
-+++ b/arch/arm/boards/beaglebone/env/init/general
-@@ -0,0 +1,18 @@
-+#!/bin/sh
-+
-+if [ "$1" = menu ]; then
-+ init-menu-add-entry "$0" "general config settings"
-+ exit
-+fi
-+
-+# user (used for network filenames)
-+global.user=jlu
-+
-+# timeout in seconds before the default boot entry is started
-+global.autoboot_timeout=3
-+
-+# default boot entry (one of /env/boot/*)
-+global.boot.default=sd
-+
-+# default tftp path
-+global.tftp.path=/mnt/tftp-dhcp
-diff --git a/arch/arm/boards/beaglebone/hardware.h b/arch/arm/boards/beaglebone/hardware.h
-new file mode 100644
-index 0000000..ee4256a
---- /dev/null
-+++ b/arch/arm/boards/beaglebone/hardware.h
-@@ -0,0 +1,117 @@
-+/*
-+ * Copyright (C) 2009, Texas Instruments, Incorporated
-+ *
-+ * 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 version 2.
-+ *
-+ * This program is distributed "as is" WITHOUT ANY WARRANTY of any
-+ * kind, whether express or implied; without even the implied warranty
-+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ */
-+
-+#ifndef __TI81XX_HARDWARE_H
-+#define __TI81XX_HARDWARE_H
-+
-+/* The objective is to keep only the overall memory map here
-+ * The break-up of the memory map for individual modules registers should
-+ * be in a different file like cpu.h so that this is the only place
-+ * where change is needed for new SoCs when the IP is otherwise the same
-+ */
-+#ifdef CONFIG_AM335X
-+#define SRAM0_START 0x402F0400
-+#else
-+#define SRAM0_START 0x40300000
-+#endif
-+#ifdef CONFIG_AM335X
-+#define UART0_BASE 0x44E09000
-+#else
-+#define UART0_BASE 0x48020000
-+#endif
-+#define UART1_BASE 0x48022000
-+#define UART2_BASE 0x48024000
-+#define UART3_BASE 0x481A6000
-+
-+/* DM Timer base addresses */
-+#define DM_TIMER0_BASE 0x4802C000
-+#define DM_TIMER1_BASE 0x4802E000
-+#define DM_TIMER2_BASE 0x48040000
-+#define DM_TIMER3_BASE 0x48042000
-+#define DM_TIMER4_BASE 0x48044000
-+#define DM_TIMER5_BASE 0x48046000
-+#define DM_TIMER6_BASE 0x48048000
-+#define DM_TIMER7_BASE 0x4804A000
-+
-+/* GPIO Base address */
-+#define GPIO0_BASE 0x48032000
-+#define GPIO1_BASE 0x4804C000
-+#ifdef CONFIG_AM335X
-+#define GPIO2_BASE 0x481AC000
-+#endif
-+/* BCH Error Location Module */
-+#define ELM_BASE 0x48080000
-+
-+/* Watchdog Timer */
-+#ifdef CONFIG_AM335X
-+#define WDT_BASE 0x44E35000
-+#else
-+#define WDT_BASE 0x480C2000
-+#endif
-+
-+/* Control Module Base Address */
-+#ifdef CONFIG_AM335X
-+#define CTRL_BASE 0x44E10000
-+#else
-+#define CTRL_BASE 0x48140000
-+#endif
-+
-+/* PRCM Base Address */
-+#ifdef CONFIG_AM335X
-+#define PRCM_BASE 0x44E00000
-+#else
-+#define PRCM_BASE 0x48180000
-+#endif
-+
-+/* PLL Subsystem Base Address */
-+#ifdef CONFIG_TI814X
-+#define PLL_SUBSYS_BASE 0x481C5000
-+#endif
-+
-+/* EMIF Base address */
-+#define EMIF4_0_CFG_BASE 0x4C000000
-+#define EMIF4_1_CFG_BASE 0x4D000000
-+#define DMM_BASE 0x4E000000
-+
-+#ifdef CONFIG_TI816X
-+#define DDRPHY_0_CONFIG_BASE 0x48198000
-+#define DDRPHY_1_CONFIG_BASE 0x4819a000
-+#define DDRPHY_CONFIG_BASE ((emif == 0) ? DDRPHY_0_CONFIG_BASE:DDRPHY_1_CONFIG_BASE)
-+#endif
-+
-+#ifdef CONFIG_TI814X
-+#define DDRPHY_0_CONFIG_BASE (CTRL_BASE + 0x1400)
-+#define DDRPHY_1_CONFIG_BASE (CTRL_BASE + 0x1500)
-+#define DDRPHY_CONFIG_BASE ((emif == 0) ? DDRPHY_0_CONFIG_BASE:DDRPHY_1_CONFIG_BASE)
-+#endif
-+
-+#ifdef CONFIG_AM335X
-+#define DDRPHY_0_CONFIG_BASE (CTRL_BASE + 0x1400)
-+#define DDRPHY_CONFIG_BASE DDRPHY_0_CONFIG_BASE
-+#endif
-+
-+/* GPMC Base address */
-+#define GPMC_BASE 0x50000000
-+
-+/* CPSW Config space */
-+#define TI814X_CPSW_BASE 0x4A100000
-+#define TI814X_CPSW_MDIO_BASE 0x4A100800
-+
-+#define AM335X_CPSW_BASE 0x4A100000
-+#define AM335X_CPSW_MDIO_BASE 0x4A101000
-+
-+#endif /* __TI81XX_HARDWARE_H */
-+
-diff --git a/arch/arm/boards/beaglebone/mux.c b/arch/arm/boards/beaglebone/mux.c
-new file mode 100644
-index 0000000..7fac302
---- /dev/null
-+++ b/arch/arm/boards/beaglebone/mux.c
-@@ -0,0 +1,707 @@
-+/*
-+ * mux.c
-+ *
-+ * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.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 version 2.
-+ *
-+ * This program is distributed "as is" WITHOUT ANY WARRANTY of any
-+ * kind, whether express or implied; without even the implied warranty
-+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ */
-+#include <common.h>
-+#include <config.h>
-+#include <asm/io.h>
-+#include "config.h"
-+#include "common_def.h"
-+#include "hardware.h"
-+
-+#define MUX_CFG(value, offset) \
-+ __raw_writel(value, (CTRL_BASE + offset));
-+
-+/* PAD Control Fields */
-+#define SLEWCTRL (0x1 << 6)
-+#define RXACTIVE (0x1 << 5)
-+#define PULLUP_EN (0x1 << 4) /* Pull UP Selection */
-+#define PULLUDEN (0x0 << 3) /* Pull up enabled */
-+#define PULLUDDIS (0x1 << 3) /* Pull up disabled */
-+#define MODE(val) val
-+
-+/*
-+ * PAD CONTROL OFFSETS
-+ * Field names corresponds to the pad signal name
-+ */
-+struct pad_signals {
-+ int gpmc_ad0;
-+ int gpmc_ad1;
-+ int gpmc_ad2;
-+ int gpmc_ad3;
-+ int gpmc_ad4;
-+ int gpmc_ad5;
-+ int gpmc_ad6;
-+ int gpmc_ad7;
-+ int gpmc_ad8;
-+ int gpmc_ad9;
-+ int gpmc_ad10;
-+ int gpmc_ad11;
-+ int gpmc_ad12;
-+ int gpmc_ad13;
-+ int gpmc_ad14;
-+ int gpmc_ad15;
-+ int gpmc_a0;
-+ int gpmc_a1;
-+ int gpmc_a2;
-+ int gpmc_a3;
-+ int gpmc_a4;
-+ int gpmc_a5;
-+ int gpmc_a6;
-+ int gpmc_a7;
-+ int gpmc_a8;
-+ int gpmc_a9;
-+ int gpmc_a10;
-+ int gpmc_a11;
-+ int gpmc_wait0;
-+ int gpmc_wpn;
-+ int gpmc_be1n;
-+ int gpmc_csn0;
-+ int gpmc_csn1;
-+ int gpmc_csn2;
-+ int gpmc_csn3;
-+ int gpmc_clk;
-+ int gpmc_advn_ale;
-+ int gpmc_oen_ren;
-+ int gpmc_wen;
-+ int gpmc_be0n_cle;
-+ int lcd_data0;
-+ int lcd_data1;
-+ int lcd_data2;
-+ int lcd_data3;
-+ int lcd_data4;
-+ int lcd_data5;
-+ int lcd_data6;
-+ int lcd_data7;
-+ int lcd_data8;
-+ int lcd_data9;
-+ int lcd_data10;
-+ int lcd_data11;
-+ int lcd_data12;
-+ int lcd_data13;
-+ int lcd_data14;
-+ int lcd_data15;
-+ int lcd_vsync;
-+ int lcd_hsync;
-+ int lcd_pclk;
-+ int lcd_ac_bias_en;
-+ int mmc0_dat3;
-+ int mmc0_dat2;
-+ int mmc0_dat1;
-+ int mmc0_dat0;
-+ int mmc0_clk;
-+ int mmc0_cmd;
-+ int mii1_col;
-+ int mii1_crs;
-+ int mii1_rxerr;
-+ int mii1_txen;
-+ int mii1_rxdv;
-+ int mii1_txd3;
-+ int mii1_txd2;
-+ int mii1_txd1;
-+ int mii1_txd0;
-+ int mii1_txclk;
-+ int mii1_rxclk;
-+ int mii1_rxd3;
-+ int mii1_rxd2;
-+ int mii1_rxd1;
-+ int mii1_rxd0;
-+ int rmii1_refclk;
-+ int mdio_data;
-+ int mdio_clk;
-+ int spi0_sclk;
-+ int spi0_d0;
-+ int spi0_d1;
-+ int spi0_cs0;
-+ int spi0_cs1;
-+ int ecap0_in_pwm0_out;
-+ int uart0_ctsn;
-+ int uart0_rtsn;
-+ int uart0_rxd;
-+ int uart0_txd;
-+ int uart1_ctsn;
-+ int uart1_rtsn;
-+ int uart1_rxd;
-+ int uart1_txd;
-+ int i2c0_sda;
-+ int i2c0_scl;
-+ int mcasp0_aclkx;
-+ int mcasp0_fsx;
-+ int mcasp0_axr0;
-+ int mcasp0_ahclkr;
-+ int mcasp0_aclkr;
-+ int mcasp0_fsr;
-+ int mcasp0_axr1;
-+ int mcasp0_ahclkx;
-+ int xdma_event_intr0;
-+ int xdma_event_intr1;
-+ int nresetin_out;
-+ int porz;
-+ int nnmi;
-+ int osc0_in;
-+ int osc0_out;
-+ int rsvd1;
-+ int tms;
-+ int tdi;
-+ int tdo;
-+ int tck;
-+ int ntrst;
-+ int emu0;
-+ int emu1;
-+ int osc1_in;
-+ int osc1_out;
-+ int pmic_power_en;
-+ int rtc_porz;
-+ int rsvd2;
-+ int ext_wakeup;
-+ int enz_kaldo_1p8v;
-+ int usb0_dm;
-+ int usb0_dp;
-+ int usb0_ce;
-+ int usb0_id;
-+ int usb0_vbus;
-+ int usb0_drvvbus;
-+ int usb1_dm;
-+ int usb1_dp;
-+ int usb1_ce;
-+ int usb1_id;
-+ int usb1_vbus;
-+ int usb1_drvvbus;
-+ int ddr_resetn;
-+ int ddr_csn0;
-+ int ddr_cke;
-+ int ddr_ck;
-+ int ddr_nck;
-+ int ddr_casn;
-+ int ddr_rasn;
-+ int ddr_wen;
-+ int ddr_ba0;
-+ int ddr_ba1;
-+ int ddr_ba2;
-+ int ddr_a0;
-+ int ddr_a1;
-+ int ddr_a2;
-+ int ddr_a3;
-+ int ddr_a4;
-+ int ddr_a5;
-+ int ddr_a6;
-+ int ddr_a7;
-+ int ddr_a8;
-+ int ddr_a9;
-+ int ddr_a10;
-+ int ddr_a11;
-+ int ddr_a12;
-+ int ddr_a13;
-+ int ddr_a14;
-+ int ddr_a15;
-+ int ddr_odt;
-+ int ddr_d0;
-+ int ddr_d1;
-+ int ddr_d2;
-+ int ddr_d3;
-+ int ddr_d4;
-+ int ddr_d5;
-+ int ddr_d6;
-+ int ddr_d7;
-+ int ddr_d8;
-+ int ddr_d9;
-+ int ddr_d10;
-+ int ddr_d11;
-+ int ddr_d12;
-+ int ddr_d13;
-+ int ddr_d14;
-+ int ddr_d15;
-+ int ddr_dqm0;
-+ int ddr_dqm1;
-+ int ddr_dqs0;
-+ int ddr_dqsn0;
-+ int ddr_dqs1;
-+ int ddr_dqsn1;
-+ int ddr_vref;
-+ int ddr_vtp;
-+ int ddr_strben0;
-+ int ddr_strben1;
-+ int ain7;
-+ int ain6;
-+ int ain5;
-+ int ain4;
-+ int ain3;
-+ int ain2;
-+ int ain1;
-+ int ain0;
-+ int vrefp;
-+ int vrefn;
-+};
-+
-+struct module_pin_mux {
-+ short reg_offset;
-+ unsigned char val;
-+};
-+
-+struct evm_pin_mux {
-+ struct module_pin_mux *mod_pin_mux;
-+ unsigned short profile;
-+/*
-+* If the device is required on both baseboard & daughter board (ex i2c),
-+* specify DEV_ON_BASEBOARD
-+*/
-+#define DEV_ON_BASEBOARD 0
-+#define DEV_ON_DGHTR_BRD 1
-+ unsigned short device_on;
-+};
-+
-+#define PAD_CTRL_BASE 0x800
-+#define OFFSET(x) (unsigned int) (&((struct pad_signals *) \
-+ (PAD_CTRL_BASE))->x)
-+
-+static struct module_pin_mux uart0_pin_mux[] = {
-+ {OFFSET(uart0_rxd), (MODE(0) | PULLUP_EN | RXACTIVE)}, /* UART0_RXD */
-+ {OFFSET(uart0_txd), (MODE(0) | PULLUDEN)}, /* UART0_TXD */
-+ {-1},
-+};
-+
-+static struct module_pin_mux uart3_pin_mux[] = {
-+ {OFFSET(spi0_cs1), (MODE(1) | PULLUDEN | RXACTIVE)}, /* UART3_RXD */
-+ {OFFSET(ecap0_in_pwm0_out), (MODE(1) | PULLUDEN)}, /* UART3_TXD */
-+ {-1},
-+};
-+
-+
-+#ifdef CONFIG_NAND
-+static struct module_pin_mux nand_pin_mux[] = {
-+ {OFFSET(gpmc_ad0), (MODE(0) | PULLUP_EN | RXACTIVE)}, /* NAND AD0 */
-+ {OFFSET(gpmc_ad1), (MODE(0) | PULLUP_EN | RXACTIVE)}, /* NAND AD1 */
-+ {OFFSET(gpmc_ad2), (MODE(0) | PULLUP_EN | RXACTIVE)}, /* NAND AD2 */
-+ {OFFSET(gpmc_ad3), (MODE(0) | PULLUP_EN | RXACTIVE)}, /* NAND AD3 */
-+ {OFFSET(gpmc_ad4), (MODE(0) | PULLUP_EN | RXACTIVE)}, /* NAND AD4 */
-+ {OFFSET(gpmc_ad5), (MODE(0) | PULLUP_EN | RXACTIVE)}, /* NAND AD5 */
-+ {OFFSET(gpmc_ad6), (MODE(0) | PULLUP_EN | RXACTIVE)}, /* NAND AD6 */
-+ {OFFSET(gpmc_ad7), (MODE(0) | PULLUP_EN | RXACTIVE)}, /* NAND AD7 */
-+ {OFFSET(gpmc_wait0), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* NAND WAIT */
-+ {OFFSET(gpmc_wpn), (MODE(7) | PULLUP_EN | RXACTIVE)}, /* NAND_WPN */
-+ {OFFSET(gpmc_csn0), (MODE(0) | PULLUDEN)}, /* NAND_CS0 */
-+ {OFFSET(gpmc_advn_ale), (MODE(0) | PULLUDEN)}, /* NAND_ADV_ALE */
-+ {OFFSET(gpmc_oen_ren), (MODE(0) | PULLUDEN)}, /* NAND_OE */
-+ {OFFSET(gpmc_wen), (MODE(0) | PULLUDEN)}, /* NAND_WEN */
-+ {OFFSET(gpmc_be0n_cle), (MODE(0) | PULLUDEN)}, /* NAND_BE_CLE */
-+ {-1},
-+};
-+#endif
-+
-+static struct module_pin_mux i2c0_pin_mux[] = {
-+ {OFFSET(i2c0_sda), (MODE(0) | RXACTIVE | PULLUDEN | SLEWCTRL)}, /* I2C_DATA */
-+ {OFFSET(i2c0_scl), (MODE(0) | RXACTIVE | PULLUDEN | SLEWCTRL)}, /* I2C_SCLK */
-+ {-1},
-+};
-+
-+static struct module_pin_mux i2c1_pin_mux[] = {
-+ {OFFSET(spi0_d1), (MODE(2) | RXACTIVE | PULLUDEN | SLEWCTRL)}, /* I2C_DATA */
-+ {OFFSET(spi0_cs0), (MODE(2) | RXACTIVE | PULLUDEN | SLEWCTRL)}, /* I2C_SCLK */
-+ {-1},
-+};
-+
-+static struct module_pin_mux i2c2_pin_mux[] = {
-+ {OFFSET(uart1_ctsn), (MODE(3) | RXACTIVE | PULLUDEN | SLEWCTRL)}, /* I2C_DATA */
-+ {OFFSET(uart1_rtsn), (MODE(3) | RXACTIVE | PULLUDEN | SLEWCTRL)}, /* I2C_SCLK */
-+ {-1},
-+};
-+
-+#ifndef CONFIG_NO_ETH
-+static struct module_pin_mux rgmii1_pin_mux[] = {
-+ {OFFSET(mii1_txen), MODE(2)}, /* RGMII1_TCTL */
-+ {OFFSET(mii1_rxdv), MODE(2) | RXACTIVE}, /* RGMII1_RCTL */
-+ {OFFSET(mii1_txd3), MODE(2)}, /* RGMII1_TD3 */
-+ {OFFSET(mii1_txd2), MODE(2)}, /* RGMII1_TD2 */
-+ {OFFSET(mii1_txd1), MODE(2)}, /* RGMII1_TD1 */
-+ {OFFSET(mii1_txd0), MODE(2)}, /* RGMII1_TD0 */
-+ {OFFSET(mii1_txclk), MODE(2)}, /* RGMII1_TCLK */
-+ {OFFSET(mii1_rxclk), MODE(2) | RXACTIVE}, /* RGMII1_RCLK */
-+ {OFFSET(mii1_rxd3), MODE(2) | RXACTIVE}, /* RGMII1_RD3 */
-+ {OFFSET(mii1_rxd2), MODE(2) | RXACTIVE}, /* RGMII1_RD2 */
-+ {OFFSET(mii1_rxd1), MODE(2) | RXACTIVE}, /* RGMII1_RD1 */
-+ {OFFSET(mii1_rxd0), MODE(2) | RXACTIVE}, /* RGMII1_RD0 */
-+ {OFFSET(mdio_data), MODE(0) | RXACTIVE | PULLUP_EN}, /* MDIO_DATA */
-+ {OFFSET(mdio_clk), MODE(0) | PULLUP_EN}, /* MDIO_CLK */
-+ {-1},
-+};
-+
-+static struct module_pin_mux rgmii2_pin_mux[] = {
-+ {OFFSET(gpmc_a0), MODE(2)}, /* RGMII2_TCTL */
-+ {OFFSET(gpmc_a1), MODE(2) | RXACTIVE}, /* RGMII2_RCTL */
-+ {OFFSET(gpmc_a2), MODE(2)}, /* RGMII2_TD3 */
-+ {OFFSET(gpmc_a3), MODE(2)}, /* RGMII2_TD2 */
-+ {OFFSET(gpmc_a4), MODE(2)}, /* RGMII2_TD1 */
-+ {OFFSET(gpmc_a5), MODE(2)}, /* RGMII2_TD0 */
-+ {OFFSET(gpmc_a6), MODE(2)}, /* RGMII2_TCLK */
-+ {OFFSET(gpmc_a7), MODE(2) | RXACTIVE}, /* RGMII2_RCLK */
-+ {OFFSET(gpmc_a8), MODE(2) | RXACTIVE}, /* RGMII2_RD3 */
-+ {OFFSET(gpmc_a9), MODE(2) | RXACTIVE}, /* RGMII2_RD2 */
-+ {OFFSET(gpmc_a10), MODE(2) | RXACTIVE}, /* RGMII2_RD1 */
-+ {OFFSET(gpmc_a11), MODE(2) | RXACTIVE}, /* RGMII2_RD0 */
-+ {OFFSET(mdio_data), MODE(0) | RXACTIVE | PULLUP_EN}, /* MDIO_DATA */
-+ {OFFSET(mdio_clk), MODE(0) | PULLUP_EN}, /* MDIO_CLK */
-+ {-1},
-+};
-+
-+static struct module_pin_mux mii1_pin_mux[] = {
-+ {OFFSET(mii1_rxerr), MODE(0) | RXACTIVE}, /* MII1_RXERR */
-+ {OFFSET(mii1_txen), MODE(0)}, /* MII1_TXEN */
-+ {OFFSET(mii1_rxdv), MODE(0) | RXACTIVE}, /* MII1_RXDV */
-+ {OFFSET(mii1_txd3), MODE(0)}, /* MII1_TXD3 */
-+ {OFFSET(mii1_txd2), MODE(0)}, /* MII1_TXD2 */
-+ {OFFSET(mii1_txd1), MODE(0)}, /* MII1_TXD1 */
-+ {OFFSET(mii1_txd0), MODE(0)}, /* MII1_TXD0 */
-+ {OFFSET(mii1_txclk), MODE(0) | RXACTIVE}, /* MII1_TXCLK */
-+ {OFFSET(mii1_rxclk), MODE(0) | RXACTIVE}, /* MII1_RXCLK */
-+ {OFFSET(mii1_rxd3), MODE(0) | RXACTIVE}, /* MII1_RXD3 */
-+ {OFFSET(mii1_rxd2), MODE(0) | RXACTIVE}, /* MII1_RXD2 */
-+ {OFFSET(mii1_rxd1), MODE(0) | RXACTIVE}, /* MII1_RXD1 */
-+ {OFFSET(mii1_rxd0), MODE(0) | RXACTIVE}, /* MII1_RXD0 */
-+ {OFFSET(mdio_data), MODE(0) | RXACTIVE | PULLUP_EN}, /* MDIO_DATA */
-+ {OFFSET(mdio_clk), MODE(0) | PULLUP_EN}, /* MDIO_CLK */
-+ {-1},
-+};
-+
-+static struct module_pin_mux rmii1_pin_mux[] = {
-+ {OFFSET(mii1_crs), MODE(1) | RXACTIVE}, /* RMII1_CRS */
-+ {OFFSET(mii1_rxerr), MODE(1) | RXACTIVE}, /* RMII1_RXERR */
-+ {OFFSET(mii1_txen), MODE(1)}, /* RMII1_TXEN */
-+ {OFFSET(mii1_txd1), MODE(1)}, /* RMII1_TXD1 */
-+ {OFFSET(mii1_txd0), MODE(1)}, /* RMII1_TXD0 */
-+ {OFFSET(mii1_rxd1), MODE(1) | RXACTIVE}, /* RMII1_RXD1 */
-+ {OFFSET(mii1_rxd0), MODE(1) | RXACTIVE}, /* RMII1_RXD0 */
-+ {OFFSET(mdio_data), MODE(0) | RXACTIVE | PULLUP_EN}, /* MDIO_DATA */
-+ {OFFSET(mdio_clk), MODE(0) | PULLUP_EN}, /* MDIO_CLK */
-+ {OFFSET(rmii1_refclk), MODE(0) | RXACTIVE}, /* RMII1_REFCLK */
-+ {-1},
-+};
-+#endif
-+
-+#ifdef CONFIG_NOR
-+static struct module_pin_mux nor_pin_mux[] = {
-+ {OFFSET(lcd_data0), MODE(1) | PULLUDEN}, /* NOR_A0 */
-+ {OFFSET(lcd_data1), MODE(1) | PULLUDEN}, /* NOR_A1 */
-+ {OFFSET(lcd_data2), MODE(1) | PULLUDEN}, /* NOR_A2 */
-+ {OFFSET(lcd_data3), MODE(1) | PULLUDEN}, /* NOR_A3 */
-+ {OFFSET(lcd_data4), MODE(1) | PULLUDEN}, /* NOR_A4 */
-+ {OFFSET(lcd_data5), MODE(1) | PULLUDEN}, /* NOR_A5 */
-+ {OFFSET(lcd_data6), MODE(1) | PULLUDEN}, /* NOR_A6 */
-+ {OFFSET(lcd_data7), MODE(1) | PULLUDEN}, /* NOR_A7 */
-+ {OFFSET(gpmc_a8), MODE(0)}, /* NOR_A8 */
-+ {OFFSET(gpmc_a9), MODE(0)}, /* NOR_A9 */
-+ {OFFSET(gpmc_a10), MODE(0)}, /* NOR_A10 */
-+ {OFFSET(gpmc_a11), MODE(0)}, /* NOR_A11 */
-+ {OFFSET(lcd_data8), MODE(1) | PULLUDEN}, /* NOR_A12 */
-+ {OFFSET(lcd_data9), MODE(1) | PULLUDEN}, /* NOR_A13 */
-+ {OFFSET(lcd_data10), MODE(1) | PULLUDEN}, /* NOR_A14 */
-+ {OFFSET(lcd_data11), MODE(1) | PULLUDEN}, /* NOR_A15 */
-+ {OFFSET(lcd_data12), MODE(1) | PULLUDEN}, /* NOR_A16 */
-+ {OFFSET(lcd_data13), MODE(1) | PULLUDEN}, /* NOR_A17 */
-+ {OFFSET(lcd_data14), MODE(1) | PULLUDEN}, /* NOR_A18 */
-+ {OFFSET(lcd_data15), MODE(1) | PULLUDEN}, /* NOR_A19 */
-+ {OFFSET(gpmc_a4), MODE(4)}, /* NOR_A20 */
-+ {OFFSET(gpmc_a5), MODE(4)}, /* NOR_A21 */
-+ {OFFSET(gpmc_a6), MODE(4)}, /* NOR_A22 */
-+ {OFFSET(gpmc_ad0), MODE(0) | RXACTIVE}, /* NOR_AD0 */
-+ {OFFSET(gpmc_ad1), MODE(0) | RXACTIVE}, /* NOR_AD1 */
-+ {OFFSET(gpmc_ad2), MODE(0) | RXACTIVE}, /* NOR_AD2 */
-+ {OFFSET(gpmc_ad3), MODE(0) | RXACTIVE}, /* NOR_AD3 */
-+ {OFFSET(gpmc_ad4), MODE(0) | RXACTIVE}, /* NOR_AD4 */
-+ {OFFSET(gpmc_ad5), MODE(0) | RXACTIVE}, /* NOR_AD5 */
-+ {OFFSET(gpmc_ad6), MODE(0) | RXACTIVE}, /* NOR_AD6 */
-+ {OFFSET(gpmc_ad7), MODE(0) | RXACTIVE}, /* NOR_AD7 */
-+ {OFFSET(gpmc_ad8), MODE(0) | RXACTIVE}, /* NOR_AD8 */
-+ {OFFSET(gpmc_ad9), MODE(0) | RXACTIVE}, /* NOR_AD9 */
-+ {OFFSET(gpmc_ad10), MODE(0) | RXACTIVE}, /* NOR_AD10 */
-+ {OFFSET(gpmc_ad11), MODE(0) | RXACTIVE}, /* NOR_AD11 */
-+ {OFFSET(gpmc_ad12), MODE(0) | RXACTIVE}, /* NOR_AD12 */
-+ {OFFSET(gpmc_ad13), MODE(0) | RXACTIVE}, /* NOR_AD13 */
-+ {OFFSET(gpmc_ad14), MODE(0) | RXACTIVE}, /* NOR_AD14 */
-+ {OFFSET(gpmc_ad15), MODE(0) | RXACTIVE}, /* NOR_AD15 */
-+ {OFFSET(gpmc_csn0), (MODE(0) | PULLUP_EN)}, /* NOR_CE */
-+ {OFFSET(gpmc_oen_ren), (MODE(0) | PULLUP_EN)}, /* NOR_OE */
-+ {OFFSET(gpmc_wen), (MODE(0) | PULLUP_EN)}, /* NOR_WEN */
-+ {OFFSET(gpmc_wait0), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* NOR WAIT */
-+ {OFFSET(lcd_ac_bias_en), MODE(7) | RXACTIVE | PULLUDEN}, /* NOR RESET */
-+ {-1},
-+};
-+#endif
-+
-+#ifdef CONFIG_MMC
-+static struct module_pin_mux mmc0_pin_mux[] = {
-+ {OFFSET(mmc0_dat3), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_DAT3 */
-+ {OFFSET(mmc0_dat2), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_DAT2 */
-+ {OFFSET(mmc0_dat1), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_DAT1 */
-+ {OFFSET(mmc0_dat0), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_DAT0 */
-+ {OFFSET(mmc0_clk), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_CLK */
-+ {OFFSET(mmc0_cmd), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_CMD */
-+ {OFFSET(mcasp0_aclkr), (MODE(4) | RXACTIVE)}, /* MMC0_WP */
-+ {OFFSET(spi0_cs1), (MODE(5) | RXACTIVE | PULLUP_EN)}, /* MMC0_CD */
-+ {-1},
-+};
-+
-+static struct module_pin_mux mmc1_pin_mux[] = {
-+ {OFFSET(gpmc_ad3), (MODE(1) | RXACTIVE)}, /* MMC1_DAT3 */
-+ {OFFSET(gpmc_ad2), (MODE(1) | RXACTIVE)}, /* MMC1_DAT2 */
-+ {OFFSET(gpmc_ad1), (MODE(1) | RXACTIVE)}, /* MMC1_DAT1 */
-+ {OFFSET(gpmc_ad0), (MODE(1) | RXACTIVE)}, /* MMC1_DAT0 */
-+ {OFFSET(gpmc_csn1), (MODE(2) | RXACTIVE | PULLUP_EN)}, /* MMC1_CLK */
-+ {OFFSET(gpmc_csn2), (MODE(2) | RXACTIVE | PULLUP_EN)}, /* MMC1_CMD */
-+ {OFFSET(uart1_rxd), (MODE(1) | RXACTIVE | PULLUP_EN)}, /* MMC1_WP */
-+ {OFFSET(mcasp0_fsx), (MODE(4) | RXACTIVE)}, /* MMC1_CD */
-+ {-1},
-+};
-+#endif
-+
-+#ifdef CONFIG_SPI
-+static struct module_pin_mux spi0_pin_mux[] = {
-+ {OFFSET(spi0_sclk), MODE(0) | PULLUDEN | RXACTIVE}, /*SPI0_SCLK */
-+ {OFFSET(spi0_d0), MODE(0) | PULLUDEN | PULLUP_EN |
-+ RXACTIVE}, /*SPI0_D0 */
-+ {OFFSET(spi0_d1), MODE(0) | PULLUDEN |
-+ RXACTIVE}, /*SPI0_D1 */
-+ {OFFSET(spi0_cs0), MODE(0) | PULLUDEN | PULLUP_EN | RXACTIVE}, /*SPI0_CS0 */
-+ {-1},
-+};
-+
-+static struct module_pin_mux spi1_pin_mux[] = {
-+ {OFFSET(mcasp0_aclkx), MODE(3) | PULLUDEN | RXACTIVE}, /*SPI0_SCLK */
-+ {OFFSET(mcasp0_fsx), MODE(3) | PULLUDEN | PULLUP_EN |
-+ RXACTIVE}, /*SPI0_D0 */
-+ {OFFSET(mcasp0_axr0), MODE(3) | PULLUDEN | RXACTIVE}, /*SPI0_D1 */
-+ {OFFSET(mcasp0_ahclkr), MODE(3) | PULLUDEN | PULLUP_EN |
-+ RXACTIVE}, /*SPI0_CS0 */
-+ {-1},
-+};
-+#endif
-+
-+/*
-+ * Update the structure with the modules present in the general purpose
-+ * board and the profiles in which the modules are present.
-+ * If the module is physically present but if it is not available
-+ * in any of the profile, then do not update it.
-+ * For eg, nand is avialable only in the profiles 0 and 1, whereas
-+ * UART0 is available in all the profiles.
-+ */
-+static struct evm_pin_mux general_purpose_evm_pin_mux[] = {
-+ {uart0_pin_mux, PROFILE_ALL, DEV_ON_BASEBOARD},
-+ {i2c1_pin_mux, PROFILE_ALL & ~PROFILE_2 & ~PROFILE_4, DEV_ON_BASEBOARD},
-+#ifdef CONFIG_NAND
-+ {nand_pin_mux, PROFILE_ALL & ~PROFILE_2 & ~PROFILE_3, DEV_ON_DGHTR_BRD},
-+#endif
-+#ifndef CONFIG_NO_ETH
-+ {rgmii1_pin_mux, PROFILE_ALL, DEV_ON_BASEBOARD},
-+ {rgmii2_pin_mux, PROFILE_1 | PROFILE_2 | PROFILE_4 | PROFILE_6,
-+ DEV_ON_DGHTR_BRD},
-+#endif
-+#ifdef CONFIG_NOR
-+ {nor_pin_mux, PROFILE_3, DEV_ON_DGHTR_BRD},
-+#endif
-+#ifdef CONFIG_MMC
-+ {mmc0_pin_mux, PROFILE_ALL, DEV_ON_BASEBOARD},
-+ {mmc1_pin_mux, PROFILE_2, DEV_ON_DGHTR_BRD},
-+#endif
-+#ifdef CONFIG_SPI
-+ {spi0_pin_mux, PROFILE_2, DEV_ON_DGHTR_BRD},
-+#endif
-+ {0},
-+};
-+
-+/*
-+ * Update the structure with the modules present in the ia daughter board and
-+ * the profiles in which the modules are present. If the module is physically
-+ * present but if it is not available in any of the profile, then do not update
-+ */
-+static struct evm_pin_mux ia_motor_control_evm_pin_mux[] = {
-+#ifdef CONFIG_NAND
-+ {nand_pin_mux, PROFILE_ALL, DEV_ON_DGHTR_BRD},
-+#endif
-+#ifdef CONFIG_MMC
-+ {mmc0_pin_mux, PROFILE_ALL, DEV_ON_BASEBOARD},
-+#endif
-+#ifdef CONFIG_SPI
-+ {spi1_pin_mux, PROFILE_ALL, DEV_ON_DGHTR_BRD},
-+#endif
-+#ifndef CONFIG_NO_ETH
-+ {mii1_pin_mux, PROFILE_ALL, DEV_ON_BASEBOARD},
-+#endif
-+ {uart3_pin_mux, PROFILE_ALL, DEV_ON_DGHTR_BRD},
-+ {0},
-+};
-+
-+/* IP Phone EVM has single profile */
-+static struct evm_pin_mux ip_phone_evm_pin_mux[] = {
-+ {uart0_pin_mux, PROFILE_NONE, DEV_ON_BASEBOARD},
-+ {i2c1_pin_mux, PROFILE_NONE, DEV_ON_BASEBOARD},
-+#ifdef CONFIG_NAND
-+ {nand_pin_mux, PROFILE_0, DEV_ON_BASEBOARD},
-+#endif
-+#ifndef CONFIG_NO_ETH
-+ {rgmii1_pin_mux, PROFILE_0, DEV_ON_BASEBOARD},
-+ {rgmii2_pin_mux, PROFILE_0, DEV_ON_DGHTR_BRD},
-+#endif
-+#ifdef CONFIG_MMC
-+ {mmc0_pin_mux, PROFILE_0, DEV_ON_BASEBOARD},
-+#endif
-+ {0},
-+};
-+
-+/* Base board has single profile */
-+static struct evm_pin_mux low_cost_evm_pin_mux[] = {
-+ {uart0_pin_mux, PROFILE_NONE, DEV_ON_BASEBOARD},
-+ {i2c1_pin_mux, PROFILE_NONE, DEV_ON_BASEBOARD},
-+#ifdef CONFIG_NAND
-+ {nand_pin_mux, PROFILE_NONE, DEV_ON_BASEBOARD},
-+#endif
-+#ifndef CONFIG_NO_ETH
-+ {rgmii1_pin_mux, PROFILE_NONE, DEV_ON_BASEBOARD},
-+#endif
-+#ifdef CONFIG_MMC
-+ {mmc0_pin_mux, PROFILE_NONE, DEV_ON_BASEBOARD},
-+#endif
-+ {0},
-+};
-+
-+static struct evm_pin_mux beaglebone_pin_mux[] = {
-+ {uart0_pin_mux, PROFILE_ALL, DEV_ON_BASEBOARD},
-+ {i2c1_pin_mux, PROFILE_ALL & ~PROFILE_2 & ~PROFILE_4, DEV_ON_BASEBOARD},
-+ {i2c2_pin_mux, PROFILE_ALL, DEV_ON_BASEBOARD},
-+#ifdef CONFIG_NAND
-+ {nand_pin_mux, PROFILE_ALL & ~PROFILE_2 & ~PROFILE_3, DEV_ON_DGHTR_BRD},
-+#endif
-+#ifndef CONFIG_NO_ETH
-+ {mii1_pin_mux, PROFILE_ALL, DEV_ON_BASEBOARD},
-+#endif
-+#ifdef CONFIG_MMC
-+ {mmc0_pin_mux, PROFILE_ALL, DEV_ON_BASEBOARD},
-+ {mmc1_pin_mux, PROFILE_2, DEV_ON_DGHTR_BRD},
-+#endif
-+#ifdef CONFIG_SPI
-+ {spi0_pin_mux, PROFILE_2, DEV_ON_DGHTR_BRD},
-+#endif
-+ {0},
-+};
-+
-+static struct evm_pin_mux beaglebone_old_pin_mux[] = {
-+ {uart0_pin_mux, PROFILE_ALL, DEV_ON_BASEBOARD},
-+ {i2c1_pin_mux, PROFILE_ALL & ~PROFILE_2 & ~PROFILE_4, DEV_ON_BASEBOARD},
-+ {i2c2_pin_mux, PROFILE_ALL, DEV_ON_BASEBOARD},
-+#ifdef CONFIG_NAND
-+ {nand_pin_mux, PROFILE_ALL & ~PROFILE_2 & ~PROFILE_3, DEV_ON_DGHTR_BRD},
-+#endif
-+#ifndef CONFIG_NO_ETH
-+ {rmii1_pin_mux, PROFILE_ALL, DEV_ON_BASEBOARD},
-+#endif
-+#ifdef CONFIG_MMC
-+ {mmc0_pin_mux, PROFILE_ALL, DEV_ON_BASEBOARD},
-+ {mmc1_pin_mux, PROFILE_2, DEV_ON_DGHTR_BRD},
-+#endif
-+#ifdef CONFIG_SPI
-+ {spi0_pin_mux, PROFILE_2, DEV_ON_DGHTR_BRD},
-+#endif
-+ {0},
-+};
-+
-+static struct evm_pin_mux *am335x_evm_pin_mux[] = {
-+ beaglebone_pin_mux,
-+ general_purpose_evm_pin_mux,
-+ ia_motor_control_evm_pin_mux,
-+ ip_phone_evm_pin_mux,
-+ low_cost_evm_pin_mux,
-+};
-+
-+/*
-+ * Configure the pin mux for the module
-+ */
-+static void configure_module_pin_mux(struct module_pin_mux *mod_pin_mux)
-+{
-+ int i;
-+
-+ if (!mod_pin_mux)
-+ return;
-+
-+ for (i = 0; mod_pin_mux[i].reg_offset != -1; i++)
-+ MUX_CFG(mod_pin_mux[i].val, mod_pin_mux[i].reg_offset);
-+}
-+
-+/*
-+ * Check each module in the daughter board(first argument) whether it is
-+ * available in the selected profile(second argument). If the module is not
-+ * available in the selected profile, skip the corresponding configuration.
-+ */
-+static void set_evm_pin_mux(struct evm_pin_mux *pin_mux,
-+ int prof, unsigned int dghtr_brd_flg)
-+{
-+ int i;
-+
-+ if (!pin_mux)
-+ return;
-+
-+ /*
-+ * Only General Purpose & Industrial Auto Motro Control
-+ * EVM has profiles. So check if this evm has profile.
-+ * If not, ignore the profile comparison
-+ */
-+
-+ /*
-+ * If the device is on baseboard, directly configure it. Else (device on
-+ * Daughter board), check if the daughter card is detected.
-+ */
-+
-+ for (i = 0; pin_mux[i].mod_pin_mux != 0; i++) {
-+ if ((pin_mux[i].profile & prof) ||
-+ (prof == PROFILE_NONE)) {
-+ if (pin_mux->device_on == DEV_ON_BASEBOARD)
-+ configure_module_pin_mux(pin_mux[i].
-+ mod_pin_mux);
-+ else if (dghtr_brd_flg)
-+ configure_module_pin_mux(pin_mux[i].
-+ mod_pin_mux);
-+ }
-+ }
-+}
-+
-+void configure_evm_pin_mux(unsigned char dghtr_brd_id, char version[4], unsigned short
-+ profile, unsigned int daughter_board_flag)
-+{
-+ if (dghtr_brd_id > BASE_BOARD)
-+ return;
-+
-+ /* Setup correct evm pinmux for older bone boards (Rev < A2) */
-+ if (dghtr_brd_id == BONE_BOARD &&
-+ (!strncmp(version, "00A2", 4) || !strncmp(version, "00A1", 4)))
-+ am335x_evm_pin_mux[dghtr_brd_id] = beaglebone_old_pin_mux;
-+
-+ set_evm_pin_mux(am335x_evm_pin_mux[dghtr_brd_id], profile,
-+ daughter_board_flag);
-+}
-+
-+void enable_i2c0_pin_mux(void)
-+{
-+ configure_module_pin_mux(i2c0_pin_mux);
-+}
-+
-+void enable_i2c1_pin_mux(void)
-+{
-+ configure_module_pin_mux(i2c1_pin_mux);
-+}
-+
-+void enable_i2c2_pin_mux(void)
-+{
-+ configure_module_pin_mux(i2c2_pin_mux);
-+}
-+
-+void enable_uart0_pin_mux(void)
-+{
-+ configure_module_pin_mux(uart0_pin_mux);
-+}
-diff --git a/arch/arm/boards/beaglebone/pll.c b/arch/arm/boards/beaglebone/pll.c
-new file mode 100644
-index 0000000..bc09fea
---- /dev/null
-+++ b/arch/arm/boards/beaglebone/pll.c
-@@ -0,0 +1,293 @@
-+/*
-+ * pll.c
-+ *
-+ * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.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 version 2.
-+ *
-+ * This program is distributed "as is" WITHOUT ANY WARRANTY of any
-+ * kind, whether express or implied; without even the implied warranty
-+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+ * GNU General Public License for more details.
-+ */
-+#include <common.h>
-+#include <asm/io.h>
-+#include "config.h"
-+#include "common_def.h"
-+#include "cpu.h"
-+#include "clock.h"
-+#include "hardware.h"
-+
-+#define PRCM_MOD_EN 0x2
-+#define PRCM_FORCE_WAKEUP 0x2
-+
-+#define PRCM_EMIF_CLK_ACTIVITY (0x1 << 2)
-+#define PRCM_L3_GCLK_ACTIVITY (0x1 << 4)
-+
-+#define PLL_BYPASS_MODE 0x4
-+#define PLL_LOCK_MODE 0x7
-+#define PLL_MULTIPLIER_SHIFT 8
-+
-+static void interface_clocks_enable(void)
-+{
-+ /* Enable all the Interconnect Modules */
-+ __raw_writel(PRCM_MOD_EN, CM_PER_L3_CLKCTRL);
-+ while (__raw_readl(CM_PER_L3_CLKCTRL) != PRCM_MOD_EN);
-+
-+ __raw_writel(PRCM_MOD_EN, CM_PER_L4LS_CLKCTRL);
-+ while (__raw_readl(CM_PER_L4LS_CLKCTRL) != PRCM_MOD_EN);
-+
-+ __raw_writel(PRCM_MOD_EN, CM_PER_L4FW_CLKCTRL);
-+ while (__raw_readl(CM_PER_L4FW_CLKCTRL) != PRCM_MOD_EN);
-+
-+ __raw_writel(PRCM_MOD_EN, CM_WKUP_L4WKUP_CLKCTRL);
-+ while (__raw_readl(CM_WKUP_L4WKUP_CLKCTRL) != PRCM_MOD_EN);
-+
-+ __raw_writel(PRCM_MOD_EN, CM_PER_L3_INSTR_CLKCTRL);
-+ while (__raw_readl(CM_PER_L3_INSTR_CLKCTRL) != PRCM_MOD_EN);
-+
-+ __raw_writel(PRCM_MOD_EN, CM_PER_L4HS_CLKCTRL);
-+ while (__raw_readl(CM_PER_L4HS_CLKCTRL) != PRCM_MOD_EN);
-+
-+ __raw_writel(PRCM_MOD_EN, CM_PER_SPI1_CLKCTRL);
-+ while (__raw_readl(CM_PER_SPI1_CLKCTRL) != PRCM_MOD_EN);
-+
-+ /* GPIO0 */
-+ __raw_writel(PRCM_MOD_EN, CM_WKUP_GPIO0_CLKCTRL);
-+ while (__raw_readl(CM_WKUP_GPIO0_CLKCTRL) != PRCM_MOD_EN);
-+}
-+
-+static void power_domain_transition_enable(void)
-+{
-+ /*
-+ * Force power domain wake up transition
-+ * Ensure that the corresponding interface clock is active before
-+ * using the peripheral
-+ */
-+ __raw_writel(PRCM_FORCE_WAKEUP, CM_PER_L3_CLKSTCTRL);
-+
-+ __raw_writel(PRCM_FORCE_WAKEUP, CM_PER_L4LS_CLKSTCTRL);
-+
-+ __raw_writel(PRCM_FORCE_WAKEUP, CM_WKUP_CLKSTCTRL);
-+
-+ __raw_writel(PRCM_FORCE_WAKEUP, CM_PER_L4FW_CLKSTCTRL);
-+
-+ __raw_writel(PRCM_FORCE_WAKEUP, CM_PER_L3S_CLKSTCTRL);
-+}
-+
-+/*
-+ * Enable the module clock and the power domain for required peripherals
-+ */
-+static void per_clocks_enable(void)
-+{
-+ /* Enable the module clock */
-+ __raw_writel(PRCM_MOD_EN, CM_PER_TIMER2_CLKCTRL);
-+ while (__raw_readl(CM_PER_TIMER2_CLKCTRL) != PRCM_MOD_EN);
-+
-+ /* Select the Master osc 24 MHZ as Timer2 clock source */
-+ __raw_writel(0x1, CLKSEL_TIMER2_CLK);
-+
-+ /* UART0 */
-+ __raw_writel(PRCM_MOD_EN, CM_WKUP_UART0_CLKCTRL);
-+ while (__raw_readl(CM_WKUP_UART0_CLKCTRL) != PRCM_MOD_EN);
-+
-+ /* UART3 */
-+ __raw_writel(PRCM_MOD_EN, CM_PER_UART3_CLKCTRL);
-+ while (__raw_readl(CM_PER_UART3_CLKCTRL) != PRCM_MOD_EN);
-+
-+ /* GPMC */
-+ __raw_writel(PRCM_MOD_EN, CM_PER_GPMC_CLKCTRL);
-+ while (__raw_readl(CM_PER_GPMC_CLKCTRL) != PRCM_MOD_EN);
-+
-+ /* ELM */
-+ __raw_writel(PRCM_MOD_EN, CM_PER_ELM_CLKCTRL);
-+ while (__raw_readl(CM_PER_ELM_CLKCTRL) != PRCM_MOD_EN);
-+
-+ /* i2c0 */
-+ __raw_writel(PRCM_MOD_EN, CM_WKUP_I2C0_CLKCTRL);
-+ while (__raw_readl(CM_WKUP_I2C0_CLKCTRL) != PRCM_MOD_EN);
-+
-+ /* i2c1 */
-+ __raw_writel(PRCM_MOD_EN, CM_PER_I2C1_CLKCTRL);
-+ while (__raw_readl(CM_PER_I2C1_CLKCTRL) != PRCM_MOD_EN);
-+
-+ /* i2c2 */
-+ __raw_writel(PRCM_MOD_EN, CM_PER_I2C2_CLKCTRL);
-+ while (__raw_readl(CM_PER_I2C2_CLKCTRL) != PRCM_MOD_EN);
-+
-+ /* Ethernet */
-+ __raw_writel(PRCM_MOD_EN, CM_PER_CPGMAC0_CLKCTRL);
-+ __raw_writel(PRCM_MOD_EN, CM_PER_CPSW_CLKSTCTRL);
-+ while ((__raw_readl(CM_PER_CPGMAC0_CLKCTRL) & 0x30000) != 0x0);
-+
-+ /* MMC 0 & 1 */
-+ __raw_writel(PRCM_MOD_EN, CM_PER_MMC0_CLKCTRL);
-+ while (__raw_readl(CM_PER_MMC0_CLKCTRL) != PRCM_MOD_EN);
-+ __raw_writel(PRCM_MOD_EN, CM_PER_MMC1_CLKCTRL);
-+ while (__raw_readl(CM_PER_MMC1_CLKCTRL) != PRCM_MOD_EN);
-+
-+ /* Enable the control module though RBL would have done it*/
-+ __raw_writel(PRCM_MOD_EN, CM_WKUP_CONTROL_CLKCTRL);
-+ while (__raw_readl(CM_WKUP_CONTROL_CLKCTRL) != PRCM_MOD_EN);
-+
-+ /* SPI 0 & 1 */
-+ __raw_writel(PRCM_MOD_EN, CM_PER_SPI0_CLKCTRL);
-+ while (__raw_readl(CM_PER_SPI0_CLKCTRL) != PRCM_MOD_EN);
-+
-+ __raw_writel(PRCM_MOD_EN, CM_PER_SPI1_CLKCTRL);
-+ while (__raw_readl(CM_PER_SPI1_CLKCTRL) != PRCM_MOD_EN);
-+}
-+
-+void mpu_pll_config(int mpupll_M)
-+{
-+ u32 clkmode, clksel, div_m2;
-+
-+ clkmode = __raw_readl(CM_CLKMODE_DPLL_MPU);
-+ clksel = __raw_readl(CM_CLKSEL_DPLL_MPU);
-+ div_m2 = __raw_readl(CM_DIV_M2_DPLL_MPU);
-+
-+ /* Set the PLL to bypass Mode */
-+ __raw_writel(PLL_BYPASS_MODE, CM_CLKMODE_DPLL_MPU);
-+
-+ while(__raw_readl(CM_IDLEST_DPLL_MPU) != 0x00000100);
-+
-+ clksel = clksel & (~0x7ffff);
-+ clksel = clksel | ((mpupll_M << 0x8) | MPUPLL_N);
-+ __raw_writel(clksel, CM_CLKSEL_DPLL_MPU);
-+
-+ div_m2 = div_m2 & ~0x1f;
-+ div_m2 = div_m2 | MPUPLL_M2;
-+ __raw_writel(div_m2, CM_DIV_M2_DPLL_MPU);
-+
-+ clkmode = clkmode | 0x7;
-+ __raw_writel(clkmode, CM_CLKMODE_DPLL_MPU);
-+
-+ while(__raw_readl(CM_IDLEST_DPLL_MPU) != 0x1);
-+}
-+
-+static void core_pll_config(void)
-+{
-+ u32 clkmode, clksel, div_m4, div_m5, div_m6;
-+
-+ clkmode = __raw_readl(CM_CLKMODE_DPLL_CORE);
-+ clksel = __raw_readl(CM_CLKSEL_DPLL_CORE);
-+ div_m4 = __raw_readl(CM_DIV_M4_DPLL_CORE);
-+ div_m5 = __raw_readl(CM_DIV_M5_DPLL_CORE);
-+ div_m6 = __raw_readl(CM_DIV_M6_DPLL_CORE);
-+
-+ /* Set the PLL to bypass Mode */
-+ __raw_writel(PLL_BYPASS_MODE, CM_CLKMODE_DPLL_CORE);
-+
-+ while(__raw_readl(CM_IDLEST_DPLL_CORE) != 0x00000100);
-+
-+ clksel = clksel & (~0x7ffff);
-+ clksel = clksel | ((COREPLL_M << 0x8) | COREPLL_N);
-+ __raw_writel(clksel, CM_CLKSEL_DPLL_CORE);
-+
-+ div_m4 = div_m4 & ~0x1f;
-+ div_m4 = div_m4 | COREPLL_M4;
-+ __raw_writel(div_m4, CM_DIV_M4_DPLL_CORE);
-+
-+ div_m5 = div_m5 & ~0x1f;
-+ div_m5 = div_m5 | COREPLL_M5;
-+ __raw_writel(div_m5, CM_DIV_M5_DPLL_CORE);
-+
-+ div_m6 = div_m6 & ~0x1f;
-+ div_m6 = div_m6 | COREPLL_M6;
-+ __raw_writel(div_m6, CM_DIV_M6_DPLL_CORE);
-+
-+
-+ clkmode = clkmode | 0x7;
-+ __raw_writel(clkmode, CM_CLKMODE_DPLL_CORE);
-+
-+ while(__raw_readl(CM_IDLEST_DPLL_CORE) != 0x1);
-+}
-+
-+static void per_pll_config(void)
-+{
-+ u32 clkmode, clksel, div_m2;
-+
-+ clkmode = __raw_readl(CM_CLKMODE_DPLL_PER);
-+ clksel = __raw_readl(CM_CLKSEL_DPLL_PER);
-+ div_m2 = __raw_readl(CM_DIV_M2_DPLL_PER);
-+
-+ /* Set the PLL to bypass Mode */
-+ __raw_writel(PLL_BYPASS_MODE, CM_CLKMODE_DPLL_PER);
-+
-+ while(__raw_readl(CM_IDLEST_DPLL_PER) != 0x00000100);
-+
-+ clksel = clksel & (~0x7ffff);
-+ clksel = clksel | ((PERPLL_M << 0x8) | PERPLL_N);
-+ __raw_writel(clksel, CM_CLKSEL_DPLL_PER);
-+
-+ div_m2 = div_m2 & ~0x7f;
-+ div_m2 = div_m2 | PERPLL_M2;
-+ __raw_writel(div_m2, CM_DIV_M2_DPLL_PER);
-+
-+ clkmode = clkmode | 0x7;
-+ __raw_writel(clkmode, CM_CLKMODE_DPLL_PER);
-+
-+ while(__raw_readl(CM_IDLEST_DPLL_PER) != 0x1);
-+}
-+
-+static void ddr_pll_config(void)
-+{
-+ u32 clkmode, clksel, div_m2;
-+
-+ clkmode = __raw_readl(CM_CLKMODE_DPLL_DDR);
-+ clksel = __raw_readl(CM_CLKSEL_DPLL_DDR);
-+ div_m2 = __raw_readl(CM_DIV_M2_DPLL_DDR);
-+
-+ /* Set the PLL to bypass Mode */
-+ clkmode = (clkmode & 0xfffffff8) | 0x00000004;
-+ __raw_writel(clkmode, CM_CLKMODE_DPLL_DDR);
-+
-+ while ((__raw_readl(CM_IDLEST_DPLL_DDR) & 0x00000100) != 0x00000100);
-+
-+ clksel = clksel & (~0x7ffff);
-+ clksel = clksel | ((DDRPLL_M << 0x8) | DDRPLL_N);
-+ __raw_writel(clksel, CM_CLKSEL_DPLL_DDR);
-+
-+ div_m2 = div_m2 & 0xFFFFFFE0;
-+ div_m2 = div_m2 | DDRPLL_M2;
-+ __raw_writel(div_m2, CM_DIV_M2_DPLL_DDR);
-+
-+ clkmode = (clkmode & 0xfffffff8) | 0x7;
-+ __raw_writel(clkmode, CM_CLKMODE_DPLL_DDR);
-+
-+ while ((__raw_readl(CM_IDLEST_DPLL_DDR) & 0x00000001) != 0x1);
-+}
-+
-+void enable_ddr_clocks(void)
-+{
-+ /* Enable the EMIF_FW Functional clock */
-+ __raw_writel(PRCM_MOD_EN, CM_PER_EMIF_FW_CLKCTRL);
-+ /* Enable EMIF0 Clock */
-+ __raw_writel(PRCM_MOD_EN, CM_PER_EMIF_CLKCTRL);
-+ /* Poll for emif_gclk & L3_G clock are active */
-+ while ((__raw_readl(CM_PER_L3_CLKSTCTRL) & (PRCM_EMIF_CLK_ACTIVITY |
-+ PRCM_L3_GCLK_ACTIVITY)) != (PRCM_EMIF_CLK_ACTIVITY |
-+ PRCM_L3_GCLK_ACTIVITY));
-+ /* Poll if module is functional */
-+ while ((__raw_readl(CM_PER_EMIF_CLKCTRL)) != PRCM_MOD_EN);
-+
-+}
-+
-+/*
-+ * Configure the PLL/PRCM for necessary peripherals
-+ */
-+void pll_init()
-+{
-+ mpu_pll_config(MPUPLL_M_500);
-+ core_pll_config();
-+ per_pll_config();
-+ ddr_pll_config();
-+ /* Enable the required interconnect clocks */
-+ interface_clocks_enable();
-+ /* Enable power domain transition */
-+ power_domain_transition_enable();
-+ /* Enable the required peripherals */
-+ per_clocks_enable();
-+}
-diff --git a/arch/arm/configs/am335x_beaglebone_defconfig b/arch/arm/configs/am335x_beaglebone_defconfig
-new file mode 100644
-index 0000000..a4279f1
---- /dev/null
-+++ b/arch/arm/configs/am335x_beaglebone_defconfig
-@@ -0,0 +1,58 @@
-+CONFIG_ARCH_OMAP=y
-+# CONFIG_OMAP3_CLOCK_CONFIG is not set
-+# CONFIG_OMAP_GPMC is not set
-+CONFIG_MACH_BEAGLEBONE=y
-+CONFIG_AEABI=y
-+CONFIG_ARM_OPTIMZED_STRING_FUNCTIONS=y
-+CONFIG_ARM_UNWIND=y
-+CONFIG_MMU=y
-+CONFIG_TEXT_BASE=0x81000000
-+CONFIG_KALLSYMS=y
-+CONFIG_PROMPT="barebox> "
-+CONFIG_LONGHELP=y
-+CONFIG_HUSH_FANCY_PROMPT=y
-+CONFIG_CMDLINE_EDITING=y
-+CONFIG_AUTO_COMPLETE=y
-+CONFIG_MENU=y
-+# CONFIG_TIMESTAMP is not set
-+CONFIG_DEFAULT_ENVIRONMENT_GENERIC_NEW=y
-+CONFIG_DEFAULT_ENVIRONMENT_PATH="arch/arm/boards/beaglebone/env"
-+CONFIG_CMD_EDIT=y
-+CONFIG_CMD_SLEEP=y
-+CONFIG_CMD_SAVEENV=y
-+CONFIG_CMD_EXPORT=y
-+CONFIG_CMD_PRINTENV=y
-+CONFIG_CMD_READLINE=y
-+CONFIG_CMD_MENU=y
-+CONFIG_CMD_MENU_MANAGEMENT=y
-+CONFIG_CMD_TIME=y
-+CONFIG_CMD_BASENAME=y
-+CONFIG_CMD_DIRNAME=y
-+CONFIG_CMD_ECHO_E=y
-+CONFIG_CMD_MEMINFO=y
-+CONFIG_CMD_CRC=y
-+CONFIG_CMD_CRC_CMP=y
-+CONFIG_CMD_BOOTM_SHOW_TYPE=y
-+CONFIG_CMD_BOOTM_VERBOSE=y
-+CONFIG_CMD_BOOTM_INITRD=y
-+CONFIG_CMD_BOOTM_OFTREE=y
-+CONFIG_CMD_BOOTM_OFTREE_UIMAGE=y
-+CONFIG_CMD_UIMAGE=y
-+CONFIG_CMD_RESET=y
-+CONFIG_CMD_GO=y
-+CONFIG_CMD_OFTREE=y
-+CONFIG_CMD_TIMEOUT=y
-+CONFIG_CMD_PARTITION=y
-+CONFIG_CMD_MAGICVAR=y
-+CONFIG_CMD_MAGICVAR_HELP=y
-+CONFIG_CMD_GPIO=y
-+CONFIG_CMD_UNCOMPRESS=y
-+CONFIG_DRIVER_SERIAL_NS16550=y
-+CONFIG_DRIVER_SERIAL_NS16550_OMAP_EXTENSIONS=y
-+# CONFIG_SPI is not set
-+CONFIG_MCI=y
-+CONFIG_MCI_STARTUP=y
-+CONFIG_MCI_OMAP_HSMMC=y
-+CONFIG_FS_FAT=y
-+CONFIG_FS_FAT_WRITE=y
-+CONFIG_FS_FAT_LFN=y
-diff --git a/arch/arm/configs/am335x_beaglebone_mlo_large_defconfig b/arch/arm/configs/am335x_beaglebone_mlo_large_defconfig
-new file mode 100644
-index 0000000..0a2d3a8
---- /dev/null
-+++ b/arch/arm/configs/am335x_beaglebone_mlo_large_defconfig
-@@ -0,0 +1,50 @@
-+CONFIG_ARCH_OMAP=y
-+# CONFIG_OMAP3_CLOCK_CONFIG is not set
-+# CONFIG_OMAP_GPMC is not set
-+CONFIG_OMAP_BUILD_IFT=y
-+CONFIG_MACH_BEAGLEBONE=y
-+CONFIG_AEABI=y
-+CONFIG_THUMB2_BAREBOX=y
-+CONFIG_MMU=y
-+CONFIG_TEXT_BASE=0x402F0400
-+CONFIG_MEMORY_LAYOUT_FIXED=y
-+CONFIG_STACK_BASE=0x4030B800
-+CONFIG_STACK_SIZE=0x1600
-+CONFIG_MALLOC_BASE=0x8F000000
-+CONFIG_MALLOC_SIZE=0x1000000
-+CONFIG_PROMPT="MLO>"
-+CONFIG_LONGHELP=y
-+# CONFIG_ERRNO_MESSAGES is not set
-+# CONFIG_TIMESTAMP is not set
-+CONFIG_DEFAULT_ENVIRONMENT_GENERIC=y
-+CONFIG_DEFAULT_ENVIRONMENT_PATH="arch/arm/boards/beaglebone/env"
-+CONFIG_CMD_EXPORT=y
-+# CONFIG_CMD_RM is not set
-+# CONFIG_CMD_CAT is not set
-+# CONFIG_CMD_RMDIR is not set
-+# CONFIG_CMD_CP is not set
-+# CONFIG_CMD_PWD is not set
-+# CONFIG_CMD_CD is not set
-+# CONFIG_CMD_UMOUNT is not set
-+# CONFIG_CMD_CLEAR is not set
-+CONFIG_CMD_LOADB=y
-+CONFIG_CMD_LOADY=y
-+CONFIG_CMD_BOOTM_SHOW_TYPE=y
-+CONFIG_CMD_BOOTM_VERBOSE=y
-+CONFIG_CMD_BOOTM_INITRD=y
-+CONFIG_CMD_BOOTM_OFTREE=y
-+CONFIG_CMD_BOOTM_OFTREE_UIMAGE=y
-+# CONFIG_CMD_BOOTZ is not set
-+# CONFIG_CMD_BOOTU is not set
-+CONFIG_CMD_GO=y
-+CONFIG_CMD_TIMEOUT=y
-+# CONFIG_CMD_VERSION is not set
-+# CONFIG_CMD_HELP is not set
-+CONFIG_DRIVER_SERIAL_NS16550=y
-+CONFIG_DRIVER_SERIAL_NS16550_OMAP_EXTENSIONS=y
-+# CONFIG_SPI is not set
-+CONFIG_MCI=y
-+CONFIG_MCI_STARTUP=y
-+CONFIG_MCI_OMAP_HSMMC=y
-+CONFIG_FS_FAT=y
-+CONFIG_FS_FAT_LFN=y
-diff --git a/arch/arm/configs/am335x_beaglebone_mlo_small_defconfig b/arch/arm/configs/am335x_beaglebone_mlo_small_defconfig
-new file mode 100644
-index 0000000..162e893
---- /dev/null
-+++ b/arch/arm/configs/am335x_beaglebone_mlo_small_defconfig
-@@ -0,0 +1,32 @@
-+CONFIG_ARCH_OMAP=y
-+# CONFIG_OMAP3_CLOCK_CONFIG is not set
-+# CONFIG_OMAP_GPMC is not set
-+CONFIG_OMAP_BUILD_IFT=y
-+CONFIG_MACH_BEAGLEBONE=y
-+CONFIG_AEABI=y
-+CONFIG_THUMB2_BAREBOX=y
-+# CONFIG_CMD_ARM_CPUINFO is not set
-+CONFIG_ENVIRONMENT_VARIABLES=y
-+CONFIG_MMU=y
-+CONFIG_TEXT_BASE=0x402F0400
-+CONFIG_MEMORY_LAYOUT_FIXED=y
-+CONFIG_STACK_BASE=0x4030B800
-+CONFIG_STACK_SIZE=0x1600
-+CONFIG_MALLOC_BASE=0x8F000000
-+CONFIG_MALLOC_SIZE=0x1000000
-+CONFIG_PROMPT="MLO>"
-+CONFIG_LONGHELP=y
-+CONFIG_SHELL_NONE=y
-+# CONFIG_ERRNO_MESSAGES is not set
-+# CONFIG_TIMESTAMP is not set
-+# CONFIG_DEFAULT_ENVIRONMENT is not set
-+CONFIG_DRIVER_SERIAL_NS16550=y
-+CONFIG_DRIVER_SERIAL_NS16550_OMAP_EXTENSIONS=y
-+# CONFIG_SPI is not set
-+CONFIG_MCI=y
-+CONFIG_MCI_STARTUP=y
-+CONFIG_MCI_OMAP_HSMMC=y
-+# CONFIG_FS_RAMFS is not set
-+# CONFIG_FS_DEVFS is not set
-+CONFIG_FS_FAT=y
-+CONFIG_FS_FAT_LFN=y
-diff --git a/arch/arm/cpu/start.c b/arch/arm/cpu/start.c
-index 523179d..5505ed3 100644
---- a/arch/arm/cpu/start.c
-+++ b/arch/arm/cpu/start.c
-@@ -22,6 +22,7 @@
-
- #include <common.h>
- #include <init.h>
-+#include <io.h>
- #include <asm/barebox-arm.h>
- #include <asm/barebox-arm-head.h>
- #include <asm/system.h>
-@@ -66,16 +67,22 @@ void __naked __bare_init reset(void)
- {
- uint32_t r;
-
-+ writel(0xFEED, 0x4030b000);
- /* set the cpu to SVC32 mode */
- __asm__ __volatile__("mrs %0, cpsr":"=r"(r));
- r &= ~0x1f;
- r |= 0xd3;
- __asm__ __volatile__("msr cpsr, %0" : : "r"(r));
-
-+ writel(0xFEED0000, 0x4030b000);
-+ //writel(0x59, 0x44e09000);
-+ writel(0xFEED0001, 0x4030b000);
-+
- #ifdef CONFIG_ARCH_HAS_LOWLEVEL_INIT
-- arch_init_lowlevel();
-+//arch_init_lowlevel();
- #endif
-
-+ writel(0xFEED0010, 0x4030b000);
- /* disable MMU stuff and caches */
- r = get_cr();
- r &= ~(CR_M | CR_C | CR_B | CR_S | CR_R | CR_V);
-@@ -87,13 +94,16 @@ void __naked __bare_init reset(void)
- r |= CR_A;
- #endif
-
-+ writel(0xFEED0020, 0x4030b000);
- #ifdef __ARMEB__
- r |= CR_B;
- #endif
- set_cr(r);
-+ writel(0xFEED0030, 0x4030b000);
-
- #ifdef CONFIG_MACH_DO_LOWLEVEL_INIT
- board_init_lowlevel();
-+ writel(0xFEED0040, 0x4030b000);
- #endif
- board_init_lowlevel_return();
- }
-@@ -112,6 +122,7 @@ void __naked __section(.text_ll_return) board_init_lowlevel_return(void)
- */
- __asm__ __volatile__("1: adr %0, 1b":"=r"(addr));
-
-+ writel(0xFEED0050, 0x4030b000);
- /* Setup the stack */
- r = STACK_BASE + STACK_SIZE - 16;
- __asm__ __volatile__("mov sp, %0" : : "r"(r));
-@@ -131,6 +142,7 @@ void __naked __section(.text_ll_return) board_init_lowlevel_return(void)
- __asm__ __volatile__("mcr p15, 0, %0, c7, c5, 0" : : "r" (0));
-
- /* call start_barebox with its absolute address */
-+ writel(0xFEED0060, 0x4030b000);
- r = (unsigned int)&start_barebox;
- __asm__ __volatile__("mov pc, %0" : : "r"(r));
- }
-diff --git a/arch/arm/mach-omap/Kconfig b/arch/arm/mach-omap/Kconfig
-index 386c484..117b1cf 100644
---- a/arch/arm/mach-omap/Kconfig
-+++ b/arch/arm/mach-omap/Kconfig
-@@ -98,7 +98,8 @@ config ARCH_TEXT_BASE
-
- config BOARDINFO
- default "Texas Instrument's SDP343x" if MACH_OMAP343xSDP
-- default "Texas Instrument's Beagle" if MACH_BEAGLE
-+ default "Texas Instrument's Beagle Board" if MACH_BEAGLE
-+ default "Texas Instrument's Beagle Bone" if MACH_BEAGLEBONE
- default "Texas Instrument's OMAP3EVM" if MACH_OMAP3EVM
- default "Texas Instrument's Panda" if MACH_PANDA
- default "Phytec phyCORE pcm049" if MACH_PCM049
-@@ -123,6 +124,14 @@ config MACH_BEAGLE
- help
- Say Y here if you are using Beagle Board
-
-+config MACH_BEAGLEBONE
-+ bool "Texas Instrument's Beagle Bone"
-+ select OMAP_CLOCK_ALL
-+ select HAVE_NOSHELL
-+ depends on ARCH_OMAP3
-+ help
-+ Say Y here if you are using Beagle Bone
-+
- config MACH_OMAP3EVM
- bool "Texas Instrument's OMAP3 EVM"
- select OMAP_CLOCK_ALL
-diff --git a/arch/arm/mach-omap/omap3_generic.c b/arch/arm/mach-omap/omap3_generic.c
-index 4ab265a..ccc4bdd 100644
---- a/arch/arm/mach-omap/omap3_generic.c
-+++ b/arch/arm/mach-omap/omap3_generic.c
-@@ -57,6 +57,7 @@
- *
- * @return void
- */
-+#if 0
- void __noreturn reset_cpu(unsigned long addr)
- {
- writel(PRM_RSTCTRL_RESET, PRM_REG(RSTCTRL));
-@@ -64,6 +65,7 @@ void __noreturn reset_cpu(unsigned long addr)
- while (1);
- }
- EXPORT_SYMBOL(reset_cpu);
-+#endif
-
- /**
- * @brief Low level CPU type
-diff --git a/arch/arm/mach-omap/s32k_clksource.c b/arch/arm/mach-omap/s32k_clksource.c
-index 3ed9448..2c21fe7 100644
---- a/arch/arm/mach-omap/s32k_clksource.c
-+++ b/arch/arm/mach-omap/s32k_clksource.c
-@@ -50,7 +50,8 @@
- */
- static uint64_t s32k_clocksource_read(void)
- {
-- return readl(S32K_CR);
-+// return readl(S32K_CR);
-+ return readl(0x44e0503c);
- }
-
- /* A bit obvious isn't it? */
-@@ -73,6 +74,8 @@ static int s32k_clocksource_init(void)
- {
- s32k_cs.mult = clocksource_hz2mult(S32K_FREQUENCY, s32k_cs.shift);
-
-+ writel(0x00000003, 0x44e05038);
-+
- return init_clock(&s32k_cs);
- }
-
-diff --git a/arch/arm/mach-omap/xload.c b/arch/arm/mach-omap/xload.c
-index 13024ab..29daaaf 100644
---- a/arch/arm/mach-omap/xload.c
-+++ b/arch/arm/mach-omap/xload.c
-@@ -56,7 +56,10 @@ void *omap_xload_boot_mmc(void)
-
- enum omap_boot_src omap_bootsrc(void)
- {
--#if defined(CONFIG_ARCH_OMAP3)
-+#if defined(CONFIG_MACH_BEAGLEBONE)
-+ /* only support for MMC */
-+ return OMAP_BOOTSRC_MMC1;
-+#elif defined(CONFIG_ARCH_OMAP3)
- return omap3_bootsrc();
- #elif defined(CONFIG_ARCH_OMAP4)
- return omap4_bootsrc();
-diff --git a/common/startup.c b/common/startup.c
-index abd1b77..4a2ef49 100644
---- a/common/startup.c
-+++ b/common/startup.c
-@@ -31,6 +31,7 @@
- */
- #include <common.h>
- #include <init.h>
-+#include <io.h>
- #include <command.h>
- #include <malloc.h>
- #include <memory.h>
-@@ -122,10 +123,14 @@ void start_barebox (void)
- for (initcall = __barebox_initcalls_start;
- initcall < __barebox_initcalls_end; initcall++) {
- debug("initcall-> %pS\n", *initcall);
-+ writel(initcall, 0x4030b004);
-+ writel(0xFEED0070, 0x4030b000);
- result = (*initcall)();
- debug("initcall<- %pS (%d)\n", *initcall, result);
- }
-
-+ //writel(r, 0x4030b004);
-+ //writel(0xFEED02FF, 0x4030b000); while(1);
- debug("initcalls done\n");
-
- display_meminfo();
---
-1.7.10.4
-
diff --git a/patches/barebox-2012.07.0/series b/patches/barebox-2012.07.0/series
deleted file mode 100644
index 636ae83..0000000
--- a/patches/barebox-2012.07.0/series
+++ /dev/null
@@ -1,2 +0,0 @@
-0000-barebox-v2012.07.0-to-master.patch
-0001-WIP-beaglebone-add-support-for-AM335x-and-board.patch
diff --git a/patches/barebox-2012.11.0/0001-ARM-OMAP-AM33XX-create-new-ARCH-for-AM33xx.patch b/patches/barebox-2012.11.0/0001-ARM-OMAP-AM33XX-create-new-ARCH-for-AM33xx.patch
new file mode 100644
index 0000000..88e307d
--- /dev/null
+++ b/patches/barebox-2012.11.0/0001-ARM-OMAP-AM33XX-create-new-ARCH-for-AM33xx.patch
@@ -0,0 +1,433 @@
+From 161fca94672753b076779ffb19ab3b6db17fd82c Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Teresa=20G=C3=A1mez?= <t.gamez@phytec.de>
+Date: Thu, 20 Sep 2012 16:02:03 +0200
+Subject: [PATCH] ARM OMAP AM33XX: create new ARCH for AM33xx
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Created ARCH for AM33xx boards as second stage bootloader.
+This includes:
+- Added dmtimer0
+- Created basic header files
+- Added MMC support for ARCH_AM33XX
+- Added reset function
+
+Signed-off-by: Teresa Gámez <t.gamez@phytec.de>
+---
+ arch/arm/mach-omap/Kconfig | 11 ++++
+ arch/arm/mach-omap/Makefile | 2 +
+ arch/arm/mach-omap/am33xx_generic.c | 29 +++++++++
+ arch/arm/mach-omap/dmtimer0.c | 72 ++++++++++++++++++++++
+ arch/arm/mach-omap/gpio.c | 31 ++++++++++
+ arch/arm/mach-omap/include/mach/am33xx-clock.h | 25 ++++++++
+ arch/arm/mach-omap/include/mach/am33xx-silicon.h | 51 +++++++++++++++
+ arch/arm/mach-omap/include/mach/clocks.h | 7 +++
+ arch/arm/mach-omap/include/mach/omap3-clock.h | 3 -
+ arch/arm/mach-omap/include/mach/silicon.h | 3 +
+ arch/arm/mach-omap/include/mach/timers.h | 22 +++++++
+ drivers/mci/Kconfig | 2 +-
+ 12 files changed, 254 insertions(+), 4 deletions(-)
+ create mode 100644 arch/arm/mach-omap/am33xx_generic.c
+ create mode 100644 arch/arm/mach-omap/dmtimer0.c
+ create mode 100644 arch/arm/mach-omap/include/mach/am33xx-clock.h
+ create mode 100644 arch/arm/mach-omap/include/mach/am33xx-silicon.h
+
+diff --git a/arch/arm/mach-omap/Kconfig b/arch/arm/mach-omap/Kconfig
+index aa31633..7e7e855 100644
+--- a/arch/arm/mach-omap/Kconfig
++++ b/arch/arm/mach-omap/Kconfig
+@@ -42,12 +42,23 @@ config ARCH_OMAP4
+ help
+ Say Y here if you are using Texas Instrument's OMAP4 based platform
+
++config ARCH_AM33XX
++ bool "AM33xx"
++ select CPU_V7
++ select GENERIC_GPIO
++ select OMAP_CLOCK_SOURCE_DMTIMER0
++ help
++ Say Y here if you are using Texas Instrument's AM33xx based platform
++
+ endchoice
+
+ # Blind enable all possible clocks.. think twice before you do this.
+ config OMAP_CLOCK_SOURCE_S32K
+ bool
+
++config OMAP_CLOCK_SOURCE_DMTIMER0
++ bool
++
+ config OMAP3_CLOCK_CONFIG
+ prompt "Clock Configuration"
+ bool
+diff --git a/arch/arm/mach-omap/Makefile b/arch/arm/mach-omap/Makefile
+index 3a6d50c..1e1a421 100644
+--- a/arch/arm/mach-omap/Makefile
++++ b/arch/arm/mach-omap/Makefile
+@@ -18,10 +18,12 @@
+ obj-$(CONFIG_ARCH_OMAP) += syslib.o
+ pbl-$(CONFIG_ARCH_OMAP) += syslib.o
+ obj-$(CONFIG_OMAP_CLOCK_SOURCE_S32K) += s32k_clksource.o
++obj-$(CONFIG_OMAP_CLOCK_SOURCE_DMTIMER0) += dmtimer0.o
+ obj-$(CONFIG_ARCH_OMAP3) += omap3_core.o omap3_generic.o auxcr.o
+ pbl-$(CONFIG_ARCH_OMAP3) += omap3_core.o omap3_generic.o auxcr.o
+ obj-$(CONFIG_ARCH_OMAP4) += omap4_generic.o omap4_clock.o
+ pbl-$(CONFIG_ARCH_OMAP4) += omap4_generic.o omap4_clock.o
++obj-$(CONFIG_ARCH_AM33XX) += am33xx_generic.o
+ obj-$(CONFIG_OMAP3_CLOCK_CONFIG) += omap3_clock.o
+ pbl-$(CONFIG_OMAP3_CLOCK_CONFIG) += omap3_clock.o
+ obj-$(CONFIG_OMAP_GPMC) += gpmc.o devices-gpmc-nand.o
+diff --git a/arch/arm/mach-omap/am33xx_generic.c b/arch/arm/mach-omap/am33xx_generic.c
+new file mode 100644
+index 0000000..ba08773
+--- /dev/null
++++ b/arch/arm/mach-omap/am33xx_generic.c
+@@ -0,0 +1,29 @@
++/*
++ * (C) Copyright 2012 Teresa Gámez, Phytec Messtechnik GmbH
++ *
++ * 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 <io.h>
++#include <mach/silicon.h>
++#include <mach/clocks.h>
++
++void __noreturn reset_cpu(unsigned long addr)
++{
++ writel(PRM_RSTCTRL_RESET, PRM_REG(RSTCTRL));
++
++ while (1);
++}
+diff --git a/arch/arm/mach-omap/dmtimer0.c b/arch/arm/mach-omap/dmtimer0.c
+new file mode 100644
+index 0000000..b8ec43f
+--- /dev/null
++++ b/arch/arm/mach-omap/dmtimer0.c
+@@ -0,0 +1,72 @@
++/**
++ * @file
++ * @brief Support DMTimer0 counter
++ *
++ * FileName: arch/arm/mach-omap/dmtimer0.c
++ */
++/*
++ * This File is based on arch/arm/mach-omap/s32k_clksource.c
++ * (C) Copyright 2008
++ * Texas Instruments, <www.ti.com>
++ * Nishanth Menon <x0nishan@ti.com>
++ *
++ * (C) Copyright 2012 Teresa Gámez, Phytec Messtechnik GmbH
++ *
++ * 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 <clock.h>
++#include <init.h>
++#include <io.h>
++#include <mach/silicon.h>
++#include <mach/timers.h>
++
++#define CLK_RC32K 32768
++
++/**
++ * @brief Provide a simple counter read
++ *
++ * @return DMTimer0 counter
++ */
++static uint64_t dmtimer0_read(void)
++{
++ return readl(AM33XX_DMTIMER0_BASE + TCRR);
++}
++
++static struct clocksource dmtimer0_cs = {
++ .read = dmtimer0_read,
++ .mask = CLOCKSOURCE_MASK(32),
++ .shift = 10,
++};
++
++/**
++ * @brief Initialize the Clock
++ *
++ * Enable dmtimer0.
++ *
++ * @return result of @ref init_clock
++ */
++static int dmtimer0_init(void)
++{
++ dmtimer0_cs.mult = clocksource_hz2mult(CLK_RC32K, dmtimer0_cs.shift);
++ /* Enable counter */
++ writel(0x3, AM33XX_DMTIMER0_BASE + TCLR);
++
++ return init_clock(&dmtimer0_cs);
++}
++
++/* Run me at boot time */
++core_initcall(dmtimer0_init);
+diff --git a/arch/arm/mach-omap/gpio.c b/arch/arm/mach-omap/gpio.c
+index 49ffbda..8a9eeed 100644
+--- a/arch/arm/mach-omap/gpio.c
++++ b/arch/arm/mach-omap/gpio.c
+@@ -48,6 +48,37 @@ struct omap_gpio_chip {
+ struct gpio_chip chip;
+ };
+
++#ifdef CONFIG_ARCH_OMAP3
++static void __iomem *gpio_bank[] = {
++ (void *)0x48310000,
++ (void *)0x49050000,
++ (void *)0x49052000,
++ (void *)0x49054000,
++ (void *)0x49056000,
++ (void *)0x49058000,
++};
++#endif
++
++#ifdef CONFIG_ARCH_OMAP4
++static void __iomem *gpio_bank[] = {
++ (void *)0x4a310100,
++ (void *)0x48055100,
++ (void *)0x48057100,
++ (void *)0x48059100,
++ (void *)0x4805b100,
++ (void *)0x4805d100,
++};
++#endif
++
++#ifdef CONFIG_ARCH_AM33XX
++static void __iomem *gpio_bank[] = {
++ (void *)0x44e07100,
++ (void *)0x4804c100,
++ (void *)0x481ac100,
++ (void *)0x481ae100,
++};
++#endif
++
+ static inline int omap_get_gpio_index(int gpio)
+ {
+ return gpio & 0x1f;
+diff --git a/arch/arm/mach-omap/include/mach/am33xx-clock.h b/arch/arm/mach-omap/include/mach/am33xx-clock.h
+new file mode 100644
+index 0000000..654c104
+--- /dev/null
++++ b/arch/arm/mach-omap/include/mach/am33xx-clock.h
+@@ -0,0 +1,25 @@
++/*
++ * (C) Copyright 2012 Teresa Gámez, Phytec Messtechnik GmbH
++ *
++ * 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 _AM33XX_CLOCKS_H_
++#define _AM33XX_CLOCKS_H_
++
++/** PRM Clock Regs */
++#define PRM_RSTCTRL 0x0f00
++
++#endif /* endif _AM33XX_CLOCKS_H_ */
+diff --git a/arch/arm/mach-omap/include/mach/am33xx-silicon.h b/arch/arm/mach-omap/include/mach/am33xx-silicon.h
+new file mode 100644
+index 0000000..7b13991
+--- /dev/null
++++ b/arch/arm/mach-omap/include/mach/am33xx-silicon.h
+@@ -0,0 +1,51 @@
++/*
++ * This file contains the address info for various AM33XX modules.
++ *
++ * Copyright (C) 2012 Teresa Gámez <t.gamez@phytec.de>,
++ * Phytec Messtechnik GmbH
++ *
++ * 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 version 2.
++ *
++ * This program is distributed "as is" WITHOUT ANY WARRANTY of any
++ * kind, whether express or implied; without even the implied warranty
++ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ */
++
++#ifndef __ASM_ARCH_AM33XX_H
++#define __ASM_ARCH_AM33XX_H
++
++/** AM335x Internal Bus Base addresses */
++#define AM33XX_L4_WKUP_BASE 0x44C00000
++#define AM33XX_L4_PER_BASE 0x48000000
++#define AM33XX_L4_FAST_BASE 0x4A000000
++
++/* UART */
++#define AM33XX_UART0_BASE (AM33XX_L4_WKUP_BASE + 0x209000)
++#define AM33XX_UART1_BASE (AM33XX_L4_PER_BASE + 0x22000)
++#define AM33XX_UART2_BASE (AM33XX_L4_PER_BASE + 0x24000)
++
++
++/* EMFI Registers */
++#define AM33XX_EMFI0_BASE 0x4C000000
++
++#define AM33XX_DRAM_ADDR_SPACE_START 0x80000000
++#define AM33XX_DRAM_ADDR_SPACE_END 0xC0000000
++
++/* GPMC */
++#define OMAP_GPMC_BASE 0x50000000
++
++/* MMC */
++#define AM33XX_MMCHS0_BASE (AM33XX_L4_PER_BASE + 0x60000)
++
++/* DTMTimer0 */
++#define AM33XX_DMTIMER0_BASE (AM33XX_L4_WKUP_BASE + 0x205000)
++
++/* PRM */
++#define OMAP_PRM_BASE (AM33XX_L4_WKUP_BASE + 0x200000)
++
++#define PRM_RSTCTRL_RESET 0x1
++
++#endif
+diff --git a/arch/arm/mach-omap/include/mach/clocks.h b/arch/arm/mach-omap/include/mach/clocks.h
+index b2b0c99..5729b50 100644
+--- a/arch/arm/mach-omap/include/mach/clocks.h
++++ b/arch/arm/mach-omap/include/mach/clocks.h
+@@ -37,6 +37,9 @@
+ #define S26M 26000000
+ #define S38_4M 38400000
+
++#define CM_REG(REGNAME) (OMAP_CM_BASE + CM_##REGNAME)
++#define PRM_REG(REGNAME) (OMAP_PRM_BASE + PRM_##REGNAME)
++
+ #ifdef CONFIG_ARCH_OMAP3
+ #include <mach/omap3-clock.h>
+ #endif
+@@ -44,4 +47,8 @@
+ #include <mach/omap4-clock.h>
+ #endif
+
++#ifdef CONFIG_ARCH_AM33XX
++#include <mach/am33xx-clock.h>
++#endif
++
+ #endif /* __OMAP_CLOCKS_H_ */
+diff --git a/arch/arm/mach-omap/include/mach/omap3-clock.h b/arch/arm/mach-omap/include/mach/omap3-clock.h
+index 4f5a1d1..c36489c 100644
+--- a/arch/arm/mach-omap/include/mach/omap3-clock.h
++++ b/arch/arm/mach-omap/include/mach/omap3-clock.h
+@@ -27,8 +27,6 @@
+ #define _OMAP343X_CLOCKS_H_
+
+ /** CM Clock Regs Wrapper */
+-#define CM_REG(REGNAME) (OMAP_CM_BASE + CM_##REGNAME)
+-
+ #define CM_FCLKEN_IVA2 0X0000
+ #define CM_CLKEN_PLL_IVA2 0X0004
+ #define CM_IDLEST_PLL_IVA2 0X0024
+@@ -77,7 +75,6 @@
+ #define CM_CLKSTCTRL_USBH 0x1448
+
+ /** PRM Clock Regs */
+-#define PRM_REG(REGNAME) (OMAP_PRM_BASE + PRM_##REGNAME)
+ #define PRM_CLKSEL 0x0D40
+ #define PRM_RSTCTRL 0x1250
+ #define PRM_CLKSRC_CTRL 0x1270
+diff --git a/arch/arm/mach-omap/include/mach/silicon.h b/arch/arm/mach-omap/include/mach/silicon.h
+index 5ee1931..ff30ad9 100644
+--- a/arch/arm/mach-omap/include/mach/silicon.h
++++ b/arch/arm/mach-omap/include/mach/silicon.h
+@@ -24,6 +24,9 @@
+ #ifdef CONFIG_ARCH_OMAP4
+ #include <mach/omap4-silicon.h>
+ #endif
++#ifdef CONFIG_ARCH_AM33XX
++#include <mach/am33xx-silicon.h>
++#endif
+
+ /* If Architecture specific init functions are present */
+ #ifndef __ASSEMBLY__
+diff --git a/arch/arm/mach-omap/include/mach/timers.h b/arch/arm/mach-omap/include/mach/timers.h
+index e8dad9a..66f5de9 100644
+--- a/arch/arm/mach-omap/include/mach/timers.h
++++ b/arch/arm/mach-omap/include/mach/timers.h
+@@ -30,6 +30,7 @@
+ #ifndef __ASM_ARCH_GPT_H
+ #define __ASM_ARCH_GPT_H
+
++#if defined(CONFIG_ARCH_OMAP3) || defined(CONFIG_ARCH_OMAP4)
+ /** General Purpose timer regs offsets (32 bit regs) */
+ #define TIDR 0x0 /* r */
+ #define TIOCP_CFG 0x10 /* rw */
+@@ -52,5 +53,26 @@
+ /** Sync 32Khz Timer registers */
+ #define S32K_CR (OMAP_32KTIMER_BASE + 0x10)
+ #define S32K_FREQUENCY 32768
++#endif
++
++#if defined(CONFIG_ARCH_AM33XX)
++#define TIDR 0x0
++#define TIOCP_CFG 0x10
++#define IRQ_EOI 0x20
++#define IRQSTATUS_RAW 0x24
++#define IRQSTATUS 0x28
++#define IRQSTATUS_SET 0x2c
++#define IRQSTATUS_CLR 0x30
++#define IRQWAKEEN 0x34
++#define TCLR 0x38
++#define TCRR 0x3C
++#define TLDR 0x40
++#define TTGR 0x44
++#define TWPS 0x48
++#define TMAR 0x4C
++#define TCAR1 0x50
++#define TSICR 0x54
++#define TCAR2 0x58
++#endif
+
+ #endif /*__ASM_ARCH_GPT_H */
+diff --git a/drivers/mci/Kconfig b/drivers/mci/Kconfig
+index b1a678e..fb95c1e 100644
+--- a/drivers/mci/Kconfig
++++ b/drivers/mci/Kconfig
+@@ -67,7 +67,7 @@ config MCI_IMX_ESDHC_PIO
+
+ config MCI_OMAP_HSMMC
+ bool "OMAP HSMMC"
+- depends on ARCH_OMAP4 || ARCH_OMAP3
++ depends on ARCH_OMAP4 || ARCH_OMAP3 || ARCH_AM33XX
+ help
+ Enable this entry to add support to read and write SD cards on
+ both OMAP3 and OMAP4 based systems.
diff --git a/patches/barebox-2012.11.0/0002-pcm051-Add-inital-support.patch b/patches/barebox-2012.11.0/0002-pcm051-Add-inital-support.patch
new file mode 100644
index 0000000..e99bd8d
--- /dev/null
+++ b/patches/barebox-2012.11.0/0002-pcm051-Add-inital-support.patch
@@ -0,0 +1,470 @@
+From c99a68edd867a203d43908cc28cf08cb2b5e6375 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Teresa=20G=C3=A1mez?= <t.gamez@phytec.de>
+Date: Thu, 20 Sep 2012 16:02:04 +0200
+Subject: [PATCH] pcm051: Add inital support
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Added initial support for Phytec phyCORE-AM335x.
+
+Signed-off-by: Teresa Gámez <t.gamez@phytec.de>
+---
+ arch/arm/Makefile | 1 +
+ arch/arm/boards/pcm051/Makefile | 1 +
+ arch/arm/boards/pcm051/board.c | 72 ++++++++++++
+ arch/arm/boards/pcm051/config.h | 21 ++++
+ arch/arm/boards/pcm051/env/boot/disk | 10 ++
+ arch/arm/boards/pcm051/env/init/automount | 32 ++++++
+ arch/arm/boards/pcm051/env/init/bootargs-base | 9 ++
+ arch/arm/boards/pcm051/env/init/general | 15 +++
+ arch/arm/boards/pcm051/env/init/hostname | 8 ++
+ arch/arm/boards/pcm051/env/network/eth0 | 15 +++
+ arch/arm/configs/pcm051_defconfig | 151 +++++++++++++++++++++++++
+ arch/arm/mach-omap/Kconfig | 10 ++
+ 12 files changed, 345 insertions(+)
+ create mode 100644 arch/arm/boards/pcm051/Makefile
+ create mode 100644 arch/arm/boards/pcm051/board.c
+ create mode 100644 arch/arm/boards/pcm051/config.h
+ create mode 100644 arch/arm/boards/pcm051/env/boot/disk
+ create mode 100644 arch/arm/boards/pcm051/env/init/automount
+ create mode 100644 arch/arm/boards/pcm051/env/init/bootargs-base
+ create mode 100644 arch/arm/boards/pcm051/env/init/general
+ create mode 100644 arch/arm/boards/pcm051/env/init/hostname
+ create mode 100644 arch/arm/boards/pcm051/env/network/eth0
+ create mode 100644 arch/arm/configs/pcm051_defconfig
+
+diff --git a/arch/arm/Makefile b/arch/arm/Makefile
+index 855043a..b9c459f 100644
+--- a/arch/arm/Makefile
++++ b/arch/arm/Makefile
+@@ -109,6 +109,7 @@ board-$(CONFIG_MACH_PCM027) := pcm027
+ board-$(CONFIG_MACH_PCM037) := pcm037
+ board-$(CONFIG_MACH_PCM038) := pcm038
+ board-$(CONFIG_MACH_PCM043) := pcm043
++board-$(CONFIG_MACH_PCM051) := pcm051
+ board-$(CONFIG_MACH_PM9261) := pm9261
+ board-$(CONFIG_MACH_PM9263) := pm9263
+ board-$(CONFIG_MACH_PM9G45) := pm9g45
+diff --git a/arch/arm/boards/pcm051/Makefile b/arch/arm/boards/pcm051/Makefile
+new file mode 100644
+index 0000000..dcfc293
+--- /dev/null
++++ b/arch/arm/boards/pcm051/Makefile
+@@ -0,0 +1 @@
++obj-y += board.o
+diff --git a/arch/arm/boards/pcm051/board.c b/arch/arm/boards/pcm051/board.c
+new file mode 100644
+index 0000000..7cb85f1
+--- /dev/null
++++ b/arch/arm/boards/pcm051/board.c
+@@ -0,0 +1,72 @@
++/*
++ * pcm051 - phyCORE-AM335x Board Initalization Code
++ *
++ * Copyright (C) 2012 Teresa Gámez, Phytec Messtechnik GmbH
++ *
++ * Based on arch/arm/boards/omap/board-beagle.c
++ *
++ * 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 <init.h>
++#include <sizes.h>
++#include <ns16550.h>
++#include <asm/armlinux.h>
++#include <generated/mach-types.h>
++#include <mach/silicon.h>
++
++static struct NS16550_plat serial_plat = {
++ .clock = 48000000, /* 48MHz (APLL96/2) */
++ .shift = 2,
++};
++
++/**
++ * @brief UART serial port initialization
++ * arch
++ *
++ * @return result of device registration
++ */
++static int pcm051_console_init(void)
++{
++ /* Register the serial port */
++ add_ns16550_device(DEVICE_ID_DYNAMIC, AM33XX_UART0_BASE, 1024,
++ IORESOURCE_MEM_8BIT, &serial_plat);
++
++ return 0;
++}
++console_initcall(pcm051_console_init);
++
++static int pcm051_mem_init(void)
++{
++ arm_add_mem_device("ram0", AM33XX_DRAM_ADDR_SPACE_START, SZ_512M);
++
++ return 0;
++}
++mem_initcall(pcm051_mem_init);
++
++static int pcm051_devices_init(void)
++{
++ add_generic_device("omap-hsmmc", DEVICE_ID_DYNAMIC, NULL,
++ (AM33XX_MMCHS0_BASE + 0x100), SZ_4K,
++ IORESOURCE_MEM, NULL);
++
++ armlinux_set_bootparams((void *)(AM33XX_DRAM_ADDR_SPACE_START + 0x100));
++ armlinux_set_architecture(MACH_TYPE_PCM051);
++
++ return 0;
++}
++device_initcall(pcm051_devices_init);
+diff --git a/arch/arm/boards/pcm051/config.h b/arch/arm/boards/pcm051/config.h
+new file mode 100644
+index 0000000..8b2b876
+--- /dev/null
++++ b/arch/arm/boards/pcm051/config.h
+@@ -0,0 +1,21 @@
++/**
++ * 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
++
++#endif /* __CONFIG_H */
+diff --git a/arch/arm/boards/pcm051/env/boot/disk b/arch/arm/boards/pcm051/env/boot/disk
+new file mode 100644
+index 0000000..c627991
+--- /dev/null
++++ b/arch/arm/boards/pcm051/env/boot/disk
+@@ -0,0 +1,10 @@
++#!/bin/sh
++
++if [ "$1" = menu ]; then
++ boot-menu-add-entry "$0" "SD Card"
++ exit
++fi
++
++global.bootm.image="/mnt/fat/linuximage"
++#global.bootm.oftree="/env/oftree"
++bootargs-root-disk -p mmcblk0p2 -t ext3
+diff --git a/arch/arm/boards/pcm051/env/init/automount b/arch/arm/boards/pcm051/env/init/automount
+new file mode 100644
+index 0000000..644a793
+--- /dev/null
++++ b/arch/arm/boards/pcm051/env/init/automount
+@@ -0,0 +1,32 @@
++#!/bin/sh
++
++if [ "$1" = menu ]; then
++ init-menu-add-entry "$0" "Automountpoints"
++ exit
++fi
++
++# automount server returned from dhcp server
++
++#mkdir -p /mnt/tftp-dhcp
++#automount /mnt/tftp-dhcp 'ifup eth0 && mount $eth0.serverip tftp /mnt/tftp-dhcp'
++
++# automount nfs server example
++
++#nfshost=somehost
++#mkdir -p /mnt/${nfshost}
++#automount /mnt/$nfshost "ifup eth0 && mount ${nfshost}:/tftpboot nfs /mnt/${nfshost}"
++
++# static tftp server example
++
++#mkdir -p /mnt/tftp
++#automount -d /mnt/tftp 'ifup eth0 && mount $serverip tftp /mnt/tftp'
++
++# FAT on usb disk example
++
++#mkdir -p /mnt/fat
++#automount -d /mnt/fat 'usb && [ -e /dev/disk0.0 ] && mount /dev/disk0.0 /mnt/fat'
++
++# FAT on mmc card
++
++mkdir -p /mnt/fat
++automount -d /mnt/fat '[ -e /dev/disk0.0 ] && mount /dev/disk0.0 /mnt/fat'
+diff --git a/arch/arm/boards/pcm051/env/init/bootargs-base b/arch/arm/boards/pcm051/env/init/bootargs-base
+new file mode 100644
+index 0000000..b3139b9
+--- /dev/null
++++ b/arch/arm/boards/pcm051/env/init/bootargs-base
+@@ -0,0 +1,9 @@
++#!/bin/sh
++
++if [ "$1" = menu ]; then
++ init-menu-add-entry "$0" "Base bootargs"
++ exit
++fi
++
++global.linux.bootargs.base="console=ttyO0,115200"
++bootargs-ip
+diff --git a/arch/arm/boards/pcm051/env/init/general b/arch/arm/boards/pcm051/env/init/general
+new file mode 100644
+index 0000000..743c864
+--- /dev/null
++++ b/arch/arm/boards/pcm051/env/init/general
+@@ -0,0 +1,15 @@
++#!/bin/sh
++
++if [ "$1" = menu ]; then
++ init-menu-add-entry "$0" "general config settings"
++ exit
++fi
++
++# user (used for network filenames)
++global.user=
++
++# timeout in seconds before the default boot entry is started
++global.autoboot_timeout=3
++
++# default boot entry (one of /env/boot/*)
++global.boot.default=disk
+diff --git a/arch/arm/boards/pcm051/env/init/hostname b/arch/arm/boards/pcm051/env/init/hostname
+new file mode 100644
+index 0000000..3ea1e0a
+--- /dev/null
++++ b/arch/arm/boards/pcm051/env/init/hostname
+@@ -0,0 +1,8 @@
++#!/bin/sh
++
++if [ "$1" = menu ]; then
++ init-menu-add-entry "$0" "hostname"
++ exit
++fi
++
++global.hostname=pcm051
+diff --git a/arch/arm/boards/pcm051/env/network/eth0 b/arch/arm/boards/pcm051/env/network/eth0
+new file mode 100644
+index 0000000..818b9f1
+--- /dev/null
++++ b/arch/arm/boards/pcm051/env/network/eth0
+@@ -0,0 +1,15 @@
++#!/bin/sh
++
++# ip setting (static/dhcp)
++ip=dhcp
++
++# static setup used if ip=static
++#ipaddr=
++#netmask=
++#gateway=
++#serverip=
++
++# MAC address if needed
++#ethaddr=xx:xx:xx:xx:xx:xx
++
++# put code to discover eth0 (i.e. 'usb') to /env/network/eth0-discover
+diff --git a/arch/arm/configs/pcm051_defconfig b/arch/arm/configs/pcm051_defconfig
+new file mode 100644
+index 0000000..6788e61
+--- /dev/null
++++ b/arch/arm/configs/pcm051_defconfig
+@@ -0,0 +1,151 @@
++CONFIG_GENERIC_LINKER_SCRIPT=y
++CONFIG_ARM=y
++CONFIG_ARM_LINUX=y
++CONFIG_ARCH_OMAP=y
++CONFIG_CPU_32=y
++CONFIG_CPU_V7=y
++CONFIG_CPU_32v7=y
++CONFIG_BOARDINFO="Phytec phyCORE-AM335x"
++CONFIG_ARCH_AM33XX=y
++CONFIG_OMAP_CLOCK_ALL=y
++CONFIG_OMAP_CLOCK_SOURCE_DMTIMER0=y
++CONFIG_OMAP_BUILD_IFT=y
++CONFIG_MACH_PCM051=y
++CONFIG_AEABI=y
++CONFIG_CMD_ARM_CPUINFO=y
++CONFIG_ARM_OPTIMZED_STRING_FUNCTIONS=y
++CONFIG_ARM_EXCEPTIONS=y
++CONFIG_ARM_UNWIND=y
++CONFIG_DEFCONFIG_LIST="$ARCH_DEFCONFIG"
++CONFIG_GREGORIAN_CALENDER=y
++CONFIG_HAS_KALLSYMS=y
++CONFIG_HAS_MODULES=y
++CONFIG_CMD_MEMORY=y
++CONFIG_ENV_HANDLING=y
++CONFIG_GENERIC_GPIO=y
++CONFIG_BLOCK=y
++CONFIG_BLOCK_WRITE=y
++CONFIG_LOCALVERSION=""
++CONFIG_LOCALVERSION_AUTO=y
++CONFIG_ENVIRONMENT_VARIABLES=y
++CONFIG_HAVE_CONFIGURABLE_TEXT_BASE=y
++CONFIG_TEXT_BASE=0x81000000
++CONFIG_HAVE_CONFIGURABLE_MEMORY_LAYOUT=y
++CONFIG_MEMORY_LAYOUT_DEFAULT=y
++CONFIG_STACK_SIZE=0x8000
++CONFIG_MALLOC_SIZE=0x400000
++CONFIG_MALLOC_DLMALLOC=y
++CONFIG_PROMPT="phyCORE-AM335x >"
++CONFIG_BAUDRATE=115200
++CONFIG_LONGHELP=y
++CONFIG_CBSIZE=1024
++CONFIG_MAXARGS=16
++CONFIG_SHELL_HUSH=y
++CONFIG_GLOB=y
++CONFIG_PROMPT_HUSH_PS2="> "
++CONFIG_HUSH_FANCY_PROMPT=y
++CONFIG_HUSH_GETOPT=y
++CONFIG_CMDLINE_EDITING=y
++CONFIG_AUTO_COMPLETE=y
++CONFIG_MENU=y
++CONFIG_DYNAMIC_CRC_TABLE=y
++CONFIG_ERRNO_MESSAGES=y
++CONFIG_TIMESTAMP=y
++CONFIG_CONSOLE_FULL=y
++CONFIG_CONSOLE_ACTIVATE_FIRST=y
++CONFIG_PARTITION=y
++CONFIG_PARTITION_DISK=y
++CONFIG_PARTITION_DISK_DOS=y
++CONFIG_DEFAULT_ENVIRONMENT=y
++CONFIG_HAVE_DEFAULT_ENVIRONMENT_NEW=y
++CONFIG_DEFAULT_ENVIRONMENT_GENERIC_NEW=y
++CONFIG_DEFAULT_ENVIRONMENT_PATH="arch/arm/boards/pcm051/env"
++CONFIG_COMMAND_SUPPORT=y
++CONFIG_CMD_EDIT=y
++CONFIG_CMD_SLEEP=y
++CONFIG_CMD_SAVEENV=y
++CONFIG_CMD_LOADENV=y
++CONFIG_CMD_EXPORT=y
++CONFIG_CMD_PRINTENV=y
++CONFIG_CMD_READLINE=y
++CONFIG_CMD_TRUE=y
++CONFIG_CMD_FALSE=y
++CONFIG_CMD_MENU=y
++CONFIG_CMD_MENU_MANAGEMENT=y
++CONFIG_CMD_TIME=y
++CONFIG_CMD_LS=y
++CONFIG_CMD_RM=y
++CONFIG_CMD_CAT=y
++CONFIG_CMD_MKDIR=y
++CONFIG_CMD_RMDIR=y
++CONFIG_CMD_CP=y
++CONFIG_CMD_PWD=y
++CONFIG_CMD_CD=y
++CONFIG_CMD_MOUNT=y
++CONFIG_CMD_UMOUNT=y
++CONFIG_CMD_NAND=y
++CONFIG_CMD_CLEAR=y
++CONFIG_CMD_ECHO=y
++CONFIG_CMD_ECHO_E=y
++CONFIG_CMD_LOADB=y
++CONFIG_CMD_MEMINFO=y
++CONFIG_CMD_IOMEM=y
++CONFIG_CMD_CRC=y
++CONFIG_CMD_CRC_CMP=y
++CONFIG_CMD_DIGEST=y
++CONFIG_CMD_MD5SUM=y
++CONFIG_CMD_SHA1SUM=y
++CONFIG_CMD_SHA256SUM=y
++CONFIG_CMD_SHA224SUM=y
++CONFIG_CMD_FLASH=y
++CONFIG_CMD_UBI=y
++CONFIG_CMD_BOOTM=y
++CONFIG_CMD_BOOTM_SHOW_TYPE=y
++CONFIG_CMD_IMINFO=y
++CONFIG_CMD_BOOTZ=n
++CONFIG_CMD_BOOTU=n
++CONFIG_CMD_RESET=y
++CONFIG_CMD_GO=y
++CONFIG_CMD_TIMEOUT=y
++CONFIG_CMD_PARTITION=y
++CONFIG_CMD_TEST=y
++CONFIG_CMD_VERSION=y
++CONFIG_CMD_HELP=y
++CONFIG_CMD_MAGICVAR=y
++CONFIG_CMD_MAGICVAR_HELP=y
++CONFIG_CMD_DEVINFO=y
++CONFIG_CMD_UNCOMPRESS=y
++CONFIG_DRIVER_SERIAL_NS16550=y
++CONFIG_DRIVER_SERIAL_NS16550_OMAP_EXTENSIONS=y
++CONFIG_MIIDEV=y
++CONFIG_DRIVER_NET_SMC911X=y
++CONFIG_DRIVER_NET_SMC911X_ADDRESS_SHIFT=0
++CONFIG_SPI=n
++CONFIG_UBI=y
++CONFIG_DISK=y
++CONFIG_DISK_WRITE=y
++CONFIG_MCI=y
++CONFIG_MCI_INFO=y
++CONFIG_MCI_WRITE=y
++CONFIG_MCI_OMAP_HSMMC=y
++CONFIG_MCI_STARTUP=y
++CONFIG_FS_CRAMFS=y
++CONFIG_FS_RAMFS=y
++CONFIG_FS_DEVFS=y
++CONFIG_FS_FAT=y
++CONFIG_FS_FAT_WRITE=y
++CONFIG_FS_FAT_LFN=y
++CONFIG_PARTITION_NEED_MTD=y
++CONFIG_ZLIB=y
++CONFIG_BZLIB=y
++CONFIG_PROCESS_ESCAPE_SEQUENCE=y
++CONFIG_LZO_DECOMPRESS=y
++CONFIG_FDT=y
++CONFIG_OFTREE=y
++CONFIG_CRC32=y
++CONFIG_CRC16=y
++CONFIG_DIGEST=y
++CONFIG_MD5=y
++CONFIG_SHA1=y
++CONFIG_SHA224=y
++CONFIG_SHA256=y
+diff --git a/arch/arm/mach-omap/Kconfig b/arch/arm/mach-omap/Kconfig
+index 7e7e855..ecbc417 100644
+--- a/arch/arm/mach-omap/Kconfig
++++ b/arch/arm/mach-omap/Kconfig
+@@ -101,6 +101,7 @@ config BOARDINFO
+ default "Phytec phyCORE pcm049" if MACH_PCM049
+ default "Phytec phyCARD-A-L1" if MACH_PCAAL1
+ default "Phytec phyCARD-A-XL2" if MACH_PCAAXL2
++ default "Phytec phyCORE-AM335x" if MACH_PCM051
+
+ choice
+ prompt "Select OMAP board"
+@@ -157,6 +158,15 @@ config MACH_PCAAXL2
+ help
+ Say Y here if you are using a phyCARD-A-XL1 PCA-A-XL1
+
++config MACH_PCM051
++ bool "Phytec phyCORE pcm051"
++ select OMAP_CLOCK_ALL
++ select HAVE_NOSHELL
++ select HAVE_DEFAULT_ENVIRONMENT_NEW
++ depends on ARCH_AM33XX
++ help
++ Say Y here if you are using Phytecs phyCORE pcm051 board
++
+ endchoice
+
+ if MACH_OMAP3EVM
diff --git a/patches/barebox-2012.11.0/0003-WIP-beaglebone-add-first-stage-supprort-for-AM335x-a.patch b/patches/barebox-2012.11.0/0003-WIP-beaglebone-add-first-stage-supprort-for-AM335x-a.patch
new file mode 100644
index 0000000..85363c1
--- /dev/null
+++ b/patches/barebox-2012.11.0/0003-WIP-beaglebone-add-first-stage-supprort-for-AM335x-a.patch
@@ -0,0 +1,2302 @@
+From 6f01704f7ceae3015fe7a5b3332879a0975233a4 Mon Sep 17 00:00:00 2001
+From: Jan Luebbe <jlu@pengutronix.de>
+Date: Mon, 24 Sep 2012 17:12:54 +0200
+Subject: [PATCH] WIP beaglebone: add first-stage supprort for AM335x and
+ board
+
+Signed-off-by: Jan Luebbe <jlu@pengutronix.de>
+---
+ arch/arm/Makefile | 1 +
+ arch/arm/boards/beaglebone/Makefile | 1 +
+ arch/arm/boards/beaglebone/board.c | 447 ++++++++++++++++++
+ arch/arm/boards/beaglebone/config.h | 21 +
+ arch/arm/boards/beaglebone/env/boot/sd | 16 +
+ arch/arm/boards/beaglebone/env/init/bootargs-base | 8 +
+ arch/arm/boards/beaglebone/env/init/general | 18 +
+ arch/arm/boards/beaglebone/mlo-env/bin/boot | 143 ++++++
+ arch/arm/boards/beaglebone/mlo-env/config | 51 ++
+ arch/arm/configs/am335x_beaglebone_defconfig | 54 +++
+ .../configs/am335x_beaglebone_mlo_large_defconfig | 48 ++
+ .../configs/am335x_beaglebone_mlo_small_defconfig | 30 ++
+ arch/arm/mach-omap/Kconfig | 11 +-
+ arch/arm/mach-omap/Makefile | 2 +-
+ arch/arm/mach-omap/am33xx_clock.c | 289 ++++++++++++
+ arch/arm/mach-omap/am33xx_generic.c | 64 +++
+ arch/arm/mach-omap/am33xx_mux.c | 497 ++++++++++++++++++++
+ arch/arm/mach-omap/include/mach/am33xx-clock.h | 172 +++++++
+ arch/arm/mach-omap/include/mach/am33xx-mux.h | 19 +
+ arch/arm/mach-omap/include/mach/am33xx-silicon.h | 158 ++++++-
+ arch/arm/mach-omap/s32k_clksource.c | 5 +-
+ arch/arm/mach-omap/xload.c | 5 +-
+ 22 files changed, 2055 insertions(+), 5 deletions(-)
+ create mode 100644 arch/arm/boards/beaglebone/Makefile
+ create mode 100644 arch/arm/boards/beaglebone/board.c
+ create mode 100644 arch/arm/boards/beaglebone/config.h
+ create mode 100644 arch/arm/boards/beaglebone/env/boot/sd
+ create mode 100644 arch/arm/boards/beaglebone/env/init/bootargs-base
+ create mode 100644 arch/arm/boards/beaglebone/env/init/general
+ create mode 100644 arch/arm/boards/beaglebone/mlo-env/bin/boot
+ create mode 100644 arch/arm/boards/beaglebone/mlo-env/config
+ create mode 100644 arch/arm/configs/am335x_beaglebone_defconfig
+ create mode 100644 arch/arm/configs/am335x_beaglebone_mlo_large_defconfig
+ create mode 100644 arch/arm/configs/am335x_beaglebone_mlo_small_defconfig
+ create mode 100644 arch/arm/mach-omap/am33xx_clock.c
+ create mode 100644 arch/arm/mach-omap/am33xx_mux.c
+ create mode 100644 arch/arm/mach-omap/include/mach/am33xx-mux.h
+
+diff --git a/arch/arm/Makefile b/arch/arm/Makefile
+index b9c459f..0329621 100644
+--- a/arch/arm/Makefile
++++ b/arch/arm/Makefile
+@@ -99,6 +99,7 @@ board-$(CONFIG_MACH_NOMADIK_8815NHK) := nhk8815
+ board-$(CONFIG_MACH_NXDB500) := netx
+ board-$(CONFIG_MACH_OMAP343xSDP) := omap343xdsp
+ board-$(CONFIG_MACH_BEAGLE) := beagle
++board-$(CONFIG_MACH_BEAGLEBONE) := beaglebone
+ board-$(CONFIG_MACH_OMAP3EVM) := omap3evm
+ board-$(CONFIG_MACH_PANDA) := panda
+ board-$(CONFIG_MACH_PCM049) := pcm049
+diff --git a/arch/arm/boards/beaglebone/Makefile b/arch/arm/boards/beaglebone/Makefile
+new file mode 100644
+index 0000000..dcfc293
+--- /dev/null
++++ b/arch/arm/boards/beaglebone/Makefile
+@@ -0,0 +1 @@
++obj-y += board.o
+diff --git a/arch/arm/boards/beaglebone/board.c b/arch/arm/boards/beaglebone/board.c
+new file mode 100644
+index 0000000..8180e28
+--- /dev/null
++++ b/arch/arm/boards/beaglebone/board.c
+@@ -0,0 +1,447 @@
++/*
++ * (C) Copyright 2008
++ * Texas Instruments, <www.ti.com>
++ * Raghavendra KH <r-khandenahally@ti.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
++ */
++
++/**
++ * @file
++ * @brief Beagle Specific Board Initialization routines
++ */
++
++/**
++ * @page ti_beagle Texas Instruments Beagle Board
++ *
++ * FileName: arch/arm/boards/omap/board-beagle.c
++ *
++ * Beagle Board from Texas Instruments as described here:
++ * http://www.beagleboard.org
++ *
++ * This board is based on OMAP3530.
++ * More on OMAP3530 (including documentation can be found here):
++ * http://focus.ti.com/docs/prod/folders/print/omap3530.html
++ *
++ * This file provides initialization in two stages:
++ * @li boot time initialization - do basics required to get SDRAM working.
++ * This is run from SRAM - so no case constructs and global vars can be used.
++ * @li run time initialization - this is for the rest of the initializations
++ * such as flash, uart etc.
++ *
++ * Boot time initialization includes:
++ * @li SDRAM initialization.
++ * @li Pin Muxing relevant for Beagle.
++ *
++ * Run time initialization includes
++ * @li serial @ref serial_ns16550.c driver device definition
++ *
++ * Originally from arch/arm/boards/omap/board-sdp343x.c
++ */
++
++#include <common.h>
++#include <console.h>
++#include <init.h>
++#include <driver.h>
++#include <fs.h>
++#include <linux/stat.h>
++#include <environment.h>
++#include <sizes.h>
++#include <io.h>
++#include <ns16550.h>
++#include <asm/armlinux.h>
++#include <generated/mach-types.h>
++#include <mach/silicon.h>
++#include <mach/clocks.h>
++#include <mach/sdrc.h>
++#include <mach/sys_info.h>
++#include <mach/syslib.h>
++#include <mach/control.h>
++#include <mach/gpmc.h>
++#include <mach/ehci.h>
++#include <i2c/i2c.h>
++#include <linux/err.h>
++#include <usb/ehci.h>
++#include <mach/xload.h>
++#include <mach/am33xx-mux.h>
++
++/* UART Defines */
++#define UART_SYSCFG_OFFSET (0x54)
++#define UART_SYSSTS_OFFSET (0x58)
++
++#define UART_RESET (0x1 << 1)
++#define UART_CLK_RUNNING_MASK 0x1
++#define UART_SMART_IDLE_EN (0x1 << 0x3)
++
++/* AM335X EMIF Register values */
++#define EMIF_SDMGT 0x80000000
++#define EMIF_SDRAM 0x00004650
++#define EMIF_PHYCFG 0x2
++#define DDR_PHY_RESET (0x1 << 10)
++#define DDR_FUNCTIONAL_MODE_EN 0x1
++#define DDR_PHY_READY (0x1 << 2)
++#define VTP_CTRL_READY (0x1 << 5)
++#define VTP_CTRL_ENABLE (0x1 << 6)
++#define VTP_CTRL_LOCK_EN (0x1 << 4)
++#define VTP_CTRL_START_EN (0x1)
++#define DDR2_RATIO 0x80 /* for mDDR */
++#define CMD_FORCE 0x00 /* common #def */
++#define CMD_DELAY 0x00
++
++#define EMIF_READ_LATENCY 0x05
++#define EMIF_TIM1 0x0666B3D6
++#define EMIF_TIM2 0x143731DA
++#define EMIF_TIM3 0x00000347
++#define EMIF_SDCFG 0x43805332
++#define EMIF_SDREF 0x0000081a
++#define DDR2_DLL_LOCK_DIFF 0x0
++#define DDR2_RD_DQS 0x12
++#define DDR2_PHY_FIFO_WE 0x80
++
++#define DDR2_INVERT_CLKOUT 0x00
++#define DDR2_WR_DQS 0x00
++#define DDR2_PHY_WRLVL 0x00
++#define DDR2_PHY_GATELVL 0x00
++#define DDR2_PHY_WR_DATA 0x40
++#define PHY_RANK0_DELAY 0x01
++#define PHY_DLL_LOCK_DIFF 0x0
++#define DDR_IOCTRL_VALUE 0x18B
++
++static void Data_Macro_Config(int dataMacroNum)
++{
++ u32 BaseAddrOffset = 0x00;;
++
++ if (dataMacroNum == 1)
++ BaseAddrOffset = 0xA4;
++
++ __raw_writel(((DDR2_RD_DQS<<30)|(DDR2_RD_DQS<<20)
++ |(DDR2_RD_DQS<<10)|(DDR2_RD_DQS<<0)),
++ (DATA0_RD_DQS_SLAVE_RATIO_0 + BaseAddrOffset));
++ __raw_writel(DDR2_RD_DQS>>2,
++ (DATA0_RD_DQS_SLAVE_RATIO_1 + BaseAddrOffset));
++ __raw_writel(((DDR2_WR_DQS<<30)|(DDR2_WR_DQS<<20)
++ |(DDR2_WR_DQS<<10)|(DDR2_WR_DQS<<0)),
++ (DATA0_WR_DQS_SLAVE_RATIO_0 + BaseAddrOffset));
++ __raw_writel(DDR2_WR_DQS>>2,
++ (DATA0_WR_DQS_SLAVE_RATIO_1 + BaseAddrOffset));
++ __raw_writel(((DDR2_PHY_WRLVL<<30)|(DDR2_PHY_WRLVL<<20)
++ |(DDR2_PHY_WRLVL<<10)|(DDR2_PHY_WRLVL<<0)),
++ (DATA0_WRLVL_INIT_RATIO_0 + BaseAddrOffset));
++ __raw_writel(DDR2_PHY_WRLVL>>2,
++ (DATA0_WRLVL_INIT_RATIO_1 + BaseAddrOffset));
++ __raw_writel(((DDR2_PHY_GATELVL<<30)|(DDR2_PHY_GATELVL<<20)
++ |(DDR2_PHY_GATELVL<<10)|(DDR2_PHY_GATELVL<<0)),
++ (DATA0_GATELVL_INIT_RATIO_0 + BaseAddrOffset));
++ __raw_writel(DDR2_PHY_GATELVL>>2,
++ (DATA0_GATELVL_INIT_RATIO_1 + BaseAddrOffset));
++ __raw_writel(((DDR2_PHY_FIFO_WE<<30)|(DDR2_PHY_FIFO_WE<<20)
++ |(DDR2_PHY_FIFO_WE<<10)|(DDR2_PHY_FIFO_WE<<0)),
++ (DATA0_FIFO_WE_SLAVE_RATIO_0 + BaseAddrOffset));
++ __raw_writel(DDR2_PHY_FIFO_WE>>2,
++ (DATA0_FIFO_WE_SLAVE_RATIO_1 + BaseAddrOffset));
++ __raw_writel(((DDR2_PHY_WR_DATA<<30)|(DDR2_PHY_WR_DATA<<20)
++ |(DDR2_PHY_WR_DATA<<10)|(DDR2_PHY_WR_DATA<<0)),
++ (DATA0_WR_DATA_SLAVE_RATIO_0 + BaseAddrOffset));
++ __raw_writel(DDR2_PHY_WR_DATA>>2,
++ (DATA0_WR_DATA_SLAVE_RATIO_1 + BaseAddrOffset));
++ __raw_writel(PHY_DLL_LOCK_DIFF,
++ (DATA0_DLL_LOCK_DIFF_0 + BaseAddrOffset));
++}
++
++static void Cmd_Macro_Config(void)
++{
++ __raw_writel(DDR2_RATIO, CMD0_CTRL_SLAVE_RATIO_0);
++ __raw_writel(CMD_FORCE, CMD0_CTRL_SLAVE_FORCE_0);
++ __raw_writel(CMD_DELAY, CMD0_CTRL_SLAVE_DELAY_0);
++ __raw_writel(DDR2_DLL_LOCK_DIFF, CMD0_DLL_LOCK_DIFF_0);
++ __raw_writel(DDR2_INVERT_CLKOUT, CMD0_INVERT_CLKOUT_0);
++
++ __raw_writel(DDR2_RATIO, CMD1_CTRL_SLAVE_RATIO_0);
++ __raw_writel(CMD_FORCE, CMD1_CTRL_SLAVE_FORCE_0);
++ __raw_writel(CMD_DELAY, CMD1_CTRL_SLAVE_DELAY_0);
++ __raw_writel(DDR2_DLL_LOCK_DIFF, CMD1_DLL_LOCK_DIFF_0);
++ __raw_writel(DDR2_INVERT_CLKOUT, CMD1_INVERT_CLKOUT_0);
++
++ __raw_writel(DDR2_RATIO, CMD2_CTRL_SLAVE_RATIO_0);
++ __raw_writel(CMD_FORCE, CMD2_CTRL_SLAVE_FORCE_0);
++ __raw_writel(CMD_DELAY, CMD2_CTRL_SLAVE_DELAY_0);
++ __raw_writel(DDR2_DLL_LOCK_DIFF, CMD2_DLL_LOCK_DIFF_0);
++ __raw_writel(DDR2_INVERT_CLKOUT, CMD2_INVERT_CLKOUT_0);
++}
++
++static void config_vtp(void)
++{
++ __raw_writel(__raw_readl(VTP0_CTRL_REG) | VTP_CTRL_ENABLE,
++ VTP0_CTRL_REG);
++ __raw_writel(__raw_readl(VTP0_CTRL_REG) & (~VTP_CTRL_START_EN),
++ VTP0_CTRL_REG);
++ __raw_writel(__raw_readl(VTP0_CTRL_REG) | VTP_CTRL_START_EN,
++ VTP0_CTRL_REG);
++
++ /* Poll for READY */
++ while ((__raw_readl(VTP0_CTRL_REG) & VTP_CTRL_READY) != VTP_CTRL_READY);
++}
++
++static void config_emif_ddr2(void)
++{
++ u32 i;
++
++ /*Program EMIF0 CFG Registers*/
++ __raw_writel(EMIF_READ_LATENCY, EMIF4_0_DDR_PHY_CTRL_1);
++ __raw_writel(EMIF_READ_LATENCY, EMIF4_0_DDR_PHY_CTRL_1_SHADOW);
++ __raw_writel(EMIF_READ_LATENCY, EMIF4_0_DDR_PHY_CTRL_2);
++ __raw_writel(EMIF_TIM1, EMIF4_0_SDRAM_TIM_1);
++ __raw_writel(EMIF_TIM1, EMIF4_0_SDRAM_TIM_1_SHADOW);
++ __raw_writel(EMIF_TIM2, EMIF4_0_SDRAM_TIM_2);
++ __raw_writel(EMIF_TIM2, EMIF4_0_SDRAM_TIM_2_SHADOW);
++ __raw_writel(EMIF_TIM3, EMIF4_0_SDRAM_TIM_3);
++ __raw_writel(EMIF_TIM3, EMIF4_0_SDRAM_TIM_3_SHADOW);
++
++ __raw_writel(EMIF_SDCFG, EMIF4_0_SDRAM_CONFIG);
++ __raw_writel(EMIF_SDCFG, EMIF4_0_SDRAM_CONFIG2);
++
++ /* __raw_writel(EMIF_SDMGT, EMIF0_0_SDRAM_MGMT_CTRL);
++ __raw_writel(EMIF_SDMGT, EMIF0_0_SDRAM_MGMT_CTRL_SHD); */
++ __raw_writel(0x00004650, EMIF4_0_SDRAM_REF_CTRL);
++ __raw_writel(0x00004650, EMIF4_0_SDRAM_REF_CTRL_SHADOW);
++
++ for (i = 0; i < 5000; i++) {
++
++ }
++
++ /* __raw_writel(EMIF_SDMGT, EMIF0_0_SDRAM_MGMT_CTRL);
++ __raw_writel(EMIF_SDMGT, EMIF0_0_SDRAM_MGMT_CTRL_SHD); */
++ __raw_writel(EMIF_SDREF, EMIF4_0_SDRAM_REF_CTRL);
++ __raw_writel(EMIF_SDREF, EMIF4_0_SDRAM_REF_CTRL_SHADOW);
++
++ __raw_writel(EMIF_SDCFG, EMIF4_0_SDRAM_CONFIG);
++ __raw_writel(EMIF_SDCFG, EMIF4_0_SDRAM_CONFIG2);
++}
++
++/* void DDR2_EMIF_Config(void); */
++static void config_am335x_ddr(void)
++{
++ int data_macro_0 = 0;
++ int data_macro_1 = 1;
++
++ enable_ddr_clocks();
++
++ config_vtp();
++
++ Cmd_Macro_Config();
++
++ Data_Macro_Config(data_macro_0);
++ Data_Macro_Config(data_macro_1);
++
++ __raw_writel(PHY_RANK0_DELAY, DATA0_RANK0_DELAYS_0);
++ __raw_writel(PHY_RANK0_DELAY, DATA1_RANK0_DELAYS_0);
++
++ __raw_writel(DDR_IOCTRL_VALUE, DDR_CMD0_IOCTRL);
++ __raw_writel(DDR_IOCTRL_VALUE, DDR_CMD1_IOCTRL);
++ __raw_writel(DDR_IOCTRL_VALUE, DDR_CMD2_IOCTRL);
++ __raw_writel(DDR_IOCTRL_VALUE, DDR_DATA0_IOCTRL);
++ __raw_writel(DDR_IOCTRL_VALUE, DDR_DATA1_IOCTRL);
++
++ __raw_writel(__raw_readl(DDR_IO_CTRL) & 0xefffffff, DDR_IO_CTRL);
++ __raw_writel(__raw_readl(DDR_CKE_CTRL) | 0x00000001, DDR_CKE_CTRL);
++
++ config_emif_ddr2();
++}
++
++/*
++ * early system init of muxing and clocks.
++ */
++void s_init(void)
++{
++ u32 regVal, uart_base;
++
++ /* Setup the PLLs and the clocks for the peripherals */
++ pll_init();
++
++ /* UART softreset */
++ uart_base = AM33XX_UART0_BASE;
++
++ enable_uart0_pin_mux();
++
++ regVal = __raw_readl(uart_base + UART_SYSCFG_OFFSET);
++ regVal |= UART_RESET;
++ __raw_writel(regVal, (uart_base + UART_SYSCFG_OFFSET) );
++ while ((__raw_readl(uart_base + UART_SYSSTS_OFFSET) &
++ UART_CLK_RUNNING_MASK) != UART_CLK_RUNNING_MASK);
++
++ /* Disable smart idle */
++ regVal = __raw_readl((uart_base + UART_SYSCFG_OFFSET));
++ regVal |= UART_SMART_IDLE_EN;
++ __raw_writel(regVal, (uart_base + UART_SYSCFG_OFFSET));
++
++ /* Initialize the Timer */
++ //init_timer();
++
++ //preloader_console_init();
++
++ config_am335x_ddr();
++}
++
++
++/**
++ * @brief The basic entry point for board initialization.
++ *
++ * This is called as part of machine init (after arch init).
++ * This is again called with stack in SRAM, so not too many
++ * constructs possible here.
++ *
++ * @return void
++ */
++static int beagle_board_init(void)
++{
++ int in_sdram = running_in_sdram();
++
++ /* Can be removed as A8 comes up with L2 enabled */
++ //l2_cache_enable();
++
++ /* WDT1 is already running when the bootloader gets control
++ * Disable it to avoid "random" resets
++ */
++ __raw_writel(0xAAAA, WDT_WSPR);
++ while(__raw_readl(WDT_WWPS) != 0x0);
++ __raw_writel(0x5555, WDT_WSPR);
++ while(__raw_readl(WDT_WWPS) != 0x0);
++
++ //omap3_core_init();
++
++ enable_uart0_pin_mux();
++ /* Dont reconfigure SDRAM while running in SDRAM! */
++ if (!in_sdram)
++ s_init();
++
++ enable_mii1_pin_mux();
++
++ return 0;
++}
++pure_initcall(beagle_board_init);
++
++/******************** Board Run Time *******************/
++
++#ifdef CONFIG_DRIVER_SERIAL_NS16550
++
++static struct NS16550_plat serial_plat = {
++ .clock = 48000000, /* 48MHz (APLL96/2) */
++ .shift = 2,
++};
++
++/**
++ * @brief UART serial port initialization - remember to enable COM clocks in
++ * arch
++ *
++ * @return result of device registration
++ */
++static int beagle_console_init(void)
++{
++ /* Register the serial port */
++ add_ns16550_device(-1, AM33XX_UART0_BASE, SZ_1K, IORESOURCE_MEM_8BIT,
++ &serial_plat);
++
++ return 0;
++}
++console_initcall(beagle_console_init);
++#endif /* CONFIG_DRIVER_SERIAL_NS16550 */
++
++#ifdef CONFIG_USB_EHCI_OMAP
++static struct omap_hcd omap_ehci_pdata = {
++ .port_mode[0] = EHCI_HCD_OMAP_MODE_PHY,
++ .port_mode[1] = EHCI_HCD_OMAP_MODE_PHY,
++ .port_mode[2] = EHCI_HCD_OMAP_MODE_UNKNOWN,
++ .phy_reset = 1,
++ .reset_gpio_port[0] = -EINVAL,
++ .reset_gpio_port[1] = 147,
++ .reset_gpio_port[2] = -EINVAL
++};
++
++static struct ehci_platform_data ehci_pdata = {
++ .flags = 0,
++};
++#endif /* CONFIG_USB_EHCI_OMAP */
++
++static struct i2c_board_info i2c_devices[] = {
++ {
++ I2C_BOARD_INFO("twl4030", 0x48),
++ },
++};
++
++static int beagle_mem_init(void)
++{
++ arm_add_mem_device("ram0", 0x80000000, 256 * 1024 * 1024);
++
++ return 0;
++}
++mem_initcall(beagle_mem_init);
++
++static int beagle_devices_init(void)
++{
++// i2c_register_board_info(0, i2c_devices, ARRAY_SIZE(i2c_devices));
++// add_generic_device("i2c-omap", DEVICE_ID_DYNAMIC, NULL, OMAP_I2C1_BASE, SZ_4K,
++// IORESOURCE_MEM, NULL);
++
++#ifdef CONFIG_USB_EHCI_OMAP
++// if (ehci_omap_init(&omap_ehci_pdata) >= 0)
++// add_usb_ehci_device(DEVICE_ID_DYNAMIC, OMAP_EHCI_BASE,
++// OMAP_EHCI_BASE + 0x10, &ehci_pdata);
++#endif /* CONFIG_USB_EHCI_OMAP */
++#ifdef CONFIG_OMAP_GPMC
++ /* WP is made high and WAIT1 active Low */
++ //gpmc_generic_init(0x10);
++#endif
++
++ add_generic_device("omap-hsmmc", DEVICE_ID_DYNAMIC, NULL, 0x48060100, SZ_4K,
++ IORESOURCE_MEM, NULL);
++
++ armlinux_set_bootparams((void *)0x80000100);
++ //armlinux_set_architecture(MACH_TYPE_OMAP_GENERIC);
++ armlinux_set_architecture(3589);
++
++ return 0;
++}
++device_initcall(beagle_devices_init);
++
++#ifdef CONFIG_DEFAULT_ENVIRONMENT
++static int beaglebone_env_init(void)
++{
++ struct stat s;
++ char *diskdev = "/dev/disk0.0";
++ int ret;
++
++ ret = stat(diskdev, &s);
++ if (ret) {
++ printf("device %s not found. Using default environment\n", diskdev);
++ return 0;
++ }
++
++ mkdir ("/boot", 0666);
++ ret = mount(diskdev, "fat", "/boot");
++ if (ret) {
++ printf("failed to mount %s\n", diskdev);
++ return 0;
++ }
++
++ if (IS_ENABLED(CONFIG_OMAP_BUILD_IFT))
++ default_environment_path = "/dev/defaultenv";
++ else
++ default_environment_path = "/boot/barebox.env";
++
++ return 0;
++}
++late_initcall(beaglebone_env_init);
++#endif
+diff --git a/arch/arm/boards/beaglebone/config.h b/arch/arm/boards/beaglebone/config.h
+new file mode 100644
+index 0000000..b908fc0
+--- /dev/null
++++ b/arch/arm/boards/beaglebone/config.h
+@@ -0,0 +1,21 @@
++/**
++ * 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
++
++#endif /* __CONFIG_H */
+diff --git a/arch/arm/boards/beaglebone/env/boot/sd b/arch/arm/boards/beaglebone/env/boot/sd
+new file mode 100644
+index 0000000..f3f276c
+--- /dev/null
++++ b/arch/arm/boards/beaglebone/env/boot/sd
+@@ -0,0 +1,16 @@
++#!/bin/sh
++
++if [ "$1" = menu ]; then
++ boot-menu-add-entry "$0" "kernel & rootfs on SD card"
++ exit
++fi
++
++global.bootm.image=/boot/uImage
++#global.bootm.oftree=<path to oftree>
++#global.bootm.initrd=<path to initrd>
++
++#bootargs-root-nfs -n "<path on server>" -s <serverip>
++#bootargs-root-jffs2 -m <mtdname>
++#bootargs-root-ubi -r <volume> -m <mtdname>
++
++global.linux.bootargs.root="root=/dev/mmcblk0p2 rootfstype=ext4 rootwait ro"
+diff --git a/arch/arm/boards/beaglebone/env/init/bootargs-base b/arch/arm/boards/beaglebone/env/init/bootargs-base
+new file mode 100644
+index 0000000..333856e
+--- /dev/null
++++ b/arch/arm/boards/beaglebone/env/init/bootargs-base
+@@ -0,0 +1,8 @@
++#!/bin/sh
++
++if [ "$1" = menu ]; then
++ init-menu-add-entry "$0" "Base bootargs"
++ exit
++fi
++
++global.linux.bootargs.base="console=ttyO0,115200n8"
+diff --git a/arch/arm/boards/beaglebone/env/init/general b/arch/arm/boards/beaglebone/env/init/general
+new file mode 100644
+index 0000000..bbd7ee3
+--- /dev/null
++++ b/arch/arm/boards/beaglebone/env/init/general
+@@ -0,0 +1,18 @@
++#!/bin/sh
++
++if [ "$1" = menu ]; then
++ init-menu-add-entry "$0" "general config settings"
++ exit
++fi
++
++# user (used for network filenames)
++global.user=jlu
++
++# timeout in seconds before the default boot entry is started
++global.autoboot_timeout=3
++
++# default boot entry (one of /env/boot/*)
++global.boot.default=sd
++
++# default tftp path
++global.tftp.path=/mnt/tftp-dhcp
+diff --git a/arch/arm/boards/beaglebone/mlo-env/bin/boot b/arch/arm/boards/beaglebone/mlo-env/bin/boot
+new file mode 100644
+index 0000000..c831c35
+--- /dev/null
++++ b/arch/arm/boards/beaglebone/mlo-env/bin/boot
+@@ -0,0 +1,143 @@
++#!/bin/sh
++
++. /env/config
++
++if [ x$kernel_loc = xnet ]; then
++ kernel_loc=tftp
++fi
++
++while getopt "hk:r:i:m:o:" Option
++do
++if [ ${Option} = k ]; then
++ kernel_loc=${OPTARG}
++elif [ ${Option} = r ]; then
++ rootfs_loc=${OPTARG}
++elif [ ${Option} = o ]; then
++ oftree_loc=${OPTARG}
++elif [ ${Option} = i ]; then
++ ip=${OPTARG}
++elif [ ${Option} = m ]; then
++ mode=${OPTARG}
++else
++ . /env/bin/_boot_help
++ exit 0
++fi
++done
++
++if [ x$mode = xnand ]; then
++ rootfs_loc=nand
++ kernel_loc=nand
++elif [ x$mode = xnor ]; then
++ rootfs_loc=nor
++ kernel_loc=nor
++elif [ x$mode = xnfs ]; then
++ rootfs_loc=net
++ kernel_loc=nfs
++elif [ x$mode = xtftp ]; then
++ rootfs_loc=net
++ kernel_loc=tftp
++elif [ x$mode = xdisk ]; then
++ rootfs_loc=disk
++ kernel_loc=disk
++fi
++
++if [ x$ip = xdhcp -o x$ip = "xdhcp-barebox" ]; then
++ if [ x$kernel_loc = xnfs -o x$kernel_loc = xtftp ]; then
++ dhcp
++ if [ x${global.dhcp.rootpath} != x ]; then
++ nfsroot=${global.dhcp.rootpath}
++ fi
++ if [ x${global.dhcp.bootfile} != x ]; then
++ kernelimage=${global.dhcp.bootfile}
++ fi
++ if [ x$global.dhcp.oftree_file} != x ]; then
++ oftreeimage=${global.dhcp_oftree_file}
++ fi
++ fi
++fi
++
++if [ x$ip = xdhcp -o ]; then
++ bootargs="$bootargs ip=dhcp"
++elif [ x$ip = xnone ]; then
++ bootargs="$bootargs ip=none"
++else
++ bootargs="$bootargs ip=$eth0.ipaddr:$eth0.serverip:$eth0.gateway:$eth0.netmask::eth0:"
++fi
++
++
++if [ x$rootfs_loc = xnet ]; then
++ bootargs="$bootargs root=/dev/nfs nfsroot=$nfsroot,v3,tcp noinitrd"
++elif [ x$rootfs_loc = xdisk ]; then
++ bootargs="$bootargs root=/dev/$rootfs_part_linux_dev rootfstype=$rootfs_type noinitrd rootwait"
++elif [ x$rootfs_loc = xinitrd ]; then
++ bootargs="$bootargs root=/dev/ram0 rdinit=/sbin/init"
++else
++ if [ x$rootfs_loc = xnand ]; then
++ rootfs_mtdblock=$rootfs_mtdblock_nand
++ else
++ rootfs_mtdblock=$rootfs_mtdblock_nor
++ fi
++
++ if [ x$rootfs_type = xubifs ]; then
++ if [ -z $ubiroot ]; then
++ ubiroot="root"
++ fi
++ bootargs="$bootargs root=ubi0:$ubiroot ubi.mtd=$rootfs_mtdblock"
++ else
++ bootargs="$bootargs root=/dev/mtdblock$rootfs_mtdblock"
++ fi
++
++ bootargs="$bootargs rootfstype=$rootfs_type noinitrd"
++fi
++
++if [ -n $nor_parts ]; then
++ mtdparts="${mtdparts}physmap-flash.0:${nor_parts}"
++fi
++
++if [ -n $nand_parts ]; then
++ if [ -n ${mtdparts} ]; then
++ mtdparts="${mtdparts};"
++ fi
++ mtdparts="${mtdparts}${nand_device}:${nand_parts}"
++fi
++
++if [ -n $mtdparts ]; then
++ bootargs="${bootargs} mtdparts=${mtdparts}"
++fi
++
++if [ -f $kernel_loc ]; then
++ kdev="$kernel_loc"
++elif [ x$kernel_loc = xnfs -o x$kernel_loc = xtftp ]; then
++ kdev=/image
++ $kernel_loc $kernelimage $kdev || exit 1
++elif [ x$kernel_loc = xnor ]; then
++ kdev="/dev/nor0.kernel"
++elif [ x$kernel_loc = xnand ]; then
++ kdev="/dev/nand0.kernel.bb"
++elif [ x$kernel_loc = xdisk ]; then
++ kdev="/dev/$kernel_part"
++else
++ echo "error: set kernel_loc to one of 'tftp', 'nfs', 'nand', 'nor' or 'disk'"
++ exit 1
++fi
++
++if [ x$oftree_loc = xnfs -o x$oftree_loc = xtftp ]; then
++ odev=/oftree
++ $oftree_loc $oftreeimage $odev || exit 1
++elif [ x$oftree_loc = xnor ]; then
++ odev="/dev/nor0.oftree"
++elif [ x$oftree_loc = xnand ]; then
++ odev="/dev/nand0.oftree.bb"
++elif [ x$oftree_loc = xdisk ]; then
++ odev="/dev/$oftree_part"
++fi
++
++[ x$odev = x ] || bootm_opt="$bootm_opt -o $odev"
++
++echo "booting kernel from $kdev"
++
++#try to execute the file
++# it does not work as example for /dev as the file is not executable
++$kdev $bootm_opt
++# fall back on bootm
++bootm $bootm_opt $kdev
+diff --git a/arch/arm/boards/beaglebone/mlo-env/config b/arch/arm/boards/beaglebone/mlo-env/config
+new file mode 100644
+index 0000000..473777a
+--- /dev/null
++++ b/arch/arm/boards/beaglebone/mlo-env/config
+@@ -0,0 +1,51 @@
++#!/bin/sh
++
++hostname=BeagleBone
++if [ -z "$user" ]; then
++# user=
++fi
++
++# use 'dhcp' to do dhcp in barebox and in kernel
++# use 'none' if you want to skip kernel ip autoconfiguration
++ip=none
++
++# or set your networking parameters here
++#eth0.ipaddr=a.b.c.d
++#eth0.netmask=a.b.c.d
++#eth0.serverip=a.b.c.d
++#eth0.gateway=a.b.c.d
++
++# can be either 'tftp', 'nfs', 'nand', 'nor' or 'disk'
++kernel_loc=/boot/uImage
++# can be either 'net', 'nand', 'nor', 'disk' or 'initrd'
++rootfs_loc=disk
++# can be either 'tftp', 'nfs', 'nand', 'nor', 'disk' or none
++oftree_loc=none
++
++# for flash based rootfs: 'jffs2' or 'ubifs'
++# in case of disk any regular filesystem like 'ext2', 'ext3', 'reiserfs'
++rootfs_type=ext4
++# where is the rootfs in case of 'rootfs_loc=disk' (linux name)
++rootfs_part_linux_dev=mmcblk0p2
++
++kernelimage=uImage-${global.hostname}
++
++bareboximage=barebox-${global.hostname}.bin
++bareboxenvimage=barebox-${global.hostname}.env
++
++if [ -n $user ]; then
++ bareboximage="$user"-"$bareboximage"
++ bareboxenvimage="$user"-"$bareboxenvimage"
++ kernelimage="$user"-"$kernelimage"
++ rootfsimage="$user"-"$rootfsimage"
++ nfsroot="/home/$user/nfsroot/${global.hostname}"
++else
++ nfsroot="/path/to/nfs/root"
++fi
++
++autoboot_timeout=3
++
++bootargs="console=ttyO0,115200n8"
++
++# set a fancy prompt (if support is compiled in)
++PS1="\e[1;32mbarebox@\e[1;31m\h:\w\e[0m "
+diff --git a/arch/arm/configs/am335x_beaglebone_defconfig b/arch/arm/configs/am335x_beaglebone_defconfig
+new file mode 100644
+index 0000000..2066d9c
+--- /dev/null
++++ b/arch/arm/configs/am335x_beaglebone_defconfig
+@@ -0,0 +1,54 @@
++CONFIG_ARCH_OMAP=y
++CONFIG_ARCH_AM33XX=y
++CONFIG_AEABI=y
++CONFIG_ARM_OPTIMZED_STRING_FUNCTIONS=y
++CONFIG_ARM_UNWIND=y
++CONFIG_MMU=y
++CONFIG_TEXT_BASE=0x81000000
++CONFIG_KALLSYMS=y
++CONFIG_PROMPT="barebox> "
++CONFIG_LONGHELP=y
++CONFIG_HUSH_FANCY_PROMPT=y
++CONFIG_CMDLINE_EDITING=y
++CONFIG_AUTO_COMPLETE=y
++CONFIG_MENU=y
++# CONFIG_TIMESTAMP is not set
++CONFIG_DEFAULT_ENVIRONMENT_GENERIC_NEW=y
++CONFIG_DEFAULT_ENVIRONMENT_PATH="arch/arm/boards/beaglebone/env"
++CONFIG_CMD_EDIT=y
++CONFIG_CMD_SLEEP=y
++CONFIG_CMD_SAVEENV=y
++CONFIG_CMD_EXPORT=y
++CONFIG_CMD_PRINTENV=y
++CONFIG_CMD_READLINE=y
++CONFIG_CMD_MENU=y
++CONFIG_CMD_MENU_MANAGEMENT=y
++CONFIG_CMD_TIME=y
++CONFIG_CMD_ECHO_E=y
++CONFIG_CMD_MEMINFO=y
++CONFIG_CMD_CRC=y
++CONFIG_CMD_CRC_CMP=y
++CONFIG_CMD_BOOTM_SHOW_TYPE=y
++CONFIG_CMD_BOOTM_VERBOSE=y
++CONFIG_CMD_BOOTM_INITRD=y
++CONFIG_CMD_BOOTM_OFTREE=y
++CONFIG_CMD_BOOTM_OFTREE_UIMAGE=y
++CONFIG_CMD_UIMAGE=y
++CONFIG_CMD_RESET=y
++CONFIG_CMD_GO=y
++CONFIG_CMD_OFTREE=y
++CONFIG_CMD_TIMEOUT=y
++CONFIG_CMD_PARTITION=y
++CONFIG_CMD_MAGICVAR=y
++CONFIG_CMD_MAGICVAR_HELP=y
++CONFIG_CMD_GPIO=y
++CONFIG_CMD_UNCOMPRESS=y
++CONFIG_DRIVER_SERIAL_NS16550=y
++CONFIG_DRIVER_SERIAL_NS16550_OMAP_EXTENSIONS=y
++# CONFIG_SPI is not set
++CONFIG_MCI=y
++CONFIG_MCI_STARTUP=y
++CONFIG_MCI_OMAP_HSMMC=y
++CONFIG_FS_FAT=y
++CONFIG_FS_FAT_WRITE=y
++CONFIG_FS_FAT_LFN=y
+diff --git a/arch/arm/configs/am335x_beaglebone_mlo_large_defconfig b/arch/arm/configs/am335x_beaglebone_mlo_large_defconfig
+new file mode 100644
+index 0000000..a2bf6c0
+--- /dev/null
++++ b/arch/arm/configs/am335x_beaglebone_mlo_large_defconfig
+@@ -0,0 +1,48 @@
++CONFIG_ARCH_OMAP=y
++CONFIG_ARCH_AM33XX=y
++CONFIG_OMAP_BUILD_IFT=y
++CONFIG_AEABI=y
++CONFIG_THUMB2_BAREBOX=y
++CONFIG_LOCALVERSION="-mlo-large"
++CONFIG_MMU=y
++CONFIG_TEXT_BASE=0x402F0400
++CONFIG_MEMORY_LAYOUT_FIXED=y
++CONFIG_STACK_BASE=0x4030B800
++CONFIG_STACK_SIZE=0x1600
++CONFIG_MALLOC_BASE=0x8F000000
++CONFIG_MALLOC_SIZE=0x1000000
++CONFIG_PROMPT="barebox mlo> "
++CONFIG_LONGHELP=y
++# CONFIG_ERRNO_MESSAGES is not set
++# CONFIG_TIMESTAMP is not set
++CONFIG_DEFAULT_ENVIRONMENT_GENERIC=y
++CONFIG_DEFAULT_ENVIRONMENT_PATH="arch/arm/boards/beaglebone/mlo-env"
++CONFIG_CMD_EXPORT=y
++# CONFIG_CMD_RM is not set
++# CONFIG_CMD_CAT is not set
++# CONFIG_CMD_RMDIR is not set
++# CONFIG_CMD_CP is not set
++# CONFIG_CMD_PWD is not set
++# CONFIG_CMD_CD is not set
++# CONFIG_CMD_UMOUNT is not set
++# CONFIG_CMD_CLEAR is not set
++CONFIG_CMD_LOADB=y
++CONFIG_CMD_LOADY=y
++CONFIG_CMD_BOOTM_SHOW_TYPE=y
++CONFIG_CMD_BOOTM_VERBOSE=y
++CONFIG_CMD_BOOTM_INITRD=y
++CONFIG_CMD_BOOTM_OFTREE=y
++CONFIG_CMD_BOOTM_OFTREE_UIMAGE=y
++# CONFIG_CMD_BOOTU is not set
++CONFIG_CMD_GO=y
++CONFIG_CMD_TIMEOUT=y
++# CONFIG_CMD_VERSION is not set
++# CONFIG_CMD_HELP is not set
++CONFIG_DRIVER_SERIAL_NS16550=y
++CONFIG_DRIVER_SERIAL_NS16550_OMAP_EXTENSIONS=y
++# CONFIG_SPI is not set
++CONFIG_MCI=y
++CONFIG_MCI_STARTUP=y
++CONFIG_MCI_OMAP_HSMMC=y
++CONFIG_FS_FAT=y
++CONFIG_FS_FAT_LFN=y
+diff --git a/arch/arm/configs/am335x_beaglebone_mlo_small_defconfig b/arch/arm/configs/am335x_beaglebone_mlo_small_defconfig
+new file mode 100644
+index 0000000..4e743b7
+--- /dev/null
++++ b/arch/arm/configs/am335x_beaglebone_mlo_small_defconfig
+@@ -0,0 +1,30 @@
++CONFIG_ARCH_OMAP=y
++CONFIG_ARCH_AM33XX=y
++CONFIG_OMAP_BUILD_IFT=y
++CONFIG_AEABI=y
++CONFIG_THUMB2_BAREBOX=y
++# CONFIG_CMD_ARM_CPUINFO is not set
++CONFIG_ENVIRONMENT_VARIABLES=y
++CONFIG_MMU=y
++CONFIG_TEXT_BASE=0x402F0400
++CONFIG_MEMORY_LAYOUT_FIXED=y
++CONFIG_STACK_BASE=0x4030B800
++CONFIG_STACK_SIZE=0x1600
++CONFIG_MALLOC_BASE=0x8F000000
++CONFIG_MALLOC_SIZE=0x1000000
++CONFIG_PROMPT="MLO>"
++CONFIG_LONGHELP=y
++CONFIG_SHELL_NONE=y
++# CONFIG_ERRNO_MESSAGES is not set
++# CONFIG_TIMESTAMP is not set
++# CONFIG_DEFAULT_ENVIRONMENT is not set
++CONFIG_DRIVER_SERIAL_NS16550=y
++CONFIG_DRIVER_SERIAL_NS16550_OMAP_EXTENSIONS=y
++# CONFIG_SPI is not set
++CONFIG_MCI=y
++CONFIG_MCI_STARTUP=y
++CONFIG_MCI_OMAP_HSMMC=y
++# CONFIG_FS_RAMFS is not set
++# CONFIG_FS_DEVFS is not set
++CONFIG_FS_FAT=y
++CONFIG_FS_FAT_LFN=y
+diff --git a/arch/arm/mach-omap/Kconfig b/arch/arm/mach-omap/Kconfig
+index ecbc417..547bd95 100644
+--- a/arch/arm/mach-omap/Kconfig
++++ b/arch/arm/mach-omap/Kconfig
+@@ -95,7 +95,8 @@ config ARCH_TEXT_BASE
+
+ config BOARDINFO
+ default "Texas Instrument's SDP343x" if MACH_OMAP343xSDP
+- default "Texas Instrument's Beagle" if MACH_BEAGLE
++ default "Texas Instrument's Beagle Board" if MACH_BEAGLE
++ default "Texas Instrument's Beagle Bone" if MACH_BEAGLEBONE
+ default "Texas Instrument's OMAP3EVM" if MACH_OMAP3EVM
+ default "Texas Instrument's Panda" if MACH_PANDA
+ default "Phytec phyCORE pcm049" if MACH_PCM049
+@@ -119,6 +120,14 @@ config MACH_BEAGLE
+ help
+ Say Y here if you are using Beagle Board
+
++config MACH_BEAGLEBONE
++ bool "Texas Instrument's Beagle Bone"
++ select OMAP_CLOCK_ALL
++ select HAVE_NOSHELL
++ depends on ARCH_AM33XX
++ help
++ Say Y here if you are using Beagle Bone
++
+ config MACH_OMAP3EVM
+ bool "Texas Instrument's OMAP3 EVM"
+ select HAVE_NOSHELL
+diff --git a/arch/arm/mach-omap/Makefile b/arch/arm/mach-omap/Makefile
+index 1e1a421..0f36a37 100644
+--- a/arch/arm/mach-omap/Makefile
++++ b/arch/arm/mach-omap/Makefile
+@@ -23,7 +23,7 @@ obj-$(CONFIG_ARCH_OMAP3) += omap3_core.o omap3_generic.o auxcr.o
+ pbl-$(CONFIG_ARCH_OMAP3) += omap3_core.o omap3_generic.o auxcr.o
+ obj-$(CONFIG_ARCH_OMAP4) += omap4_generic.o omap4_clock.o
+ pbl-$(CONFIG_ARCH_OMAP4) += omap4_generic.o omap4_clock.o
+-obj-$(CONFIG_ARCH_AM33XX) += am33xx_generic.o
++obj-$(CONFIG_ARCH_AM33XX) += am33xx_generic.o am33xx_clock.o am33xx_mux.o
+ obj-$(CONFIG_OMAP3_CLOCK_CONFIG) += omap3_clock.o
+ pbl-$(CONFIG_OMAP3_CLOCK_CONFIG) += omap3_clock.o
+ obj-$(CONFIG_OMAP_GPMC) += gpmc.o devices-gpmc-nand.o
+diff --git a/arch/arm/mach-omap/am33xx_clock.c b/arch/arm/mach-omap/am33xx_clock.c
+new file mode 100644
+index 0000000..843af9c
+--- /dev/null
++++ b/arch/arm/mach-omap/am33xx_clock.c
+@@ -0,0 +1,289 @@
++/*
++ * pll.c
++ *
++ * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.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 version 2.
++ *
++ * This program is distributed "as is" WITHOUT ANY WARRANTY of any
++ * kind, whether express or implied; without even the implied warranty
++ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ */
++#include <common.h>
++#include <asm/io.h>
++#include <mach/clocks.h>
++
++#define PRCM_MOD_EN 0x2
++#define PRCM_FORCE_WAKEUP 0x2
++
++#define PRCM_EMIF_CLK_ACTIVITY (0x1 << 2)
++#define PRCM_L3_GCLK_ACTIVITY (0x1 << 4)
++
++#define PLL_BYPASS_MODE 0x4
++#define PLL_LOCK_MODE 0x7
++#define PLL_MULTIPLIER_SHIFT 8
++
++static void interface_clocks_enable(void)
++{
++ /* Enable all the Interconnect Modules */
++ __raw_writel(PRCM_MOD_EN, CM_PER_L3_CLKCTRL);
++ while (__raw_readl(CM_PER_L3_CLKCTRL) != PRCM_MOD_EN);
++
++ __raw_writel(PRCM_MOD_EN, CM_PER_L4LS_CLKCTRL);
++ while (__raw_readl(CM_PER_L4LS_CLKCTRL) != PRCM_MOD_EN);
++
++ __raw_writel(PRCM_MOD_EN, CM_PER_L4FW_CLKCTRL);
++ while (__raw_readl(CM_PER_L4FW_CLKCTRL) != PRCM_MOD_EN);
++
++ __raw_writel(PRCM_MOD_EN, CM_WKUP_L4WKUP_CLKCTRL);
++ while (__raw_readl(CM_WKUP_L4WKUP_CLKCTRL) != PRCM_MOD_EN);
++
++ __raw_writel(PRCM_MOD_EN, CM_PER_L3_INSTR_CLKCTRL);
++ while (__raw_readl(CM_PER_L3_INSTR_CLKCTRL) != PRCM_MOD_EN);
++
++ __raw_writel(PRCM_MOD_EN, CM_PER_L4HS_CLKCTRL);
++ while (__raw_readl(CM_PER_L4HS_CLKCTRL) != PRCM_MOD_EN);
++
++ __raw_writel(PRCM_MOD_EN, CM_PER_SPI1_CLKCTRL);
++ while (__raw_readl(CM_PER_SPI1_CLKCTRL) != PRCM_MOD_EN);
++
++ /* GPIO0 */
++ __raw_writel(PRCM_MOD_EN, CM_WKUP_GPIO0_CLKCTRL);
++ while (__raw_readl(CM_WKUP_GPIO0_CLKCTRL) != PRCM_MOD_EN);
++}
++
++static void power_domain_transition_enable(void)
++{
++ /*
++ * Force power domain wake up transition
++ * Ensure that the corresponding interface clock is active before
++ * using the peripheral
++ */
++ __raw_writel(PRCM_FORCE_WAKEUP, CM_PER_L3_CLKSTCTRL);
++
++ __raw_writel(PRCM_FORCE_WAKEUP, CM_PER_L4LS_CLKSTCTRL);
++
++ __raw_writel(PRCM_FORCE_WAKEUP, CM_WKUP_CLKSTCTRL);
++
++ __raw_writel(PRCM_FORCE_WAKEUP, CM_PER_L4FW_CLKSTCTRL);
++
++ __raw_writel(PRCM_FORCE_WAKEUP, CM_PER_L3S_CLKSTCTRL);
++}
++
++/*
++ * Enable the module clock and the power domain for required peripherals
++ */
++static void per_clocks_enable(void)
++{
++ /* Enable the module clock */
++ __raw_writel(PRCM_MOD_EN, CM_PER_TIMER2_CLKCTRL);
++ while (__raw_readl(CM_PER_TIMER2_CLKCTRL) != PRCM_MOD_EN);
++
++ /* Select the Master osc 24 MHZ as Timer2 clock source */
++ __raw_writel(0x1, CLKSEL_TIMER2_CLK);
++
++ /* UART0 */
++ __raw_writel(PRCM_MOD_EN, CM_WKUP_UART0_CLKCTRL);
++ while (__raw_readl(CM_WKUP_UART0_CLKCTRL) != PRCM_MOD_EN);
++
++ /* UART3 */
++ __raw_writel(PRCM_MOD_EN, CM_PER_UART3_CLKCTRL);
++ while (__raw_readl(CM_PER_UART3_CLKCTRL) != PRCM_MOD_EN);
++
++ /* GPMC */
++ __raw_writel(PRCM_MOD_EN, CM_PER_GPMC_CLKCTRL);
++ while (__raw_readl(CM_PER_GPMC_CLKCTRL) != PRCM_MOD_EN);
++
++ /* ELM */
++ __raw_writel(PRCM_MOD_EN, CM_PER_ELM_CLKCTRL);
++ while (__raw_readl(CM_PER_ELM_CLKCTRL) != PRCM_MOD_EN);
++
++ /* i2c0 */
++ __raw_writel(PRCM_MOD_EN, CM_WKUP_I2C0_CLKCTRL);
++ while (__raw_readl(CM_WKUP_I2C0_CLKCTRL) != PRCM_MOD_EN);
++
++ /* i2c1 */
++ __raw_writel(PRCM_MOD_EN, CM_PER_I2C1_CLKCTRL);
++ while (__raw_readl(CM_PER_I2C1_CLKCTRL) != PRCM_MOD_EN);
++
++ /* i2c2 */
++ __raw_writel(PRCM_MOD_EN, CM_PER_I2C2_CLKCTRL);
++ while (__raw_readl(CM_PER_I2C2_CLKCTRL) != PRCM_MOD_EN);
++
++ /* Ethernet */
++ __raw_writel(PRCM_MOD_EN, CM_PER_CPGMAC0_CLKCTRL);
++ __raw_writel(PRCM_MOD_EN, CM_PER_CPSW_CLKSTCTRL);
++ while ((__raw_readl(CM_PER_CPGMAC0_CLKCTRL) & 0x30000) != 0x0);
++
++ /* MMC 0 & 1 */
++ __raw_writel(PRCM_MOD_EN, CM_PER_MMC0_CLKCTRL);
++ while (__raw_readl(CM_PER_MMC0_CLKCTRL) != PRCM_MOD_EN);
++ __raw_writel(PRCM_MOD_EN, CM_PER_MMC1_CLKCTRL);
++ while (__raw_readl(CM_PER_MMC1_CLKCTRL) != PRCM_MOD_EN);
++
++ /* Enable the control module though RBL would have done it*/
++ __raw_writel(PRCM_MOD_EN, CM_WKUP_CONTROL_CLKCTRL);
++ while (__raw_readl(CM_WKUP_CONTROL_CLKCTRL) != PRCM_MOD_EN);
++
++ /* SPI 0 & 1 */
++ __raw_writel(PRCM_MOD_EN, CM_PER_SPI0_CLKCTRL);
++ while (__raw_readl(CM_PER_SPI0_CLKCTRL) != PRCM_MOD_EN);
++
++ __raw_writel(PRCM_MOD_EN, CM_PER_SPI1_CLKCTRL);
++ while (__raw_readl(CM_PER_SPI1_CLKCTRL) != PRCM_MOD_EN);
++}
++
++static void mpu_pll_config(int mpupll_M)
++{
++ u32 clkmode, clksel, div_m2;
++
++ clkmode = __raw_readl(CM_CLKMODE_DPLL_MPU);
++ clksel = __raw_readl(CM_CLKSEL_DPLL_MPU);
++ div_m2 = __raw_readl(CM_DIV_M2_DPLL_MPU);
++
++ /* Set the PLL to bypass Mode */
++ __raw_writel(PLL_BYPASS_MODE, CM_CLKMODE_DPLL_MPU);
++
++ while(__raw_readl(CM_IDLEST_DPLL_MPU) != 0x00000100);
++
++ clksel = clksel & (~0x7ffff);
++ clksel = clksel | ((mpupll_M << 0x8) | MPUPLL_N);
++ __raw_writel(clksel, CM_CLKSEL_DPLL_MPU);
++
++ div_m2 = div_m2 & ~0x1f;
++ div_m2 = div_m2 | MPUPLL_M2;
++ __raw_writel(div_m2, CM_DIV_M2_DPLL_MPU);
++
++ clkmode = clkmode | 0x7;
++ __raw_writel(clkmode, CM_CLKMODE_DPLL_MPU);
++
++ while(__raw_readl(CM_IDLEST_DPLL_MPU) != 0x1);
++}
++
++static void core_pll_config(void)
++{
++ u32 clkmode, clksel, div_m4, div_m5, div_m6;
++
++ clkmode = __raw_readl(CM_CLKMODE_DPLL_CORE);
++ clksel = __raw_readl(CM_CLKSEL_DPLL_CORE);
++ div_m4 = __raw_readl(CM_DIV_M4_DPLL_CORE);
++ div_m5 = __raw_readl(CM_DIV_M5_DPLL_CORE);
++ div_m6 = __raw_readl(CM_DIV_M6_DPLL_CORE);
++
++ /* Set the PLL to bypass Mode */
++ __raw_writel(PLL_BYPASS_MODE, CM_CLKMODE_DPLL_CORE);
++
++ while(__raw_readl(CM_IDLEST_DPLL_CORE) != 0x00000100);
++
++ clksel = clksel & (~0x7ffff);
++ clksel = clksel | ((COREPLL_M << 0x8) | COREPLL_N);
++ __raw_writel(clksel, CM_CLKSEL_DPLL_CORE);
++
++ div_m4 = div_m4 & ~0x1f;
++ div_m4 = div_m4 | COREPLL_M4;
++ __raw_writel(div_m4, CM_DIV_M4_DPLL_CORE);
++
++ div_m5 = div_m5 & ~0x1f;
++ div_m5 = div_m5 | COREPLL_M5;
++ __raw_writel(div_m5, CM_DIV_M5_DPLL_CORE);
++
++ div_m6 = div_m6 & ~0x1f;
++ div_m6 = div_m6 | COREPLL_M6;
++ __raw_writel(div_m6, CM_DIV_M6_DPLL_CORE);
++
++
++ clkmode = clkmode | 0x7;
++ __raw_writel(clkmode, CM_CLKMODE_DPLL_CORE);
++
++ while(__raw_readl(CM_IDLEST_DPLL_CORE) != 0x1);
++}
++
++static void per_pll_config(void)
++{
++ u32 clkmode, clksel, div_m2;
++
++ clkmode = __raw_readl(CM_CLKMODE_DPLL_PER);
++ clksel = __raw_readl(CM_CLKSEL_DPLL_PER);
++ div_m2 = __raw_readl(CM_DIV_M2_DPLL_PER);
++
++ /* Set the PLL to bypass Mode */
++ __raw_writel(PLL_BYPASS_MODE, CM_CLKMODE_DPLL_PER);
++
++ while(__raw_readl(CM_IDLEST_DPLL_PER) != 0x00000100);
++
++ clksel = clksel & (~0x7ffff);
++ clksel = clksel | ((PERPLL_M << 0x8) | PERPLL_N);
++ __raw_writel(clksel, CM_CLKSEL_DPLL_PER);
++
++ div_m2 = div_m2 & ~0x7f;
++ div_m2 = div_m2 | PERPLL_M2;
++ __raw_writel(div_m2, CM_DIV_M2_DPLL_PER);
++
++ clkmode = clkmode | 0x7;
++ __raw_writel(clkmode, CM_CLKMODE_DPLL_PER);
++
++ while(__raw_readl(CM_IDLEST_DPLL_PER) != 0x1);
++}
++
++static void ddr_pll_config(void)
++{
++ u32 clkmode, clksel, div_m2;
++
++ clkmode = __raw_readl(CM_CLKMODE_DPLL_DDR);
++ clksel = __raw_readl(CM_CLKSEL_DPLL_DDR);
++ div_m2 = __raw_readl(CM_DIV_M2_DPLL_DDR);
++
++ /* Set the PLL to bypass Mode */
++ clkmode = (clkmode & 0xfffffff8) | 0x00000004;
++ __raw_writel(clkmode, CM_CLKMODE_DPLL_DDR);
++
++ while ((__raw_readl(CM_IDLEST_DPLL_DDR) & 0x00000100) != 0x00000100);
++
++ clksel = clksel & (~0x7ffff);
++ clksel = clksel | ((DDRPLL_M << 0x8) | DDRPLL_N);
++ __raw_writel(clksel, CM_CLKSEL_DPLL_DDR);
++
++ div_m2 = div_m2 & 0xFFFFFFE0;
++ div_m2 = div_m2 | DDRPLL_M2;
++ __raw_writel(div_m2, CM_DIV_M2_DPLL_DDR);
++
++ clkmode = (clkmode & 0xfffffff8) | 0x7;
++ __raw_writel(clkmode, CM_CLKMODE_DPLL_DDR);
++
++ while ((__raw_readl(CM_IDLEST_DPLL_DDR) & 0x00000001) != 0x1);
++}
++
++void enable_ddr_clocks(void)
++{
++ /* Enable the EMIF_FW Functional clock */
++ __raw_writel(PRCM_MOD_EN, CM_PER_EMIF_FW_CLKCTRL);
++ /* Enable EMIF0 Clock */
++ __raw_writel(PRCM_MOD_EN, CM_PER_EMIF_CLKCTRL);
++ /* Poll for emif_gclk & L3_G clock are active */
++ while ((__raw_readl(CM_PER_L3_CLKSTCTRL) & (PRCM_EMIF_CLK_ACTIVITY |
++ PRCM_L3_GCLK_ACTIVITY)) != (PRCM_EMIF_CLK_ACTIVITY |
++ PRCM_L3_GCLK_ACTIVITY));
++ /* Poll if module is functional */
++ while ((__raw_readl(CM_PER_EMIF_CLKCTRL)) != PRCM_MOD_EN);
++
++}
++
++/*
++ * Configure the PLL/PRCM for necessary peripherals
++ */
++void pll_init()
++{
++ mpu_pll_config(MPUPLL_M_500);
++ core_pll_config();
++ per_pll_config();
++ ddr_pll_config();
++ /* Enable the required interconnect clocks */
++ interface_clocks_enable();
++ /* Enable power domain transition */
++ power_domain_transition_enable();
++ /* Enable the required peripherals */
++ per_clocks_enable();
++}
+diff --git a/arch/arm/mach-omap/am33xx_generic.c b/arch/arm/mach-omap/am33xx_generic.c
+index ba08773..37166e2 100644
+--- a/arch/arm/mach-omap/am33xx_generic.c
++++ b/arch/arm/mach-omap/am33xx_generic.c
+@@ -20,6 +20,7 @@
+ #include <io.h>
+ #include <mach/silicon.h>
+ #include <mach/clocks.h>
++#include <mach/sys_info.h>
+
+ void __noreturn reset_cpu(unsigned long addr)
+ {
+@@ -27,3 +28,66 @@ void __noreturn reset_cpu(unsigned long addr)
+
+ while (1);
+ }
++
++/* TODO consolidate with omap3_generic.c */
++
++/**
++ * @brief Get the upper address of current execution
++ *
++ * we can use this to figure out if we are running in SRAM /
++ * XIP Flash or in SDRAM
++ *
++ * @return base address
++ */
++u32 get_base(void)
++{
++ u32 val;
++ __asm__ __volatile__("mov %0, pc \n":"=r"(val)::"memory");
++ val &= 0xF0000000;
++ val >>= 28;
++ return val;
++}
++
++/**
++ * @brief Are we running in Flash XIP?
++ *
++ * If the base is in GPMC address space, we probably are!
++ *
++ * @return 1 if we are running in XIP mode, else return 0
++ */
++u32 running_in_flash(void)
++{
++ if (get_base() < 4)
++ return 1; /* in flash */
++ return 0; /* running in SRAM or SDRAM */
++}
++
++/**
++ * @brief Are we running in OMAP internal SRAM?
++ *
++ * If in SRAM address, then yes!
++ *
++ * @return 1 if we are running in SRAM, else return 0
++ */
++u32 running_in_sram(void)
++{
++ if (get_base() == 4)
++ return 1; /* in SRAM */
++ return 0; /* running in FLASH or SDRAM */
++}
++
++/**
++ * @brief Are we running in SDRAM?
++ *
++ * if we are not in GPMC nor in SRAM address space,
++ * we are in SDRAM execution area
++ *
++ * @return 1 if we are running from SDRAM, else return 0
++ */
++u32 running_in_sdram(void)
++{
++ if (get_base() > 4)
++ return 1; /* in sdram */
++ return 0; /* running in SRAM or FLASH */
++}
++
+diff --git a/arch/arm/mach-omap/am33xx_mux.c b/arch/arm/mach-omap/am33xx_mux.c
+new file mode 100644
+index 0000000..db841aa
+--- /dev/null
++++ b/arch/arm/mach-omap/am33xx_mux.c
+@@ -0,0 +1,497 @@
++/*
++ * mux.c
++ *
++ * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.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 version 2.
++ *
++ * This program is distributed "as is" WITHOUT ANY WARRANTY of any
++ * kind, whether express or implied; without even the implied warranty
++ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ */
++#include <common.h>
++#include <config.h>
++#include <asm/io.h>
++#include <mach/silicon.h>
++
++#define MUX_CFG(value, offset) \
++ __raw_writel(value, (OMAP_CTRL_BASE + offset));
++
++/* PAD Control Fields */
++#define SLEWCTRL (0x1 << 6)
++#define RXACTIVE (0x1 << 5)
++#define PULLUP_EN (0x1 << 4) /* Pull UP Selection */
++#define PULLUDEN (0x0 << 3) /* Pull up enabled */
++#define PULLUDDIS (0x1 << 3) /* Pull up disabled */
++#define MODE(val) val
++
++/*
++ * PAD CONTROL OFFSETS
++ * Field names corresponds to the pad signal name
++ */
++/* TODO replace with defines */
++struct pad_signals {
++ int gpmc_ad0;
++ int gpmc_ad1;
++ int gpmc_ad2;
++ int gpmc_ad3;
++ int gpmc_ad4;
++ int gpmc_ad5;
++ int gpmc_ad6;
++ int gpmc_ad7;
++ int gpmc_ad8;
++ int gpmc_ad9;
++ int gpmc_ad10;
++ int gpmc_ad11;
++ int gpmc_ad12;
++ int gpmc_ad13;
++ int gpmc_ad14;
++ int gpmc_ad15;
++ int gpmc_a0;
++ int gpmc_a1;
++ int gpmc_a2;
++ int gpmc_a3;
++ int gpmc_a4;
++ int gpmc_a5;
++ int gpmc_a6;
++ int gpmc_a7;
++ int gpmc_a8;
++ int gpmc_a9;
++ int gpmc_a10;
++ int gpmc_a11;
++ int gpmc_wait0;
++ int gpmc_wpn;
++ int gpmc_be1n;
++ int gpmc_csn0;
++ int gpmc_csn1;
++ int gpmc_csn2;
++ int gpmc_csn3;
++ int gpmc_clk;
++ int gpmc_advn_ale;
++ int gpmc_oen_ren;
++ int gpmc_wen;
++ int gpmc_be0n_cle;
++ int lcd_data0;
++ int lcd_data1;
++ int lcd_data2;
++ int lcd_data3;
++ int lcd_data4;
++ int lcd_data5;
++ int lcd_data6;
++ int lcd_data7;
++ int lcd_data8;
++ int lcd_data9;
++ int lcd_data10;
++ int lcd_data11;
++ int lcd_data12;
++ int lcd_data13;
++ int lcd_data14;
++ int lcd_data15;
++ int lcd_vsync;
++ int lcd_hsync;
++ int lcd_pclk;
++ int lcd_ac_bias_en;
++ int mmc0_dat3;
++ int mmc0_dat2;
++ int mmc0_dat1;
++ int mmc0_dat0;
++ int mmc0_clk;
++ int mmc0_cmd;
++ int mii1_col;
++ int mii1_crs;
++ int mii1_rxerr;
++ int mii1_txen;
++ int mii1_rxdv;
++ int mii1_txd3;
++ int mii1_txd2;
++ int mii1_txd1;
++ int mii1_txd0;
++ int mii1_txclk;
++ int mii1_rxclk;
++ int mii1_rxd3;
++ int mii1_rxd2;
++ int mii1_rxd1;
++ int mii1_rxd0;
++ int rmii1_refclk;
++ int mdio_data;
++ int mdio_clk;
++ int spi0_sclk;
++ int spi0_d0;
++ int spi0_d1;
++ int spi0_cs0;
++ int spi0_cs1;
++ int ecap0_in_pwm0_out;
++ int uart0_ctsn;
++ int uart0_rtsn;
++ int uart0_rxd;
++ int uart0_txd;
++ int uart1_ctsn;
++ int uart1_rtsn;
++ int uart1_rxd;
++ int uart1_txd;
++ int i2c0_sda;
++ int i2c0_scl;
++ int mcasp0_aclkx;
++ int mcasp0_fsx;
++ int mcasp0_axr0;
++ int mcasp0_ahclkr;
++ int mcasp0_aclkr;
++ int mcasp0_fsr;
++ int mcasp0_axr1;
++ int mcasp0_ahclkx;
++ int xdma_event_intr0;
++ int xdma_event_intr1;
++ int nresetin_out;
++ int porz;
++ int nnmi;
++ int osc0_in;
++ int osc0_out;
++ int rsvd1;
++ int tms;
++ int tdi;
++ int tdo;
++ int tck;
++ int ntrst;
++ int emu0;
++ int emu1;
++ int osc1_in;
++ int osc1_out;
++ int pmic_power_en;
++ int rtc_porz;
++ int rsvd2;
++ int ext_wakeup;
++ int enz_kaldo_1p8v;
++ int usb0_dm;
++ int usb0_dp;
++ int usb0_ce;
++ int usb0_id;
++ int usb0_vbus;
++ int usb0_drvvbus;
++ int usb1_dm;
++ int usb1_dp;
++ int usb1_ce;
++ int usb1_id;
++ int usb1_vbus;
++ int usb1_drvvbus;
++ int ddr_resetn;
++ int ddr_csn0;
++ int ddr_cke;
++ int ddr_ck;
++ int ddr_nck;
++ int ddr_casn;
++ int ddr_rasn;
++ int ddr_wen;
++ int ddr_ba0;
++ int ddr_ba1;
++ int ddr_ba2;
++ int ddr_a0;
++ int ddr_a1;
++ int ddr_a2;
++ int ddr_a3;
++ int ddr_a4;
++ int ddr_a5;
++ int ddr_a6;
++ int ddr_a7;
++ int ddr_a8;
++ int ddr_a9;
++ int ddr_a10;
++ int ddr_a11;
++ int ddr_a12;
++ int ddr_a13;
++ int ddr_a14;
++ int ddr_a15;
++ int ddr_odt;
++ int ddr_d0;
++ int ddr_d1;
++ int ddr_d2;
++ int ddr_d3;
++ int ddr_d4;
++ int ddr_d5;
++ int ddr_d6;
++ int ddr_d7;
++ int ddr_d8;
++ int ddr_d9;
++ int ddr_d10;
++ int ddr_d11;
++ int ddr_d12;
++ int ddr_d13;
++ int ddr_d14;
++ int ddr_d15;
++ int ddr_dqm0;
++ int ddr_dqm1;
++ int ddr_dqs0;
++ int ddr_dqsn0;
++ int ddr_dqs1;
++ int ddr_dqsn1;
++ int ddr_vref;
++ int ddr_vtp;
++ int ddr_strben0;
++ int ddr_strben1;
++ int ain7;
++ int ain6;
++ int ain5;
++ int ain4;
++ int ain3;
++ int ain2;
++ int ain1;
++ int ain0;
++ int vrefp;
++ int vrefn;
++};
++
++struct module_pin_mux {
++ short reg_offset;
++ unsigned char val;
++};
++
++#define PAD_CTRL_BASE 0x800
++#define OFFSET(x) (unsigned int) (&((struct pad_signals *) \
++ (PAD_CTRL_BASE))->x)
++
++static struct module_pin_mux uart0_pin_mux[] = {
++ {OFFSET(uart0_rxd), (MODE(0) | PULLUP_EN | RXACTIVE)}, /* UART0_RXD */
++ {OFFSET(uart0_txd), (MODE(0) | PULLUDEN)}, /* UART0_TXD */
++ {-1},
++};
++
++static struct module_pin_mux uart3_pin_mux[] = {
++ {OFFSET(spi0_cs1), (MODE(1) | PULLUDEN | RXACTIVE)}, /* UART3_RXD */
++ {OFFSET(ecap0_in_pwm0_out), (MODE(1) | PULLUDEN)}, /* UART3_TXD */
++ {-1},
++};
++
++
++#ifdef CONFIG_NAND
++static struct module_pin_mux nand_pin_mux[] = {
++ {OFFSET(gpmc_ad0), (MODE(0) | PULLUP_EN | RXACTIVE)}, /* NAND AD0 */
++ {OFFSET(gpmc_ad1), (MODE(0) | PULLUP_EN | RXACTIVE)}, /* NAND AD1 */
++ {OFFSET(gpmc_ad2), (MODE(0) | PULLUP_EN | RXACTIVE)}, /* NAND AD2 */
++ {OFFSET(gpmc_ad3), (MODE(0) | PULLUP_EN | RXACTIVE)}, /* NAND AD3 */
++ {OFFSET(gpmc_ad4), (MODE(0) | PULLUP_EN | RXACTIVE)}, /* NAND AD4 */
++ {OFFSET(gpmc_ad5), (MODE(0) | PULLUP_EN | RXACTIVE)}, /* NAND AD5 */
++ {OFFSET(gpmc_ad6), (MODE(0) | PULLUP_EN | RXACTIVE)}, /* NAND AD6 */
++ {OFFSET(gpmc_ad7), (MODE(0) | PULLUP_EN | RXACTIVE)}, /* NAND AD7 */
++ {OFFSET(gpmc_wait0), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* NAND WAIT */
++ {OFFSET(gpmc_wpn), (MODE(7) | PULLUP_EN | RXACTIVE)}, /* NAND_WPN */
++ {OFFSET(gpmc_csn0), (MODE(0) | PULLUDEN)}, /* NAND_CS0 */
++ {OFFSET(gpmc_advn_ale), (MODE(0) | PULLUDEN)}, /* NAND_ADV_ALE */
++ {OFFSET(gpmc_oen_ren), (MODE(0) | PULLUDEN)}, /* NAND_OE */
++ {OFFSET(gpmc_wen), (MODE(0) | PULLUDEN)}, /* NAND_WEN */
++ {OFFSET(gpmc_be0n_cle), (MODE(0) | PULLUDEN)}, /* NAND_BE_CLE */
++ {-1},
++};
++#endif
++
++static struct module_pin_mux i2c0_pin_mux[] = {
++ {OFFSET(i2c0_sda), (MODE(0) | RXACTIVE | PULLUDEN | SLEWCTRL)}, /* I2C_DATA */
++ {OFFSET(i2c0_scl), (MODE(0) | RXACTIVE | PULLUDEN | SLEWCTRL)}, /* I2C_SCLK */
++ {-1},
++};
++
++static struct module_pin_mux i2c1_pin_mux[] = {
++ {OFFSET(spi0_d1), (MODE(2) | RXACTIVE | PULLUDEN | SLEWCTRL)}, /* I2C_DATA */
++ {OFFSET(spi0_cs0), (MODE(2) | RXACTIVE | PULLUDEN | SLEWCTRL)}, /* I2C_SCLK */
++ {-1},
++};
++
++static struct module_pin_mux i2c2_pin_mux[] = {
++ {OFFSET(uart1_ctsn), (MODE(3) | RXACTIVE | PULLUDEN | SLEWCTRL)}, /* I2C_DATA */
++ {OFFSET(uart1_rtsn), (MODE(3) | RXACTIVE | PULLUDEN | SLEWCTRL)}, /* I2C_SCLK */
++ {-1},
++};
++
++#ifndef CONFIG_NO_ETH
++static struct module_pin_mux rgmii1_pin_mux[] = {
++ {OFFSET(mii1_txen), MODE(2)}, /* RGMII1_TCTL */
++ {OFFSET(mii1_rxdv), MODE(2) | RXACTIVE}, /* RGMII1_RCTL */
++ {OFFSET(mii1_txd3), MODE(2)}, /* RGMII1_TD3 */
++ {OFFSET(mii1_txd2), MODE(2)}, /* RGMII1_TD2 */
++ {OFFSET(mii1_txd1), MODE(2)}, /* RGMII1_TD1 */
++ {OFFSET(mii1_txd0), MODE(2)}, /* RGMII1_TD0 */
++ {OFFSET(mii1_txclk), MODE(2)}, /* RGMII1_TCLK */
++ {OFFSET(mii1_rxclk), MODE(2) | RXACTIVE}, /* RGMII1_RCLK */
++ {OFFSET(mii1_rxd3), MODE(2) | RXACTIVE}, /* RGMII1_RD3 */
++ {OFFSET(mii1_rxd2), MODE(2) | RXACTIVE}, /* RGMII1_RD2 */
++ {OFFSET(mii1_rxd1), MODE(2) | RXACTIVE}, /* RGMII1_RD1 */
++ {OFFSET(mii1_rxd0), MODE(2) | RXACTIVE}, /* RGMII1_RD0 */
++ {OFFSET(mdio_data), MODE(0) | RXACTIVE | PULLUP_EN}, /* MDIO_DATA */
++ {OFFSET(mdio_clk), MODE(0) | PULLUP_EN}, /* MDIO_CLK */
++ {-1},
++};
++
++static struct module_pin_mux rgmii2_pin_mux[] = {
++ {OFFSET(gpmc_a0), MODE(2)}, /* RGMII2_TCTL */
++ {OFFSET(gpmc_a1), MODE(2) | RXACTIVE}, /* RGMII2_RCTL */
++ {OFFSET(gpmc_a2), MODE(2)}, /* RGMII2_TD3 */
++ {OFFSET(gpmc_a3), MODE(2)}, /* RGMII2_TD2 */
++ {OFFSET(gpmc_a4), MODE(2)}, /* RGMII2_TD1 */
++ {OFFSET(gpmc_a5), MODE(2)}, /* RGMII2_TD0 */
++ {OFFSET(gpmc_a6), MODE(2)}, /* RGMII2_TCLK */
++ {OFFSET(gpmc_a7), MODE(2) | RXACTIVE}, /* RGMII2_RCLK */
++ {OFFSET(gpmc_a8), MODE(2) | RXACTIVE}, /* RGMII2_RD3 */
++ {OFFSET(gpmc_a9), MODE(2) | RXACTIVE}, /* RGMII2_RD2 */
++ {OFFSET(gpmc_a10), MODE(2) | RXACTIVE}, /* RGMII2_RD1 */
++ {OFFSET(gpmc_a11), MODE(2) | RXACTIVE}, /* RGMII2_RD0 */
++ {OFFSET(mdio_data), MODE(0) | RXACTIVE | PULLUP_EN}, /* MDIO_DATA */
++ {OFFSET(mdio_clk), MODE(0) | PULLUP_EN}, /* MDIO_CLK */
++ {-1},
++};
++
++static struct module_pin_mux mii1_pin_mux[] = {
++ {OFFSET(mii1_rxerr), MODE(0) | RXACTIVE}, /* MII1_RXERR */
++ {OFFSET(mii1_txen), MODE(0)}, /* MII1_TXEN */
++ {OFFSET(mii1_rxdv), MODE(0) | RXACTIVE}, /* MII1_RXDV */
++ {OFFSET(mii1_txd3), MODE(0)}, /* MII1_TXD3 */
++ {OFFSET(mii1_txd2), MODE(0)}, /* MII1_TXD2 */
++ {OFFSET(mii1_txd1), MODE(0)}, /* MII1_TXD1 */
++ {OFFSET(mii1_txd0), MODE(0)}, /* MII1_TXD0 */
++ {OFFSET(mii1_txclk), MODE(0) | RXACTIVE}, /* MII1_TXCLK */
++ {OFFSET(mii1_rxclk), MODE(0) | RXACTIVE}, /* MII1_RXCLK */
++ {OFFSET(mii1_rxd3), MODE(0) | RXACTIVE}, /* MII1_RXD3 */
++ {OFFSET(mii1_rxd2), MODE(0) | RXACTIVE}, /* MII1_RXD2 */
++ {OFFSET(mii1_rxd1), MODE(0) | RXACTIVE}, /* MII1_RXD1 */
++ {OFFSET(mii1_rxd0), MODE(0) | RXACTIVE}, /* MII1_RXD0 */
++ {OFFSET(mdio_data), MODE(0) | RXACTIVE | PULLUP_EN}, /* MDIO_DATA */
++ {OFFSET(mdio_clk), MODE(0) | PULLUP_EN}, /* MDIO_CLK */
++ {-1},
++};
++
++static struct module_pin_mux rmii1_pin_mux[] = {
++ {OFFSET(mii1_crs), MODE(1) | RXACTIVE}, /* RMII1_CRS */
++ {OFFSET(mii1_rxerr), MODE(1) | RXACTIVE}, /* RMII1_RXERR */
++ {OFFSET(mii1_txen), MODE(1)}, /* RMII1_TXEN */
++ {OFFSET(mii1_txd1), MODE(1)}, /* RMII1_TXD1 */
++ {OFFSET(mii1_txd0), MODE(1)}, /* RMII1_TXD0 */
++ {OFFSET(mii1_rxd1), MODE(1) | RXACTIVE}, /* RMII1_RXD1 */
++ {OFFSET(mii1_rxd0), MODE(1) | RXACTIVE}, /* RMII1_RXD0 */
++ {OFFSET(mdio_data), MODE(0) | RXACTIVE | PULLUP_EN}, /* MDIO_DATA */
++ {OFFSET(mdio_clk), MODE(0) | PULLUP_EN}, /* MDIO_CLK */
++ {OFFSET(rmii1_refclk), MODE(0) | RXACTIVE}, /* RMII1_REFCLK */
++ {-1},
++};
++#endif
++
++#ifdef CONFIG_NOR
++static struct module_pin_mux nor_pin_mux[] = {
++ {OFFSET(lcd_data0), MODE(1) | PULLUDEN}, /* NOR_A0 */
++ {OFFSET(lcd_data1), MODE(1) | PULLUDEN}, /* NOR_A1 */
++ {OFFSET(lcd_data2), MODE(1) | PULLUDEN}, /* NOR_A2 */
++ {OFFSET(lcd_data3), MODE(1) | PULLUDEN}, /* NOR_A3 */
++ {OFFSET(lcd_data4), MODE(1) | PULLUDEN}, /* NOR_A4 */
++ {OFFSET(lcd_data5), MODE(1) | PULLUDEN}, /* NOR_A5 */
++ {OFFSET(lcd_data6), MODE(1) | PULLUDEN}, /* NOR_A6 */
++ {OFFSET(lcd_data7), MODE(1) | PULLUDEN}, /* NOR_A7 */
++ {OFFSET(gpmc_a8), MODE(0)}, /* NOR_A8 */
++ {OFFSET(gpmc_a9), MODE(0)}, /* NOR_A9 */
++ {OFFSET(gpmc_a10), MODE(0)}, /* NOR_A10 */
++ {OFFSET(gpmc_a11), MODE(0)}, /* NOR_A11 */
++ {OFFSET(lcd_data8), MODE(1) | PULLUDEN}, /* NOR_A12 */
++ {OFFSET(lcd_data9), MODE(1) | PULLUDEN}, /* NOR_A13 */
++ {OFFSET(lcd_data10), MODE(1) | PULLUDEN}, /* NOR_A14 */
++ {OFFSET(lcd_data11), MODE(1) | PULLUDEN}, /* NOR_A15 */
++ {OFFSET(lcd_data12), MODE(1) | PULLUDEN}, /* NOR_A16 */
++ {OFFSET(lcd_data13), MODE(1) | PULLUDEN}, /* NOR_A17 */
++ {OFFSET(lcd_data14), MODE(1) | PULLUDEN}, /* NOR_A18 */
++ {OFFSET(lcd_data15), MODE(1) | PULLUDEN}, /* NOR_A19 */
++ {OFFSET(gpmc_a4), MODE(4)}, /* NOR_A20 */
++ {OFFSET(gpmc_a5), MODE(4)}, /* NOR_A21 */
++ {OFFSET(gpmc_a6), MODE(4)}, /* NOR_A22 */
++ {OFFSET(gpmc_ad0), MODE(0) | RXACTIVE}, /* NOR_AD0 */
++ {OFFSET(gpmc_ad1), MODE(0) | RXACTIVE}, /* NOR_AD1 */
++ {OFFSET(gpmc_ad2), MODE(0) | RXACTIVE}, /* NOR_AD2 */
++ {OFFSET(gpmc_ad3), MODE(0) | RXACTIVE}, /* NOR_AD3 */
++ {OFFSET(gpmc_ad4), MODE(0) | RXACTIVE}, /* NOR_AD4 */
++ {OFFSET(gpmc_ad5), MODE(0) | RXACTIVE}, /* NOR_AD5 */
++ {OFFSET(gpmc_ad6), MODE(0) | RXACTIVE}, /* NOR_AD6 */
++ {OFFSET(gpmc_ad7), MODE(0) | RXACTIVE}, /* NOR_AD7 */
++ {OFFSET(gpmc_ad8), MODE(0) | RXACTIVE}, /* NOR_AD8 */
++ {OFFSET(gpmc_ad9), MODE(0) | RXACTIVE}, /* NOR_AD9 */
++ {OFFSET(gpmc_ad10), MODE(0) | RXACTIVE}, /* NOR_AD10 */
++ {OFFSET(gpmc_ad11), MODE(0) | RXACTIVE}, /* NOR_AD11 */
++ {OFFSET(gpmc_ad12), MODE(0) | RXACTIVE}, /* NOR_AD12 */
++ {OFFSET(gpmc_ad13), MODE(0) | RXACTIVE}, /* NOR_AD13 */
++ {OFFSET(gpmc_ad14), MODE(0) | RXACTIVE}, /* NOR_AD14 */
++ {OFFSET(gpmc_ad15), MODE(0) | RXACTIVE}, /* NOR_AD15 */
++ {OFFSET(gpmc_csn0), (MODE(0) | PULLUP_EN)}, /* NOR_CE */
++ {OFFSET(gpmc_oen_ren), (MODE(0) | PULLUP_EN)}, /* NOR_OE */
++ {OFFSET(gpmc_wen), (MODE(0) | PULLUP_EN)}, /* NOR_WEN */
++ {OFFSET(gpmc_wait0), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* NOR WAIT */
++ {OFFSET(lcd_ac_bias_en), MODE(7) | RXACTIVE | PULLUDEN}, /* NOR RESET */
++ {-1},
++};
++#endif
++
++#ifdef CONFIG_MMC
++static struct module_pin_mux mmc0_pin_mux[] = {
++ {OFFSET(mmc0_dat3), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_DAT3 */
++ {OFFSET(mmc0_dat2), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_DAT2 */
++ {OFFSET(mmc0_dat1), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_DAT1 */
++ {OFFSET(mmc0_dat0), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_DAT0 */
++ {OFFSET(mmc0_clk), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_CLK */
++ {OFFSET(mmc0_cmd), (MODE(0) | RXACTIVE | PULLUP_EN)}, /* MMC0_CMD */
++ {OFFSET(mcasp0_aclkr), (MODE(4) | RXACTIVE)}, /* MMC0_WP */
++ {OFFSET(spi0_cs1), (MODE(5) | RXACTIVE | PULLUP_EN)}, /* MMC0_CD */
++ {-1},
++};
++
++static struct module_pin_mux mmc1_pin_mux[] = {
++ {OFFSET(gpmc_ad3), (MODE(1) | RXACTIVE)}, /* MMC1_DAT3 */
++ {OFFSET(gpmc_ad2), (MODE(1) | RXACTIVE)}, /* MMC1_DAT2 */
++ {OFFSET(gpmc_ad1), (MODE(1) | RXACTIVE)}, /* MMC1_DAT1 */
++ {OFFSET(gpmc_ad0), (MODE(1) | RXACTIVE)}, /* MMC1_DAT0 */
++ {OFFSET(gpmc_csn1), (MODE(2) | RXACTIVE | PULLUP_EN)}, /* MMC1_CLK */
++ {OFFSET(gpmc_csn2), (MODE(2) | RXACTIVE | PULLUP_EN)}, /* MMC1_CMD */
++ {OFFSET(uart1_rxd), (MODE(1) | RXACTIVE | PULLUP_EN)}, /* MMC1_WP */
++ {OFFSET(mcasp0_fsx), (MODE(4) | RXACTIVE)}, /* MMC1_CD */
++ {-1},
++};
++#endif
++
++#ifdef CONFIG_SPI
++static struct module_pin_mux spi0_pin_mux[] = {
++ {OFFSET(spi0_sclk), MODE(0) | PULLUDEN | RXACTIVE}, /*SPI0_SCLK */
++ {OFFSET(spi0_d0), MODE(0) | PULLUDEN | PULLUP_EN |
++ RXACTIVE}, /*SPI0_D0 */
++ {OFFSET(spi0_d1), MODE(0) | PULLUDEN |
++ RXACTIVE}, /*SPI0_D1 */
++ {OFFSET(spi0_cs0), MODE(0) | PULLUDEN | PULLUP_EN | RXACTIVE}, /*SPI0_CS0 */
++ {-1},
++};
++
++static struct module_pin_mux spi1_pin_mux[] = {
++ {OFFSET(mcasp0_aclkx), MODE(3) | PULLUDEN | RXACTIVE}, /*SPI0_SCLK */
++ {OFFSET(mcasp0_fsx), MODE(3) | PULLUDEN | PULLUP_EN |
++ RXACTIVE}, /*SPI0_D0 */
++ {OFFSET(mcasp0_axr0), MODE(3) | PULLUDEN | RXACTIVE}, /*SPI0_D1 */
++ {OFFSET(mcasp0_ahclkr), MODE(3) | PULLUDEN | PULLUP_EN |
++ RXACTIVE}, /*SPI0_CS0 */
++ {-1},
++};
++#endif
++
++/*
++ * Configure the pin mux for the module
++ */
++static void configure_module_pin_mux(struct module_pin_mux *mod_pin_mux)
++{
++ int i;
++
++ if (!mod_pin_mux)
++ return;
++
++ for (i = 0; mod_pin_mux[i].reg_offset != -1; i++)
++ MUX_CFG(mod_pin_mux[i].val, mod_pin_mux[i].reg_offset);
++}
++
++void enable_mii1_pin_mux(void)
++{
++ configure_module_pin_mux(mii1_pin_mux);
++}
++
++void enable_uart0_pin_mux(void)
++{
++ configure_module_pin_mux(uart0_pin_mux);
++}
+diff --git a/arch/arm/mach-omap/include/mach/am33xx-clock.h b/arch/arm/mach-omap/include/mach/am33xx-clock.h
+index 654c104..f9bfd36 100644
+--- a/arch/arm/mach-omap/include/mach/am33xx-clock.h
++++ b/arch/arm/mach-omap/include/mach/am33xx-clock.h
+@@ -19,7 +19,179 @@
+ #ifndef _AM33XX_CLOCKS_H_
+ #define _AM33XX_CLOCKS_H_
+
++#include "am33xx-silicon.h"
++
+ /** PRM Clock Regs */
+ #define PRM_RSTCTRL 0x0f00
+
++/* Put the pll config values over here */
++
++#define OSC 24
++
++/* MAIN PLL Fdll = 1 GHZ, */
++#define MPUPLL_M_500 500 /* 125 * n */
++#define MPUPLL_M_550 550 /* 125 * n */
++#define MPUPLL_M_600 600 /* 125 * n */
++#define MPUPLL_M_720 720 /* 125 * n */
++
++#define MPUPLL_N 23 /* (n -1 ) */
++#define MPUPLL_M2 1
++
++/* Core PLL Fdll = 1 GHZ, */
++#define COREPLL_M 1000 /* 125 * n */
++#define COREPLL_N 23 /* (n -1 ) */
++
++#define COREPLL_M4 10 /* CORE_CLKOUTM4 = 200 MHZ */
++#define COREPLL_M5 8 /* CORE_CLKOUTM5 = 250 MHZ */
++#define COREPLL_M6 4 /* CORE_CLKOUTM6 = 500 MHZ */
++
++/*
++ * USB PHY clock is 960 MHZ. Since, this comes directly from Fdll, Fdll
++ * frequency needs to be set to 960 MHZ. Hence,
++ * For clkout = 192 MHZ, Fdll = 960 MHZ, divider values are given below
++ */
++#define PERPLL_M 960
++#define PERPLL_N 23
++#define PERPLL_M2 5
++
++/* DDR Freq is 166 MHZ for now*/
++/* Set Fdll = 400 MHZ , Fdll = M * 2 * CLKINP/ N + 1; clkout = Fdll /(2 * M2) */
++//#if (CONFIG_AM335X_EVM_IS_13x13 == 1)
++#if 0
++#define DDRPLL_M 166 /* M/N + 1 = 25/3 */
++#else
++#define DDRPLL_M 266
++#endif
++
++#define DDRPLL_N 23
++#define DDRPLL_M2 1
++
++/* PRCM */
++/* Module Offsets */
++#define CM_PER (OMAP_PRM_BASE + 0x0)
++#define CM_WKUP (OMAP_PRM_BASE + 0x400)
++#define CM_DPLL (OMAP_PRM_BASE + 0x500)
++#define CM_DEVICE (OMAP_PRM_BASE + 0x0700)
++#define CM_CEFUSE (OMAP_PRM_BASE + 0x0A00)
++#define PRM_DEVICE (OMAP_PRM_BASE + 0x0F00)
++/* Register Offsets */
++/* Core PLL ADPLLS */
++#define CM_CLKSEL_DPLL_CORE (CM_WKUP + 0x68)
++#define CM_CLKMODE_DPLL_CORE (CM_WKUP + 0x90)
++
++/* Core HSDIV */
++#define CM_DIV_M4_DPLL_CORE (CM_WKUP + 0x80)
++#define CM_DIV_M5_DPLL_CORE (CM_WKUP + 0x84)
++#define CM_DIV_M6_DPLL_CORE (CM_WKUP + 0xD8)
++#define CM_IDLEST_DPLL_CORE (CM_WKUP + 0x5c)
++
++/* Peripheral PLL */
++#define CM_CLKSEL_DPLL_PER (CM_WKUP + 0x9c)
++#define CM_CLKMODE_DPLL_PER (CM_WKUP + 0x8c)
++#define CM_DIV_M2_DPLL_PER (CM_WKUP + 0xAC)
++#define CM_IDLEST_DPLL_PER (CM_WKUP + 0x70)
++
++/* Display PLL */
++#define CM_CLKSEL_DPLL_DISP (CM_WKUP + 0x54)
++#define CM_CLKMODE_DPLL_DISP (CM_WKUP + 0x98)
++#define CM_DIV_M2_DPLL_DISP (CM_WKUP + 0xA4)
++
++/* DDR PLL */
++#define CM_CLKSEL_DPLL_DDR (CM_WKUP + 0x40)
++#define CM_CLKMODE_DPLL_DDR (CM_WKUP + 0x94)
++#define CM_DIV_M2_DPLL_DDR (CM_WKUP + 0xA0)
++#define CM_IDLEST_DPLL_DDR (CM_WKUP + 0x34)
++
++/* MPU PLL */
++#define CM_CLKSEL_DPLL_MPU (CM_WKUP + 0x2c)
++#define CM_CLKMODE_DPLL_MPU (CM_WKUP + 0x88)
++#define CM_DIV_M2_DPLL_MPU (CM_WKUP + 0xA8)
++#define CM_IDLEST_DPLL_MPU (CM_WKUP + 0x20)
++
++/* TIMER Clock Source Select */
++#define CLKSEL_TIMER2_CLK (CM_DPLL + 0x8)
++
++/* Interconnect clocks */
++#define CM_PER_L4LS_CLKCTRL (CM_PER + 0x60) /* EMIF */
++#define CM_PER_L4FW_CLKCTRL (CM_PER + 0x64) /* EMIF FW */
++#define CM_PER_L3_CLKCTRL (CM_PER + 0xE0) /* OCMC RAM */
++#define CM_PER_L3_INSTR_CLKCTRL (CM_PER + 0xDC)
++#define CM_PER_L4HS_CLKCTRL (CM_PER + 0x120)
++#define CM_WKUP_L4WKUP_CLKCTRL (CM_WKUP + 0x0c)/* UART0 */
++
++/* Domain Wake UP */
++#define CM_WKUP_CLKSTCTRL (CM_WKUP + 0) /* UART0 */
++#define CM_PER_L4LS_CLKSTCTRL (CM_PER + 0x0) /* TIMER2 */
++#define CM_PER_L3_CLKSTCTRL (CM_PER + 0x0c) /* EMIF */
++#define CM_PER_L4FW_CLKSTCTRL (CM_PER + 0x08) /* EMIF FW */
++#define CM_PER_L3S_CLKSTCTRL (CM_PER + 0x4)
++#define CM_PER_L4HS_CLKSTCTRL (CM_PER + 0x011c)
++#define CM_CEFUSE_CLKSTCTRL (CM_CEFUSE + 0x0)
++
++/* Module Enable Registers */
++#define CM_PER_TIMER2_CLKCTRL (CM_PER + 0x80) /* Timer2 */
++#define CM_WKUP_UART0_CLKCTRL (CM_WKUP + 0xB4)/* UART0 */
++#define CM_WKUP_CONTROL_CLKCTRL (CM_WKUP + 0x4) /* Control Module */
++#define CM_PER_EMIF_CLKCTRL (CM_PER + 0x28) /* EMIF */
++#define CM_PER_EMIF_FW_CLKCTRL (CM_PER + 0xD0) /* EMIF FW */
++#define CM_PER_GPMC_CLKCTRL (CM_PER + 0x30) /* GPMC */
++#define CM_PER_ELM_CLKCTRL (CM_PER + 0x40) /* ELM */
++#define CM_PER_SPI0_CLKCTRL (CM_PER + 0x4c) /* SPI0 */
++#define CM_PER_SPI1_CLKCTRL (CM_PER + 0x50) /* SPI1 */
++#define CM_WKUP_I2C0_CLKCTRL (CM_WKUP + 0xB8) /* I2C0 */
++#define CM_PER_CPGMAC0_CLKCTRL (CM_PER + 0x14) /* Ethernet */
++#define CM_PER_CPSW_CLKSTCTRL (CM_PER + 0x144)/* Ethernet */
++#define CM_PER_OCMCRAM_CLKCTRL (CM_PER + 0x2C) /* OCMC RAM */
++#define CM_PER_GPIO2_CLKCTRL (CM_PER + 0xB0) /* GPIO2 */
++#define CM_PER_UART3_CLKCTRL (CM_PER + 0x74) /* UART3 */
++#define CM_PER_I2C1_CLKCTRL (CM_PER + 0x48) /* I2C1 */
++#define CM_PER_I2C2_CLKCTRL (CM_PER + 0x44) /* I2C2 */
++#define CM_WKUP_GPIO0_CLKCTRL (CM_WKUP + 0x8) /* GPIO0 */
++
++#define CM_PER_MMC0_CLKCTRL (CM_PER + 0x3C)
++#define CM_PER_MMC1_CLKCTRL (CM_PER + 0xF4)
++#define CM_PER_MMC2_CLKCTRL (CM_PER + 0xF8)
++
++/* PRCM */
++#define CM_DPLL_OFFSET (OMAP_PRM_BASE + 0x0300)
++
++#define CM_ALWON_WDTIMER_CLKCTRL (OMAP_PRM_BASE + 0x158C)
++#define CM_ALWON_SPI_CLKCTRL (OMAP_PRM_BASE + 0x1590)
++#define CM_ALWON_CONTROL_CLKCTRL (OMAP_PRM_BASE + 0x15C4)
++
++#define CM_ALWON_L3_SLOW_CLKSTCTRL (OMAP_PRM_BASE + 0x1400)
++
++#define CM_ALWON_GPIO_0_CLKCTRL (OMAP_PRM_BASE + 0x155c)
++#define CM_ALWON_GPIO_0_OPTFCLKEN_DBCLK (OMAP_PRM_BASE + 0x155c)
++
++/* Ethernet */
++#define CM_ETHERNET_CLKSTCTRL (OMAP_PRM_BASE + 0x1404)
++#define CM_ALWON_ETHERNET_0_CLKCTRL (OMAP_PRM_BASE + 0x15D4)
++#define CM_ALWON_ETHERNET_1_CLKCTRL (OMAP_PRM_BASE + 0x15D8)
++
++/* UARTs */
++#define CM_ALWON_UART_0_CLKCTRL (OMAP_PRM_BASE + 0x1550)
++#define CM_ALWON_UART_1_CLKCTRL (OMAP_PRM_BASE + 0x1554)
++#define CM_ALWON_UART_2_CLKCTRL (OMAP_PRM_BASE + 0x1558)
++
++/* I2C */
++/* Note: In ti814x I2C0 and I2C2 have common clk control */
++#define CM_ALWON_I2C_0_CLKCTRL (OMAP_PRM_BASE + 0x1564)
++
++/* EMIF4 PRCM Defintion */
++#define CM_DEFAULT_L3_FAST_CLKSTCTRL (OMAP_PRM_BASE + 0x0508)
++#define CM_DEFAULT_EMIF_0_CLKCTRL (OMAP_PRM_BASE + 0x0520)
++#define CM_DEFAULT_EMIF_1_CLKCTRL (OMAP_PRM_BASE + 0x0524)
++#define CM_DEFAULT_DMM_CLKCTRL (OMAP_PRM_BASE + 0x0528)
++#define CM_DEFAULT_FW_CLKCTRL (OMAP_PRM_BASE + 0x052C)
++
++/* ALWON PRCM */
++#define CM_ALWON_OCMC_0_CLKSTCTRL CM_PER_L3_CLKSTCTRL
++#define CM_ALWON_OCMC_0_CLKCTRL CM_PER_OCMCRAM_CLKCTRL
++
++#define CM_ALWON_GPMC_CLKCTRL CM_PER_GPMC_CLKCTRL
++
++extern void pll_init(void);
++extern void enable_ddr_clocks(void);
++
+ #endif /* endif _AM33XX_CLOCKS_H_ */
+diff --git a/arch/arm/mach-omap/include/mach/am33xx-mux.h b/arch/arm/mach-omap/include/mach/am33xx-mux.h
+new file mode 100644
+index 0000000..38a1aae
+--- /dev/null
++++ b/arch/arm/mach-omap/include/mach/am33xx-mux.h
+@@ -0,0 +1,19 @@
++/*
++ * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.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 version 2.
++ *
++ * This program is distributed "as is" WITHOUT ANY WARRANTY of any
++ * kind, whether express or implied; without even the implied warranty
++ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ */
++#ifndef __AM33XX_MUX_H__
++#define __AM33XX_MUX_H__
++
++extern void enable_mii1_pin_mux(void);
++extern void enable_uart0_pin_mux(void);
++
++#endif /*__AM33XX_MUX_H__ */
+diff --git a/arch/arm/mach-omap/include/mach/am33xx-silicon.h b/arch/arm/mach-omap/include/mach/am33xx-silicon.h
+index 7b13991..0cf916c 100644
+--- a/arch/arm/mach-omap/include/mach/am33xx-silicon.h
++++ b/arch/arm/mach-omap/include/mach/am33xx-silicon.h
+@@ -27,7 +27,6 @@
+ #define AM33XX_UART1_BASE (AM33XX_L4_PER_BASE + 0x22000)
+ #define AM33XX_UART2_BASE (AM33XX_L4_PER_BASE + 0x24000)
+
+-
+ /* EMFI Registers */
+ #define AM33XX_EMFI0_BASE 0x4C000000
+
+@@ -48,4 +47,161 @@
+
+ #define PRM_RSTCTRL_RESET 0x1
+
++/* CTRL */
++#define OMAP_CTRL_BASE (AM33XX_L4_WKUP_BASE + 0x210000)
++
++/* Watchdog Timer */
++#define WDT_BASE 0x44E35000
++
++/* EMIF Base address */
++#define EMIF4_0_CFG_BASE 0x4C000000
++#define EMIF4_1_CFG_BASE 0x4D000000
++#define DMM_BASE 0x4E000000
++
++#define DDRPHY_0_CONFIG_BASE (CTRL_BASE + 0x1400)
++#define DDRPHY_CONFIG_BASE DDRPHY_0_CONFIG_BASE
++
++#define AM335X_CPSW_BASE 0x4A100000
++#define AM335X_CPSW_MDIO_BASE 0x4A101000
++
++/*DMM & EMIF4 MMR Declaration*/
++#define DMM_LISA_MAP__0 (DMM_BASE + 0x40)
++#define DMM_LISA_MAP__1 (DMM_BASE + 0x44)
++#define DMM_LISA_MAP__2 (DMM_BASE + 0x48)
++#define DMM_LISA_MAP__3 (DMM_BASE + 0x4C)
++#define DMM_PAT_BASE_ADDR (DMM_BASE + 0x460)
++
++#define EMIF_MOD_ID_REV (EMIF4_0_CFG_BASE + 0x0)
++#define EMIF4_0_SDRAM_STATUS (EMIF4_0_CFG_BASE + 0x04)
++#define EMIF4_0_SDRAM_CONFIG (EMIF4_0_CFG_BASE + 0x08)
++#define EMIF4_0_SDRAM_CONFIG2 (EMIF4_0_CFG_BASE + 0x0C)
++#define EMIF4_0_SDRAM_REF_CTRL (EMIF4_0_CFG_BASE + 0x10)
++#define EMIF4_0_SDRAM_REF_CTRL_SHADOW (EMIF4_0_CFG_BASE + 0x14)
++#define EMIF4_0_SDRAM_TIM_1 (EMIF4_0_CFG_BASE + 0x18)
++#define EMIF4_0_SDRAM_TIM_1_SHADOW (EMIF4_0_CFG_BASE + 0x1C)
++#define EMIF4_0_SDRAM_TIM_2 (EMIF4_0_CFG_BASE + 0x20)
++#define EMIF4_0_SDRAM_TIM_2_SHADOW (EMIF4_0_CFG_BASE + 0x24)
++#define EMIF4_0_SDRAM_TIM_3 (EMIF4_0_CFG_BASE + 0x28)
++#define EMIF4_0_SDRAM_TIM_3_SHADOW (EMIF4_0_CFG_BASE + 0x2C)
++#define EMIF0_0_SDRAM_MGMT_CTRL (EMIF4_0_CFG_BASE + 0x38)
++#define EMIF0_0_SDRAM_MGMT_CTRL_SHD (EMIF4_0_CFG_BASE + 0x3C)
++#define EMIF4_0_DDR_PHY_CTRL_1 (EMIF4_0_CFG_BASE + 0xE4)
++#define EMIF4_0_DDR_PHY_CTRL_1_SHADOW (EMIF4_0_CFG_BASE + 0xE8)
++#define EMIF4_0_DDR_PHY_CTRL_2 (EMIF4_0_CFG_BASE + 0xEC)
++#define EMIF4_0_IODFT_TLGC (EMIF4_0_CFG_BASE + 0x60)
++
++#define EMIF4_1_SDRAM_CONFIG (EMIF4_1_CFG_BASE + 0x08)
++#define EMIF4_1_SDRAM_CONFIG2 (EMIF4_1_CFG_BASE + 0x0C)
++#define EMIF4_1_SDRAM_REF_CTRL (EMIF4_1_CFG_BASE + 0x10)
++#define EMIF4_1_SDRAM_REF_CTRL_SHADOW (EMIF4_1_CFG_BASE + 0x14)
++#define EMIF4_1_SDRAM_TIM_1 (EMIF4_1_CFG_BASE + 0x18)
++#define EMIF4_1_SDRAM_TIM_1_SHADOW (EMIF4_1_CFG_BASE + 0x1C)
++#define EMIF4_1_SDRAM_TIM_2 (EMIF4_1_CFG_BASE + 0x20)
++#define EMIF4_1_SDRAM_TIM_2_SHADOW (EMIF4_1_CFG_BASE + 0x24)
++#define EMIF4_1_SDRAM_TIM_3 (EMIF4_1_CFG_BASE + 0x28)
++#define EMIF4_1_SDRAM_TIM_3_SHADOW (EMIF4_1_CFG_BASE + 0x2C)
++#define EMIF4_1_DDR_PHY_CTRL_1 (EMIF4_1_CFG_BASE + 0xE4)
++#define EMIF4_1_DDR_PHY_CTRL_1_SHADOW (EMIF4_1_CFG_BASE + 0xE8)
++#define EMIF4_1_IODFT_TLGC (EMIF4_1_CFG_BASE + 0x60)
++
++#define VTP0_CTRL_REG 0x44E10E0C
++#define VTP1_CTRL_REG 0x48140E10
++
++/* OCMC */
++#define SRAM0_SIZE (0x1B400) /* 109 KB */
++#define SRAM_GPMC_STACK_SIZE (0x40)
++
++#define LOW_LEVEL_SRAM_STACK (SRAM0_START + SRAM0_SIZE - 4)
++
++/* GPMC related */
++#define GPMC_CONFIG_CS0 (0x60)
++#define GPMC_CONFIG_CS0_BASE (GPMC_BASE + GPMC_CONFIG_CS0)
++#define GPMC_CONFIG1 (0x00)
++#define GPMC_CONFIG2 (0x04)
++#define GPMC_CONFIG3 (0x08)
++#define GPMC_CONFIG4 (0x0C)
++#define GPMC_CONFIG5 (0x10)
++#define GPMC_CONFIG6 (0x14)
++#define GPMC_CONFIG7 (0x18)
++
++/* DDR offsets */
++#define DDR_PHY_BASE_ADDR 0x44E12000
++#define DDR_IO_CTRL 0x44E10E04
++#define DDR_CKE_CTRL 0x44E1131C
++#define CONTROL_BASE_ADDR 0x44E10000
++
++#define DDR_CMD0_IOCTRL (CONTROL_BASE_ADDR + 0x1404)
++#define DDR_CMD1_IOCTRL (CONTROL_BASE_ADDR + 0x1408)
++#define DDR_CMD2_IOCTRL (CONTROL_BASE_ADDR + 0x140C)
++#define DDR_DATA0_IOCTRL (CONTROL_BASE_ADDR + 0x1440)
++#define DDR_DATA1_IOCTRL (CONTROL_BASE_ADDR + 0x1444)
++
++#define CMD0_CTRL_SLAVE_RATIO_0 (DDR_PHY_BASE_ADDR + 0x01C)
++#define CMD0_CTRL_SLAVE_FORCE_0 (DDR_PHY_BASE_ADDR + 0x020)
++#define CMD0_CTRL_SLAVE_DELAY_0 (DDR_PHY_BASE_ADDR + 0x024)
++#define CMD0_DLL_LOCK_DIFF_0 (DDR_PHY_BASE_ADDR + 0x028)
++#define CMD0_INVERT_CLKOUT_0 (DDR_PHY_BASE_ADDR + 0x02C)
++
++#define CMD1_CTRL_SLAVE_RATIO_0 (DDR_PHY_BASE_ADDR + 0x050)
++#define CMD1_CTRL_SLAVE_FORCE_0 (DDR_PHY_BASE_ADDR + 0x054)
++#define CMD1_CTRL_SLAVE_DELAY_0 (DDR_PHY_BASE_ADDR + 0x058)
++#define CMD1_DLL_LOCK_DIFF_0 (DDR_PHY_BASE_ADDR + 0x05C)
++#define CMD1_INVERT_CLKOUT_0 (DDR_PHY_BASE_ADDR + 0x060)
++
++#define CMD2_CTRL_SLAVE_RATIO_0 (DDR_PHY_BASE_ADDR + 0x084)
++#define CMD2_CTRL_SLAVE_FORCE_0 (DDR_PHY_BASE_ADDR + 0x088)
++#define CMD2_CTRL_SLAVE_DELAY_0 (DDR_PHY_BASE_ADDR + 0x08C)
++#define CMD2_DLL_LOCK_DIFF_0 (DDR_PHY_BASE_ADDR + 0x090)
++#define CMD2_INVERT_CLKOUT_0 (DDR_PHY_BASE_ADDR + 0x094)
++
++#define DATA0_RD_DQS_SLAVE_RATIO_0 (DDR_PHY_BASE_ADDR + 0x0C8)
++#define DATA0_RD_DQS_SLAVE_RATIO_1 (DDR_PHY_BASE_ADDR + 0x0CC)
++#define DATA0_WR_DQS_SLAVE_RATIO_0 (DDR_PHY_BASE_ADDR + 0x0DC)
++
++#define DATA0_WR_DQS_SLAVE_RATIO_1 (DDR_PHY_BASE_ADDR + 0x0E0)
++#define DATA0_WRLVL_INIT_RATIO_0 (DDR_PHY_BASE_ADDR + 0x0F0)
++
++#define DATA0_WRLVL_INIT_RATIO_1 (DDR_PHY_BASE_ADDR + 0x0F4)
++#define DATA0_GATELVL_INIT_RATIO_0 (DDR_PHY_BASE_ADDR + 0x0FC)
++
++#define DATA0_GATELVL_INIT_RATIO_1 (DDR_PHY_BASE_ADDR + 0x100)
++#define DATA0_FIFO_WE_SLAVE_RATIO_0 (DDR_PHY_BASE_ADDR + 0x108)
++
++#define DATA0_FIFO_WE_SLAVE_RATIO_1 (DDR_PHY_BASE_ADDR + 0x10C)
++#define DATA0_WR_DATA_SLAVE_RATIO_0 (DDR_PHY_BASE_ADDR + 0x120)
++
++#define DATA0_WR_DATA_SLAVE_RATIO_1 (DDR_PHY_BASE_ADDR + 0x124)
++#define DATA0_DLL_LOCK_DIFF_0 (DDR_PHY_BASE_ADDR + 0x138)
++
++#define DATA0_RANK0_DELAYS_0 (DDR_PHY_BASE_ADDR + 0x134)
++#define DATA1_RANK0_DELAYS_0 (DDR_PHY_BASE_ADDR + 0x1D8)
++
++/* Ethernet MAC ID from EFuse */
++#define MAC_ID0_LO (CTRL_BASE + 0x630)
++#define MAC_ID0_HI (CTRL_BASE + 0x634)
++#define MAC_ID1_LO (CTRL_BASE + 0x638)
++#define MAC_ID1_HI (CTRL_BASE + 0x63c)
++#define MAC_MII_SEL (CTRL_BASE + 0x650)
++
++/* WDT related */
++#define WDT_WDSC (WDT_BASE + 0x010)
++#define WDT_WDST (WDT_BASE + 0x014)
++#define WDT_WISR (WDT_BASE + 0x018)
++#define WDT_WIER (WDT_BASE + 0x01C)
++#define WDT_WWER (WDT_BASE + 0x020)
++#define WDT_WCLR (WDT_BASE + 0x024)
++#define WDT_WCRR (WDT_BASE + 0x028)
++#define WDT_WLDR (WDT_BASE + 0x02C)
++#define WDT_WTGR (WDT_BASE + 0x030)
++#define WDT_WWPS (WDT_BASE + 0x034)
++#define WDT_WDLY (WDT_BASE + 0x044)
++#define WDT_WSPR (WDT_BASE + 0x048)
++#define WDT_WIRQEOI (WDT_BASE + 0x050)
++#define WDT_WIRQSTATRAW (WDT_BASE + 0x054)
++#define WDT_WIRQSTAT (WDT_BASE + 0x058)
++#define WDT_WIRQENSET (WDT_BASE + 0x05C)
++#define WDT_WIRQENCLR (WDT_BASE + 0x060)
++
++#define WDT_UNFREEZE (CTRL_BASE + 0x100)
++
+ #endif
+diff --git a/arch/arm/mach-omap/s32k_clksource.c b/arch/arm/mach-omap/s32k_clksource.c
+index 6ce0c64..5d45541 100644
+--- a/arch/arm/mach-omap/s32k_clksource.c
++++ b/arch/arm/mach-omap/s32k_clksource.c
+@@ -46,7 +46,8 @@
+ */
+ static uint64_t s32k_clocksource_read(void)
+ {
+- return readl(S32K_CR);
++// return readl(S32K_CR);
++ return readl(0x44e0503c);
+ }
+
+ /* A bit obvious isn't it? */
+@@ -69,6 +70,8 @@ static int s32k_clocksource_init(void)
+ {
+ s32k_cs.mult = clocksource_hz2mult(S32K_FREQUENCY, s32k_cs.shift);
+
++ writel(0x00000003, 0x44e05038);
++
+ return init_clock(&s32k_cs);
+ }
+
+diff --git a/arch/arm/mach-omap/xload.c b/arch/arm/mach-omap/xload.c
+index 9fa8221..4ef72e7 100644
+--- a/arch/arm/mach-omap/xload.c
++++ b/arch/arm/mach-omap/xload.c
+@@ -141,7 +141,10 @@ static void *omap_xload_boot_spi(int offset)
+
+ enum omap_boot_src omap_bootsrc(void)
+ {
+-#if defined(CONFIG_ARCH_OMAP3)
++#if defined(CONFIG_MACH_BEAGLEBONE)
++ /* only support for MMC */
++ return OMAP_BOOTSRC_MMC1;
++#elif defined(CONFIG_ARCH_OMAP3)
+ return omap3_bootsrc();
+ #elif defined(CONFIG_ARCH_OMAP4)
+ return omap4_bootsrc();
diff --git a/patches/barebox-2012.11.0/0004-Enable-Bone-i2c-mux.patch b/patches/barebox-2012.11.0/0004-Enable-Bone-i2c-mux.patch
new file mode 100644
index 0000000..ef5c773
--- /dev/null
+++ b/patches/barebox-2012.11.0/0004-Enable-Bone-i2c-mux.patch
@@ -0,0 +1,64 @@
+From 5832843ffe8482ec30adcc981b1bcc95a5174622 Mon Sep 17 00:00:00 2001
+From: Jan Luebbe <jlu@pengutronix.de>
+Date: Sat, 20 Oct 2012 15:39:18 +0200
+Subject: [PATCH] Enable Bone i2c mux
+
+Signed-off-by: Jan Luebbe <jlu@pengutronix.de>
+---
+ arch/arm/boards/beaglebone/board.c | 1 +
+ arch/arm/mach-omap/am33xx_mux.c | 15 +++++++++++++++
+ arch/arm/mach-omap/include/mach/am33xx-mux.h | 3 +++
+ 3 files changed, 19 insertions(+)
+
+diff --git a/arch/arm/boards/beaglebone/board.c b/arch/arm/boards/beaglebone/board.c
+index 8180e28..110122b 100644
+--- a/arch/arm/boards/beaglebone/board.c
++++ b/arch/arm/boards/beaglebone/board.c
+@@ -328,6 +328,7 @@ static int beagle_board_init(void)
+ s_init();
+
+ enable_mii1_pin_mux();
++ enable_i2c0_pin_mux();
+
+ return 0;
+ }
+diff --git a/arch/arm/mach-omap/am33xx_mux.c b/arch/arm/mach-omap/am33xx_mux.c
+index db841aa..b48a25c 100644
+--- a/arch/arm/mach-omap/am33xx_mux.c
++++ b/arch/arm/mach-omap/am33xx_mux.c
+@@ -491,6 +491,21 @@ void enable_mii1_pin_mux(void)
+ configure_module_pin_mux(mii1_pin_mux);
+ }
+
++void enable_i2c0_pin_mux(void)
++{
++ configure_module_pin_mux(i2c0_pin_mux);
++}
++
++void enable_i2c1_pin_mux(void)
++{
++ configure_module_pin_mux(i2c1_pin_mux);
++}
++
++void enable_i2c2_pin_mux(void)
++{
++ configure_module_pin_mux(i2c2_pin_mux);
++}
++
+ void enable_uart0_pin_mux(void)
+ {
+ configure_module_pin_mux(uart0_pin_mux);
+diff --git a/arch/arm/mach-omap/include/mach/am33xx-mux.h b/arch/arm/mach-omap/include/mach/am33xx-mux.h
+index 38a1aae..ed328f5 100644
+--- a/arch/arm/mach-omap/include/mach/am33xx-mux.h
++++ b/arch/arm/mach-omap/include/mach/am33xx-mux.h
+@@ -14,6 +14,9 @@
+ #define __AM33XX_MUX_H__
+
+ extern void enable_mii1_pin_mux(void);
++extern void enable_i2c0_pin_mux(void);
++extern void enable_i2c1_pin_mux(void);
++extern void enable_i2c2_pin_mux(void);
+ extern void enable_uart0_pin_mux(void);
+
+ #endif /*__AM33XX_MUX_H__ */
diff --git a/patches/barebox-2012.11.0/0005-update-env.patch b/patches/barebox-2012.11.0/0005-update-env.patch
new file mode 100644
index 0000000..193525b
--- /dev/null
+++ b/patches/barebox-2012.11.0/0005-update-env.patch
@@ -0,0 +1,48 @@
+From 64020ec169f2841b6f4ae01eb3769b77b462e9e1 Mon Sep 17 00:00:00 2001
+From: Jan Luebbe <jlu@pengutronix.de>
+Date: Sat, 20 Oct 2012 15:45:23 +0200
+Subject: [PATCH] update env
+
+Signed-off-by: Jan Luebbe <jlu@pengutronix.de>
+---
+ arch/arm/boards/beaglebone/env/boot/sd | 8 ++------
+ arch/arm/boards/beaglebone/env/init/general | 5 +----
+ 2 files changed, 3 insertions(+), 10 deletions(-)
+
+diff --git a/arch/arm/boards/beaglebone/env/boot/sd b/arch/arm/boards/beaglebone/env/boot/sd
+index f3f276c..898a9fb 100644
+--- a/arch/arm/boards/beaglebone/env/boot/sd
++++ b/arch/arm/boards/beaglebone/env/boot/sd
+@@ -6,11 +6,7 @@ if [ "$1" = menu ]; then
+ fi
+
+ global.bootm.image=/boot/uImage
+-#global.bootm.oftree=<path to oftree>
++global.bootm.oftree=/boot/oftree
+ #global.bootm.initrd=<path to initrd>
+
+-#bootargs-root-nfs -n "<path on server>" -s <serverip>
+-#bootargs-root-jffs2 -m <mtdname>
+-#bootargs-root-ubi -r <volume> -m <mtdname>
+-
+-global.linux.bootargs.root="root=/dev/mmcblk0p2 rootfstype=ext4 rootwait ro"
++bootargs-root-disk -p mmcblk0p2 -t ext4
+diff --git a/arch/arm/boards/beaglebone/env/init/general b/arch/arm/boards/beaglebone/env/init/general
+index bbd7ee3..4ade9cd 100644
+--- a/arch/arm/boards/beaglebone/env/init/general
++++ b/arch/arm/boards/beaglebone/env/init/general
+@@ -6,13 +6,10 @@ if [ "$1" = menu ]; then
+ fi
+
+ # user (used for network filenames)
+-global.user=jlu
++#global.user=none
+
+ # timeout in seconds before the default boot entry is started
+ global.autoboot_timeout=3
+
+ # default boot entry (one of /env/boot/*)
+ global.boot.default=sd
+-
+-# default tftp path
+-global.tftp.path=/mnt/tftp-dhcp
diff --git a/patches/barebox-2012.11.0/series b/patches/barebox-2012.11.0/series
new file mode 100644
index 0000000..ef68f8a
--- /dev/null
+++ b/patches/barebox-2012.11.0/series
@@ -0,0 +1,5 @@
+0001-ARM-OMAP-AM33XX-create-new-ARCH-for-AM33xx.patch
+0002-pcm051-Add-inital-support.patch
+0003-WIP-beaglebone-add-first-stage-supprort-for-AM335x-a.patch
+0004-Enable-Bone-i2c-mux.patch
+0005-update-env.patch
diff --git a/platformconfig b/platformconfig
index 761391e..c706a9d 100644
--- a/platformconfig
+++ b/platformconfig
@@ -128,12 +128,11 @@ PTXCONF_CONSOLE_SPEED="115200"
# PTXCONF_AT91BOOTSTRAP2 is not set
PTXCONF_BAREBOX_ARCH_STRING="arm"
PTXCONF_BAREBOX=y
-PTXCONF_BAREBOX_VERSION="2012.07.0"
-PTXCONF_BAREBOX_MD5="7d3293e72afe7726ac3d0f2b6fe961cf"
+PTXCONF_BAREBOX_VERSION="2012.11.0"
+PTXCONF_BAREBOX_MD5="56b3187c9593de7e759380f3b93919f3"
PTXCONF_BAREBOX_CONFIG="barebox.config"
-PTXCONF_BAREBOX_EXTRA_ENV=y
-PTXCONF_BAREBOX_EXTRA_ENV_PATH="${PTXDIST_PLATFORMCONFIGDIR}/barebox-defaultenv"
-# PTXCONF_BAREBOX_BAREBOXENV is not set
+# PTXCONF_BAREBOX_EXTRA_ENV is not set
+PTXCONF_BAREBOX_BAREBOXENV=y
PTXCONF_BAREBOX_MLO=y
PTXCONF_BAREBOX_MLO_VERSION="${PTXCONF_BAREBOX_VERSION}"
PTXCONF_BAREBOX_MLO_MD5="${PTXCONF_BAREBOX_MD5}"