diff -urNp linux-2.6.20/Documentation/SM501-fb.txt linux-2.6.20-s1t/Documentation/SM501-fb.txt
--- linux-2.6.20/Documentation/SM501-fb.txt	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/Documentation/SM501-fb.txt	2007-02-07 16:29:14.000000000 +0000
@@ -0,0 +1,74 @@
+			SM501 FB Driver
+			===============
+
+Copyright 2006,2007 Simtec Electronics
+
+
+Introduction
+------------
+
+The SM501 framebuffer driver provides access to the CRT and Panel
+video interfaces via the Linux framebuffer system.
+
+The driver currently supports the following parts of the video
+engine(s):
+
+	- X/Y picture paning
+	- Hardware cursor
+	- Blanking
+
+
+Running X using FB
+------------------
+
+The device and driver only support 24bpp as 32bpp data, and the
+X server may need to be configured to support this. Add the
+following to your X configuration's Device section:
+
+        Option          "DefaultDepth"          "32"
+
+to look like:
+
+Section "Device"
+        Option          "DefaultDepth"          "32"
+EndSection
+
+
+CRT Routing
+-----------
+
+The CRT output can be fed from either the CRT or the Panel video
+engine which can be controlled from either the platform data or
+via the device file crt_src in the device's sysfs directory.
+
+If the routing is changed whilst the CRT engine is inactive, then
+no memory is allocated to the display, and the video parameters
+must be re-set from the framebuffer interface to re-activate the
+display.
+
+Changing the routing back to the CRT engine does not re-allocate
+any resources for the engine, and will require a re-set from the
+framebuffer layer to re-activate the mode. If there are previous
+settings still valid, then the CRT will start displaying the CRT
+engine output immediately.
+
+
+Debugging
+---------
+
+The driver implementes printf style debugging using dev_dbg()
+which can be enabled by either defining the macro DEBUG at the
+top of the file, or by turning on kernel debugging.
+
+The driver exports the register sets by files in sysfs, which
+are available even when the debugging is not enabled.
+
+Internals
+---------
+
+The driver exploits the common bits in the registers to try and
+allow common register settings to be placed into common code blocks
+which are called from the crt or panel register code. Driver entry
+blocks which can be called for both crt and panel use the par->head
+entry to determine which head they are being called for.
+
diff -urNp linux-2.6.20/Documentation/SM501.txt linux-2.6.20-s1t/Documentation/SM501.txt
--- linux-2.6.20/Documentation/SM501.txt	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/Documentation/SM501.txt	2007-02-07 16:29:14.000000000 +0000
@@ -0,0 +1,58 @@
+			SM501 Driver
+			============
+
+Copyright 2006 Simtec Electronics
+
+Core
+----
+
+The core driver in drivers/mfd provides common services for the
+drivers which manage the specific hardware blocks. These services
+include locking for common registers, clock control and resource
+management.
+
+The core registers drivers for both PCI and generic bus based
+chips via the platform device and driver system.
+
+On detection of a device, the core initialises the chip (which may
+be specified by the platfrom data) and then exports the selected
+peripheral set as platform devices for the specific drivers.
+
+The core re-uses the platform device system as the platform device
+system provides enough features to support the drivers without the
+need to create a new bus-type and the associated code to go with it.
+
+
+Resources
+---------
+
+Each peripheral's view of the device is implicitly narrowed to the
+specific set of resources it requires in order to function correctly.
+
+The centralised memory allocation allows the driver to ensure that the
+maximum possible resource allocation can be made to the video subsystem
+as this is by-far the most resource-sensitive of the on-chip functions.
+
+The primary issue with memory allocation is that of moving the video
+buffers once a display mode is chosen. Indeed when a video mode change
+occurs the memory footprint of the video subsystem changes.
+
+Since Video memory is difficult to move without changing the display
+(unless sufficient contiguous memory can be provided for the old and new
+modes simultaneously) the video driver fully utilises the memory area
+given to it by aligning fb0 to the start of the area and fb1 to the end
+of it. Any memory left over in the middle is used for the acceleration
+functions, which are transient and thus their location is less critical
+as it can be moved.
+
+
+Configuration
+-------------
+
+The platform device driver uses a set of platform data to pass
+configurations through to the core and the subsidiary drivers
+so that there can be sujpport for more than one system carrying
+an SM501 built into a single kernel image.
+
+Currently the PCI driver assumes the manufacturer's reference
+design.
diff -urNp linux-2.6.20/Documentation/simtec-lcd.txt linux-2.6.20-s1t/Documentation/simtec-lcd.txt
--- linux-2.6.20/Documentation/simtec-lcd.txt	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/Documentation/simtec-lcd.txt	2007-02-07 16:29:14.000000000 +0000
@@ -0,0 +1,14 @@
+Simtec Generic 8bit LCD driver
+------------------------------
+
+(c) 2005 Simtec Electronics
+
+
+Introduction
+------------
+
+
+
+
+Connector
+--------
\ No newline at end of file
diff -urNp linux-2.6.20/Documentation/spi/spi-summary linux-2.6.20-s1t/Documentation/spi/spi-summary
--- linux-2.6.20/Documentation/spi/spi-summary	2007-02-04 18:44:54.000000000 +0000
+++ linux-2.6.20-s1t/Documentation/spi/spi-summary	2007-02-07 16:29:14.000000000 +0000
@@ -284,7 +284,6 @@ SPI protocol drivers somewhat resemble p
 	static struct spi_driver CHIP_driver = {
 		.driver = {
 			.name		= "CHIP",
-			.bus		= &spi_bus_type,
 			.owner		= THIS_MODULE,
 		},
 
@@ -312,7 +311,7 @@ might look like this unless you're creat
 		chip = kzalloc(sizeof *chip, GFP_KERNEL);
 		if (!chip)
 			return -ENOMEM;
-		dev_set_drvdata(&spi->dev, chip);
+		spi_set_drvdata(spi, chip);
 
 		... etc
 		return 0;
diff -urNp linux-2.6.20/Makefile linux-2.6.20-s1t/Makefile
--- linux-2.6.20/Makefile	2007-02-04 18:44:54.000000000 +0000
+++ linux-2.6.20-s1t/Makefile	2007-02-07 16:39:35.000000000 +0000
@@ -1,7 +1,7 @@
 VERSION = 2
 PATCHLEVEL = 6
 SUBLEVEL = 20
-EXTRAVERSION =
+EXTRAVERSION = -simtec1p1
 NAME = Homicidal Dwarf Hamster
 
 # *DOCUMENTATION*
diff -urNp linux-2.6.20/Makefile.orig linux-2.6.20-s1t/Makefile.orig
--- linux-2.6.20/Makefile.orig	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/Makefile.orig	2007-02-04 18:44:54.000000000 +0000
@@ -0,0 +1,1492 @@
+VERSION = 2
+PATCHLEVEL = 6
+SUBLEVEL = 20
+EXTRAVERSION =
+NAME = Homicidal Dwarf Hamster
+
+# *DOCUMENTATION*
+# To see a list of typical targets execute "make help"
+# More info can be located in ./README
+# Comments in this file are targeted only to the developer, do not
+# expect to learn how to build the kernel reading this file.
+
+# Do not:
+# o  use make's built-in rules and variables
+#    (this increases performance and avoid hard-to-debug behavour);
+# o  print "Entering directory ...";
+MAKEFLAGS += -rR --no-print-directory
+
+# We are using a recursive build, so we need to do a little thinking
+# to get the ordering right.
+#
+# Most importantly: sub-Makefiles should only ever modify files in
+# their own directory. If in some directory we have a dependency on
+# a file in another dir (which doesn't happen often, but it's often
+# unavoidable when linking the built-in.o targets which finally
+# turn into vmlinux), we will call a sub make in that other dir, and
+# after that we are sure that everything which is in that other dir
+# is now up to date.
+#
+# The only cases where we need to modify files which have global
+# effects are thus separated out and done before the recursive
+# descending is started. They are now explicitly listed as the
+# prepare rule.
+
+# To put more focus on warnings, be less verbose as default
+# Use 'make V=1' to see the full commands
+
+ifdef V
+  ifeq ("$(origin V)", "command line")
+    KBUILD_VERBOSE = $(V)
+  endif
+endif
+ifndef KBUILD_VERBOSE
+  KBUILD_VERBOSE = 0
+endif
+
+# Call a source code checker (by default, "sparse") as part of the
+# C compilation.
+#
+# Use 'make C=1' to enable checking of only re-compiled files.
+# Use 'make C=2' to enable checking of *all* source files, regardless
+# of whether they are re-compiled or not.
+#
+# See the file "Documentation/sparse.txt" for more details, including
+# where to get the "sparse" utility.
+
+ifdef C
+  ifeq ("$(origin C)", "command line")
+    KBUILD_CHECKSRC = $(C)
+  endif
+endif
+ifndef KBUILD_CHECKSRC
+  KBUILD_CHECKSRC = 0
+endif
+
+# Use make M=dir to specify directory of external module to build
+# Old syntax make ... SUBDIRS=$PWD is still supported
+# Setting the environment variable KBUILD_EXTMOD take precedence
+ifdef SUBDIRS
+  KBUILD_EXTMOD ?= $(SUBDIRS)
+endif
+ifdef M
+  ifeq ("$(origin M)", "command line")
+    KBUILD_EXTMOD := $(M)
+  endif
+endif
+
+
+# kbuild supports saving output files in a separate directory.
+# To locate output files in a separate directory two syntaxes are supported.
+# In both cases the working directory must be the root of the kernel src.
+# 1) O=
+# Use "make O=dir/to/store/output/files/"
+#
+# 2) Set KBUILD_OUTPUT
+# Set the environment variable KBUILD_OUTPUT to point to the directory
+# where the output files shall be placed.
+# export KBUILD_OUTPUT=dir/to/store/output/files/
+# make
+#
+# The O= assignment takes precedence over the KBUILD_OUTPUT environment
+# variable.
+
+
+# KBUILD_SRC is set on invocation of make in OBJ directory
+# KBUILD_SRC is not intended to be used by the regular user (for now)
+ifeq ($(KBUILD_SRC),)
+
+# OK, Make called in directory where kernel src resides
+# Do we want to locate output files in a separate directory?
+ifdef O
+  ifeq ("$(origin O)", "command line")
+    KBUILD_OUTPUT := $(O)
+  endif
+endif
+
+# That's our default target when none is given on the command line
+PHONY := _all
+_all:
+
+ifneq ($(KBUILD_OUTPUT),)
+# Invoke a second make in the output directory, passing relevant variables
+# check that the output directory actually exists
+saved-output := $(KBUILD_OUTPUT)
+KBUILD_OUTPUT := $(shell cd $(KBUILD_OUTPUT) && /bin/pwd)
+$(if $(KBUILD_OUTPUT),, \
+     $(error output directory "$(saved-output)" does not exist))
+
+PHONY += $(MAKECMDGOALS)
+
+$(filter-out _all,$(MAKECMDGOALS)) _all:
+	$(if $(KBUILD_VERBOSE:1=),@)$(MAKE) -C $(KBUILD_OUTPUT) \
+	KBUILD_SRC=$(CURDIR) \
+	KBUILD_EXTMOD="$(KBUILD_EXTMOD)" -f $(CURDIR)/Makefile $@
+
+# Leave processing to above invocation of make
+skip-makefile := 1
+endif # ifneq ($(KBUILD_OUTPUT),)
+endif # ifeq ($(KBUILD_SRC),)
+
+# We process the rest of the Makefile if this is the final invocation of make
+ifeq ($(skip-makefile),)
+
+# If building an external module we do not care about the all: rule
+# but instead _all depend on modules
+PHONY += all
+ifeq ($(KBUILD_EXTMOD),)
+_all: all
+else
+_all: modules
+endif
+
+srctree		:= $(if $(KBUILD_SRC),$(KBUILD_SRC),$(CURDIR))
+TOPDIR		:= $(srctree)
+# FIXME - TOPDIR is obsolete, use srctree/objtree
+objtree		:= $(CURDIR)
+src		:= $(srctree)
+obj		:= $(objtree)
+
+VPATH		:= $(srctree)$(if $(KBUILD_EXTMOD),:$(KBUILD_EXTMOD))
+
+export srctree objtree VPATH TOPDIR
+
+
+# SUBARCH tells the usermode build what the underlying arch is.  That is set
+# first, and if a usermode build is happening, the "ARCH=um" on the command
+# line overrides the setting of ARCH below.  If a native build is happening,
+# then ARCH is assigned, getting whatever value it gets normally, and 
+# SUBARCH is subsequently ignored.
+
+SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \
+				  -e s/arm.*/arm/ -e s/sa110/arm/ \
+				  -e s/s390x/s390/ -e s/parisc64/parisc/ \
+				  -e s/ppc.*/powerpc/ -e s/mips.*/mips/ )
+
+# Cross compiling and selecting different set of gcc/bin-utils
+# ---------------------------------------------------------------------------
+#
+# When performing cross compilation for other architectures ARCH shall be set
+# to the target architecture. (See arch/* for the possibilities).
+# ARCH can be set during invocation of make:
+# make ARCH=ia64
+# Another way is to have ARCH set in the environment.
+# The default ARCH is the host where make is executed.
+
+# CROSS_COMPILE specify the prefix used for all executables used
+# during compilation. Only gcc and related bin-utils executables
+# are prefixed with $(CROSS_COMPILE).
+# CROSS_COMPILE can be set on the command line
+# make CROSS_COMPILE=ia64-linux-
+# Alternatively CROSS_COMPILE can be set in the environment.
+# Default value for CROSS_COMPILE is not to prefix executables
+# Note: Some architectures assign CROSS_COMPILE in their arch/*/Makefile
+
+ARCH		?= $(SUBARCH)
+CROSS_COMPILE	?=
+
+# Architecture as present in compile.h
+UTS_MACHINE := $(ARCH)
+
+KCONFIG_CONFIG	?= .config
+
+# SHELL used by kbuild
+CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \
+	  else if [ -x /bin/bash ]; then echo /bin/bash; \
+	  else echo sh; fi ; fi)
+
+HOSTCC       = gcc
+HOSTCXX      = g++
+HOSTCFLAGS   = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer
+HOSTCXXFLAGS = -O2
+
+# Decide whether to build built-in, modular, or both.
+# Normally, just do built-in.
+
+KBUILD_MODULES :=
+KBUILD_BUILTIN := 1
+
+#	If we have only "make modules", don't compile built-in objects.
+#	When we're building modules with modversions, we need to consider
+#	the built-in objects during the descend as well, in order to
+#	make sure the checksums are up to date before we record them.
+
+ifeq ($(MAKECMDGOALS),modules)
+  KBUILD_BUILTIN := $(if $(CONFIG_MODVERSIONS),1)
+endif
+
+#	If we have "make <whatever> modules", compile modules
+#	in addition to whatever we do anyway.
+#	Just "make" or "make all" shall build modules as well
+
+ifneq ($(filter all _all modules,$(MAKECMDGOALS)),)
+  KBUILD_MODULES := 1
+endif
+
+ifeq ($(MAKECMDGOALS),)
+  KBUILD_MODULES := 1
+endif
+
+export KBUILD_MODULES KBUILD_BUILTIN
+export KBUILD_CHECKSRC KBUILD_SRC KBUILD_EXTMOD
+
+# Beautify output
+# ---------------------------------------------------------------------------
+#
+# Normally, we echo the whole command before executing it. By making
+# that echo $($(quiet)$(cmd)), we now have the possibility to set
+# $(quiet) to choose other forms of output instead, e.g.
+#
+#         quiet_cmd_cc_o_c = Compiling $(RELDIR)/$@
+#         cmd_cc_o_c       = $(CC) $(c_flags) -c -o $@ $<
+#
+# If $(quiet) is empty, the whole command will be printed.
+# If it is set to "quiet_", only the short version will be printed. 
+# If it is set to "silent_", nothing will be printed at all, since
+# the variable $(silent_cmd_cc_o_c) doesn't exist.
+#
+# A simple variant is to prefix commands with $(Q) - that's useful
+# for commands that shall be hidden in non-verbose mode.
+#
+#	$(Q)ln $@ :<
+#
+# If KBUILD_VERBOSE equals 0 then the above command will be hidden.
+# If KBUILD_VERBOSE equals 1 then the above command is displayed.
+
+ifeq ($(KBUILD_VERBOSE),1)
+  quiet =
+  Q =
+else
+  quiet=quiet_
+  Q = @
+endif
+
+# If the user is running make -s (silent mode), suppress echoing of
+# commands
+
+ifneq ($(findstring s,$(MAKEFLAGS)),)
+  quiet=silent_
+endif
+
+export quiet Q KBUILD_VERBOSE
+
+
+# Look for make include files relative to root of kernel src
+MAKEFLAGS += --include-dir=$(srctree)
+
+# We need some generic definitions.
+include $(srctree)/scripts/Kbuild.include
+
+# Make variables (CC, etc...)
+
+AS		= $(CROSS_COMPILE)as
+LD		= $(CROSS_COMPILE)ld
+CC		= $(CROSS_COMPILE)gcc
+CPP		= $(CC) -E
+AR		= $(CROSS_COMPILE)ar
+NM		= $(CROSS_COMPILE)nm
+STRIP		= $(CROSS_COMPILE)strip
+OBJCOPY		= $(CROSS_COMPILE)objcopy
+OBJDUMP		= $(CROSS_COMPILE)objdump
+AWK		= awk
+GENKSYMS	= scripts/genksyms/genksyms
+DEPMOD		= /sbin/depmod
+KALLSYMS	= scripts/kallsyms
+PERL		= perl
+CHECK		= sparse
+
+CHECKFLAGS     := -D__linux__ -Dlinux -D__STDC__ -Dunix -D__unix__ -Wbitwise $(CF)
+MODFLAGS	= -DMODULE
+CFLAGS_MODULE   = $(MODFLAGS)
+AFLAGS_MODULE   = $(MODFLAGS)
+LDFLAGS_MODULE  = -r
+CFLAGS_KERNEL	=
+AFLAGS_KERNEL	=
+
+
+# Use LINUXINCLUDE when you must reference the include/ directory.
+# Needed to be compatible with the O= option
+LINUXINCLUDE    := -Iinclude \
+                   $(if $(KBUILD_SRC),-Iinclude2 -I$(srctree)/include) \
+		   -include include/linux/autoconf.h
+
+CPPFLAGS        := -D__KERNEL__ $(LINUXINCLUDE)
+
+CFLAGS          := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \
+                   -fno-strict-aliasing -fno-common
+AFLAGS          := -D__ASSEMBLY__
+
+# Read KERNELRELEASE from include/config/kernel.release (if it exists)
+KERNELRELEASE = $(shell cat include/config/kernel.release 2> /dev/null)
+KERNELVERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
+
+export VERSION PATCHLEVEL SUBLEVEL KERNELRELEASE KERNELVERSION
+export ARCH CONFIG_SHELL HOSTCC HOSTCFLAGS CROSS_COMPILE AS LD CC
+export CPP AR NM STRIP OBJCOPY OBJDUMP MAKE AWK GENKSYMS PERL UTS_MACHINE
+export HOSTCXX HOSTCXXFLAGS LDFLAGS_MODULE CHECK CHECKFLAGS
+
+export CPPFLAGS NOSTDINC_FLAGS LINUXINCLUDE OBJCOPYFLAGS LDFLAGS
+export CFLAGS CFLAGS_KERNEL CFLAGS_MODULE
+export AFLAGS AFLAGS_KERNEL AFLAGS_MODULE
+
+# When compiling out-of-tree modules, put MODVERDIR in the module
+# tree rather than in the kernel tree. The kernel tree might
+# even be read-only.
+export MODVERDIR := $(if $(KBUILD_EXTMOD),$(firstword $(KBUILD_EXTMOD))/).tmp_versions
+
+# Files to ignore in find ... statements
+
+RCS_FIND_IGNORE := \( -name SCCS -o -name BitKeeper -o -name .svn -o -name CVS -o -name .pc -o -name .hg -o -name .git \) -prune -o
+export RCS_TAR_IGNORE := --exclude SCCS --exclude BitKeeper --exclude .svn --exclude CVS --exclude .pc --exclude .hg --exclude .git
+
+# ===========================================================================
+# Rules shared between *config targets and build targets
+
+# Basic helpers built in scripts/
+PHONY += scripts_basic
+scripts_basic:
+	$(Q)$(MAKE) $(build)=scripts/basic
+
+# To avoid any implicit rule to kick in, define an empty command.
+scripts/basic/%: scripts_basic ;
+
+PHONY += outputmakefile
+# outputmakefile generates a Makefile in the output directory, if using a
+# separate output directory. This allows convenient use of make in the
+# output directory.
+outputmakefile:
+ifneq ($(KBUILD_SRC),)
+	$(Q)$(CONFIG_SHELL) $(srctree)/scripts/mkmakefile \
+	    $(srctree) $(objtree) $(VERSION) $(PATCHLEVEL)
+endif
+
+# To make sure we do not include .config for any of the *config targets
+# catch them early, and hand them over to scripts/kconfig/Makefile
+# It is allowed to specify more targets when calling make, including
+# mixing *config targets and build targets.
+# For example 'make oldconfig all'.
+# Detect when mixed targets is specified, and make a second invocation
+# of make so .config is not included in this case either (for *config).
+
+no-dot-config-targets := clean mrproper distclean \
+			 cscope TAGS tags help %docs check% \
+			 include/linux/version.h headers_% \
+			 kernelrelease kernelversion
+
+config-targets := 0
+mixed-targets  := 0
+dot-config     := 1
+
+ifneq ($(filter $(no-dot-config-targets), $(MAKECMDGOALS)),)
+	ifeq ($(filter-out $(no-dot-config-targets), $(MAKECMDGOALS)),)
+		dot-config := 0
+	endif
+endif
+
+ifeq ($(KBUILD_EXTMOD),)
+        ifneq ($(filter config %config,$(MAKECMDGOALS)),)
+                config-targets := 1
+                ifneq ($(filter-out config %config,$(MAKECMDGOALS)),)
+                        mixed-targets := 1
+                endif
+        endif
+endif
+
+ifeq ($(mixed-targets),1)
+# ===========================================================================
+# We're called with mixed targets (*config and build targets).
+# Handle them one by one.
+
+%:: FORCE
+	$(Q)$(MAKE) -C $(srctree) KBUILD_SRC= $@
+
+else
+ifeq ($(config-targets),1)
+# ===========================================================================
+# *config targets only - make sure prerequisites are updated, and descend
+# in scripts/kconfig to make the *config target
+
+# Read arch specific Makefile to set KBUILD_DEFCONFIG as needed.
+# KBUILD_DEFCONFIG may point out an alternative default configuration
+# used for 'make defconfig'
+include $(srctree)/arch/$(ARCH)/Makefile
+export KBUILD_DEFCONFIG
+
+config %config: scripts_basic outputmakefile FORCE
+	$(Q)mkdir -p include/linux include/config
+	$(Q)$(MAKE) $(build)=scripts/kconfig $@
+
+else
+# ===========================================================================
+# Build targets only - this includes vmlinux, arch specific targets, clean
+# targets and others. In general all targets except *config targets.
+
+ifeq ($(KBUILD_EXTMOD),)
+# Additional helpers built in scripts/
+# Carefully list dependencies so we do not try to build scripts twice
+# in parallel
+PHONY += scripts
+scripts: scripts_basic include/config/auto.conf
+	$(Q)$(MAKE) $(build)=$(@)
+
+# Objects we will link into vmlinux / subdirs we need to visit
+init-y		:= init/
+drivers-y	:= drivers/ sound/
+net-y		:= net/
+libs-y		:= lib/
+core-y		:= usr/
+endif # KBUILD_EXTMOD
+
+ifeq ($(dot-config),1)
+# Read in config
+-include include/config/auto.conf
+
+ifeq ($(KBUILD_EXTMOD),)
+# Read in dependencies to all Kconfig* files, make sure to run
+# oldconfig if changes are detected.
+-include include/config/auto.conf.cmd
+
+# To avoid any implicit rule to kick in, define an empty command
+$(KCONFIG_CONFIG) include/config/auto.conf.cmd: ;
+
+# If .config is newer than include/config/auto.conf, someone tinkered
+# with it and forgot to run make oldconfig.
+# if auto.conf.cmd is missing then we are probably in a cleaned tree so
+# we execute the config step to be sure to catch updated Kconfig files
+include/config/auto.conf: $(KCONFIG_CONFIG) include/config/auto.conf.cmd
+	$(Q)$(MAKE) -f $(srctree)/Makefile silentoldconfig
+else
+# external modules needs include/linux/autoconf.h and include/config/auto.conf
+# but do not care if they are up-to-date. Use auto.conf to trigger the test
+PHONY += include/config/auto.conf
+
+include/config/auto.conf:
+	$(Q)test -e include/linux/autoconf.h -a -e $@ || (		\
+	echo;								\
+	echo "  ERROR: Kernel configuration is invalid.";		\
+	echo "         include/linux/autoconf.h or $@ are missing.";	\
+	echo "         Run 'make oldconfig && make prepare' on kernel src to fix it.";	\
+	echo;								\
+	/bin/false)
+
+endif # KBUILD_EXTMOD
+
+else
+# Dummy target needed, because used as prerequisite
+include/config/auto.conf: ;
+endif # $(dot-config)
+
+# The all: target is the default when no target is given on the
+# command line.
+# This allow a user to issue only 'make' to build a kernel including modules
+# Defaults vmlinux but it is usually overridden in the arch makefile
+all: vmlinux
+
+ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
+CFLAGS		+= -Os
+else
+CFLAGS		+= -O2
+endif
+
+include $(srctree)/arch/$(ARCH)/Makefile
+
+ifdef CONFIG_FRAME_POINTER
+CFLAGS		+= -fno-omit-frame-pointer $(call cc-option,-fno-optimize-sibling-calls,)
+else
+CFLAGS		+= -fomit-frame-pointer
+endif
+
+ifdef CONFIG_DEBUG_INFO
+CFLAGS		+= -g
+endif
+
+# Force gcc to behave correct even for buggy distributions
+CFLAGS          += $(call cc-option, -fno-stack-protector)
+
+# arch Makefile may override CC so keep this after arch Makefile is included
+NOSTDINC_FLAGS += -nostdinc -isystem $(shell $(CC) -print-file-name=include)
+CHECKFLAGS     += $(NOSTDINC_FLAGS)
+
+# warn about C99 declaration after statement
+CFLAGS += $(call cc-option,-Wdeclaration-after-statement,)
+
+# disable pointer signed / unsigned warnings in gcc 4.0
+CFLAGS += $(call cc-option,-Wno-pointer-sign,)
+
+# Default kernel image to build when no specific target is given.
+# KBUILD_IMAGE may be overruled on the command line or
+# set in the environment
+# Also any assignments in arch/$(ARCH)/Makefile take precedence over
+# this default value
+export KBUILD_IMAGE ?= vmlinux
+
+#
+# INSTALL_PATH specifies where to place the updated kernel and system map
+# images. Default is /boot, but you can set it to other values
+export	INSTALL_PATH ?= /boot
+
+#
+# INSTALL_MOD_PATH specifies a prefix to MODLIB for module directory
+# relocations required by build roots.  This is not defined in the
+# makefile but the argument can be passed to make if needed.
+#
+
+MODLIB	= $(INSTALL_MOD_PATH)/lib/modules/$(KERNELRELEASE)
+export MODLIB
+
+#
+#  INSTALL_MOD_STRIP, if defined, will cause modules to be
+#  stripped after they are installed.  If INSTALL_MOD_STRIP is '1', then
+#  the default option --strip-debug will be used.  Otherwise,
+#  INSTALL_MOD_STRIP will used as the options to the strip command.
+
+ifdef INSTALL_MOD_STRIP
+ifeq ($(INSTALL_MOD_STRIP),1)
+mod_strip_cmd = $(STRIP) --strip-debug
+else
+mod_strip_cmd = $(STRIP) $(INSTALL_MOD_STRIP)
+endif # INSTALL_MOD_STRIP=1
+else
+mod_strip_cmd = true
+endif # INSTALL_MOD_STRIP
+export mod_strip_cmd
+
+
+ifeq ($(KBUILD_EXTMOD),)
+core-y		+= kernel/ mm/ fs/ ipc/ security/ crypto/ block/
+
+vmlinux-dirs	:= $(patsubst %/,%,$(filter %/, $(init-y) $(init-m) \
+		     $(core-y) $(core-m) $(drivers-y) $(drivers-m) \
+		     $(net-y) $(net-m) $(libs-y) $(libs-m)))
+
+vmlinux-alldirs	:= $(sort $(vmlinux-dirs) $(patsubst %/,%,$(filter %/, \
+		     $(init-n) $(init-) \
+		     $(core-n) $(core-) $(drivers-n) $(drivers-) \
+		     $(net-n)  $(net-)  $(libs-n)    $(libs-))))
+
+init-y		:= $(patsubst %/, %/built-in.o, $(init-y))
+core-y		:= $(patsubst %/, %/built-in.o, $(core-y))
+drivers-y	:= $(patsubst %/, %/built-in.o, $(drivers-y))
+net-y		:= $(patsubst %/, %/built-in.o, $(net-y))
+libs-y1		:= $(patsubst %/, %/lib.a, $(libs-y))
+libs-y2		:= $(patsubst %/, %/built-in.o, $(libs-y))
+libs-y		:= $(libs-y1) $(libs-y2)
+
+# Build vmlinux
+# ---------------------------------------------------------------------------
+# vmlinux is built from the objects selected by $(vmlinux-init) and
+# $(vmlinux-main). Most are built-in.o files from top-level directories
+# in the kernel tree, others are specified in arch/$(ARCH)Makefile.
+# Ordering when linking is important, and $(vmlinux-init) must be first.
+#
+# vmlinux
+#   ^
+#   |
+#   +-< $(vmlinux-init)
+#   |   +--< init/version.o + more
+#   |
+#   +--< $(vmlinux-main)
+#   |    +--< driver/built-in.o mm/built-in.o + more
+#   |
+#   +-< kallsyms.o (see description in CONFIG_KALLSYMS section)
+#
+# vmlinux version (uname -v) cannot be updated during normal
+# descending-into-subdirs phase since we do not yet know if we need to
+# update vmlinux.
+# Therefore this step is delayed until just before final link of vmlinux -
+# except in the kallsyms case where it is done just before adding the
+# symbols to the kernel.
+#
+# System.map is generated to document addresses of all kernel symbols
+
+vmlinux-init := $(head-y) $(init-y)
+vmlinux-main := $(core-y) $(libs-y) $(drivers-y) $(net-y)
+vmlinux-all  := $(vmlinux-init) $(vmlinux-main)
+vmlinux-lds  := arch/$(ARCH)/kernel/vmlinux.lds
+
+# Rule to link vmlinux - also used during CONFIG_KALLSYMS
+# May be overridden by arch/$(ARCH)/Makefile
+quiet_cmd_vmlinux__ ?= LD      $@
+      cmd_vmlinux__ ?= $(LD) $(LDFLAGS) $(LDFLAGS_vmlinux) -o $@ \
+      -T $(vmlinux-lds) $(vmlinux-init)                          \
+      --start-group $(vmlinux-main) --end-group                  \
+      $(filter-out $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) FORCE ,$^)
+
+# Generate new vmlinux version
+quiet_cmd_vmlinux_version = GEN     .version
+      cmd_vmlinux_version = set -e;                     \
+	if [ ! -r .version ]; then			\
+	  rm -f .version;				\
+	  echo 1 >.version;				\
+	else						\
+	  mv .version .old_version;			\
+	  expr 0$$(cat .old_version) + 1 >.version;	\
+	fi;						\
+	$(MAKE) $(build)=init
+
+# Generate System.map
+quiet_cmd_sysmap = SYSMAP
+      cmd_sysmap = $(CONFIG_SHELL) $(srctree)/scripts/mksysmap
+
+# Link of vmlinux
+# If CONFIG_KALLSYMS is set .version is already updated
+# Generate System.map and verify that the content is consistent
+# Use + in front of the vmlinux_version rule to silent warning with make -j2
+# First command is ':' to allow us to use + in front of the rule
+define rule_vmlinux__
+	:
+	$(if $(CONFIG_KALLSYMS),,+$(call cmd,vmlinux_version))
+
+	$(call cmd,vmlinux__)
+	$(Q)echo 'cmd_$@ := $(cmd_vmlinux__)' > $(@D)/.$(@F).cmd
+
+	$(Q)$(if $($(quiet)cmd_sysmap),                                      \
+	  echo '  $($(quiet)cmd_sysmap)  System.map' &&)                     \
+	$(cmd_sysmap) $@ System.map;                                         \
+	if [ $$? -ne 0 ]; then                                               \
+		rm -f $@;                                                    \
+		/bin/false;                                                  \
+	fi;
+	$(verify_kallsyms)
+endef
+
+
+ifdef CONFIG_KALLSYMS
+# Generate section listing all symbols and add it into vmlinux $(kallsyms.o)
+# It's a three stage process:
+# o .tmp_vmlinux1 has all symbols and sections, but __kallsyms is
+#   empty
+#   Running kallsyms on that gives us .tmp_kallsyms1.o with
+#   the right size - vmlinux version (uname -v) is updated during this step
+# o .tmp_vmlinux2 now has a __kallsyms section of the right size,
+#   but due to the added section, some addresses have shifted.
+#   From here, we generate a correct .tmp_kallsyms2.o
+# o The correct .tmp_kallsyms2.o is linked into the final vmlinux.
+# o Verify that the System.map from vmlinux matches the map from
+#   .tmp_vmlinux2, just in case we did not generate kallsyms correctly.
+# o If CONFIG_KALLSYMS_EXTRA_PASS is set, do an extra pass using
+#   .tmp_vmlinux3 and .tmp_kallsyms3.o.  This is only meant as a
+#   temporary bypass to allow the kernel to be built while the
+#   maintainers work out what went wrong with kallsyms.
+
+ifdef CONFIG_KALLSYMS_EXTRA_PASS
+last_kallsyms := 3
+else
+last_kallsyms := 2
+endif
+
+kallsyms.o := .tmp_kallsyms$(last_kallsyms).o
+
+define verify_kallsyms
+	$(Q)$(if $($(quiet)cmd_sysmap),                                      \
+	  echo '  $($(quiet)cmd_sysmap)  .tmp_System.map' &&)                \
+	  $(cmd_sysmap) .tmp_vmlinux$(last_kallsyms) .tmp_System.map
+	$(Q)cmp -s System.map .tmp_System.map ||                             \
+		(echo Inconsistent kallsyms data;                            \
+		 echo Try setting CONFIG_KALLSYMS_EXTRA_PASS;                \
+		 rm .tmp_kallsyms* ; /bin/false )
+endef
+
+# Update vmlinux version before link
+# Use + in front of this rule to silent warning about make -j1
+# First command is ':' to allow us to use + in front of this rule
+cmd_ksym_ld = $(cmd_vmlinux__)
+define rule_ksym_ld
+	: 
+	+$(call cmd,vmlinux_version)
+	$(call cmd,vmlinux__)
+	$(Q)echo 'cmd_$@ := $(cmd_vmlinux__)' > $(@D)/.$(@F).cmd
+endef
+
+# Generate .S file with all kernel symbols
+quiet_cmd_kallsyms = KSYM    $@
+      cmd_kallsyms = $(NM) -n $< | $(KALLSYMS) \
+                     $(if $(CONFIG_KALLSYMS_ALL),--all-symbols) > $@
+
+.tmp_kallsyms1.o .tmp_kallsyms2.o .tmp_kallsyms3.o: %.o: %.S scripts FORCE
+	$(call if_changed_dep,as_o_S)
+
+.tmp_kallsyms%.S: .tmp_vmlinux% $(KALLSYMS)
+	$(call cmd,kallsyms)
+
+# .tmp_vmlinux1 must be complete except kallsyms, so update vmlinux version
+.tmp_vmlinux1: $(vmlinux-lds) $(vmlinux-all) FORCE
+	$(call if_changed_rule,ksym_ld)
+
+.tmp_vmlinux2: $(vmlinux-lds) $(vmlinux-all) .tmp_kallsyms1.o FORCE
+	$(call if_changed,vmlinux__)
+
+.tmp_vmlinux3: $(vmlinux-lds) $(vmlinux-all) .tmp_kallsyms2.o FORCE
+	$(call if_changed,vmlinux__)
+
+# Needs to visit scripts/ before $(KALLSYMS) can be used.
+$(KALLSYMS): scripts ;
+
+# Generate some data for debugging strange kallsyms problems
+debug_kallsyms: .tmp_map$(last_kallsyms)
+
+.tmp_map%: .tmp_vmlinux% FORCE
+	($(OBJDUMP) -h $< | $(AWK) '/^ +[0-9]/{print $$4 " 0 " $$2}'; $(NM) $<) | sort > $@
+
+.tmp_map3: .tmp_map2
+
+.tmp_map2: .tmp_map1
+
+endif # ifdef CONFIG_KALLSYMS
+
+# vmlinux image - including updated kernel symbols
+vmlinux: $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) $(kallsyms.o) FORCE
+ifdef CONFIG_HEADERS_CHECK
+	$(Q)$(MAKE) -f $(srctree)/Makefile headers_check
+endif
+	$(call if_changed_rule,vmlinux__)
+	$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost $@
+	$(Q)rm -f .old_version
+
+# The actual objects are generated when descending, 
+# make sure no implicit rule kicks in
+$(sort $(vmlinux-init) $(vmlinux-main)) $(vmlinux-lds): $(vmlinux-dirs) ;
+
+# Handle descending into subdirectories listed in $(vmlinux-dirs)
+# Preset locale variables to speed up the build process. Limit locale
+# tweaks to this spot to avoid wrong language settings when running
+# make menuconfig etc.
+# Error messages still appears in the original language
+
+PHONY += $(vmlinux-dirs)
+$(vmlinux-dirs): prepare scripts
+	$(Q)$(MAKE) $(build)=$@
+
+# Build the kernel release string
+#
+# The KERNELRELEASE value built here is stored in the file
+# include/config/kernel.release, and is used when executing several
+# make targets, such as "make install" or "make modules_install."
+#
+# The eventual kernel release string consists of the following fields,
+# shown in a hierarchical format to show how smaller parts are concatenated
+# to form the larger and final value, with values coming from places like
+# the Makefile, kernel config options, make command line options and/or
+# SCM tag information.
+#
+#	$(KERNELVERSION)
+#	  $(VERSION)			eg, 2
+#	  $(PATCHLEVEL)			eg, 6
+#	  $(SUBLEVEL)			eg, 18
+#	  $(EXTRAVERSION)		eg, -rc6
+#	$(localver-full)
+#	  $(localver)
+#	    localversion*		(all localversion* files)
+#	    $(CONFIG_LOCALVERSION)	(from kernel config setting)
+#	  $(localver-auto)		(only if CONFIG_LOCALVERSION_AUTO is set)
+#	    ./scripts/setlocalversion	(SCM tag, if one exists)
+#	    $(LOCALVERSION)		(from make command line if provided)
+#
+#  Note how the final $(localver-auto) string is included *only* if the
+# kernel config option CONFIG_LOCALVERSION_AUTO is selected.  Also, at the
+# moment, only git is supported but other SCMs can edit the script
+# scripts/setlocalversion and add the appropriate checks as needed.
+
+nullstring :=
+space      := $(nullstring) # end of line
+
+___localver = $(objtree)/localversion* $(srctree)/localversion*
+__localver  = $(sort $(wildcard $(___localver)))
+# skip backup files (containing '~')
+_localver = $(foreach f, $(__localver), $(if $(findstring ~, $(f)),,$(f)))
+
+localver = $(subst $(space),, \
+	   $(shell cat /dev/null $(_localver)) \
+	   $(patsubst "%",%,$(CONFIG_LOCALVERSION)))
+
+# If CONFIG_LOCALVERSION_AUTO is set scripts/setlocalversion is called
+# and if the SCM is know a tag from the SCM is appended.
+# The appended tag is determined by the SCM used.
+#
+# Currently, only git is supported.
+# Other SCMs can edit scripts/setlocalversion and add the appropriate
+# checks as needed.
+ifdef CONFIG_LOCALVERSION_AUTO
+	_localver-auto = $(shell $(CONFIG_SHELL) \
+	                  $(srctree)/scripts/setlocalversion $(srctree))
+	localver-auto  = $(LOCALVERSION)$(_localver-auto)
+endif
+
+localver-full = $(localver)$(localver-auto)
+
+# Store (new) KERNELRELASE string in include/config/kernel.release
+kernelrelease = $(KERNELVERSION)$(localver-full)
+include/config/kernel.release: include/config/auto.conf FORCE
+	$(Q)rm -f $@
+	$(Q)echo $(kernelrelease) > $@
+
+
+# Things we need to do before we recursively start building the kernel
+# or the modules are listed in "prepare".
+# A multi level approach is used. prepareN is processed before prepareN-1.
+# archprepare is used in arch Makefiles and when processed asm symlink,
+# version.h and scripts_basic is processed / created.
+
+# Listed in dependency order
+PHONY += prepare archprepare prepare0 prepare1 prepare2 prepare3
+
+# prepare-all is deprecated, use prepare as valid replacement
+PHONY += prepare-all
+
+# prepare3 is used to check if we are building in a separate output directory,
+# and if so do:
+# 1) Check that make has not been executed in the kernel src $(srctree)
+# 2) Create the include2 directory, used for the second asm symlink
+prepare3: include/config/kernel.release
+ifneq ($(KBUILD_SRC),)
+	@echo '  Using $(srctree) as source for kernel'
+	$(Q)if [ -f $(srctree)/.config -o -d $(srctree)/include/config ]; then \
+		echo "  $(srctree) is not clean, please run 'make mrproper'";\
+		echo "  in the '$(srctree)' directory.";\
+		/bin/false; \
+	fi;
+	$(Q)if [ ! -d include2 ]; then mkdir -p include2; fi;
+	$(Q)ln -fsn $(srctree)/include/asm-$(ARCH) include2/asm
+endif
+
+# prepare2 creates a makefile if using a separate output directory
+prepare2: prepare3 outputmakefile
+
+prepare1: prepare2 include/linux/version.h include/linux/utsrelease.h \
+                   include/asm include/config/auto.conf
+ifneq ($(KBUILD_MODULES),)
+	$(Q)mkdir -p $(MODVERDIR)
+	$(Q)rm -f $(MODVERDIR)/*
+endif
+
+archprepare: prepare1 scripts_basic
+
+prepare0: archprepare FORCE
+	$(Q)$(MAKE) $(build)=.
+
+# All the preparing..
+prepare prepare-all: prepare0
+
+# Leave this as default for preprocessing vmlinux.lds.S, which is now
+# done in arch/$(ARCH)/kernel/Makefile
+
+export CPPFLAGS_vmlinux.lds += -P -C -U$(ARCH)
+
+# FIXME: The asm symlink changes when $(ARCH) changes. That's
+# hard to detect, but I suppose "make mrproper" is a good idea
+# before switching between archs anyway.
+
+include/asm:
+	@echo '  SYMLINK $@ -> include/asm-$(ARCH)'
+	$(Q)if [ ! -d include ]; then mkdir -p include; fi;
+	@ln -fsn asm-$(ARCH) $@
+
+# Generate some files
+# ---------------------------------------------------------------------------
+
+# KERNELRELEASE can change from a few different places, meaning version.h
+# needs to be updated, so this check is forced on all builds
+
+uts_len := 64
+define filechk_utsrelease.h
+	if [ `echo -n "$(KERNELRELEASE)" | wc -c ` -gt $(uts_len) ]; then \
+	  echo '"$(KERNELRELEASE)" exceeds $(uts_len) characters' >&2;    \
+	  exit 1;                                                         \
+	fi;                                                               \
+	(echo \#define UTS_RELEASE \"$(KERNELRELEASE)\";)
+endef
+
+define filechk_version.h
+	(echo \#define LINUX_VERSION_CODE $(shell                             \
+	expr $(VERSION) \* 65536 + $(PATCHLEVEL) \* 256 + $(SUBLEVEL));     \
+	echo '#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))';)
+endef
+
+include/linux/version.h: $(srctree)/Makefile FORCE
+	$(call filechk,version.h)
+
+include/linux/utsrelease.h: include/config/kernel.release FORCE
+	$(call filechk,utsrelease.h)
+
+# ---------------------------------------------------------------------------
+
+PHONY += depend dep
+depend dep:
+	@echo '*** Warning: make $@ is unnecessary now.'
+
+# ---------------------------------------------------------------------------
+# Kernel headers
+INSTALL_HDR_PATH=$(objtree)/usr
+export INSTALL_HDR_PATH
+
+HDRARCHES=$(filter-out generic,$(patsubst $(srctree)/include/asm-%/Kbuild,%,$(wildcard $(srctree)/include/asm-*/Kbuild)))
+
+PHONY += headers_install_all
+headers_install_all: include/linux/version.h scripts_basic FORCE
+	$(Q)$(MAKE) $(build)=scripts scripts/unifdef
+	$(Q)for arch in $(HDRARCHES); do \
+	 $(MAKE) ARCH=$$arch -f $(srctree)/scripts/Makefile.headersinst obj=include BIASMDIR=-bi-$$arch ;\
+	 done
+
+PHONY += headers_install
+headers_install: include/linux/version.h scripts_basic FORCE
+	@if [ ! -r $(srctree)/include/asm-$(ARCH)/Kbuild ]; then \
+	  echo '*** Error: Headers not exportable for this architecture ($(ARCH))'; \
+	  exit 1 ; fi
+	$(Q)$(MAKE) $(build)=scripts scripts/unifdef
+	$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.headersinst obj=include
+
+PHONY += headers_check
+headers_check: headers_install
+	$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.headersinst obj=include HDRCHECK=1
+
+# ---------------------------------------------------------------------------
+# Modules
+
+ifdef CONFIG_MODULES
+
+# By default, build modules as well
+
+all: modules
+
+#	Build modules
+
+PHONY += modules
+modules: $(vmlinux-dirs) $(if $(KBUILD_BUILTIN),vmlinux)
+	@echo '  Building modules, stage 2.';
+	$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
+
+
+# Target to prepare building external modules
+PHONY += modules_prepare
+modules_prepare: prepare scripts
+
+# Target to install modules
+PHONY += modules_install
+modules_install: _modinst_ _modinst_post
+
+PHONY += _modinst_
+_modinst_:
+	@if [ -z "`$(DEPMOD) -V 2>/dev/null | grep module-init-tools`" ]; then \
+		echo "Warning: you may need to install module-init-tools"; \
+		echo "See http://www.codemonkey.org.uk/docs/post-halloween-2.6.txt";\
+		sleep 1; \
+	fi
+	@rm -rf $(MODLIB)/kernel
+	@rm -f $(MODLIB)/source
+	@mkdir -p $(MODLIB)/kernel
+	@ln -s $(srctree) $(MODLIB)/source
+	@if [ ! $(objtree) -ef  $(MODLIB)/build ]; then \
+		rm -f $(MODLIB)/build ; \
+		ln -s $(objtree) $(MODLIB)/build ; \
+	fi
+	$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modinst
+
+# If System.map exists, run depmod.  This deliberately does not have a
+# dependency on System.map since that would run the dependency tree on
+# vmlinux.  This depmod is only for convenience to give the initial
+# boot a modules.dep even before / is mounted read-write.  However the
+# boot script depmod is the master version.
+ifeq "$(strip $(INSTALL_MOD_PATH))" ""
+depmod_opts	:=
+else
+depmod_opts	:= -b $(INSTALL_MOD_PATH) -r
+endif
+PHONY += _modinst_post
+_modinst_post: _modinst_
+	if [ -r System.map -a -x $(DEPMOD) ]; then $(DEPMOD) -ae -F System.map $(depmod_opts) $(KERNELRELEASE); fi
+
+else # CONFIG_MODULES
+
+# Modules not configured
+# ---------------------------------------------------------------------------
+
+modules modules_install: FORCE
+	@echo
+	@echo "The present kernel configuration has modules disabled."
+	@echo "Type 'make config' and enable loadable module support."
+	@echo "Then build a kernel with module support enabled."
+	@echo
+	@exit 1
+
+endif # CONFIG_MODULES
+
+###
+# Cleaning is done on three levels.
+# make clean     Delete most generated files
+#                Leave enough to build external modules
+# make mrproper  Delete the current configuration, and all generated files
+# make distclean Remove editor backup files, patch leftover files and the like
+
+# Directories & files removed with 'make clean'
+CLEAN_DIRS  += $(MODVERDIR)
+CLEAN_FILES +=	vmlinux System.map \
+                .tmp_kallsyms* .tmp_version .tmp_vmlinux* .tmp_System.map
+
+# Directories & files removed with 'make mrproper'
+MRPROPER_DIRS  += include/config include2 usr/include
+MRPROPER_FILES += .config .config.old include/asm .version .old_version \
+                  include/linux/autoconf.h include/linux/version.h      \
+                  include/linux/utsrelease.h                            \
+		  Module.symvers tags TAGS cscope*
+
+# clean - Delete most, but leave enough to build external modules
+#
+clean: rm-dirs  := $(CLEAN_DIRS)
+clean: rm-files := $(CLEAN_FILES)
+clean-dirs      := $(addprefix _clean_,$(srctree) $(vmlinux-alldirs))
+
+PHONY += $(clean-dirs) clean archclean
+$(clean-dirs):
+	$(Q)$(MAKE) $(clean)=$(patsubst _clean_%,%,$@)
+
+clean: archclean $(clean-dirs)
+	$(call cmd,rmdirs)
+	$(call cmd,rmfiles)
+	@find . $(RCS_FIND_IGNORE) \
+		\( -name '*.[oas]' -o -name '*.ko' -o -name '.*.cmd' \
+		-o -name '.*.d' -o -name '.*.tmp' -o -name '*.mod.c' \
+		-o -name '*.symtypes' \) \
+		-type f -print | xargs rm -f
+
+# mrproper - Delete all generated files, including .config
+#
+mrproper: rm-dirs  := $(wildcard $(MRPROPER_DIRS))
+mrproper: rm-files := $(wildcard $(MRPROPER_FILES))
+mrproper-dirs      := $(addprefix _mrproper_,Documentation/DocBook scripts)
+
+PHONY += $(mrproper-dirs) mrproper archmrproper
+$(mrproper-dirs):
+	$(Q)$(MAKE) $(clean)=$(patsubst _mrproper_%,%,$@)
+
+mrproper: clean archmrproper $(mrproper-dirs)
+	$(call cmd,rmdirs)
+	$(call cmd,rmfiles)
+
+# distclean
+#
+PHONY += distclean
+
+distclean: mrproper
+	@find $(srctree) $(RCS_FIND_IGNORE) \
+		\( -name '*.orig' -o -name '*.rej' -o -name '*~' \
+		-o -name '*.bak' -o -name '#*#' -o -name '.*.orig' \
+		-o -name '.*.rej' -o -size 0 \
+		-o -name '*%' -o -name '.*.cmd' -o -name 'core' \) \
+		-type f -print | xargs rm -f
+
+
+# Packaging of the kernel to various formats
+# ---------------------------------------------------------------------------
+# rpm target kept for backward compatibility
+package-dir	:= $(srctree)/scripts/package
+
+%pkg: include/config/kernel.release FORCE
+	$(Q)$(MAKE) $(build)=$(package-dir) $@
+rpm: include/config/kernel.release FORCE
+	$(Q)$(MAKE) $(build)=$(package-dir) $@
+
+
+# Brief documentation of the typical targets used
+# ---------------------------------------------------------------------------
+
+boards := $(wildcard $(srctree)/arch/$(ARCH)/configs/*_defconfig)
+boards := $(notdir $(boards))
+
+help:
+	@echo  'Cleaning targets:'
+	@echo  '  clean		  - Remove most generated files but keep the config and'
+	@echo  '                    enough build support to build external modules'
+	@echo  '  mrproper	  - Remove all generated files + config + various backup files'
+	@echo  '  distclean	  - mrproper + remove editor backup and patch files'
+	@echo  ''
+	@echo  'Configuration targets:'
+	@$(MAKE) -f $(srctree)/scripts/kconfig/Makefile help
+	@echo  ''
+	@echo  'Other generic targets:'
+	@echo  '  all		  - Build all targets marked with [*]'
+	@echo  '* vmlinux	  - Build the bare kernel'
+	@echo  '* modules	  - Build all modules'
+	@echo  '  modules_install - Install all modules to INSTALL_MOD_PATH (default: /)'
+	@echo  '  dir/            - Build all files in dir and below'
+	@echo  '  dir/file.[ois]  - Build specified target only'
+	@echo  '  dir/file.ko     - Build module including final link'
+	@echo  '  rpm		  - Build a kernel as an RPM package'
+	@echo  '  tags/TAGS	  - Generate tags file for editors'
+	@echo  '  cscope	  - Generate cscope index'
+	@echo  '  kernelrelease	  - Output the release version string'
+	@echo  '  kernelversion	  - Output the version stored in Makefile'
+	@if [ -r $(srctree)/include/asm-$(ARCH)/Kbuild ]; then \
+	 echo  '  headers_install - Install sanitised kernel headers to INSTALL_HDR_PATH'; \
+	 echo  '                    (default: $(INSTALL_HDR_PATH))'; \
+	 fi
+	@echo  ''
+	@echo  'Static analysers'
+	@echo  '  checkstack      - Generate a list of stack hogs'
+	@echo  '  namespacecheck  - Name space analysis on compiled kernel'
+	@if [ -r $(srctree)/include/asm-$(ARCH)/Kbuild ]; then \
+	 echo  '  headers_check   - Sanity check on exported headers'; \
+	 fi
+	@echo  ''
+	@echo  'Kernel packaging:'
+	@$(MAKE) $(build)=$(package-dir) help
+	@echo  ''
+	@echo  'Documentation targets:'
+	@$(MAKE) -f $(srctree)/Documentation/DocBook/Makefile dochelp
+	@echo  ''
+	@echo  'Architecture specific targets ($(ARCH)):'
+	@$(if $(archhelp),$(archhelp),\
+		echo '  No architecture specific help defined for $(ARCH)')
+	@echo  ''
+	@$(if $(boards), \
+		$(foreach b, $(boards), \
+		printf "  %-24s - Build for %s\\n" $(b) $(subst _defconfig,,$(b));) \
+		echo '')
+
+	@echo  '  make V=0|1 [targets] 0 => quiet build (default), 1 => verbose build'
+	@echo  '  make V=2   [targets] 2 => give reason for rebuild of target'
+	@echo  '  make O=dir [targets] Locate all output files in "dir", including .config'
+	@echo  '  make C=1   [targets] Check all c source with $$CHECK (sparse by default)'
+	@echo  '  make C=2   [targets] Force check of all c source with $$CHECK'
+	@echo  ''
+	@echo  'Execute "make" or "make all" to build all targets marked with [*] '
+	@echo  'For further info see the ./README file'
+
+
+# Documentation targets
+# ---------------------------------------------------------------------------
+%docs: scripts_basic FORCE
+	$(Q)$(MAKE) $(build)=Documentation/DocBook $@
+
+else # KBUILD_EXTMOD
+
+###
+# External module support.
+# When building external modules the kernel used as basis is considered
+# read-only, and no consistency checks are made and the make
+# system is not used on the basis kernel. If updates are required
+# in the basis kernel ordinary make commands (without M=...) must
+# be used.
+#
+# The following are the only valid targets when building external
+# modules.
+# make M=dir clean     Delete all automatically generated files
+# make M=dir modules   Make all modules in specified dir
+# make M=dir	       Same as 'make M=dir modules'
+# make M=dir modules_install
+#                      Install the modules built in the module directory
+#                      Assumes install directory is already created
+
+# We are always building modules
+KBUILD_MODULES := 1
+PHONY += crmodverdir
+crmodverdir:
+	$(Q)mkdir -p $(MODVERDIR)
+	$(Q)rm -f $(MODVERDIR)/*
+
+PHONY += $(objtree)/Module.symvers
+$(objtree)/Module.symvers:
+	@test -e $(objtree)/Module.symvers || ( \
+	echo; \
+	echo "  WARNING: Symbol version dump $(objtree)/Module.symvers"; \
+	echo "           is missing; modules will have no dependencies and modversions."; \
+	echo )
+
+module-dirs := $(addprefix _module_,$(KBUILD_EXTMOD))
+PHONY += $(module-dirs) modules
+$(module-dirs): crmodverdir $(objtree)/Module.symvers
+	$(Q)$(MAKE) $(build)=$(patsubst _module_%,%,$@)
+
+modules: $(module-dirs)
+	@echo '  Building modules, stage 2.';
+	$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
+
+PHONY += modules_install
+modules_install: _emodinst_ _emodinst_post
+
+install-dir := $(if $(INSTALL_MOD_DIR),$(INSTALL_MOD_DIR),extra)
+PHONY += _emodinst_
+_emodinst_:
+	$(Q)mkdir -p $(MODLIB)/$(install-dir)
+	$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modinst
+
+# Run depmod only is we have System.map and depmod is executable
+quiet_cmd_depmod = DEPMOD  $(KERNELRELEASE)
+      cmd_depmod = if [ -r System.map -a -x $(DEPMOD) ]; then \
+                      $(DEPMOD) -ae -F System.map             \
+                      $(if $(strip $(INSTALL_MOD_PATH)),      \
+		      -b $(INSTALL_MOD_PATH) -r)              \
+		      $(KERNELRELEASE);                       \
+                   fi
+
+PHONY += _emodinst_post
+_emodinst_post: _emodinst_
+	$(call cmd,depmod)
+
+clean-dirs := $(addprefix _clean_,$(KBUILD_EXTMOD))
+
+PHONY += $(clean-dirs) clean
+$(clean-dirs):
+	$(Q)$(MAKE) $(clean)=$(patsubst _clean_%,%,$@)
+
+clean:	rm-dirs := $(MODVERDIR)
+clean: $(clean-dirs)
+	$(call cmd,rmdirs)
+	@find $(KBUILD_EXTMOD) $(RCS_FIND_IGNORE) \
+		\( -name '*.[oas]' -o -name '*.ko' -o -name '.*.cmd' \
+		-o -name '.*.d' -o -name '.*.tmp' -o -name '*.mod.c' \) \
+		-type f -print | xargs rm -f
+
+help:
+	@echo  '  Building external modules.'
+	@echo  '  Syntax: make -C path/to/kernel/src M=$$PWD target'
+	@echo  ''
+	@echo  '  modules         - default target, build the module(s)'
+	@echo  '  modules_install - install the module'
+	@echo  '  clean           - remove generated files in module directory only'
+	@echo  ''
+
+# Dummies...
+PHONY += prepare scripts
+prepare: ;
+scripts: ;
+endif # KBUILD_EXTMOD
+
+# Generate tags for editors
+# ---------------------------------------------------------------------------
+
+#We want __srctree to totally vanish out when KBUILD_OUTPUT is not set
+#(which is the most common case IMHO) to avoid unneeded clutter in the big tags file.
+#Adding $(srctree) adds about 20M on i386 to the size of the output file!
+
+ifeq ($(src),$(obj))
+__srctree =
+else
+__srctree = $(srctree)/
+endif
+
+ifeq ($(ALLSOURCE_ARCHS),)
+ifeq ($(ARCH),um)
+ALLINCLUDE_ARCHS := $(ARCH) $(SUBARCH)
+else
+ALLINCLUDE_ARCHS := $(ARCH)
+endif
+else
+#Allow user to specify only ALLSOURCE_PATHS on the command line, keeping existing behavour.
+ALLINCLUDE_ARCHS := $(ALLSOURCE_ARCHS)
+endif
+
+ALLSOURCE_ARCHS := $(ARCH)
+
+define find-sources
+        ( find $(__srctree) $(RCS_FIND_IGNORE) \
+	       \( -name include -o -name arch \) -prune -o \
+	       -name $1 -print; \
+	  for ARCH in $(ALLSOURCE_ARCHS) ; do \
+	       find $(__srctree)arch/$${ARCH} $(RCS_FIND_IGNORE) \
+	            -name $1 -print; \
+	  done ; \
+	  find $(__srctree)security/selinux/include $(RCS_FIND_IGNORE) \
+	       -name $1 -print; \
+	  find $(__srctree)include $(RCS_FIND_IGNORE) \
+	       \( -name config -o -name 'asm-*' \) -prune \
+	       -o -name $1 -print; \
+	  for ARCH in $(ALLINCLUDE_ARCHS) ; do \
+	       find $(__srctree)include/asm-$${ARCH} $(RCS_FIND_IGNORE) \
+	            -name $1 -print; \
+	  done ; \
+	  find $(__srctree)include/asm-generic $(RCS_FIND_IGNORE) \
+	       -name $1 -print )
+endef
+
+define all-sources
+	$(call find-sources,'*.[chS]')
+endef
+define all-kconfigs
+	$(call find-sources,'Kconfig*')
+endef
+define all-defconfigs
+	$(call find-sources,'defconfig')
+endef
+
+define xtags
+	if $1 --version 2>&1 | grep -iq exuberant; then \
+	    $(all-sources) | xargs $1 -a \
+		-I __initdata,__exitdata,__acquires,__releases \
+		-I EXPORT_SYMBOL,EXPORT_SYMBOL_GPL \
+		--extra=+f --c-kinds=+px \
+		--regex-asm='/ENTRY\(([^)]*)\).*/\1/'; \
+	    $(all-kconfigs) | xargs $1 -a \
+		--langdef=kconfig \
+		--language-force=kconfig \
+		--regex-kconfig='/^[[:blank:]]*config[[:blank:]]+([[:alnum:]_]+)/\1/'; \
+	    $(all-defconfigs) | xargs -r $1 -a \
+		--langdef=dotconfig \
+		--language-force=dotconfig \
+		--regex-dotconfig='/^#?[[:blank:]]*(CONFIG_[[:alnum:]_]+)/\1/'; \
+	elif $1 --version 2>&1 | grep -iq emacs; then \
+	    $(all-sources) | xargs $1 -a; \
+	    $(all-kconfigs) | xargs $1 -a \
+		--regex='/^[ \t]*config[ \t]+\([a-zA-Z0-9_]+\)/\1/'; \
+	    $(all-defconfigs) | xargs -r $1 -a \
+		--regex='/^#?[ \t]?\(CONFIG_[a-zA-Z0-9_]+\)/\1/'; \
+	else \
+	    $(all-sources) | xargs $1 -a; \
+	fi
+endef
+
+quiet_cmd_cscope-file = FILELST cscope.files
+      cmd_cscope-file = (echo \-k; echo \-q; $(all-sources)) > cscope.files
+
+quiet_cmd_cscope = MAKE    cscope.out
+      cmd_cscope = cscope -b
+
+cscope: FORCE
+	$(call cmd,cscope-file)
+	$(call cmd,cscope)
+
+quiet_cmd_TAGS = MAKE   $@
+define cmd_TAGS
+	rm -f $@; \
+	$(call xtags,etags)
+endef
+
+TAGS: FORCE
+	$(call cmd,TAGS)
+
+quiet_cmd_tags = MAKE   $@
+define cmd_tags
+	rm -f $@; \
+	$(call xtags,ctags)
+endef
+
+tags: FORCE
+	$(call cmd,tags)
+
+
+# Scripts to check various things for consistency
+# ---------------------------------------------------------------------------
+
+includecheck:
+	find * $(RCS_FIND_IGNORE) \
+		-name '*.[hcS]' -type f -print | sort \
+		| xargs $(PERL) -w scripts/checkincludes.pl
+
+versioncheck:
+	find * $(RCS_FIND_IGNORE) \
+		-name '*.[hcS]' -type f -print | sort \
+		| xargs $(PERL) -w scripts/checkversion.pl
+
+namespacecheck:
+	$(PERL) $(srctree)/scripts/namespace.pl
+
+endif #ifeq ($(config-targets),1)
+endif #ifeq ($(mixed-targets),1)
+
+PHONY += checkstack kernelrelease kernelversion
+
+# UML needs a little special treatment here.  It wants to use the host
+# toolchain, so needs $(SUBARCH) passed to checkstack.pl.  Everyone
+# else wants $(ARCH), including people doing cross-builds, which means
+# that $(SUBARCH) doesn't work here.
+ifeq ($(ARCH), um)
+CHECKSTACK_ARCH := $(SUBARCH)
+else
+CHECKSTACK_ARCH := $(ARCH)
+endif
+checkstack:
+	$(OBJDUMP) -d vmlinux $$(find . -name '*.ko') | \
+	$(PERL) $(src)/scripts/checkstack.pl $(CHECKSTACK_ARCH)
+
+kernelrelease:
+	$(if $(wildcard include/config/kernel.release), $(Q)echo $(KERNELRELEASE), \
+	$(error kernelrelease not valid - run 'make prepare' to update it))
+kernelversion:
+	@echo $(KERNELVERSION)
+
+# Single targets
+# ---------------------------------------------------------------------------
+# Single targets are compatible with:
+# - build whith mixed source and output
+# - build with separate output dir 'make O=...'
+# - external modules
+#
+#  target-dir => where to store outputfile
+#  build-dir  => directory in kernel source tree to use
+
+ifeq ($(KBUILD_EXTMOD),)
+        build-dir  = $(patsubst %/,%,$(dir $@))
+        target-dir = $(dir $@)
+else
+        zap-slash=$(filter-out .,$(patsubst %/,%,$(dir $@)))
+        build-dir  = $(KBUILD_EXTMOD)$(if $(zap-slash),/$(zap-slash))
+        target-dir = $(if $(KBUILD_EXTMOD),$(dir $<),$(dir $@))
+endif
+
+%.s: %.c prepare scripts FORCE
+	$(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)
+%.i: %.c prepare scripts FORCE
+	$(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)
+%.o: %.c prepare scripts FORCE
+	$(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)
+%.lst: %.c prepare scripts FORCE
+	$(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)
+%.s: %.S prepare scripts FORCE
+	$(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)
+%.o: %.S prepare scripts FORCE
+	$(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)
+%.symtypes: %.c prepare scripts FORCE
+	$(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)
+
+# Modules
+/ %/: prepare scripts FORCE
+	$(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \
+	$(build)=$(build-dir)
+%.ko: prepare scripts FORCE
+	$(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1)   \
+	$(build)=$(build-dir) $(@:.ko=.o)
+	$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
+
+# FIXME Should go into a make.lib or something 
+# ===========================================================================
+
+quiet_cmd_rmdirs = $(if $(wildcard $(rm-dirs)),CLEAN   $(wildcard $(rm-dirs)))
+      cmd_rmdirs = rm -rf $(rm-dirs)
+
+quiet_cmd_rmfiles = $(if $(wildcard $(rm-files)),CLEAN   $(wildcard $(rm-files)))
+      cmd_rmfiles = rm -f $(rm-files)
+
+
+a_flags = -Wp,-MD,$(depfile) $(AFLAGS) $(AFLAGS_KERNEL) \
+	  $(NOSTDINC_FLAGS) $(CPPFLAGS) \
+	  $(modkern_aflags) $(EXTRA_AFLAGS) $(AFLAGS_$(basetarget).o)
+
+quiet_cmd_as_o_S = AS      $@
+cmd_as_o_S       = $(CC) $(a_flags) -c -o $@ $<
+
+# read all saved command lines
+
+targets := $(wildcard $(sort $(targets)))
+cmd_files := $(wildcard .*.cmd $(foreach f,$(targets),$(dir $(f)).$(notdir $(f)).cmd))
+
+ifneq ($(cmd_files),)
+  $(cmd_files): ;	# Do not try to update included dependency files
+  include $(cmd_files)
+endif
+
+# Shorthand for $(Q)$(MAKE) -f scripts/Makefile.clean obj=dir
+# Usage:
+# $(Q)$(MAKE) $(clean)=dir
+clean := -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.clean obj
+
+endif	# skip-makefile
+
+PHONY += FORCE
+FORCE:
+
+# Cancel implicit rules on top Makefile, `-rR' will apply to sub-makes.
+Makefile: ;
+
+# Declare the contents of the .PHONY variable as phony.  We keep that
+# information in a variable se we can use it in if_changed and friends.
+.PHONY: $(PHONY)
diff -urNp linux-2.6.20/Makefile~ linux-2.6.20-s1t/Makefile~
--- linux-2.6.20/Makefile~	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/Makefile~	2007-02-07 16:29:18.000000000 +0000
@@ -0,0 +1,1492 @@
+VERSION = 2
+PATCHLEVEL = 6
+SUBLEVEL = 20
+EXTRAVERSION =
+NAME = Homicidal Dwarf Hamster
+
+# *DOCUMENTATION*
+# To see a list of typical targets execute "make help"
+# More info can be located in ./README
+# Comments in this file are targeted only to the developer, do not
+# expect to learn how to build the kernel reading this file.
+
+# Do not:
+# o  use make's built-in rules and variables
+#    (this increases performance and avoid hard-to-debug behavour);
+# o  print "Entering directory ...";
+MAKEFLAGS += -rR --no-print-directory
+
+# We are using a recursive build, so we need to do a little thinking
+# to get the ordering right.
+#
+# Most importantly: sub-Makefiles should only ever modify files in
+# their own directory. If in some directory we have a dependency on
+# a file in another dir (which doesn't happen often, but it's often
+# unavoidable when linking the built-in.o targets which finally
+# turn into vmlinux), we will call a sub make in that other dir, and
+# after that we are sure that everything which is in that other dir
+# is now up to date.
+#
+# The only cases where we need to modify files which have global
+# effects are thus separated out and done before the recursive
+# descending is started. They are now explicitly listed as the
+# prepare rule.
+
+# To put more focus on warnings, be less verbose as default
+# Use 'make V=1' to see the full commands
+
+ifdef V
+  ifeq ("$(origin V)", "command line")
+    KBUILD_VERBOSE = $(V)
+  endif
+endif
+ifndef KBUILD_VERBOSE
+  KBUILD_VERBOSE = 0
+endif
+
+# Call a source code checker (by default, "sparse") as part of the
+# C compilation.
+#
+# Use 'make C=1' to enable checking of only re-compiled files.
+# Use 'make C=2' to enable checking of *all* source files, regardless
+# of whether they are re-compiled or not.
+#
+# See the file "Documentation/sparse.txt" for more details, including
+# where to get the "sparse" utility.
+
+ifdef C
+  ifeq ("$(origin C)", "command line")
+    KBUILD_CHECKSRC = $(C)
+  endif
+endif
+ifndef KBUILD_CHECKSRC
+  KBUILD_CHECKSRC = 0
+endif
+
+# Use make M=dir to specify directory of external module to build
+# Old syntax make ... SUBDIRS=$PWD is still supported
+# Setting the environment variable KBUILD_EXTMOD take precedence
+ifdef SUBDIRS
+  KBUILD_EXTMOD ?= $(SUBDIRS)
+endif
+ifdef M
+  ifeq ("$(origin M)", "command line")
+    KBUILD_EXTMOD := $(M)
+  endif
+endif
+
+
+# kbuild supports saving output files in a separate directory.
+# To locate output files in a separate directory two syntaxes are supported.
+# In both cases the working directory must be the root of the kernel src.
+# 1) O=
+# Use "make O=dir/to/store/output/files/"
+#
+# 2) Set KBUILD_OUTPUT
+# Set the environment variable KBUILD_OUTPUT to point to the directory
+# where the output files shall be placed.
+# export KBUILD_OUTPUT=dir/to/store/output/files/
+# make
+#
+# The O= assignment takes precedence over the KBUILD_OUTPUT environment
+# variable.
+
+
+# KBUILD_SRC is set on invocation of make in OBJ directory
+# KBUILD_SRC is not intended to be used by the regular user (for now)
+ifeq ($(KBUILD_SRC),)
+
+# OK, Make called in directory where kernel src resides
+# Do we want to locate output files in a separate directory?
+ifdef O
+  ifeq ("$(origin O)", "command line")
+    KBUILD_OUTPUT := $(O)
+  endif
+endif
+
+# That's our default target when none is given on the command line
+PHONY := _all
+_all:
+
+ifneq ($(KBUILD_OUTPUT),)
+# Invoke a second make in the output directory, passing relevant variables
+# check that the output directory actually exists
+saved-output := $(KBUILD_OUTPUT)
+KBUILD_OUTPUT := $(shell cd $(KBUILD_OUTPUT) && /bin/pwd)
+$(if $(KBUILD_OUTPUT),, \
+     $(error output directory "$(saved-output)" does not exist))
+
+PHONY += $(MAKECMDGOALS)
+
+$(filter-out _all,$(MAKECMDGOALS)) _all:
+	$(if $(KBUILD_VERBOSE:1=),@)$(MAKE) -C $(KBUILD_OUTPUT) \
+	KBUILD_SRC=$(CURDIR) \
+	KBUILD_EXTMOD="$(KBUILD_EXTMOD)" -f $(CURDIR)/Makefile $@
+
+# Leave processing to above invocation of make
+skip-makefile := 1
+endif # ifneq ($(KBUILD_OUTPUT),)
+endif # ifeq ($(KBUILD_SRC),)
+
+# We process the rest of the Makefile if this is the final invocation of make
+ifeq ($(skip-makefile),)
+
+# If building an external module we do not care about the all: rule
+# but instead _all depend on modules
+PHONY += all
+ifeq ($(KBUILD_EXTMOD),)
+_all: all
+else
+_all: modules
+endif
+
+srctree		:= $(if $(KBUILD_SRC),$(KBUILD_SRC),$(CURDIR))
+TOPDIR		:= $(srctree)
+# FIXME - TOPDIR is obsolete, use srctree/objtree
+objtree		:= $(CURDIR)
+src		:= $(srctree)
+obj		:= $(objtree)
+
+VPATH		:= $(srctree)$(if $(KBUILD_EXTMOD),:$(KBUILD_EXTMOD))
+
+export srctree objtree VPATH TOPDIR
+
+
+# SUBARCH tells the usermode build what the underlying arch is.  That is set
+# first, and if a usermode build is happening, the "ARCH=um" on the command
+# line overrides the setting of ARCH below.  If a native build is happening,
+# then ARCH is assigned, getting whatever value it gets normally, and 
+# SUBARCH is subsequently ignored.
+
+SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \
+				  -e s/arm.*/arm/ -e s/sa110/arm/ \
+				  -e s/s390x/s390/ -e s/parisc64/parisc/ \
+				  -e s/ppc.*/powerpc/ -e s/mips.*/mips/ )
+
+# Cross compiling and selecting different set of gcc/bin-utils
+# ---------------------------------------------------------------------------
+#
+# When performing cross compilation for other architectures ARCH shall be set
+# to the target architecture. (See arch/* for the possibilities).
+# ARCH can be set during invocation of make:
+# make ARCH=ia64
+# Another way is to have ARCH set in the environment.
+# The default ARCH is the host where make is executed.
+
+# CROSS_COMPILE specify the prefix used for all executables used
+# during compilation. Only gcc and related bin-utils executables
+# are prefixed with $(CROSS_COMPILE).
+# CROSS_COMPILE can be set on the command line
+# make CROSS_COMPILE=ia64-linux-
+# Alternatively CROSS_COMPILE can be set in the environment.
+# Default value for CROSS_COMPILE is not to prefix executables
+# Note: Some architectures assign CROSS_COMPILE in their arch/*/Makefile
+
+ARCH		?= $(SUBARCH)
+CROSS_COMPILE	?=
+
+# Architecture as present in compile.h
+UTS_MACHINE := $(ARCH)
+
+KCONFIG_CONFIG	?= .config
+
+# SHELL used by kbuild
+CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \
+	  else if [ -x /bin/bash ]; then echo /bin/bash; \
+	  else echo sh; fi ; fi)
+
+HOSTCC       = gcc
+HOSTCXX      = g++
+HOSTCFLAGS   = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer
+HOSTCXXFLAGS = -O2
+
+# Decide whether to build built-in, modular, or both.
+# Normally, just do built-in.
+
+KBUILD_MODULES :=
+KBUILD_BUILTIN := 1
+
+#	If we have only "make modules", don't compile built-in objects.
+#	When we're building modules with modversions, we need to consider
+#	the built-in objects during the descend as well, in order to
+#	make sure the checksums are up to date before we record them.
+
+ifeq ($(MAKECMDGOALS),modules)
+  KBUILD_BUILTIN := $(if $(CONFIG_MODVERSIONS),1)
+endif
+
+#	If we have "make <whatever> modules", compile modules
+#	in addition to whatever we do anyway.
+#	Just "make" or "make all" shall build modules as well
+
+ifneq ($(filter all _all modules,$(MAKECMDGOALS)),)
+  KBUILD_MODULES := 1
+endif
+
+ifeq ($(MAKECMDGOALS),)
+  KBUILD_MODULES := 1
+endif
+
+export KBUILD_MODULES KBUILD_BUILTIN
+export KBUILD_CHECKSRC KBUILD_SRC KBUILD_EXTMOD
+
+# Beautify output
+# ---------------------------------------------------------------------------
+#
+# Normally, we echo the whole command before executing it. By making
+# that echo $($(quiet)$(cmd)), we now have the possibility to set
+# $(quiet) to choose other forms of output instead, e.g.
+#
+#         quiet_cmd_cc_o_c = Compiling $(RELDIR)/$@
+#         cmd_cc_o_c       = $(CC) $(c_flags) -c -o $@ $<
+#
+# If $(quiet) is empty, the whole command will be printed.
+# If it is set to "quiet_", only the short version will be printed. 
+# If it is set to "silent_", nothing will be printed at all, since
+# the variable $(silent_cmd_cc_o_c) doesn't exist.
+#
+# A simple variant is to prefix commands with $(Q) - that's useful
+# for commands that shall be hidden in non-verbose mode.
+#
+#	$(Q)ln $@ :<
+#
+# If KBUILD_VERBOSE equals 0 then the above command will be hidden.
+# If KBUILD_VERBOSE equals 1 then the above command is displayed.
+
+ifeq ($(KBUILD_VERBOSE),1)
+  quiet =
+  Q =
+else
+  quiet=quiet_
+  Q = @
+endif
+
+# If the user is running make -s (silent mode), suppress echoing of
+# commands
+
+ifneq ($(findstring s,$(MAKEFLAGS)),)
+  quiet=silent_
+endif
+
+export quiet Q KBUILD_VERBOSE
+
+
+# Look for make include files relative to root of kernel src
+MAKEFLAGS += --include-dir=$(srctree)
+
+# We need some generic definitions.
+include $(srctree)/scripts/Kbuild.include
+
+# Make variables (CC, etc...)
+
+AS		= $(CROSS_COMPILE)as
+LD		= $(CROSS_COMPILE)ld
+CC		= $(CROSS_COMPILE)gcc
+CPP		= $(CC) -E
+AR		= $(CROSS_COMPILE)ar
+NM		= $(CROSS_COMPILE)nm
+STRIP		= $(CROSS_COMPILE)strip
+OBJCOPY		= $(CROSS_COMPILE)objcopy
+OBJDUMP		= $(CROSS_COMPILE)objdump
+AWK		= awk
+GENKSYMS	= scripts/genksyms/genksyms
+DEPMOD		= /sbin/depmod
+KALLSYMS	= scripts/kallsyms
+PERL		= perl
+CHECK		= sparse
+
+CHECKFLAGS     := -D__linux__ -Dlinux -D__STDC__ -Dunix -D__unix__ -Wbitwise $(CF)
+MODFLAGS	= -DMODULE
+CFLAGS_MODULE   = $(MODFLAGS)
+AFLAGS_MODULE   = $(MODFLAGS)
+LDFLAGS_MODULE  = -r
+CFLAGS_KERNEL	=
+AFLAGS_KERNEL	=
+
+
+# Use LINUXINCLUDE when you must reference the include/ directory.
+# Needed to be compatible with the O= option
+LINUXINCLUDE    := -Iinclude \
+                   $(if $(KBUILD_SRC),-Iinclude2 -I$(srctree)/include) \
+		   -include include/linux/autoconf.h
+
+CPPFLAGS        := -D__KERNEL__ $(LINUXINCLUDE)
+
+CFLAGS          := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \
+                   -fno-strict-aliasing -fno-common
+AFLAGS          := -D__ASSEMBLY__
+
+# Read KERNELRELEASE from include/config/kernel.release (if it exists)
+KERNELRELEASE = $(shell cat include/config/kernel.release 2> /dev/null)
+KERNELVERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
+
+export VERSION PATCHLEVEL SUBLEVEL KERNELRELEASE KERNELVERSION
+export ARCH CONFIG_SHELL HOSTCC HOSTCFLAGS CROSS_COMPILE AS LD CC
+export CPP AR NM STRIP OBJCOPY OBJDUMP MAKE AWK GENKSYMS PERL UTS_MACHINE
+export HOSTCXX HOSTCXXFLAGS LDFLAGS_MODULE CHECK CHECKFLAGS
+
+export CPPFLAGS NOSTDINC_FLAGS LINUXINCLUDE OBJCOPYFLAGS LDFLAGS
+export CFLAGS CFLAGS_KERNEL CFLAGS_MODULE
+export AFLAGS AFLAGS_KERNEL AFLAGS_MODULE
+
+# When compiling out-of-tree modules, put MODVERDIR in the module
+# tree rather than in the kernel tree. The kernel tree might
+# even be read-only.
+export MODVERDIR := $(if $(KBUILD_EXTMOD),$(firstword $(KBUILD_EXTMOD))/).tmp_versions
+
+# Files to ignore in find ... statements
+
+RCS_FIND_IGNORE := \( -name SCCS -o -name BitKeeper -o -name .svn -o -name CVS -o -name .pc -o -name .hg -o -name .git \) -prune -o
+export RCS_TAR_IGNORE := --exclude SCCS --exclude BitKeeper --exclude .svn --exclude CVS --exclude .pc --exclude .hg --exclude .git
+
+# ===========================================================================
+# Rules shared between *config targets and build targets
+
+# Basic helpers built in scripts/
+PHONY += scripts_basic
+scripts_basic:
+	$(Q)$(MAKE) $(build)=scripts/basic
+
+# To avoid any implicit rule to kick in, define an empty command.
+scripts/basic/%: scripts_basic ;
+
+PHONY += outputmakefile
+# outputmakefile generates a Makefile in the output directory, if using a
+# separate output directory. This allows convenient use of make in the
+# output directory.
+outputmakefile:
+ifneq ($(KBUILD_SRC),)
+	$(Q)$(CONFIG_SHELL) $(srctree)/scripts/mkmakefile \
+	    $(srctree) $(objtree) $(VERSION) $(PATCHLEVEL)
+endif
+
+# To make sure we do not include .config for any of the *config targets
+# catch them early, and hand them over to scripts/kconfig/Makefile
+# It is allowed to specify more targets when calling make, including
+# mixing *config targets and build targets.
+# For example 'make oldconfig all'.
+# Detect when mixed targets is specified, and make a second invocation
+# of make so .config is not included in this case either (for *config).
+
+no-dot-config-targets := clean mrproper distclean \
+			 cscope TAGS tags help %docs check% \
+			 include/linux/version.h headers_% \
+			 kernelrelease kernelversion
+
+config-targets := 0
+mixed-targets  := 0
+dot-config     := 1
+
+ifneq ($(filter $(no-dot-config-targets), $(MAKECMDGOALS)),)
+	ifeq ($(filter-out $(no-dot-config-targets), $(MAKECMDGOALS)),)
+		dot-config := 0
+	endif
+endif
+
+ifeq ($(KBUILD_EXTMOD),)
+        ifneq ($(filter config %config,$(MAKECMDGOALS)),)
+                config-targets := 1
+                ifneq ($(filter-out config %config,$(MAKECMDGOALS)),)
+                        mixed-targets := 1
+                endif
+        endif
+endif
+
+ifeq ($(mixed-targets),1)
+# ===========================================================================
+# We're called with mixed targets (*config and build targets).
+# Handle them one by one.
+
+%:: FORCE
+	$(Q)$(MAKE) -C $(srctree) KBUILD_SRC= $@
+
+else
+ifeq ($(config-targets),1)
+# ===========================================================================
+# *config targets only - make sure prerequisites are updated, and descend
+# in scripts/kconfig to make the *config target
+
+# Read arch specific Makefile to set KBUILD_DEFCONFIG as needed.
+# KBUILD_DEFCONFIG may point out an alternative default configuration
+# used for 'make defconfig'
+include $(srctree)/arch/$(ARCH)/Makefile
+export KBUILD_DEFCONFIG
+
+config %config: scripts_basic outputmakefile FORCE
+	$(Q)mkdir -p include/linux include/config
+	$(Q)$(MAKE) $(build)=scripts/kconfig $@
+
+else
+# ===========================================================================
+# Build targets only - this includes vmlinux, arch specific targets, clean
+# targets and others. In general all targets except *config targets.
+
+ifeq ($(KBUILD_EXTMOD),)
+# Additional helpers built in scripts/
+# Carefully list dependencies so we do not try to build scripts twice
+# in parallel
+PHONY += scripts
+scripts: scripts_basic include/config/auto.conf
+	$(Q)$(MAKE) $(build)=$(@)
+
+# Objects we will link into vmlinux / subdirs we need to visit
+init-y		:= init/
+drivers-y	:= drivers/ sound/
+net-y		:= net/
+libs-y		:= lib/
+core-y		:= usr/
+endif # KBUILD_EXTMOD
+
+ifeq ($(dot-config),1)
+# Read in config
+-include include/config/auto.conf
+
+ifeq ($(KBUILD_EXTMOD),)
+# Read in dependencies to all Kconfig* files, make sure to run
+# oldconfig if changes are detected.
+-include include/config/auto.conf.cmd
+
+# To avoid any implicit rule to kick in, define an empty command
+$(KCONFIG_CONFIG) include/config/auto.conf.cmd: ;
+
+# If .config is newer than include/config/auto.conf, someone tinkered
+# with it and forgot to run make oldconfig.
+# if auto.conf.cmd is missing then we are probably in a cleaned tree so
+# we execute the config step to be sure to catch updated Kconfig files
+include/config/auto.conf: $(KCONFIG_CONFIG) include/config/auto.conf.cmd
+	$(Q)$(MAKE) -f $(srctree)/Makefile silentoldconfig
+else
+# external modules needs include/linux/autoconf.h and include/config/auto.conf
+# but do not care if they are up-to-date. Use auto.conf to trigger the test
+PHONY += include/config/auto.conf
+
+include/config/auto.conf:
+	$(Q)test -e include/linux/autoconf.h -a -e $@ || (		\
+	echo;								\
+	echo "  ERROR: Kernel configuration is invalid.";		\
+	echo "         include/linux/autoconf.h or $@ are missing.";	\
+	echo "         Run 'make oldconfig && make prepare' on kernel src to fix it.";	\
+	echo;								\
+	/bin/false)
+
+endif # KBUILD_EXTMOD
+
+else
+# Dummy target needed, because used as prerequisite
+include/config/auto.conf: ;
+endif # $(dot-config)
+
+# The all: target is the default when no target is given on the
+# command line.
+# This allow a user to issue only 'make' to build a kernel including modules
+# Defaults vmlinux but it is usually overridden in the arch makefile
+all: vmlinux
+
+ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
+CFLAGS		+= -Os
+else
+CFLAGS		+= -O2
+endif
+
+include $(srctree)/arch/$(ARCH)/Makefile
+
+ifdef CONFIG_FRAME_POINTER
+CFLAGS		+= -fno-omit-frame-pointer $(call cc-option,-fno-optimize-sibling-calls,)
+else
+CFLAGS		+= -fomit-frame-pointer
+endif
+
+ifdef CONFIG_DEBUG_INFO
+CFLAGS		+= -g
+endif
+
+# Force gcc to behave correct even for buggy distributions
+CFLAGS          += $(call cc-option, -fno-stack-protector)
+
+# arch Makefile may override CC so keep this after arch Makefile is included
+NOSTDINC_FLAGS += -nostdinc -isystem $(shell $(CC) -print-file-name=include)
+CHECKFLAGS     += $(NOSTDINC_FLAGS)
+
+# warn about C99 declaration after statement
+CFLAGS += $(call cc-option,-Wdeclaration-after-statement,)
+
+# disable pointer signed / unsigned warnings in gcc 4.0
+CFLAGS += $(call cc-option,-Wno-pointer-sign,)
+
+# Default kernel image to build when no specific target is given.
+# KBUILD_IMAGE may be overruled on the command line or
+# set in the environment
+# Also any assignments in arch/$(ARCH)/Makefile take precedence over
+# this default value
+export KBUILD_IMAGE ?= vmlinux
+
+#
+# INSTALL_PATH specifies where to place the updated kernel and system map
+# images. Default is /boot, but you can set it to other values
+export	INSTALL_PATH ?= /boot
+
+#
+# INSTALL_MOD_PATH specifies a prefix to MODLIB for module directory
+# relocations required by build roots.  This is not defined in the
+# makefile but the argument can be passed to make if needed.
+#
+
+MODLIB	= $(INSTALL_MOD_PATH)/lib/modules/$(KERNELRELEASE)
+export MODLIB
+
+#
+#  INSTALL_MOD_STRIP, if defined, will cause modules to be
+#  stripped after they are installed.  If INSTALL_MOD_STRIP is '1', then
+#  the default option --strip-debug will be used.  Otherwise,
+#  INSTALL_MOD_STRIP will used as the options to the strip command.
+
+ifdef INSTALL_MOD_STRIP
+ifeq ($(INSTALL_MOD_STRIP),1)
+mod_strip_cmd = $(STRIP) --strip-debug
+else
+mod_strip_cmd = $(STRIP) $(INSTALL_MOD_STRIP)
+endif # INSTALL_MOD_STRIP=1
+else
+mod_strip_cmd = true
+endif # INSTALL_MOD_STRIP
+export mod_strip_cmd
+
+
+ifeq ($(KBUILD_EXTMOD),)
+core-y		+= kernel/ mm/ fs/ ipc/ security/ crypto/ block/
+
+vmlinux-dirs	:= $(patsubst %/,%,$(filter %/, $(init-y) $(init-m) \
+		     $(core-y) $(core-m) $(drivers-y) $(drivers-m) \
+		     $(net-y) $(net-m) $(libs-y) $(libs-m)))
+
+vmlinux-alldirs	:= $(sort $(vmlinux-dirs) $(patsubst %/,%,$(filter %/, \
+		     $(init-n) $(init-) \
+		     $(core-n) $(core-) $(drivers-n) $(drivers-) \
+		     $(net-n)  $(net-)  $(libs-n)    $(libs-))))
+
+init-y		:= $(patsubst %/, %/built-in.o, $(init-y))
+core-y		:= $(patsubst %/, %/built-in.o, $(core-y))
+drivers-y	:= $(patsubst %/, %/built-in.o, $(drivers-y))
+net-y		:= $(patsubst %/, %/built-in.o, $(net-y))
+libs-y1		:= $(patsubst %/, %/lib.a, $(libs-y))
+libs-y2		:= $(patsubst %/, %/built-in.o, $(libs-y))
+libs-y		:= $(libs-y1) $(libs-y2)
+
+# Build vmlinux
+# ---------------------------------------------------------------------------
+# vmlinux is built from the objects selected by $(vmlinux-init) and
+# $(vmlinux-main). Most are built-in.o files from top-level directories
+# in the kernel tree, others are specified in arch/$(ARCH)Makefile.
+# Ordering when linking is important, and $(vmlinux-init) must be first.
+#
+# vmlinux
+#   ^
+#   |
+#   +-< $(vmlinux-init)
+#   |   +--< init/version.o + more
+#   |
+#   +--< $(vmlinux-main)
+#   |    +--< driver/built-in.o mm/built-in.o + more
+#   |
+#   +-< kallsyms.o (see description in CONFIG_KALLSYMS section)
+#
+# vmlinux version (uname -v) cannot be updated during normal
+# descending-into-subdirs phase since we do not yet know if we need to
+# update vmlinux.
+# Therefore this step is delayed until just before final link of vmlinux -
+# except in the kallsyms case where it is done just before adding the
+# symbols to the kernel.
+#
+# System.map is generated to document addresses of all kernel symbols
+
+vmlinux-init := $(head-y) $(init-y)
+vmlinux-main := $(core-y) $(libs-y) $(drivers-y) $(net-y)
+vmlinux-all  := $(vmlinux-init) $(vmlinux-main)
+vmlinux-lds  := arch/$(ARCH)/kernel/vmlinux.lds
+
+# Rule to link vmlinux - also used during CONFIG_KALLSYMS
+# May be overridden by arch/$(ARCH)/Makefile
+quiet_cmd_vmlinux__ ?= LD      $@
+      cmd_vmlinux__ ?= $(LD) $(LDFLAGS) $(LDFLAGS_vmlinux) -o $@ \
+      -T $(vmlinux-lds) $(vmlinux-init)                          \
+      --start-group $(vmlinux-main) --end-group                  \
+      $(filter-out $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) FORCE ,$^)
+
+# Generate new vmlinux version
+quiet_cmd_vmlinux_version = GEN     .version
+      cmd_vmlinux_version = set -e;                     \
+	if [ ! -r .version ]; then			\
+	  rm -f .version;				\
+	  echo 1 >.version;				\
+	else						\
+	  mv .version .old_version;			\
+	  expr 0$$(cat .old_version) + 1 >.version;	\
+	fi;						\
+	$(MAKE) $(build)=init
+
+# Generate System.map
+quiet_cmd_sysmap = SYSMAP
+      cmd_sysmap = $(CONFIG_SHELL) $(srctree)/scripts/mksysmap
+
+# Link of vmlinux
+# If CONFIG_KALLSYMS is set .version is already updated
+# Generate System.map and verify that the content is consistent
+# Use + in front of the vmlinux_version rule to silent warning with make -j2
+# First command is ':' to allow us to use + in front of the rule
+define rule_vmlinux__
+	:
+	$(if $(CONFIG_KALLSYMS),,+$(call cmd,vmlinux_version))
+
+	$(call cmd,vmlinux__)
+	$(Q)echo 'cmd_$@ := $(cmd_vmlinux__)' > $(@D)/.$(@F).cmd
+
+	$(Q)$(if $($(quiet)cmd_sysmap),                                      \
+	  echo '  $($(quiet)cmd_sysmap)  System.map' &&)                     \
+	$(cmd_sysmap) $@ System.map;                                         \
+	if [ $$? -ne 0 ]; then                                               \
+		rm -f $@;                                                    \
+		/bin/false;                                                  \
+	fi;
+	$(verify_kallsyms)
+endef
+
+
+ifdef CONFIG_KALLSYMS
+# Generate section listing all symbols and add it into vmlinux $(kallsyms.o)
+# It's a three stage process:
+# o .tmp_vmlinux1 has all symbols and sections, but __kallsyms is
+#   empty
+#   Running kallsyms on that gives us .tmp_kallsyms1.o with
+#   the right size - vmlinux version (uname -v) is updated during this step
+# o .tmp_vmlinux2 now has a __kallsyms section of the right size,
+#   but due to the added section, some addresses have shifted.
+#   From here, we generate a correct .tmp_kallsyms2.o
+# o The correct .tmp_kallsyms2.o is linked into the final vmlinux.
+# o Verify that the System.map from vmlinux matches the map from
+#   .tmp_vmlinux2, just in case we did not generate kallsyms correctly.
+# o If CONFIG_KALLSYMS_EXTRA_PASS is set, do an extra pass using
+#   .tmp_vmlinux3 and .tmp_kallsyms3.o.  This is only meant as a
+#   temporary bypass to allow the kernel to be built while the
+#   maintainers work out what went wrong with kallsyms.
+
+ifdef CONFIG_KALLSYMS_EXTRA_PASS
+last_kallsyms := 3
+else
+last_kallsyms := 2
+endif
+
+kallsyms.o := .tmp_kallsyms$(last_kallsyms).o
+
+define verify_kallsyms
+	$(Q)$(if $($(quiet)cmd_sysmap),                                      \
+	  echo '  $($(quiet)cmd_sysmap)  .tmp_System.map' &&)                \
+	  $(cmd_sysmap) .tmp_vmlinux$(last_kallsyms) .tmp_System.map
+	$(Q)cmp -s System.map .tmp_System.map ||                             \
+		(echo Inconsistent kallsyms data;                            \
+		 echo Try setting CONFIG_KALLSYMS_EXTRA_PASS;                \
+		 rm .tmp_kallsyms* ; /bin/false )
+endef
+
+# Update vmlinux version before link
+# Use + in front of this rule to silent warning about make -j1
+# First command is ':' to allow us to use + in front of this rule
+cmd_ksym_ld = $(cmd_vmlinux__)
+define rule_ksym_ld
+	: 
+	+$(call cmd,vmlinux_version)
+	$(call cmd,vmlinux__)
+	$(Q)echo 'cmd_$@ := $(cmd_vmlinux__)' > $(@D)/.$(@F).cmd
+endef
+
+# Generate .S file with all kernel symbols
+quiet_cmd_kallsyms = KSYM    $@
+      cmd_kallsyms = $(NM) -n $< | $(KALLSYMS) \
+                     $(if $(CONFIG_KALLSYMS_ALL),--all-symbols) > $@
+
+.tmp_kallsyms1.o .tmp_kallsyms2.o .tmp_kallsyms3.o: %.o: %.S scripts FORCE
+	$(call if_changed_dep,as_o_S)
+
+.tmp_kallsyms%.S: .tmp_vmlinux% $(KALLSYMS)
+	$(call cmd,kallsyms)
+
+# .tmp_vmlinux1 must be complete except kallsyms, so update vmlinux version
+.tmp_vmlinux1: $(vmlinux-lds) $(vmlinux-all) FORCE
+	$(call if_changed_rule,ksym_ld)
+
+.tmp_vmlinux2: $(vmlinux-lds) $(vmlinux-all) .tmp_kallsyms1.o FORCE
+	$(call if_changed,vmlinux__)
+
+.tmp_vmlinux3: $(vmlinux-lds) $(vmlinux-all) .tmp_kallsyms2.o FORCE
+	$(call if_changed,vmlinux__)
+
+# Needs to visit scripts/ before $(KALLSYMS) can be used.
+$(KALLSYMS): scripts ;
+
+# Generate some data for debugging strange kallsyms problems
+debug_kallsyms: .tmp_map$(last_kallsyms)
+
+.tmp_map%: .tmp_vmlinux% FORCE
+	($(OBJDUMP) -h $< | $(AWK) '/^ +[0-9]/{print $$4 " 0 " $$2}'; $(NM) $<) | sort > $@
+
+.tmp_map3: .tmp_map2
+
+.tmp_map2: .tmp_map1
+
+endif # ifdef CONFIG_KALLSYMS
+
+# vmlinux image - including updated kernel symbols
+vmlinux: $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) $(kallsyms.o) FORCE
+ifdef CONFIG_HEADERS_CHECK
+	$(Q)$(MAKE) -f $(srctree)/Makefile headers_check
+endif
+	$(call if_changed_rule,vmlinux__)
+	$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost $@
+	$(Q)rm -f .old_version
+
+# The actual objects are generated when descending, 
+# make sure no implicit rule kicks in
+$(sort $(vmlinux-init) $(vmlinux-main)) $(vmlinux-lds): $(vmlinux-dirs) ;
+
+# Handle descending into subdirectories listed in $(vmlinux-dirs)
+# Preset locale variables to speed up the build process. Limit locale
+# tweaks to this spot to avoid wrong language settings when running
+# make menuconfig etc.
+# Error messages still appears in the original language
+
+PHONY += $(vmlinux-dirs)
+$(vmlinux-dirs): prepare scripts
+	$(Q)$(MAKE) $(build)=$@
+
+# Build the kernel release string
+#
+# The KERNELRELEASE value built here is stored in the file
+# include/config/kernel.release, and is used when executing several
+# make targets, such as "make install" or "make modules_install."
+#
+# The eventual kernel release string consists of the following fields,
+# shown in a hierarchical format to show how smaller parts are concatenated
+# to form the larger and final value, with values coming from places like
+# the Makefile, kernel config options, make command line options and/or
+# SCM tag information.
+#
+#	$(KERNELVERSION)
+#	  $(VERSION)			eg, 2
+#	  $(PATCHLEVEL)			eg, 6
+#	  $(SUBLEVEL)			eg, 18
+#	  $(EXTRAVERSION)		eg, -rc6
+#	$(localver-full)
+#	  $(localver)
+#	    localversion*		(all localversion* files)
+#	    $(CONFIG_LOCALVERSION)	(from kernel config setting)
+#	  $(localver-auto)		(only if CONFIG_LOCALVERSION_AUTO is set)
+#	    ./scripts/setlocalversion	(SCM tag, if one exists)
+#	    $(LOCALVERSION)		(from make command line if provided)
+#
+#  Note how the final $(localver-auto) string is included *only* if the
+# kernel config option CONFIG_LOCALVERSION_AUTO is selected.  Also, at the
+# moment, only git is supported but other SCMs can edit the script
+# scripts/setlocalversion and add the appropriate checks as needed.
+
+nullstring :=
+space      := $(nullstring) # end of line
+
+___localver = $(objtree)/localversion* $(srctree)/localversion*
+__localver  = $(sort $(wildcard $(___localver)))
+# skip backup files (containing '~')
+_localver = $(foreach f, $(__localver), $(if $(findstring ~, $(f)),,$(f)))
+
+localver = $(subst $(space),, \
+	   $(shell cat /dev/null $(_localver)) \
+	   $(patsubst "%",%,$(CONFIG_LOCALVERSION)))
+
+# If CONFIG_LOCALVERSION_AUTO is set scripts/setlocalversion is called
+# and if the SCM is know a tag from the SCM is appended.
+# The appended tag is determined by the SCM used.
+#
+# Currently, only git is supported.
+# Other SCMs can edit scripts/setlocalversion and add the appropriate
+# checks as needed.
+ifdef CONFIG_LOCALVERSION_AUTO
+	_localver-auto = $(shell $(CONFIG_SHELL) \
+	                  $(srctree)/scripts/setlocalversion $(srctree))
+	localver-auto  = $(LOCALVERSION)$(_localver-auto)
+endif
+
+localver-full = $(localver)$(localver-auto)
+
+# Store (new) KERNELRELASE string in include/config/kernel.release
+kernelrelease = $(KERNELVERSION)$(localver-full)
+include/config/kernel.release: include/config/auto.conf FORCE
+	$(Q)rm -f $@
+	$(Q)echo $(kernelrelease) > $@
+
+
+# Things we need to do before we recursively start building the kernel
+# or the modules are listed in "prepare".
+# A multi level approach is used. prepareN is processed before prepareN-1.
+# archprepare is used in arch Makefiles and when processed asm symlink,
+# version.h and scripts_basic is processed / created.
+
+# Listed in dependency order
+PHONY += prepare archprepare prepare0 prepare1 prepare2 prepare3
+
+# prepare-all is deprecated, use prepare as valid replacement
+PHONY += prepare-all
+
+# prepare3 is used to check if we are building in a separate output directory,
+# and if so do:
+# 1) Check that make has not been executed in the kernel src $(srctree)
+# 2) Create the include2 directory, used for the second asm symlink
+prepare3: include/config/kernel.release
+ifneq ($(KBUILD_SRC),)
+	@echo '  Using $(srctree) as source for kernel'
+	$(Q)if [ -f $(srctree)/.config -o -d $(srctree)/include/config ]; then \
+		echo "  $(srctree) is not clean, please run 'make mrproper'";\
+		echo "  in the '$(srctree)' directory.";\
+		/bin/false; \
+	fi;
+	$(Q)if [ ! -d include2 ]; then mkdir -p include2; fi;
+	$(Q)ln -fsn $(srctree)/include/asm-$(ARCH) include2/asm
+endif
+
+# prepare2 creates a makefile if using a separate output directory
+prepare2: prepare3 outputmakefile
+
+prepare1: prepare2 include/linux/version.h include/linux/utsrelease.h \
+                   include/asm include/config/auto.conf
+ifneq ($(KBUILD_MODULES),)
+	$(Q)mkdir -p $(MODVERDIR)
+	$(Q)rm -f $(MODVERDIR)/*
+endif
+
+archprepare: prepare1 scripts_basic
+
+prepare0: archprepare FORCE
+	$(Q)$(MAKE) $(build)=.
+
+# All the preparing..
+prepare prepare-all: prepare0
+
+# Leave this as default for preprocessing vmlinux.lds.S, which is now
+# done in arch/$(ARCH)/kernel/Makefile
+
+export CPPFLAGS_vmlinux.lds += -P -C -U$(ARCH)
+
+# FIXME: The asm symlink changes when $(ARCH) changes. That's
+# hard to detect, but I suppose "make mrproper" is a good idea
+# before switching between archs anyway.
+
+include/asm:
+	@echo '  SYMLINK $@ -> include/asm-$(ARCH)'
+	$(Q)if [ ! -d include ]; then mkdir -p include; fi;
+	@ln -fsn asm-$(ARCH) $@
+
+# Generate some files
+# ---------------------------------------------------------------------------
+
+# KERNELRELEASE can change from a few different places, meaning version.h
+# needs to be updated, so this check is forced on all builds
+
+uts_len := 64
+define filechk_utsrelease.h
+	if [ `echo -n "$(KERNELRELEASE)" | wc -c ` -gt $(uts_len) ]; then \
+	  echo '"$(KERNELRELEASE)" exceeds $(uts_len) characters' >&2;    \
+	  exit 1;                                                         \
+	fi;                                                               \
+	(echo \#define UTS_RELEASE \"$(KERNELRELEASE)\";)
+endef
+
+define filechk_version.h
+	(echo \#define LINUX_VERSION_CODE $(shell                             \
+	expr $(VERSION) \* 65536 + $(PATCHLEVEL) \* 256 + $(SUBLEVEL));     \
+	echo '#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))';)
+endef
+
+include/linux/version.h: $(srctree)/Makefile FORCE
+	$(call filechk,version.h)
+
+include/linux/utsrelease.h: include/config/kernel.release FORCE
+	$(call filechk,utsrelease.h)
+
+# ---------------------------------------------------------------------------
+
+PHONY += depend dep
+depend dep:
+	@echo '*** Warning: make $@ is unnecessary now.'
+
+# ---------------------------------------------------------------------------
+# Kernel headers
+INSTALL_HDR_PATH=$(objtree)/usr
+export INSTALL_HDR_PATH
+
+HDRARCHES=$(filter-out generic,$(patsubst $(srctree)/include/asm-%/Kbuild,%,$(wildcard $(srctree)/include/asm-*/Kbuild)))
+
+PHONY += headers_install_all
+headers_install_all: include/linux/version.h scripts_basic FORCE
+	$(Q)$(MAKE) $(build)=scripts scripts/unifdef
+	$(Q)for arch in $(HDRARCHES); do \
+	 $(MAKE) ARCH=$$arch -f $(srctree)/scripts/Makefile.headersinst obj=include BIASMDIR=-bi-$$arch ;\
+	 done
+
+PHONY += headers_install
+headers_install: include/linux/version.h scripts_basic FORCE
+	@if [ ! -r $(srctree)/include/asm-$(ARCH)/Kbuild ]; then \
+	  echo '*** Error: Headers not exportable for this architecture ($(ARCH))'; \
+	  exit 1 ; fi
+	$(Q)$(MAKE) $(build)=scripts scripts/unifdef
+	$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.headersinst obj=include
+
+PHONY += headers_check
+headers_check: headers_install
+	$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.headersinst obj=include HDRCHECK=1
+
+# ---------------------------------------------------------------------------
+# Modules
+
+ifdef CONFIG_MODULES
+
+# By default, build modules as well
+
+all: modules
+
+#	Build modules
+
+PHONY += modules
+modules: $(vmlinux-dirs) $(if $(KBUILD_BUILTIN),vmlinux)
+	@echo '  Building modules, stage 2.';
+	$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
+
+
+# Target to prepare building external modules
+PHONY += modules_prepare
+modules_prepare: prepare scripts
+
+# Target to install modules
+PHONY += modules_install
+modules_install: _modinst_ _modinst_post
+
+PHONY += _modinst_
+_modinst_:
+	@if [ -z "`$(DEPMOD) -V 2>/dev/null | grep module-init-tools`" ]; then \
+		echo "Warning: you may need to install module-init-tools"; \
+		echo "See http://www.codemonkey.org.uk/docs/post-halloween-2.6.txt";\
+		sleep 1; \
+	fi
+	@rm -rf $(MODLIB)/kernel
+	@rm -f $(MODLIB)/source
+	@mkdir -p $(MODLIB)/kernel
+	@ln -s $(srctree) $(MODLIB)/source
+	@if [ ! $(objtree) -ef  $(MODLIB)/build ]; then \
+		rm -f $(MODLIB)/build ; \
+		ln -s $(objtree) $(MODLIB)/build ; \
+	fi
+	$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modinst
+
+# If System.map exists, run depmod.  This deliberately does not have a
+# dependency on System.map since that would run the dependency tree on
+# vmlinux.  This depmod is only for convenience to give the initial
+# boot a modules.dep even before / is mounted read-write.  However the
+# boot script depmod is the master version.
+ifeq "$(strip $(INSTALL_MOD_PATH))" ""
+depmod_opts	:=
+else
+depmod_opts	:= -b $(INSTALL_MOD_PATH) -r
+endif
+PHONY += _modinst_post
+_modinst_post: _modinst_
+	if [ -r System.map -a -x $(DEPMOD) ]; then $(DEPMOD) -ae -F System.map $(depmod_opts) $(KERNELRELEASE); fi
+
+else # CONFIG_MODULES
+
+# Modules not configured
+# ---------------------------------------------------------------------------
+
+modules modules_install: FORCE
+	@echo
+	@echo "The present kernel configuration has modules disabled."
+	@echo "Type 'make config' and enable loadable module support."
+	@echo "Then build a kernel with module support enabled."
+	@echo
+	@exit 1
+
+endif # CONFIG_MODULES
+
+###
+# Cleaning is done on three levels.
+# make clean     Delete most generated files
+#                Leave enough to build external modules
+# make mrproper  Delete the current configuration, and all generated files
+# make distclean Remove editor backup files, patch leftover files and the like
+
+# Directories & files removed with 'make clean'
+CLEAN_DIRS  += $(MODVERDIR)
+CLEAN_FILES +=	vmlinux System.map \
+                .tmp_kallsyms* .tmp_version .tmp_vmlinux* .tmp_System.map
+
+# Directories & files removed with 'make mrproper'
+MRPROPER_DIRS  += include/config include2 usr/include
+MRPROPER_FILES += .config .config.old include/asm .version .old_version \
+                  include/linux/autoconf.h include/linux/version.h      \
+                  include/linux/utsrelease.h                            \
+		  Module.symvers tags TAGS cscope*
+
+# clean - Delete most, but leave enough to build external modules
+#
+clean: rm-dirs  := $(CLEAN_DIRS)
+clean: rm-files := $(CLEAN_FILES)
+clean-dirs      := $(addprefix _clean_,$(srctree) $(vmlinux-alldirs))
+
+PHONY += $(clean-dirs) clean archclean
+$(clean-dirs):
+	$(Q)$(MAKE) $(clean)=$(patsubst _clean_%,%,$@)
+
+clean: archclean $(clean-dirs)
+	$(call cmd,rmdirs)
+	$(call cmd,rmfiles)
+	@find . $(RCS_FIND_IGNORE) \
+		\( -name '*.[oas]' -o -name '*.ko' -o -name '.*.cmd' \
+		-o -name '.*.d' -o -name '.*.tmp' -o -name '*.mod.c' \
+		-o -name '*.symtypes' \) \
+		-type f -print | xargs rm -f
+
+# mrproper - Delete all generated files, including .config
+#
+mrproper: rm-dirs  := $(wildcard $(MRPROPER_DIRS))
+mrproper: rm-files := $(wildcard $(MRPROPER_FILES))
+mrproper-dirs      := $(addprefix _mrproper_,Documentation/DocBook scripts)
+
+PHONY += $(mrproper-dirs) mrproper archmrproper
+$(mrproper-dirs):
+	$(Q)$(MAKE) $(clean)=$(patsubst _mrproper_%,%,$@)
+
+mrproper: clean archmrproper $(mrproper-dirs)
+	$(call cmd,rmdirs)
+	$(call cmd,rmfiles)
+
+# distclean
+#
+PHONY += distclean
+
+distclean: mrproper
+	@find $(srctree) $(RCS_FIND_IGNORE) \
+		\( -name '*.orig' -o -name '*.rej' -o -name '*~' \
+		-o -name '*.bak' -o -name '#*#' -o -name '.*.orig' \
+		-o -name '.*.rej' -o -size 0 \
+		-o -name '*%' -o -name '.*.cmd' -o -name 'core' \) \
+		-type f -print | xargs rm -f
+
+
+# Packaging of the kernel to various formats
+# ---------------------------------------------------------------------------
+# rpm target kept for backward compatibility
+package-dir	:= $(srctree)/scripts/package
+
+%pkg: include/config/kernel.release FORCE
+	$(Q)$(MAKE) $(build)=$(package-dir) $@
+rpm: include/config/kernel.release FORCE
+	$(Q)$(MAKE) $(build)=$(package-dir) $@
+
+
+# Brief documentation of the typical targets used
+# ---------------------------------------------------------------------------
+
+boards := $(wildcard $(srctree)/arch/$(ARCH)/configs/*_defconfig)
+boards := $(notdir $(boards))
+
+help:
+	@echo  'Cleaning targets:'
+	@echo  '  clean		  - Remove most generated files but keep the config and'
+	@echo  '                    enough build support to build external modules'
+	@echo  '  mrproper	  - Remove all generated files + config + various backup files'
+	@echo  '  distclean	  - mrproper + remove editor backup and patch files'
+	@echo  ''
+	@echo  'Configuration targets:'
+	@$(MAKE) -f $(srctree)/scripts/kconfig/Makefile help
+	@echo  ''
+	@echo  'Other generic targets:'
+	@echo  '  all		  - Build all targets marked with [*]'
+	@echo  '* vmlinux	  - Build the bare kernel'
+	@echo  '* modules	  - Build all modules'
+	@echo  '  modules_install - Install all modules to INSTALL_MOD_PATH (default: /)'
+	@echo  '  dir/            - Build all files in dir and below'
+	@echo  '  dir/file.[ois]  - Build specified target only'
+	@echo  '  dir/file.ko     - Build module including final link'
+	@echo  '  rpm		  - Build a kernel as an RPM package'
+	@echo  '  tags/TAGS	  - Generate tags file for editors'
+	@echo  '  cscope	  - Generate cscope index'
+	@echo  '  kernelrelease	  - Output the release version string'
+	@echo  '  kernelversion	  - Output the version stored in Makefile'
+	@if [ -r $(srctree)/include/asm-$(ARCH)/Kbuild ]; then \
+	 echo  '  headers_install - Install sanitised kernel headers to INSTALL_HDR_PATH'; \
+	 echo  '                    (default: $(INSTALL_HDR_PATH))'; \
+	 fi
+	@echo  ''
+	@echo  'Static analysers'
+	@echo  '  checkstack      - Generate a list of stack hogs'
+	@echo  '  namespacecheck  - Name space analysis on compiled kernel'
+	@if [ -r $(srctree)/include/asm-$(ARCH)/Kbuild ]; then \
+	 echo  '  headers_check   - Sanity check on exported headers'; \
+	 fi
+	@echo  ''
+	@echo  'Kernel packaging:'
+	@$(MAKE) $(build)=$(package-dir) help
+	@echo  ''
+	@echo  'Documentation targets:'
+	@$(MAKE) -f $(srctree)/Documentation/DocBook/Makefile dochelp
+	@echo  ''
+	@echo  'Architecture specific targets ($(ARCH)):'
+	@$(if $(archhelp),$(archhelp),\
+		echo '  No architecture specific help defined for $(ARCH)')
+	@echo  ''
+	@$(if $(boards), \
+		$(foreach b, $(boards), \
+		printf "  %-24s - Build for %s\\n" $(b) $(subst _defconfig,,$(b));) \
+		echo '')
+
+	@echo  '  make V=0|1 [targets] 0 => quiet build (default), 1 => verbose build'
+	@echo  '  make V=2   [targets] 2 => give reason for rebuild of target'
+	@echo  '  make O=dir [targets] Locate all output files in "dir", including .config'
+	@echo  '  make C=1   [targets] Check all c source with $$CHECK (sparse by default)'
+	@echo  '  make C=2   [targets] Force check of all c source with $$CHECK'
+	@echo  ''
+	@echo  'Execute "make" or "make all" to build all targets marked with [*] '
+	@echo  'For further info see the ./README file'
+
+
+# Documentation targets
+# ---------------------------------------------------------------------------
+%docs: scripts_basic FORCE
+	$(Q)$(MAKE) $(build)=Documentation/DocBook $@
+
+else # KBUILD_EXTMOD
+
+###
+# External module support.
+# When building external modules the kernel used as basis is considered
+# read-only, and no consistency checks are made and the make
+# system is not used on the basis kernel. If updates are required
+# in the basis kernel ordinary make commands (without M=...) must
+# be used.
+#
+# The following are the only valid targets when building external
+# modules.
+# make M=dir clean     Delete all automatically generated files
+# make M=dir modules   Make all modules in specified dir
+# make M=dir	       Same as 'make M=dir modules'
+# make M=dir modules_install
+#                      Install the modules built in the module directory
+#                      Assumes install directory is already created
+
+# We are always building modules
+KBUILD_MODULES := 1
+PHONY += crmodverdir
+crmodverdir:
+	$(Q)mkdir -p $(MODVERDIR)
+	$(Q)rm -f $(MODVERDIR)/*
+
+PHONY += $(objtree)/Module.symvers
+$(objtree)/Module.symvers:
+	@test -e $(objtree)/Module.symvers || ( \
+	echo; \
+	echo "  WARNING: Symbol version dump $(objtree)/Module.symvers"; \
+	echo "           is missing; modules will have no dependencies and modversions."; \
+	echo )
+
+module-dirs := $(addprefix _module_,$(KBUILD_EXTMOD))
+PHONY += $(module-dirs) modules
+$(module-dirs): crmodverdir $(objtree)/Module.symvers
+	$(Q)$(MAKE) $(build)=$(patsubst _module_%,%,$@)
+
+modules: $(module-dirs)
+	@echo '  Building modules, stage 2.';
+	$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
+
+PHONY += modules_install
+modules_install: _emodinst_ _emodinst_post
+
+install-dir := $(if $(INSTALL_MOD_DIR),$(INSTALL_MOD_DIR),extra)
+PHONY += _emodinst_
+_emodinst_:
+	$(Q)mkdir -p $(MODLIB)/$(install-dir)
+	$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modinst
+
+# Run depmod only is we have System.map and depmod is executable
+quiet_cmd_depmod = DEPMOD  $(KERNELRELEASE)
+      cmd_depmod = if [ -r System.map -a -x $(DEPMOD) ]; then \
+                      $(DEPMOD) -ae -F System.map             \
+                      $(if $(strip $(INSTALL_MOD_PATH)),      \
+		      -b $(INSTALL_MOD_PATH) -r)              \
+		      $(KERNELRELEASE);                       \
+                   fi
+
+PHONY += _emodinst_post
+_emodinst_post: _emodinst_
+	$(call cmd,depmod)
+
+clean-dirs := $(addprefix _clean_,$(KBUILD_EXTMOD))
+
+PHONY += $(clean-dirs) clean
+$(clean-dirs):
+	$(Q)$(MAKE) $(clean)=$(patsubst _clean_%,%,$@)
+
+clean:	rm-dirs := $(MODVERDIR)
+clean: $(clean-dirs)
+	$(call cmd,rmdirs)
+	@find $(KBUILD_EXTMOD) $(RCS_FIND_IGNORE) \
+		\( -name '*.[oas]' -o -name '*.ko' -o -name '.*.cmd' \
+		-o -name '.*.d' -o -name '.*.tmp' -o -name '*.mod.c' \) \
+		-type f -print | xargs rm -f
+
+help:
+	@echo  '  Building external modules.'
+	@echo  '  Syntax: make -C path/to/kernel/src M=$$PWD target'
+	@echo  ''
+	@echo  '  modules         - default target, build the module(s)'
+	@echo  '  modules_install - install the module'
+	@echo  '  clean           - remove generated files in module directory only'
+	@echo  ''
+
+# Dummies...
+PHONY += prepare scripts
+prepare: ;
+scripts: ;
+endif # KBUILD_EXTMOD
+
+# Generate tags for editors
+# ---------------------------------------------------------------------------
+
+#We want __srctree to totally vanish out when KBUILD_OUTPUT is not set
+#(which is the most common case IMHO) to avoid unneeded clutter in the big tags file.
+#Adding $(srctree) adds about 20M on i386 to the size of the output file!
+
+ifeq ($(src),$(obj))
+__srctree =
+else
+__srctree = $(srctree)/
+endif
+
+ifeq ($(ALLSOURCE_ARCHS),)
+ifeq ($(ARCH),um)
+ALLINCLUDE_ARCHS := $(ARCH) $(SUBARCH)
+else
+ALLINCLUDE_ARCHS := $(ARCH)
+endif
+else
+#Allow user to specify only ALLSOURCE_PATHS on the command line, keeping existing behavour.
+ALLINCLUDE_ARCHS := $(ALLSOURCE_ARCHS)
+endif
+
+ALLSOURCE_ARCHS := $(ARCH)
+
+define find-sources
+        ( find $(__srctree) $(RCS_FIND_IGNORE) \
+	       \( -name include -o -name arch \) -prune -o \
+	       -name $1 -print; \
+	  for ARCH in $(ALLSOURCE_ARCHS) ; do \
+	       find $(__srctree)arch/$${ARCH} $(RCS_FIND_IGNORE) \
+	            -name $1 -print; \
+	  done ; \
+	  find $(__srctree)security/selinux/include $(RCS_FIND_IGNORE) \
+	       -name $1 -print; \
+	  find $(__srctree)include $(RCS_FIND_IGNORE) \
+	       \( -name config -o -name 'asm-*' \) -prune \
+	       -o -name $1 -print; \
+	  for ARCH in $(ALLINCLUDE_ARCHS) ; do \
+	       find $(__srctree)include/asm-$${ARCH} $(RCS_FIND_IGNORE) \
+	            -name $1 -print; \
+	  done ; \
+	  find $(__srctree)include/asm-generic $(RCS_FIND_IGNORE) \
+	       -name $1 -print )
+endef
+
+define all-sources
+	$(call find-sources,'*.[chS]')
+endef
+define all-kconfigs
+	$(call find-sources,'Kconfig*')
+endef
+define all-defconfigs
+	$(call find-sources,'defconfig')
+endef
+
+define xtags
+	if $1 --version 2>&1 | grep -iq exuberant; then \
+	    $(all-sources) | xargs $1 -a \
+		-I __initdata,__exitdata,__acquires,__releases \
+		-I EXPORT_SYMBOL,EXPORT_SYMBOL_GPL \
+		--extra=+f --c-kinds=+px \
+		--regex-asm='/ENTRY\(([^)]*)\).*/\1/'; \
+	    $(all-kconfigs) | xargs $1 -a \
+		--langdef=kconfig \
+		--language-force=kconfig \
+		--regex-kconfig='/^[[:blank:]]*config[[:blank:]]+([[:alnum:]_]+)/\1/'; \
+	    $(all-defconfigs) | xargs -r $1 -a \
+		--langdef=dotconfig \
+		--language-force=dotconfig \
+		--regex-dotconfig='/^#?[[:blank:]]*(CONFIG_[[:alnum:]_]+)/\1/'; \
+	elif $1 --version 2>&1 | grep -iq emacs; then \
+	    $(all-sources) | xargs $1 -a; \
+	    $(all-kconfigs) | xargs $1 -a \
+		--regex='/^[ \t]*config[ \t]+\([a-zA-Z0-9_]+\)/\1/'; \
+	    $(all-defconfigs) | xargs -r $1 -a \
+		--regex='/^#?[ \t]?\(CONFIG_[a-zA-Z0-9_]+\)/\1/'; \
+	else \
+	    $(all-sources) | xargs $1 -a; \
+	fi
+endef
+
+quiet_cmd_cscope-file = FILELST cscope.files
+      cmd_cscope-file = (echo \-k; echo \-q; $(all-sources)) > cscope.files
+
+quiet_cmd_cscope = MAKE    cscope.out
+      cmd_cscope = cscope -b
+
+cscope: FORCE
+	$(call cmd,cscope-file)
+	$(call cmd,cscope)
+
+quiet_cmd_TAGS = MAKE   $@
+define cmd_TAGS
+	rm -f $@; \
+	$(call xtags,etags)
+endef
+
+TAGS: FORCE
+	$(call cmd,TAGS)
+
+quiet_cmd_tags = MAKE   $@
+define cmd_tags
+	rm -f $@; \
+	$(call xtags,ctags)
+endef
+
+tags: FORCE
+	$(call cmd,tags)
+
+
+# Scripts to check various things for consistency
+# ---------------------------------------------------------------------------
+
+includecheck:
+	find * $(RCS_FIND_IGNORE) \
+		-name '*.[hcS]' -type f -print | sort \
+		| xargs $(PERL) -w scripts/checkincludes.pl
+
+versioncheck:
+	find * $(RCS_FIND_IGNORE) \
+		-name '*.[hcS]' -type f -print | sort \
+		| xargs $(PERL) -w scripts/checkversion.pl
+
+namespacecheck:
+	$(PERL) $(srctree)/scripts/namespace.pl
+
+endif #ifeq ($(config-targets),1)
+endif #ifeq ($(mixed-targets),1)
+
+PHONY += checkstack kernelrelease kernelversion
+
+# UML needs a little special treatment here.  It wants to use the host
+# toolchain, so needs $(SUBARCH) passed to checkstack.pl.  Everyone
+# else wants $(ARCH), including people doing cross-builds, which means
+# that $(SUBARCH) doesn't work here.
+ifeq ($(ARCH), um)
+CHECKSTACK_ARCH := $(SUBARCH)
+else
+CHECKSTACK_ARCH := $(ARCH)
+endif
+checkstack:
+	$(OBJDUMP) -d vmlinux $$(find . -name '*.ko') | \
+	$(PERL) $(src)/scripts/checkstack.pl $(CHECKSTACK_ARCH)
+
+kernelrelease:
+	$(if $(wildcard include/config/kernel.release), $(Q)echo $(KERNELRELEASE), \
+	$(error kernelrelease not valid - run 'make prepare' to update it))
+kernelversion:
+	@echo $(KERNELVERSION)
+
+# Single targets
+# ---------------------------------------------------------------------------
+# Single targets are compatible with:
+# - build whith mixed source and output
+# - build with separate output dir 'make O=...'
+# - external modules
+#
+#  target-dir => where to store outputfile
+#  build-dir  => directory in kernel source tree to use
+
+ifeq ($(KBUILD_EXTMOD),)
+        build-dir  = $(patsubst %/,%,$(dir $@))
+        target-dir = $(dir $@)
+else
+        zap-slash=$(filter-out .,$(patsubst %/,%,$(dir $@)))
+        build-dir  = $(KBUILD_EXTMOD)$(if $(zap-slash),/$(zap-slash))
+        target-dir = $(if $(KBUILD_EXTMOD),$(dir $<),$(dir $@))
+endif
+
+%.s: %.c prepare scripts FORCE
+	$(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)
+%.i: %.c prepare scripts FORCE
+	$(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)
+%.o: %.c prepare scripts FORCE
+	$(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)
+%.lst: %.c prepare scripts FORCE
+	$(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)
+%.s: %.S prepare scripts FORCE
+	$(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)
+%.o: %.S prepare scripts FORCE
+	$(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)
+%.symtypes: %.c prepare scripts FORCE
+	$(Q)$(MAKE) $(build)=$(build-dir) $(target-dir)$(notdir $@)
+
+# Modules
+/ %/: prepare scripts FORCE
+	$(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) \
+	$(build)=$(build-dir)
+%.ko: prepare scripts FORCE
+	$(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1)   \
+	$(build)=$(build-dir) $(@:.ko=.o)
+	$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
+
+# FIXME Should go into a make.lib or something 
+# ===========================================================================
+
+quiet_cmd_rmdirs = $(if $(wildcard $(rm-dirs)),CLEAN   $(wildcard $(rm-dirs)))
+      cmd_rmdirs = rm -rf $(rm-dirs)
+
+quiet_cmd_rmfiles = $(if $(wildcard $(rm-files)),CLEAN   $(wildcard $(rm-files)))
+      cmd_rmfiles = rm -f $(rm-files)
+
+
+a_flags = -Wp,-MD,$(depfile) $(AFLAGS) $(AFLAGS_KERNEL) \
+	  $(NOSTDINC_FLAGS) $(CPPFLAGS) \
+	  $(modkern_aflags) $(EXTRA_AFLAGS) $(AFLAGS_$(basetarget).o)
+
+quiet_cmd_as_o_S = AS      $@
+cmd_as_o_S       = $(CC) $(a_flags) -c -o $@ $<
+
+# read all saved command lines
+
+targets := $(wildcard $(sort $(targets)))
+cmd_files := $(wildcard .*.cmd $(foreach f,$(targets),$(dir $(f)).$(notdir $(f)).cmd))
+
+ifneq ($(cmd_files),)
+  $(cmd_files): ;	# Do not try to update included dependency files
+  include $(cmd_files)
+endif
+
+# Shorthand for $(Q)$(MAKE) -f scripts/Makefile.clean obj=dir
+# Usage:
+# $(Q)$(MAKE) $(clean)=dir
+clean := -f $(if $(KBUILD_SRC),$(srctree)/)scripts/Makefile.clean obj
+
+endif	# skip-makefile
+
+PHONY += FORCE
+FORCE:
+
+# Cancel implicit rules on top Makefile, `-rR' will apply to sub-makes.
+Makefile: ;
+
+# Declare the contents of the .PHONY variable as phony.  We keep that
+# information in a variable se we can use it in if_changed and friends.
+.PHONY: $(PHONY)
diff -urNp linux-2.6.20/arch/arm/common/Kconfig linux-2.6.20-s1t/arch/arm/common/Kconfig
--- linux-2.6.20/arch/arm/common/Kconfig	2007-02-04 18:44:54.000000000 +0000
+++ linux-2.6.20-s1t/arch/arm/common/Kconfig	2007-02-07 16:29:01.000000000 +0000
@@ -31,3 +31,9 @@ config SHARPSL_PM
 
 config SHARP_SCOOP
 	bool
+
+config SIMTEC_SBCD
+	bool
+
+source "arch/arm/common/sbcd/Kconfig"
+
diff -urNp linux-2.6.20/arch/arm/common/Makefile linux-2.6.20-s1t/arch/arm/common/Makefile
--- linux-2.6.20/arch/arm/common/Makefile	2007-02-04 18:44:54.000000000 +0000
+++ linux-2.6.20-s1t/arch/arm/common/Makefile	2007-02-07 16:29:01.000000000 +0000
@@ -17,3 +17,4 @@ obj-$(CONFIG_SHARPSL_PM)	+= sharpsl_pm.o
 obj-$(CONFIG_SHARP_SCOOP)	+= scoop.o
 obj-$(CONFIG_ARCH_IXP2000)	+= uengine.o
 obj-$(CONFIG_ARCH_IXP23XX)	+= uengine.o
+obj-$(CONFIG_SIMTEC_SBCD)	+= sbcd/
\ No newline at end of file
diff -urNp linux-2.6.20/arch/arm/common/s3c2410_defconfig linux-2.6.20-s1t/arch/arm/common/s3c2410_defconfig
--- linux-2.6.20/arch/arm/common/s3c2410_defconfig	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/arch/arm/common/s3c2410_defconfig	2007-02-07 16:29:01.000000000 +0000
@@ -0,0 +1,1617 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.19-simtec2p1
+# Wed Jan 24 14:16:03 2007
+#
+CONFIG_ARM=y
+# CONFIG_GENERIC_TIME is not set
+CONFIG_MMU=y
+CONFIG_GENERIC_HARDIRQS=y
+CONFIG_TRACE_IRQFLAGS_SUPPORT=y
+CONFIG_HARDIRQS_SW_RESEND=y
+CONFIG_GENERIC_IRQ_PROBE=y
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_VECTORS_BASE=0xffff0000
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+
+#
+# Code maturity level options
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_BROKEN_ON_SMP=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+
+#
+# General setup
+#
+CONFIG_LOCALVERSION=""
+CONFIG_LOCALVERSION_AUTO=y
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# CONFIG_IPC_NS is not set
+# CONFIG_POSIX_MQUEUE is not set
+# CONFIG_BSD_PROCESS_ACCT is not set
+# CONFIG_TASKSTATS is not set
+# CONFIG_UTS_NS is not set
+# CONFIG_AUDIT is not set
+# CONFIG_IKCONFIG is not set
+# CONFIG_RELAY is not set
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+CONFIG_SYSCTL=y
+# CONFIG_EMBEDDED is not set
+CONFIG_UID16=y
+CONFIG_SYSCTL_SYSCALL=y
+CONFIG_KALLSYMS=y
+# CONFIG_KALLSYMS_ALL is not set
+# CONFIG_KALLSYMS_EXTRA_PASS is not set
+CONFIG_HOTPLUG=y
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+CONFIG_ELF_CORE=y
+CONFIG_BASE_FULL=y
+CONFIG_FUTEX=y
+CONFIG_EPOLL=y
+CONFIG_SHMEM=y
+CONFIG_SLAB=y
+CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_RT_MUTEXES=y
+# CONFIG_TINY_SHMEM is not set
+CONFIG_BASE_SMALL=0
+# CONFIG_SLOB is not set
+
+#
+# Loadable module support
+#
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+# CONFIG_MODULE_FORCE_UNLOAD is not set
+CONFIG_MODVERSIONS=y
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+# CONFIG_BLK_DEV_IO_TRACE is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
+#
+# System Type
+#
+# CONFIG_ARCH_AAEC2000 is not set
+# CONFIG_ARCH_INTEGRATOR is not set
+# CONFIG_ARCH_REALVIEW is not set
+# CONFIG_ARCH_VERSATILE is not set
+# CONFIG_ARCH_AT91 is not set
+# CONFIG_ARCH_CLPS7500 is not set
+# CONFIG_ARCH_CLPS711X is not set
+# CONFIG_ARCH_CO285 is not set
+# CONFIG_ARCH_EBSA110 is not set
+# CONFIG_ARCH_EP93XX is not set
+# CONFIG_ARCH_FOOTBRIDGE is not set
+# CONFIG_ARCH_NETX is not set
+# CONFIG_ARCH_H720X is not set
+# CONFIG_ARCH_IMX is not set
+# CONFIG_ARCH_IOP32X is not set
+# CONFIG_ARCH_IOP33X is not set
+# CONFIG_ARCH_IXP4XX is not set
+# CONFIG_ARCH_IXP2000 is not set
+# CONFIG_ARCH_IXP23XX is not set
+# CONFIG_ARCH_L7200 is not set
+# CONFIG_ARCH_PNX4008 is not set
+# CONFIG_ARCH_PXA is not set
+# CONFIG_ARCH_RPC is not set
+# CONFIG_ARCH_SA1100 is not set
+CONFIG_ARCH_S3C2410=y
+# CONFIG_ARCH_SHARK is not set
+# CONFIG_ARCH_LH7A40X is not set
+# CONFIG_ARCH_OMAP is not set
+
+#
+# S3C24XX Implementations
+#
+# CONFIG_MACH_AML_M5900 is not set
+CONFIG_MACH_ANUBIS=y
+CONFIG_MACH_OSIRIS=y
+CONFIG_ARCH_BAST=y
+CONFIG_BAST_PC104_IRQ=y
+CONFIG_ARCH_H1940=y
+CONFIG_MACH_N30=y
+CONFIG_MACH_SMDK=y
+CONFIG_ARCH_SMDK2410=y
+CONFIG_ARCH_S3C2440=y
+CONFIG_SMDK2440_CPU2440=y
+CONFIG_SMDK2440_CPU2442=y
+# CONFIG_MACH_SMDK2413 is not set
+CONFIG_MACH_VR1000=y
+CONFIG_MACH_RX3715=y
+CONFIG_MACH_OTOM=y
+CONFIG_MACH_NEXCODER_2440=y
+# CONFIG_MACH_VSTMS is not set
+
+#
+# Board drivers and common code
+#
+# CONFIG_SMDK_AX88780 is not set
+
+#
+# Core configuration
+#
+CONFIG_S3C2410_CLOCK=y
+CONFIG_S3C2410_PM=y
+CONFIG_CPU_S3C2410_DMA=y
+CONFIG_CPU_S3C2410=y
+CONFIG_CPU_S3C244X=y
+CONFIG_CPU_S3C2440=y
+CONFIG_CPU_S3C2442=y
+
+#
+# S3C2410 Boot
+#
+# CONFIG_S3C2410_BOOT_WATCHDOG is not set
+CONFIG_S3C2410_BOOT_ERROR_RESET=y
+
+#
+# S3C2410 Setup
+#
+CONFIG_S3C2410_DMA=y
+# CONFIG_S3C2410_DMA_DEBUG is not set
+# CONFIG_S3C2410_PM_DEBUG is not set
+# CONFIG_S3C2410_PM_CHECK is not set
+CONFIG_PM_SIMTEC=y
+CONFIG_SIMTEC_AUDIO=y
+CONFIG_S3C2410_LOWLEVEL_UART_PORT=0
+
+#
+# Processor Type
+#
+CONFIG_CPU_32=y
+CONFIG_CPU_ARM920T=y
+CONFIG_CPU_32v4T=y
+CONFIG_CPU_ABRT_EV4T=y
+CONFIG_CPU_CACHE_V4WT=y
+CONFIG_CPU_CACHE_VIVT=y
+CONFIG_CPU_COPY_V4WB=y
+CONFIG_CPU_TLB_V4WBI=y
+CONFIG_CPU_CP15=y
+CONFIG_CPU_CP15_MMU=y
+
+#
+# Processor Features
+#
+# CONFIG_ARM_THUMB is not set
+# CONFIG_CPU_ICACHE_DISABLE is not set
+# CONFIG_CPU_DCACHE_DISABLE is not set
+# CONFIG_CPU_DCACHE_WRITETHROUGH is not set
+CONFIG_SIMTEC_SBCD=y
+CONFIG_SBCD=y
+CONFIG_SBCD_IM2440D20=y
+
+#
+# Bus support
+#
+CONFIG_ISA=y
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+# CONFIG_PCCARD is not set
+
+#
+# Kernel Features
+#
+# CONFIG_PREEMPT is not set
+# CONFIG_NO_IDLE_HZ is not set
+CONFIG_HZ=200
+# CONFIG_AEABI is not set
+# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
+CONFIG_SELECT_MEMORY_MODEL=y
+CONFIG_FLATMEM_MANUAL=y
+# CONFIG_DISCONTIGMEM_MANUAL is not set
+# CONFIG_SPARSEMEM_MANUAL is not set
+CONFIG_FLATMEM=y
+CONFIG_FLAT_NODE_MEM_MAP=y
+# CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4096
+# CONFIG_RESOURCES_64BIT is not set
+CONFIG_ALIGNMENT_TRAP=y
+
+#
+# Boot options
+#
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_CMDLINE="root=/dev/hda1 ro init=/bin/bash console=ttySAC0"
+# CONFIG_XIP_KERNEL is not set
+
+#
+# Floating point emulation
+#
+
+#
+# At least one emulation must be selected
+#
+CONFIG_FPE_NWFPE=y
+CONFIG_FPE_NWFPE_XP=y
+# CONFIG_FPE_FASTFPE is not set
+
+#
+# Userspace binary formats
+#
+CONFIG_BINFMT_ELF=y
+CONFIG_BINFMT_AOUT=y
+# CONFIG_BINFMT_MISC is not set
+# CONFIG_ARTHUR is not set
+
+#
+# Power management options
+#
+CONFIG_PM=y
+CONFIG_PM_LEGACY=y
+# CONFIG_PM_DEBUG is not set
+# CONFIG_PM_SYSFS_DEPRECATED is not set
+CONFIG_APM=y
+
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_NETDEBUG is not set
+CONFIG_PACKET=y
+# CONFIG_PACKET_MMAP is not set
+CONFIG_UNIX=y
+CONFIG_XFRM=y
+# CONFIG_XFRM_USER is not set
+# CONFIG_XFRM_SUB_POLICY is not set
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+# CONFIG_IP_MULTICAST is not set
+# CONFIG_IP_ADVANCED_ROUTER is not set
+CONFIG_IP_FIB_HASH=y
+CONFIG_IP_PNP=y
+CONFIG_IP_PNP_DHCP=y
+CONFIG_IP_PNP_BOOTP=y
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_ARPD is not set
+# CONFIG_SYN_COOKIES is not set
+# CONFIG_INET_AH is not set
+# CONFIG_INET_ESP is not set
+# CONFIG_INET_IPCOMP is not set
+# CONFIG_INET_XFRM_TUNNEL is not set
+# CONFIG_INET_TUNNEL is not set
+CONFIG_INET_XFRM_MODE_TRANSPORT=y
+CONFIG_INET_XFRM_MODE_TUNNEL=y
+CONFIG_INET_XFRM_MODE_BEET=y
+CONFIG_INET_DIAG=y
+CONFIG_INET_TCP_DIAG=y
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_IPV6 is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+# CONFIG_NETWORK_SECMARK is not set
+# CONFIG_NETFILTER is not set
+
+#
+# DCCP Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP_DCCP is not set
+
+#
+# SCTP Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP_SCTP is not set
+
+#
+# TIPC Configuration (EXPERIMENTAL)
+#
+# CONFIG_TIPC is not set
+# CONFIG_ATM is not set
+# CONFIG_BRIDGE is not set
+CONFIG_VLAN_8021Q=y
+# CONFIG_DECNET is not set
+# CONFIG_LLC2 is not set
+# CONFIG_IPX is not set
+# CONFIG_ATALK is not set
+# CONFIG_X25 is not set
+# CONFIG_LAPB is not set
+# CONFIG_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
+# CONFIG_NET_SCHED is not set
+
+#
+# Network testing
+#
+# CONFIG_NET_PKTGEN is not set
+# CONFIG_HAMRADIO is not set
+# CONFIG_IRDA is not set
+# CONFIG_BT is not set
+CONFIG_IEEE80211=y
+# CONFIG_IEEE80211_DEBUG is not set
+CONFIG_IEEE80211_CRYPT_WEP=y
+CONFIG_IEEE80211_CRYPT_CCMP=y
+# CONFIG_IEEE80211_CRYPT_TKIP is not set
+# CONFIG_IEEE80211_SOFTMAC is not set
+CONFIG_WIRELESS_EXT=y
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+# CONFIG_STANDALONE is not set
+# CONFIG_PREVENT_FIRMWARE_BUILD is not set
+CONFIG_FW_LOADER=y
+# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_SYS_HYPERVISOR is not set
+
+#
+# Connector - unified userspace <-> kernelspace linker
+#
+CONFIG_CONNECTOR=m
+
+#
+# Memory Technology Devices (MTD)
+#
+CONFIG_MTD=y
+# CONFIG_MTD_DEBUG is not set
+# CONFIG_MTD_CONCAT is not set
+CONFIG_MTD_PARTITIONS=y
+CONFIG_MTD_REDBOOT_PARTS=y
+CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-1
+CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED=y
+# CONFIG_MTD_REDBOOT_PARTS_READONLY is not set
+CONFIG_MTD_CMDLINE_PARTS=y
+# CONFIG_MTD_AFS_PARTS is not set
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_CHAR=y
+CONFIG_MTD_BLOCK=y
+# CONFIG_FTL is not set
+# CONFIG_NFTL is not set
+# CONFIG_INFTL is not set
+# CONFIG_RFD_FTL is not set
+# CONFIG_SSFDC is not set
+
+#
+# RAM/ROM/Flash chip drivers
+#
+CONFIG_MTD_CFI=y
+CONFIG_MTD_JEDECPROBE=y
+CONFIG_MTD_GEN_PROBE=y
+# CONFIG_MTD_CFI_ADV_OPTIONS is not set
+CONFIG_MTD_MAP_BANK_WIDTH_1=y
+CONFIG_MTD_MAP_BANK_WIDTH_2=y
+CONFIG_MTD_MAP_BANK_WIDTH_4=y
+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
+CONFIG_MTD_MAP_BANK_WIDTH_16=y
+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
+CONFIG_MTD_CFI_I1=y
+CONFIG_MTD_CFI_I2=y
+# CONFIG_MTD_CFI_I4 is not set
+# CONFIG_MTD_CFI_I8 is not set
+CONFIG_MTD_CFI_INTELEXT=y
+CONFIG_MTD_CFI_AMDSTD=y
+# CONFIG_MTD_CFI_STAA is not set
+CONFIG_MTD_CFI_UTIL=y
+# CONFIG_MTD_RAM is not set
+CONFIG_MTD_ROM=y
+# CONFIG_MTD_ABSENT is not set
+# CONFIG_MTD_OBSOLETE_CHIPS is not set
+
+#
+# Mapping drivers for chip access
+#
+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
+# CONFIG_MTD_PHYSMAP is not set
+# CONFIG_MTD_ARM_INTEGRATOR is not set
+# CONFIG_MTD_IMPA7 is not set
+CONFIG_MTD_BAST=y
+CONFIG_MTD_BAST_MAXSIZE=4
+# CONFIG_MTD_PLATRAM is not set
+
+#
+# Self-contained MTD device drivers
+#
+# CONFIG_MTD_DATAFLASH is not set
+# CONFIG_MTD_M25P80 is not set
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_PHRAM is not set
+# CONFIG_MTD_MTDRAM is not set
+# CONFIG_MTD_BLOCK2MTD is not set
+
+#
+# Disk-On-Chip Device Drivers
+#
+# CONFIG_MTD_DOC2000 is not set
+# CONFIG_MTD_DOC2001 is not set
+# CONFIG_MTD_DOC2001PLUS is not set
+
+#
+# NAND Flash Device Drivers
+#
+CONFIG_MTD_NAND=y
+# CONFIG_MTD_NAND_VERIFY_WRITE is not set
+# CONFIG_MTD_NAND_ECC_SMC is not set
+CONFIG_MTD_NAND_IDS=y
+CONFIG_MTD_NAND_S3C2410=y
+# CONFIG_MTD_NAND_S3C2410_DEBUG is not set
+CONFIG_MTD_NAND_S3C2410_HWECC=y
+# CONFIG_MTD_NAND_S3C2410_CLKSTOP is not set
+# CONFIG_MTD_NAND_DISKONCHIP is not set
+# CONFIG_MTD_NAND_NANDSIM is not set
+
+#
+# OneNAND Flash Device Drivers
+#
+# CONFIG_MTD_ONENAND is not set
+
+#
+# Parallel port support
+#
+CONFIG_PARPORT=m
+CONFIG_PARPORT_PC=m
+CONFIG_PARPORT_PC_FIFO=y
+CONFIG_PARPORT_PC_SUPERIO=y
+CONFIG_PARPORT_NOT_PC=y
+# CONFIG_PARPORT_GSC is not set
+CONFIG_PARPORT_AX88796=m
+CONFIG_PARPORT_1284=y
+
+#
+# Plug and Play support
+#
+# CONFIG_PNP is not set
+
+#
+# Block devices
+#
+# CONFIG_PARIDE is not set
+# CONFIG_BLK_DEV_COW_COMMON is not set
+CONFIG_BLK_DEV_LOOP=y
+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
+CONFIG_BLK_DEV_NBD=m
+# CONFIG_BLK_DEV_UB is not set
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_COUNT=16
+CONFIG_BLK_DEV_RAM_SIZE=4096
+CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
+CONFIG_BLK_DEV_INITRD=y
+# CONFIG_CDROM_PKTCDVD is not set
+CONFIG_ATA_OVER_ETH=m
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+CONFIG_IDE=y
+CONFIG_BLK_DEV_IDE=y
+
+#
+# Please see Documentation/ide.txt for help/info on IDE drives
+#
+# CONFIG_BLK_DEV_IDE_SATA is not set
+CONFIG_BLK_DEV_IDEDISK=y
+# CONFIG_IDEDISK_MULTI_MODE is not set
+CONFIG_BLK_DEV_IDECD=y
+# CONFIG_BLK_DEV_IDETAPE is not set
+CONFIG_BLK_DEV_IDEFLOPPY=m
+# CONFIG_BLK_DEV_IDESCSI is not set
+# CONFIG_IDE_TASK_IOCTL is not set
+
+#
+# IDE chipset support/bugfixes
+#
+CONFIG_IDE_GENERIC=y
+# CONFIG_IDE_ARM is not set
+CONFIG_BLK_DEV_IDE_BAST=y
+CONFIG_BLK_DEV_IDE_SIMTEC=y
+# CONFIG_IDE_CHIPSETS is not set
+# CONFIG_BLK_DEV_IDEDMA is not set
+# CONFIG_IDEDMA_AUTO is not set
+# CONFIG_BLK_DEV_HD is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+CONFIG_SCSI=y
+# CONFIG_SCSI_NETLINK is not set
+CONFIG_SCSI_PROC_FS=y
+
+#
+# SCSI support type (disk, tape, CD-ROM)
+#
+CONFIG_BLK_DEV_SD=m
+# CONFIG_CHR_DEV_ST is not set
+# CONFIG_CHR_DEV_OSST is not set
+CONFIG_BLK_DEV_SR=m
+# CONFIG_BLK_DEV_SR_VENDOR is not set
+CONFIG_CHR_DEV_SG=m
+CONFIG_CHR_DEV_SCH=m
+
+#
+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
+#
+CONFIG_SCSI_MULTI_LUN=y
+CONFIG_SCSI_CONSTANTS=y
+# CONFIG_SCSI_LOGGING is not set
+
+#
+# SCSI Transports
+#
+# CONFIG_SCSI_SPI_ATTRS is not set
+# CONFIG_SCSI_FC_ATTRS is not set
+# CONFIG_SCSI_ISCSI_ATTRS is not set
+# CONFIG_SCSI_SAS_ATTRS is not set
+# CONFIG_SCSI_SAS_LIBSAS is not set
+
+#
+# SCSI low-level drivers
+#
+# CONFIG_ISCSI_TCP is not set
+# CONFIG_SCSI_AHA152X is not set
+# CONFIG_SCSI_AIC7XXX_OLD is not set
+# CONFIG_SCSI_IN2000 is not set
+# CONFIG_SCSI_DTC3280 is not set
+# CONFIG_SCSI_FUTURE_DOMAIN is not set
+# CONFIG_SCSI_GENERIC_NCR5380 is not set
+# CONFIG_SCSI_GENERIC_NCR5380_MMIO is not set
+# CONFIG_SCSI_PPA is not set
+# CONFIG_SCSI_IMM is not set
+# CONFIG_SCSI_NCR53C406A is not set
+# CONFIG_SCSI_PAS16 is not set
+# CONFIG_SCSI_PSI240I is not set
+# CONFIG_SCSI_QLOGIC_FAS is not set
+# CONFIG_SCSI_SYM53C416 is not set
+# CONFIG_SCSI_T128 is not set
+# CONFIG_SCSI_DEBUG is not set
+
+#
+# Serial ATA (prod) and Parallel ATA (experimental) drivers
+#
+# CONFIG_ATA is not set
+
+#
+# Multi-device support (RAID and LVM)
+#
+# CONFIG_MD is not set
+
+#
+# Fusion MPT device support
+#
+# CONFIG_FUSION is not set
+
+#
+# IEEE 1394 (FireWire) support
+#
+
+#
+# I2O device support
+#
+
+#
+# Network device support
+#
+CONFIG_NETDEVICES=y
+# CONFIG_DUMMY is not set
+# CONFIG_BONDING is not set
+# CONFIG_EQUALIZER is not set
+# CONFIG_TUN is not set
+
+#
+# ARCnet devices
+#
+# CONFIG_ARCNET is not set
+
+#
+# PHY device support
+#
+# CONFIG_PHYLIB is not set
+
+#
+# Ethernet (10 or 100Mbit)
+#
+CONFIG_NET_ETHERNET=y
+CONFIG_MII=y
+# CONFIG_NET_VENDOR_3COM is not set
+# CONFIG_NET_VENDOR_SMC is not set
+# CONFIG_SMC91X is not set
+CONFIG_DM9000=y
+# CONFIG_NET_VENDOR_RACAL is not set
+# CONFIG_AT1700 is not set
+# CONFIG_DEPCA is not set
+# CONFIG_HP100 is not set
+# CONFIG_NET_ISA is not set
+# CONFIG_NET_PCI is not set
+CONFIG_AX88796=y
+CONFIG_AX88780=y
+# CONFIG_NET_POCKET is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+
+#
+# Ethernet (10000 Mbit)
+#
+
+#
+# Token Ring devices
+#
+# CONFIG_TR is not set
+
+#
+# Wireless LAN (non-hamradio)
+#
+CONFIG_NET_RADIO=y
+# CONFIG_NET_WIRELESS_RTNETLINK is not set
+
+#
+# Obsolete Wireless cards support (pre-802.11)
+#
+# CONFIG_STRIP is not set
+# CONFIG_ARLAN is not set
+# CONFIG_WAVELAN is not set
+
+#
+# Wireless 802.11b ISA/PCI cards support
+#
+# CONFIG_USB_ZD1201 is not set
+# CONFIG_HOSTAP is not set
+CONFIG_NET_WIRELESS=y
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN is not set
+# CONFIG_PLIP is not set
+CONFIG_PPP=m
+# CONFIG_PPP_MULTILINK is not set
+# CONFIG_PPP_FILTER is not set
+CONFIG_PPP_ASYNC=m
+CONFIG_PPP_SYNC_TTY=m
+CONFIG_PPP_DEFLATE=m
+CONFIG_PPP_BSDCOMP=m
+CONFIG_PPP_MPPE=m
+CONFIG_PPPOE=m
+CONFIG_SLIP=m
+# CONFIG_SLIP_COMPRESSED is not set
+CONFIG_SLHC=m
+# CONFIG_SLIP_SMART is not set
+# CONFIG_SLIP_MODE_SLIP6 is not set
+# CONFIG_SHAPER is not set
+# CONFIG_NETCONSOLE is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
+
+#
+# ISDN subsystem
+#
+# CONFIG_ISDN is not set
+
+#
+# Input device support
+#
+CONFIG_INPUT=y
+# CONFIG_INPUT_FF_MEMLESS is not set
+
+#
+# Userland interfaces
+#
+CONFIG_INPUT_MOUSEDEV=y
+# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
+CONFIG_INPUT_JOYDEV=m
+CONFIG_INPUT_TSDEV=m
+CONFIG_INPUT_TSDEV_SCREEN_X=240
+CONFIG_INPUT_TSDEV_SCREEN_Y=320
+CONFIG_INPUT_EVDEV=m
+# CONFIG_INPUT_EVBUG is not set
+
+#
+# Input Device Drivers
+#
+# CONFIG_INPUT_KEYBOARD is not set
+# CONFIG_INPUT_MOUSE is not set
+# CONFIG_INPUT_JOYSTICK is not set
+# CONFIG_INPUT_TOUCHSCREEN is not set
+# CONFIG_INPUT_MISC is not set
+
+#
+# Hardware I/O ports
+#
+CONFIG_SERIO=y
+CONFIG_SERIO_SERPORT=y
+# CONFIG_SERIO_PARKBD is not set
+# CONFIG_SERIO_RAW is not set
+# CONFIG_GAMEPORT is not set
+
+#
+# Character devices
+#
+CONFIG_VT=y
+CONFIG_VT_CONSOLE=y
+CONFIG_HW_CONSOLE=y
+# CONFIG_VT_HW_CONSOLE_BINDING is not set
+CONFIG_SERIAL_NONSTANDARD=y
+# CONFIG_COMPUTONE is not set
+# CONFIG_ROCKETPORT is not set
+# CONFIG_CYCLADES is not set
+# CONFIG_DIGIEPCA is not set
+# CONFIG_MOXA_INTELLIO is not set
+# CONFIG_MOXA_SMARTIO is not set
+# CONFIG_ISI is not set
+# CONFIG_SYNCLINKMP is not set
+# CONFIG_N_HDLC is not set
+# CONFIG_RISCOM8 is not set
+# CONFIG_SPECIALIX is not set
+# CONFIG_SX is not set
+# CONFIG_RIO is not set
+# CONFIG_STALDRV is not set
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
+CONFIG_SERIAL_8250_NR_UARTS=8
+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
+CONFIG_SERIAL_8250_EXTENDED=y
+CONFIG_SERIAL_8250_MANY_PORTS=y
+CONFIG_SERIAL_8250_SHARE_IRQ=y
+# CONFIG_SERIAL_8250_DETECT_IRQ is not set
+# CONFIG_SERIAL_8250_RSA is not set
+# CONFIG_SERIAL_8250_FOURPORT is not set
+# CONFIG_SERIAL_8250_ACCENT is not set
+# CONFIG_SERIAL_8250_BOCA is not set
+# CONFIG_SERIAL_8250_HUB6 is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_S3C2410=y
+CONFIG_SERIAL_S3C2410_CONSOLE=y
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
+# CONFIG_PRINTER is not set
+# CONFIG_PPDEV is not set
+# CONFIG_TIPAR is not set
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+CONFIG_WATCHDOG=y
+# CONFIG_WATCHDOG_NOWAYOUT is not set
+
+#
+# Watchdog Device Drivers
+#
+# CONFIG_SOFT_WATCHDOG is not set
+CONFIG_S3C2410_WATCHDOG=y
+
+#
+# ISA-based Watchdog Cards
+#
+# CONFIG_PCWATCHDOG is not set
+# CONFIG_MIXCOMWD is not set
+# CONFIG_WDT is not set
+
+#
+# USB-based Watchdog Cards
+#
+# CONFIG_USBPCWATCHDOG is not set
+CONFIG_HW_RANDOM=y
+# CONFIG_NVRAM is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+
+#
+# Ftape, the floppy tape device driver
+#
+# CONFIG_RAW_DRIVER is not set
+
+#
+# TPM devices
+#
+# CONFIG_TCG_TPM is not set
+# CONFIG_SIMTEC_LCD is not set
+
+#
+# I2C support
+#
+CONFIG_I2C=y
+CONFIG_I2C_CHARDEV=y
+
+#
+# I2C Algorithms
+#
+CONFIG_I2C_ALGOBIT=y
+# CONFIG_I2C_ALGOPCF is not set
+# CONFIG_I2C_ALGOPCA is not set
+
+#
+# I2C Hardware Bus support
+#
+# CONFIG_I2C_ELEKTOR is not set
+CONFIG_I2C_ISA=m
+# CONFIG_I2C_OCORES is not set
+# CONFIG_I2C_PARPORT is not set
+# CONFIG_I2C_PARPORT_LIGHT is not set
+CONFIG_I2C_S3C2410=y
+# CONFIG_I2C_S3C2410_CLKIDLE is not set
+CONFIG_I2C_SIMTEC=m
+# CONFIG_I2C_STUB is not set
+# CONFIG_I2C_PCA_ISA is not set
+
+#
+# Miscellaneous I2C Chip support
+#
+CONFIG_BAST_PMU=y
+# CONFIG_SENSORS_DS1337 is not set
+# CONFIG_SENSORS_DS1374 is not set
+CONFIG_SENSORS_EEPROM=y
+# CONFIG_SENSORS_PCF8574 is not set
+# CONFIG_SENSORS_PCA9539 is not set
+# CONFIG_SENSORS_PCF8591 is not set
+# CONFIG_SENSORS_MAX6875 is not set
+CONFIG_SENSORS_M41ST87=y
+# CONFIG_I2C_DEBUG_CORE is not set
+# CONFIG_I2C_DEBUG_ALGO is not set
+# CONFIG_I2C_DEBUG_BUS is not set
+# CONFIG_I2C_DEBUG_CHIP is not set
+
+#
+# SPI support
+#
+CONFIG_SPI=y
+# CONFIG_SPI_DEBUG is not set
+CONFIG_SPI_MASTER=y
+
+#
+# SPI Master Controller Drivers
+#
+CONFIG_SPI_BITBANG=y
+# CONFIG_SPI_BUTTERFLY is not set
+CONFIG_SPI_S3C24XX_GPIO=y
+CONFIG_SPI_S3C24XX=y
+
+#
+# SPI Protocol Masters
+#
+CONFIG_SPI_TLE62X0=y
+
+#
+# Dallas's 1-wire bus
+#
+# CONFIG_W1 is not set
+
+#
+# Hardware Monitoring support
+#
+CONFIG_HWMON=y
+CONFIG_HWMON_VID=m
+# CONFIG_SENSORS_ABITUGURU is not set
+# CONFIG_SENSORS_ADM1021 is not set
+# CONFIG_SENSORS_ADM1025 is not set
+# CONFIG_SENSORS_ADM1026 is not set
+# CONFIG_SENSORS_ADM1031 is not set
+# CONFIG_SENSORS_ADM9240 is not set
+# CONFIG_SENSORS_ASB100 is not set
+# CONFIG_SENSORS_ATXP1 is not set
+# CONFIG_SENSORS_DS1621 is not set
+# CONFIG_SENSORS_F71805F is not set
+# CONFIG_SENSORS_FSCHER is not set
+# CONFIG_SENSORS_FSCPOS is not set
+# CONFIG_SENSORS_GL518SM is not set
+# CONFIG_SENSORS_GL520SM is not set
+# CONFIG_SENSORS_IT87 is not set
+# CONFIG_SENSORS_LM63 is not set
+# CONFIG_SENSORS_LM70 is not set
+CONFIG_SENSORS_LM75=m
+# CONFIG_SENSORS_LM77 is not set
+CONFIG_SENSORS_LM78=m
+# CONFIG_SENSORS_LM80 is not set
+# CONFIG_SENSORS_LM83 is not set
+CONFIG_SENSORS_LM85=m
+# CONFIG_SENSORS_LM87 is not set
+# CONFIG_SENSORS_LM90 is not set
+# CONFIG_SENSORS_LM92 is not set
+# CONFIG_SENSORS_MAX1619 is not set
+# CONFIG_SENSORS_PC87360 is not set
+CONFIG_SENSORS_S3C_ADC=m
+# CONFIG_SENSORS_SMSC47M1 is not set
+# CONFIG_SENSORS_SMSC47M192 is not set
+# CONFIG_SENSORS_SMSC47B397 is not set
+# CONFIG_SENSORS_VT1211 is not set
+# CONFIG_SENSORS_W83781D is not set
+# CONFIG_SENSORS_W83791D is not set
+# CONFIG_SENSORS_W83792D is not set
+# CONFIG_SENSORS_W83L785TS is not set
+# CONFIG_SENSORS_W83627HF is not set
+# CONFIG_SENSORS_W83627EHF is not set
+# CONFIG_HWMON_DEBUG_CHIP is not set
+
+#
+# Misc devices
+#
+# CONFIG_TIFM_CORE is not set
+CONFIG_GPIO_SBCD_BASE=y
+CONFIG_GPIO_SBCD=y
+
+#
+# Multifunction device drivers
+#
+CONFIG_MFD_SM501=y
+
+#
+# LED devices
+#
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=m
+
+#
+# LED drivers
+#
+CONFIG_LEDS_S3C24XX=m
+
+#
+# LED Triggers
+#
+CONFIG_LEDS_TRIGGERS=y
+CONFIG_LEDS_TRIGGER_TIMER=m
+# CONFIG_LEDS_TRIGGER_IDE_DISK is not set
+# CONFIG_LEDS_TRIGGER_HEARTBEAT is not set
+
+#
+# Multimedia devices
+#
+CONFIG_VIDEO_DEV=y
+CONFIG_VIDEO_V4L1=y
+CONFIG_VIDEO_V4L1_COMPAT=y
+CONFIG_VIDEO_V4L2=y
+
+#
+# Video Capture Adapters
+#
+
+#
+# Video Capture Adapters
+#
+CONFIG_VIDEO_ADV_DEBUG=y
+CONFIG_VIDEO_HELPER_CHIPS_AUTO=y
+# CONFIG_VIDEO_VIVI is not set
+# CONFIG_VIDEO_PMS is not set
+# CONFIG_VIDEO_BWQCAM is not set
+# CONFIG_VIDEO_CQCAM is not set
+# CONFIG_VIDEO_W9966 is not set
+CONFIG_VIDEO_CPIA=y
+# CONFIG_VIDEO_CPIA_PP is not set
+CONFIG_VIDEO_CPIA_USB=m
+# CONFIG_VIDEO_CPIA2 is not set
+# CONFIG_VIDEO_SAA5246A is not set
+# CONFIG_VIDEO_SAA5249 is not set
+# CONFIG_TUNER_3036 is not set
+
+#
+# V4L USB devices
+#
+# CONFIG_VIDEO_PVRUSB2 is not set
+# CONFIG_VIDEO_EM28XX is not set
+# CONFIG_USB_VICAM is not set
+# CONFIG_USB_IBMCAM is not set
+# CONFIG_USB_KONICAWC is not set
+# CONFIG_USB_QUICKCAM_MESSENGER is not set
+# CONFIG_USB_ET61X251 is not set
+# CONFIG_VIDEO_OVCAMCHIP is not set
+# CONFIG_USB_W9968CF is not set
+# CONFIG_USB_OV511 is not set
+# CONFIG_USB_SE401 is not set
+# CONFIG_USB_SN9C102 is not set
+# CONFIG_USB_STV680 is not set
+# CONFIG_USB_ZC0301 is not set
+# CONFIG_USB_PWC is not set
+
+#
+# Radio Adapters
+#
+# CONFIG_RADIO_CADET is not set
+# CONFIG_RADIO_RTRACK is not set
+# CONFIG_RADIO_RTRACK2 is not set
+# CONFIG_RADIO_AZTECH is not set
+# CONFIG_RADIO_GEMTEK is not set
+# CONFIG_RADIO_SF16FMI is not set
+# CONFIG_RADIO_SF16FMR2 is not set
+# CONFIG_RADIO_TERRATEC is not set
+# CONFIG_RADIO_TRUST is not set
+# CONFIG_RADIO_TYPHOON is not set
+# CONFIG_RADIO_ZOLTRIX is not set
+# CONFIG_USB_DSBR is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+# CONFIG_USB_DABUSB is not set
+
+#
+# Graphics support
+#
+CONFIG_FIRMWARE_EDID=y
+CONFIG_FB=y
+# CONFIG_FB_DDC is not set
+CONFIG_FB_CFB_FILLRECT=y
+CONFIG_FB_CFB_COPYAREA=y
+CONFIG_FB_CFB_IMAGEBLIT=y
+# CONFIG_FB_MACMODES is not set
+# CONFIG_FB_BACKLIGHT is not set
+# CONFIG_FB_MODE_HELPERS is not set
+# CONFIG_FB_TILEBLITTING is not set
+# CONFIG_FB_S1D13XXX is not set
+CONFIG_FB_S3C2410=m
+# CONFIG_FB_S3C2410_DEBUG is not set
+CONFIG_FB_SM501=y
+# CONFIG_FB_VIRTUAL is not set
+
+#
+# Console display driver support
+#
+# CONFIG_VGA_CONSOLE is not set
+# CONFIG_MDA_CONSOLE is not set
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
+# CONFIG_FONTS is not set
+CONFIG_FONT_8x8=y
+CONFIG_FONT_8x16=y
+
+#
+# Logo configuration
+#
+# CONFIG_LOGO is not set
+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
+
+#
+# Sound
+#
+CONFIG_SOUND=y
+
+#
+# Advanced Linux Sound Architecture
+#
+CONFIG_SND=y
+CONFIG_SND_TIMER=y
+CONFIG_SND_PCM=y
+# CONFIG_SND_SEQUENCER is not set
+CONFIG_SND_OSSEMUL=y
+CONFIG_SND_MIXER_OSS=y
+CONFIG_SND_PCM_OSS=y
+CONFIG_SND_PCM_OSS_PLUGINS=y
+# CONFIG_SND_DYNAMIC_MINORS is not set
+CONFIG_SND_SUPPORT_OLD_API=y
+CONFIG_SND_VERBOSE_PROCFS=y
+# CONFIG_SND_VERBOSE_PRINTK is not set
+# CONFIG_SND_DEBUG is not set
+
+#
+# Generic devices
+#
+# CONFIG_SND_DUMMY is not set
+# CONFIG_SND_MTPAV is not set
+# CONFIG_SND_MTS64 is not set
+# CONFIG_SND_SERIAL_U16550 is not set
+# CONFIG_SND_MPU401 is not set
+
+#
+# ALSA ARM devices
+#
+CONFIG_SND_S3C2410=y
+# CONFIG_SND_S3C2410_DBG is not set
+# CONFIG_SND_S3C2410_DBG_DMA is not set
+CONFIG_SND_TLV320AIC23=y
+CONFIG_SND_TLV320AIC33=y
+CONFIG_SND_S3C2410_TLV320AIC23=y
+CONFIG_SND_S3C2410_TLV320AIC33=y
+CONFIG_SND_VR2K_AMP=y
+
+#
+# USB devices
+#
+# CONFIG_SND_USB_AUDIO is not set
+
+#
+# Open Sound System
+#
+# CONFIG_SOUND_PRIME is not set
+
+#
+# USB support
+#
+CONFIG_USB_ARCH_HAS_HCD=y
+CONFIG_USB_ARCH_HAS_OHCI=y
+# CONFIG_USB_ARCH_HAS_EHCI is not set
+CONFIG_USB=y
+# CONFIG_USB_DEBUG is not set
+
+#
+# Miscellaneous USB options
+#
+CONFIG_USB_DEVICEFS=y
+# CONFIG_USB_BANDWIDTH is not set
+# CONFIG_USB_DYNAMIC_MINORS is not set
+# CONFIG_USB_SUSPEND is not set
+# CONFIG_USB_OTG is not set
+
+#
+# USB Host Controller Drivers
+#
+# CONFIG_USB_ISP116X_HCD is not set
+CONFIG_USB_OHCI_HCD=y
+# CONFIG_USB_OHCI_BIG_ENDIAN is not set
+CONFIG_USB_OHCI_LITTLE_ENDIAN=y
+# CONFIG_USB_SL811_HCD is not set
+
+#
+# USB Device Class drivers
+#
+# CONFIG_USB_ACM is not set
+# CONFIG_USB_PRINTER is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# may also be needed; see USB_STORAGE Help for more information
+#
+CONFIG_USB_STORAGE=y
+# CONFIG_USB_STORAGE_DEBUG is not set
+# CONFIG_USB_STORAGE_DATAFAB is not set
+# CONFIG_USB_STORAGE_FREECOM is not set
+# CONFIG_USB_STORAGE_ISD200 is not set
+# CONFIG_USB_STORAGE_DPCM is not set
+# CONFIG_USB_STORAGE_USBAT is not set
+# CONFIG_USB_STORAGE_SDDR09 is not set
+# CONFIG_USB_STORAGE_SDDR55 is not set
+# CONFIG_USB_STORAGE_JUMPSHOT is not set
+# CONFIG_USB_STORAGE_ALAUDA is not set
+# CONFIG_USB_STORAGE_KARMA is not set
+# CONFIG_USB_LIBUSUAL is not set
+
+#
+# USB Input Devices
+#
+# CONFIG_USB_HID is not set
+
+#
+# USB HID Boot Protocol drivers
+#
+# CONFIG_USB_KBD is not set
+# CONFIG_USB_MOUSE is not set
+# CONFIG_USB_AIPTEK is not set
+# CONFIG_USB_WACOM is not set
+# CONFIG_USB_ACECAD is not set
+# CONFIG_USB_KBTAB is not set
+# CONFIG_USB_POWERMATE is not set
+# CONFIG_USB_TOUCHSCREEN is not set
+# CONFIG_USB_YEALINK is not set
+# CONFIG_USB_XPAD is not set
+# CONFIG_USB_ATI_REMOTE is not set
+# CONFIG_USB_ATI_REMOTE2 is not set
+# CONFIG_USB_KEYSPAN_REMOTE is not set
+# CONFIG_USB_APPLETOUCH is not set
+
+#
+# USB Imaging devices
+#
+# CONFIG_USB_MDC800 is not set
+# CONFIG_USB_MICROTEK is not set
+
+#
+# USB Network Adapters
+#
+# CONFIG_USB_CATC is not set
+# CONFIG_USB_KAWETH is not set
+# CONFIG_USB_PEGASUS is not set
+# CONFIG_USB_RTL8150 is not set
+# CONFIG_USB_USBNET_MII is not set
+# CONFIG_USB_USBNET is not set
+CONFIG_USB_MON=y
+
+#
+# USB port drivers
+#
+# CONFIG_USB_USS720 is not set
+
+#
+# USB Serial Converter support
+#
+# CONFIG_USB_SERIAL is not set
+
+#
+# USB Miscellaneous drivers
+#
+# CONFIG_USB_EMI62 is not set
+# CONFIG_USB_EMI26 is not set
+# CONFIG_USB_ADUTUX is not set
+# CONFIG_USB_AUERSWALD is not set
+# CONFIG_USB_RIO500 is not set
+# CONFIG_USB_LEGOTOWER is not set
+# CONFIG_USB_LCD is not set
+# CONFIG_USB_LED is not set
+# CONFIG_USB_CYPRESS_CY7C63 is not set
+# CONFIG_USB_CYTHERM is not set
+# CONFIG_USB_PHIDGET is not set
+# CONFIG_USB_IDMOUSE is not set
+# CONFIG_USB_FTDI_ELAN is not set
+# CONFIG_USB_APPLEDISPLAY is not set
+# CONFIG_USB_LD is not set
+# CONFIG_USB_TRANCEVIBRATOR is not set
+# CONFIG_USB_TEST is not set
+
+#
+# USB DSL modem support
+#
+
+#
+# USB Gadget Support
+#
+# CONFIG_USB_GADGET is not set
+
+#
+# MMC/SD Card support
+#
+CONFIG_MMC=m
+# CONFIG_MMC_DEBUG is not set
+CONFIG_MMC_BLOCK=m
+# CONFIG_MMC_S3C2410 is not set
+# CONFIG_MMC_TIFM_SD is not set
+
+#
+# Real Time Clock
+#
+CONFIG_RTC_LIB=y
+CONFIG_RTC_CLASS=y
+CONFIG_RTC_HCTOSYS=y
+CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
+# CONFIG_RTC_DEBUG is not set
+
+#
+# RTC interfaces
+#
+CONFIG_RTC_INTF_SYSFS=y
+CONFIG_RTC_INTF_PROC=y
+CONFIG_RTC_INTF_DEV=y
+# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
+
+#
+# RTC drivers
+#
+# CONFIG_RTC_DRV_X1205 is not set
+# CONFIG_RTC_DRV_DS1307 is not set
+# CONFIG_RTC_DRV_DS1553 is not set
+# CONFIG_RTC_DRV_ISL1208 is not set
+# CONFIG_RTC_DRV_DS1672 is not set
+# CONFIG_RTC_DRV_DS1742 is not set
+# CONFIG_RTC_DRV_PCF8563 is not set
+# CONFIG_RTC_DRV_PCF8583 is not set
+# CONFIG_RTC_DRV_RS5C348 is not set
+# CONFIG_RTC_DRV_RS5C372 is not set
+CONFIG_RTC_DRV_S3C=y
+# CONFIG_RTC_DRV_M48T86 is not set
+# CONFIG_RTC_DRV_TEST is not set
+# CONFIG_RTC_DRV_MAX6902 is not set
+# CONFIG_RTC_DRV_V3020 is not set
+
+#
+# File systems
+#
+CONFIG_EXT2_FS=y
+# CONFIG_EXT2_FS_XATTR is not set
+# CONFIG_EXT2_FS_XIP is not set
+CONFIG_EXT3_FS=y
+CONFIG_EXT3_FS_XATTR=y
+# CONFIG_EXT3_FS_POSIX_ACL is not set
+# CONFIG_EXT3_FS_SECURITY is not set
+# CONFIG_EXT4DEV_FS is not set
+CONFIG_JBD=y
+# CONFIG_JBD_DEBUG is not set
+CONFIG_FS_MBCACHE=y
+# CONFIG_REISERFS_FS is not set
+# CONFIG_JFS_FS is not set
+# CONFIG_FS_POSIX_ACL is not set
+# CONFIG_XFS_FS is not set
+# CONFIG_GFS2_FS is not set
+# CONFIG_OCFS2_FS is not set
+# CONFIG_MINIX_FS is not set
+CONFIG_ROMFS_FS=y
+CONFIG_INOTIFY=y
+CONFIG_INOTIFY_USER=y
+# CONFIG_QUOTA is not set
+CONFIG_DNOTIFY=y
+# CONFIG_AUTOFS_FS is not set
+# CONFIG_AUTOFS4_FS is not set
+# CONFIG_FUSE_FS is not set
+
+#
+# CD-ROM/DVD Filesystems
+#
+# CONFIG_ISO9660_FS is not set
+# CONFIG_UDF_FS is not set
+
+#
+# DOS/FAT/NT Filesystems
+#
+CONFIG_FAT_FS=y
+CONFIG_MSDOS_FS=y
+CONFIG_VFAT_FS=y
+CONFIG_FAT_DEFAULT_CODEPAGE=437
+CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
+# CONFIG_NTFS_FS is not set
+
+#
+# Pseudo filesystems
+#
+CONFIG_PROC_FS=y
+CONFIG_PROC_SYSCTL=y
+CONFIG_SYSFS=y
+CONFIG_TMPFS=y
+# CONFIG_TMPFS_POSIX_ACL is not set
+# CONFIG_HUGETLB_PAGE is not set
+CONFIG_RAMFS=y
+# CONFIG_CONFIGFS_FS is not set
+
+#
+# Miscellaneous filesystems
+#
+# CONFIG_ADFS_FS is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
+# CONFIG_BEFS_FS is not set
+# CONFIG_BFS_FS is not set
+# CONFIG_EFS_FS is not set
+CONFIG_JFFS_FS=y
+CONFIG_JFFS_FS_VERBOSE=0
+# CONFIG_JFFS_PROC_FS is not set
+CONFIG_JFFS2_FS=y
+CONFIG_JFFS2_FS_DEBUG=0
+CONFIG_JFFS2_FS_WRITEBUFFER=y
+# CONFIG_JFFS2_SUMMARY is not set
+# CONFIG_JFFS2_FS_XATTR is not set
+CONFIG_JFFS2_COMPRESSION_OPTIONS=y
+# CONFIG_JFFS2_ZLIB is not set
+# CONFIG_JFFS2_RTIME is not set
+# CONFIG_JFFS2_RUBIN is not set
+# CONFIG_JFFS2_CMODE_NONE is not set
+CONFIG_JFFS2_CMODE_PRIORITY=y
+# CONFIG_JFFS2_CMODE_SIZE is not set
+CONFIG_CRAMFS=y
+# CONFIG_VXFS_FS is not set
+# CONFIG_HPFS_FS is not set
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_SYSV_FS is not set
+# CONFIG_UFS_FS is not set
+
+#
+# Network File Systems
+#
+CONFIG_NFS_FS=y
+# CONFIG_NFS_V3 is not set
+# CONFIG_NFS_V4 is not set
+# CONFIG_NFS_DIRECTIO is not set
+# CONFIG_NFSD is not set
+CONFIG_ROOT_NFS=y
+CONFIG_LOCKD=y
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=y
+# CONFIG_RPCSEC_GSS_KRB5 is not set
+# CONFIG_RPCSEC_GSS_SPKM3 is not set
+# CONFIG_SMB_FS is not set
+# CONFIG_CIFS is not set
+# CONFIG_NCP_FS is not set
+# CONFIG_CODA_FS is not set
+# CONFIG_AFS_FS is not set
+# CONFIG_9P_FS is not set
+
+#
+# Partition Types
+#
+CONFIG_PARTITION_ADVANCED=y
+# CONFIG_ACORN_PARTITION is not set
+# CONFIG_OSF_PARTITION is not set
+# CONFIG_AMIGA_PARTITION is not set
+# CONFIG_ATARI_PARTITION is not set
+# CONFIG_MAC_PARTITION is not set
+CONFIG_MSDOS_PARTITION=y
+CONFIG_BSD_DISKLABEL=y
+# CONFIG_MINIX_SUBPARTITION is not set
+CONFIG_SOLARIS_X86_PARTITION=y
+# CONFIG_UNIXWARE_DISKLABEL is not set
+# CONFIG_LDM_PARTITION is not set
+# CONFIG_SGI_PARTITION is not set
+# CONFIG_ULTRIX_PARTITION is not set
+# CONFIG_SUN_PARTITION is not set
+# CONFIG_KARMA_PARTITION is not set
+# CONFIG_EFI_PARTITION is not set
+
+#
+# Native Language Support
+#
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="iso8859-1"
+CONFIG_NLS_CODEPAGE_437=y
+# CONFIG_NLS_CODEPAGE_737 is not set
+# CONFIG_NLS_CODEPAGE_775 is not set
+CONFIG_NLS_CODEPAGE_850=y
+CONFIG_NLS_CODEPAGE_852=y
+# CONFIG_NLS_CODEPAGE_855 is not set
+# CONFIG_NLS_CODEPAGE_857 is not set
+# CONFIG_NLS_CODEPAGE_860 is not set
+# CONFIG_NLS_CODEPAGE_861 is not set
+# CONFIG_NLS_CODEPAGE_862 is not set
+# CONFIG_NLS_CODEPAGE_863 is not set
+# CONFIG_NLS_CODEPAGE_864 is not set
+# CONFIG_NLS_CODEPAGE_865 is not set
+# CONFIG_NLS_CODEPAGE_866 is not set
+# CONFIG_NLS_CODEPAGE_869 is not set
+# CONFIG_NLS_CODEPAGE_936 is not set
+# CONFIG_NLS_CODEPAGE_950 is not set
+# CONFIG_NLS_CODEPAGE_932 is not set
+# CONFIG_NLS_CODEPAGE_949 is not set
+# CONFIG_NLS_CODEPAGE_874 is not set
+# CONFIG_NLS_ISO8859_8 is not set
+# CONFIG_NLS_CODEPAGE_1250 is not set
+# CONFIG_NLS_CODEPAGE_1251 is not set
+# CONFIG_NLS_ASCII is not set
+CONFIG_NLS_ISO8859_1=y
+# CONFIG_NLS_ISO8859_2 is not set
+# CONFIG_NLS_ISO8859_3 is not set
+# CONFIG_NLS_ISO8859_4 is not set
+# CONFIG_NLS_ISO8859_5 is not set
+# CONFIG_NLS_ISO8859_6 is not set
+# CONFIG_NLS_ISO8859_7 is not set
+# CONFIG_NLS_ISO8859_9 is not set
+# CONFIG_NLS_ISO8859_13 is not set
+# CONFIG_NLS_ISO8859_14 is not set
+# CONFIG_NLS_ISO8859_15 is not set
+# CONFIG_NLS_KOI8_R is not set
+# CONFIG_NLS_KOI8_U is not set
+# CONFIG_NLS_UTF8 is not set
+
+#
+# Profiling support
+#
+# CONFIG_PROFILING is not set
+
+#
+# Kernel hacking
+#
+# CONFIG_PRINTK_TIME is not set
+CONFIG_ENABLE_MUST_CHECK=y
+CONFIG_MAGIC_SYSRQ=y
+# CONFIG_UNUSED_SYMBOLS is not set
+CONFIG_DEBUG_KERNEL=y
+CONFIG_LOG_BUF_SHIFT=16
+CONFIG_DETECT_SOFTLOCKUP=y
+# CONFIG_SCHEDSTATS is not set
+# CONFIG_DEBUG_SLAB is not set
+# CONFIG_DEBUG_RT_MUTEXES is not set
+# CONFIG_RT_MUTEX_TESTER is not set
+CONFIG_DEBUG_SPINLOCK=y
+CONFIG_DEBUG_MUTEXES=y
+# CONFIG_DEBUG_RWSEMS is not set
+CONFIG_DEBUG_SPINLOCK_SLEEP=y
+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
+# CONFIG_DEBUG_KOBJECT is not set
+CONFIG_DEBUG_BUGVERBOSE=y
+CONFIG_DEBUG_INFO=y
+# CONFIG_DEBUG_FS is not set
+# CONFIG_DEBUG_VM is not set
+# CONFIG_DEBUG_LIST is not set
+CONFIG_FRAME_POINTER=y
+CONFIG_FORCED_INLINING=y
+# CONFIG_HEADERS_CHECK is not set
+# CONFIG_RCU_TORTURE_TEST is not set
+CONFIG_DEBUG_USER=y
+CONFIG_DEBUG_WAITQ=y
+CONFIG_DEBUG_ERRORS=y
+CONFIG_DEBUG_LL=y
+# CONFIG_DEBUG_ICEDCC is not set
+CONFIG_DEBUG_S3C2410_PORT=y
+CONFIG_DEBUG_S3C2410_UART=0
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+CONFIG_CRYPTO=y
+CONFIG_CRYPTO_ALGAPI=y
+CONFIG_CRYPTO_BLKCIPHER=y
+CONFIG_CRYPTO_HASH=y
+CONFIG_CRYPTO_MANAGER=y
+CONFIG_CRYPTO_HMAC=y
+# CONFIG_CRYPTO_NULL is not set
+# CONFIG_CRYPTO_MD4 is not set
+CONFIG_CRYPTO_MD5=y
+CONFIG_CRYPTO_SHA1=y
+# CONFIG_CRYPTO_SHA256 is not set
+# CONFIG_CRYPTO_SHA512 is not set
+# CONFIG_CRYPTO_WP512 is not set
+# CONFIG_CRYPTO_TGR192 is not set
+CONFIG_CRYPTO_ECB=y
+CONFIG_CRYPTO_CBC=m
+CONFIG_CRYPTO_DES=y
+# CONFIG_CRYPTO_BLOWFISH is not set
+# CONFIG_CRYPTO_TWOFISH is not set
+# CONFIG_CRYPTO_SERPENT is not set
+CONFIG_CRYPTO_AES=y
+# CONFIG_CRYPTO_CAST5 is not set
+# CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_TEA is not set
+CONFIG_CRYPTO_ARC4=y
+# CONFIG_CRYPTO_KHAZAD is not set
+# CONFIG_CRYPTO_ANUBIS is not set
+CONFIG_CRYPTO_DEFLATE=y
+# CONFIG_CRYPTO_MICHAEL_MIC is not set
+# CONFIG_CRYPTO_CRC32C is not set
+# CONFIG_CRYPTO_TEST is not set
+
+#
+# Hardware crypto devices
+#
+
+#
+# Library routines
+#
+CONFIG_CRC_CCITT=y
+# CONFIG_CRC16 is not set
+CONFIG_CRC32=y
+# CONFIG_LIBCRC32C is not set
+CONFIG_ZLIB_INFLATE=y
+CONFIG_ZLIB_DEFLATE=y
+CONFIG_PLIST=y
diff -urNp linux-2.6.20/arch/arm/common/sbcd/Kconfig linux-2.6.20-s1t/arch/arm/common/sbcd/Kconfig
--- linux-2.6.20/arch/arm/common/sbcd/Kconfig	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/arch/arm/common/sbcd/Kconfig	2007-02-07 16:29:01.000000000 +0000
@@ -0,0 +1,8 @@
+
+config SBCD
+	bool
+
+config SBCD_IM2440D20
+	bool
+
+
diff -urNp linux-2.6.20/arch/arm/common/sbcd/Makefile linux-2.6.20-s1t/arch/arm/common/sbcd/Makefile
--- linux-2.6.20/arch/arm/common/sbcd/Makefile	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/arch/arm/common/sbcd/Makefile	2007-02-07 16:29:01.000000000 +0000
@@ -0,0 +1,16 @@
+# linux/sbcd/Makefile
+#
+# Copyright 2005 Simtec Electronics
+#
+# $Id: Makefile,v 1.4 2005/09/22 16:45:22 ben Exp $
+
+obj-y				 = sbcd.o sbcd-tag.o sbcd-gpio.o
+
+# subdirs
+
+obj-y				 += devices/
+obj-y				 += utils/
+
+# cpu specific support
+
+obj-$(CONFIG_ARCH_S3C2410)	+= s3c24xx/
\ No newline at end of file
diff -urNp linux-2.6.20/arch/arm/common/sbcd/devices/Makefile linux-2.6.20-s1t/arch/arm/common/sbcd/devices/Makefile
--- linux-2.6.20/arch/arm/common/sbcd/devices/Makefile	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/arch/arm/common/sbcd/devices/Makefile	2007-02-07 16:29:01.000000000 +0000
@@ -0,0 +1,22 @@
+# linux/sbcd/devices/Makefile
+#
+# Copyright 2005 Simtec Electronics
+#
+# $Id: Makefile,v 1.10 2006/05/16 10:26:27 ben Exp $
+
+obj-y			 = platform.o
+obj-y			+= spi.o
+obj-y			+= gpio.o
+obj-y			+= gpio-reg8.o
+obj-y			+= ax88796.o
+obj-y			+= ax88796-pp.o
+obj-y			+= dm9000.o
+obj-y			+= sm501.o
+obj-y			+= sram.o
+obj-y			+= uart16550.o
+obj-y			+= dbg-platdev.o
+obj-y			+= simtec-ide.o
+obj-y			+= simtec-i2c.o
+obj-y			+= simtec-lcd.o
+obj-y			+= simtec-gpio-p4.o
+obj-y			+= vr2k-spi-cs.o
diff -urNp linux-2.6.20/arch/arm/common/sbcd/devices/ax88796-pp.c linux-2.6.20-s1t/arch/arm/common/sbcd/devices/ax88796-pp.c
--- linux-2.6.20/arch/arm/common/sbcd/devices/ax88796-pp.c	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/arch/arm/common/sbcd/devices/ax88796-pp.c	2007-02-07 16:29:01.000000000 +0000
@@ -0,0 +1,42 @@
+/* sbcd/kernel/linux/sbcd/devices/ax88796-pp.c
+ *
+ * Copyright 2005 Simtec Electronics
+ *
+ * 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.
+ *
+ * SBCD device support for AX88796 parallel port
+*/
+
+#include <linux/kernel.h>
+#include <linux/ioport.h>
+#include <linux/device.h>
+
+#include <asm/mach/sbcd.h>
+#include <asm/mach/sbcd-info.h>
+#include <asm/mach/sbcd-types.h>
+#include <asm/mach/sbcd-utils.h>
+#include <asm/mach/sbcd-os.h>
+
+
+#include "platform.h"
+
+static __init int ax88796pp_sbcd_attach(struct sbcd_state *state,
+				      struct sbcd_item *parent,
+				      struct sbcd_item *drv_it)
+{
+	struct platform_device *pdev;
+	int ret;
+
+	ret = sbcd_dev_platform_create(state, parent, drv_it, &pdev);
+
+	if (ret >= 0) {
+		sbcd_add_platform_device(state, pdev);
+	}
+
+	return ret;
+}
+
+sbcd_drv_decl2(ax88796pp, "ax88796-pp", ax88796pp_sbcd_attach);
+
diff -urNp linux-2.6.20/arch/arm/common/sbcd/devices/ax88796.c linux-2.6.20-s1t/arch/arm/common/sbcd/devices/ax88796.c
--- linux-2.6.20/arch/arm/common/sbcd/devices/ax88796.c	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/arch/arm/common/sbcd/devices/ax88796.c	2007-02-07 16:29:01.000000000 +0000
@@ -0,0 +1,148 @@
+/* sbcd/kernel/linux/sbcd/devices/ax88796.c
+ *
+ * Copyright 2005 Simtec Electronics
+ *
+ * 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.
+ *
+ * SBCD device support for AX88796 network controller
+*/
+
+#include <linux/kernel.h>
+#include <linux/ioport.h>
+#include <linux/device.h>
+
+#include <asm/mach/sbcd.h>
+#include <asm/mach/sbcd-info.h>
+#include <asm/mach/sbcd-types.h>
+#include <asm/mach/sbcd-utils.h>
+#include <asm/mach/sbcd-os.h>
+
+#include <net/ax88796-plat.h>
+
+#include "platform.h"
+
+static __init int ax88796_sbcd_process_info(struct sbcd_state *state,
+					    struct sbcd_item *ptr,
+					    struct platform_device *pdev)
+{
+	struct ax_plat_data *pd = pdev->dev.platform_data;
+	char *optname, *optval;
+	int rcr = -1;
+	int dcr = -1;
+	int width = -1;
+	int flag_set = 0;
+	int flag_clr = 0;
+
+	sbcd_get_optvals(ptr, &optname, &optval);
+
+	if (0) {
+		printk(KERN_INFO "considering %s = %s\n",
+		       optname, optval);
+	}
+
+	if (strcmp(optname, "rcr") == 0) {
+		rcr = simple_strtoul(optval, NULL, 0);
+	} else if (strcmp(optname, "dcr") == 0) {
+		dcr = simple_strtoul(optval, NULL, 0);
+	} else if (strcmp(optname, "width") == 0) {
+		width = simple_strtoul(optval, NULL, 0);
+	} else if (strcmp(optname, "mac-addr") == 0) {
+		if (strcmp(optval, "regs") == 0 ||
+		    strcmp(optval, "dev") == 0) {
+			flag_set = AXFLG_MAC_FROMDEV;
+		} else {
+			printk(KERN_ERR "unknown value: %s = %s\n",
+			       optname, optval);
+			return 0;
+		}
+	} else if (strcmp(optname, "eeprom") == 0) {
+		// TODO
+	} else {
+		printk(KERN_INFO "unknown option: %s = %s\n",
+		       optname, optval);
+		return 0;
+	}
+
+	if (!pd) {
+		pd = kzalloc(sizeof(struct ax_plat_data), GFP_KERNEL);
+		pdev->dev.platform_data = pd;
+	}
+
+	if (pd == NULL) {
+		printk(KERN_ERR "no memory for `struct ax_plat_data`\n");
+		return -ENOMEM;
+	}
+
+	if (rcr >= 0)
+		pd->rcr_val = rcr;
+
+	if (dcr >= 0)
+		pd->dcr_val = dcr;
+
+	if (width >= 0)
+		pd->wordlength = width;
+
+	pd->flags |= flag_set;
+	pd->flags &= ~flag_clr;
+
+	printk(KERN_DEBUG "pd[%p]: flg %08x rcr 0x%02x dcr 0x%02x wl %d, %p\n",
+	       pd, pd->flags, pd->rcr_val, pd->dcr_val, pd->wordlength,
+	       pd->reg_offsets);
+
+	return 0;
+}
+
+
+static __init int ax88796_sbcd_check_platdata(struct sbcd_state *state,
+					      struct platform_device *pdev,
+					      struct sbcd_item *it)
+{
+	struct sbcd_item *ptr;
+	int level;
+	int err = 0;
+
+	if (0) {
+		printk(KERN_INFO "%s: state %p, pdev %p, it %p\n",
+		       __FUNCTION__, state, pdev, it);
+	}
+
+	sbcd_items_forallsub(it, ptr, level) {
+		/* is an option ? */
+		if (0) {
+			printk("%s: considering %p (%d, %02x)\n",
+			       __FUNCTION__, ptr, ptr->hdr.type,
+			       ptr->hdr.length);
+		}
+
+		if (ptr->hdr.type == SBCD_TYPE_INFO) {			
+			err = ax88796_sbcd_process_info(state, ptr, pdev);
+		}
+
+		if (err)
+			return err;
+	}
+
+	return 0;
+}
+
+static __init int ax88796_sbcd_attach(struct sbcd_state *state,
+				      struct sbcd_item *parent,
+				      struct sbcd_item *drv_it)
+{
+	struct platform_device *pdev;
+	int ret;
+
+	ret = sbcd_dev_platform_create(state, parent, drv_it, &pdev);
+
+	if (ret >= 0) {
+		ax88796_sbcd_check_platdata(state, pdev, parent);
+		sbcd_add_platform_device(state, pdev);
+	}
+
+	return ret;
+}
+
+sbcd_drv_decl(ax88796, ax88796_sbcd_attach);
+
diff -urNp linux-2.6.20/arch/arm/common/sbcd/devices/dbg-platdev.c linux-2.6.20-s1t/arch/arm/common/sbcd/devices/dbg-platdev.c
--- linux-2.6.20/arch/arm/common/sbcd/devices/dbg-platdev.c	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/arch/arm/common/sbcd/devices/dbg-platdev.c	2007-02-07 16:29:01.000000000 +0000
@@ -0,0 +1,53 @@
+/* kernel/linux/sbcd/dbg-platdev.c
+ *
+ * Copyright 2005 Simtec Electronics
+ *
+ * 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.
+ *
+ * SBCD debug for platform devices
+*/
+
+#include <linux/kernel.h>
+#include <linux/ioport.h>
+#include <linux/device.h>
+
+#include <asm/mach/sbcd.h>
+#include <asm/mach/sbcd-info.h>
+#include <asm/mach/sbcd-types.h>
+#include <asm/mach/sbcd-os.h>
+
+#include "debug.h"
+
+void __init dbg_show_platdev(struct platform_device *pdev, char *pfx)
+{
+	struct resource *rptr;
+	int idx;
+
+	printk(KERN_DEBUG "pdev[%p] %s: name %s, resources %d @ %p, data %p\n",
+	       pdev, pfx, pdev->name, pdev->num_resources, pdev->resource,
+	       pdev->dev.platform_data);
+
+	rptr =  pdev->resource;
+
+	for (idx = pdev->num_resources; idx > 0; idx--, rptr++) {
+		printk(KERN_DEBUG "pdev[%p] %s: r%d: ",
+		       pdev, pfx,  pdev->num_resources - idx);
+		
+		if (rptr->flags & IORESOURCE_IRQ)
+			printk("irq: ");
+		else if (rptr->flags & IORESOURCE_IO)
+			printk(" io: ");
+		else if (rptr->flags & IORESOURCE_MEM)
+			printk("mem: ");
+		else if (rptr->flags & IORESOURCE_DMA)
+			printk("dma: ");
+		else
+			printk("   : ");
+
+		printk("0x%08zx -> %08zx, flags %08lx\n",
+		       rptr->start, rptr->end, rptr->flags);
+	}
+
+}
diff -urNp linux-2.6.20/arch/arm/common/sbcd/devices/debug.h linux-2.6.20-s1t/arch/arm/common/sbcd/devices/debug.h
--- linux-2.6.20/arch/arm/common/sbcd/devices/debug.h	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/arch/arm/common/sbcd/devices/debug.h	2007-02-07 16:29:01.000000000 +0000
@@ -0,0 +1,12 @@
+/* sbcd/kernel/linux/sbcd/devices/debug.h
+ *
+ * Copyright 2005 Simtec Electronics
+ *
+ * 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.
+ *
+ * SBCD debugging header
+*/
+
+extern void dbg_show_platdev(struct platform_device *, char *pfx);
diff -urNp linux-2.6.20/arch/arm/common/sbcd/devices/dm9000.c linux-2.6.20-s1t/arch/arm/common/sbcd/devices/dm9000.c
--- linux-2.6.20/arch/arm/common/sbcd/devices/dm9000.c	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/arch/arm/common/sbcd/devices/dm9000.c	2007-02-07 16:29:01.000000000 +0000
@@ -0,0 +1,44 @@
+/* sbcd/kernel/linux/sbcd/devices/dm9000.c
+ *
+ * Copyright 2005 Simtec Electronics
+ *
+ * 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.
+ *
+ * SBCD device support for Davicom DM9000 network controller
+*/
+
+#include <linux/kernel.h>
+#include <linux/ioport.h>
+#include <linux/device.h>
+
+#include <asm/mach/sbcd.h>
+#include <asm/mach/sbcd-info.h>
+#include <asm/mach/sbcd-types.h>
+#include <asm/mach/sbcd-utils.h>
+#include <asm/mach/sbcd-os.h>
+
+#include "platform.h"
+
+static __init int dm9000_drv_attach(struct sbcd_state *state,
+				    struct sbcd_item *parent,
+				    struct sbcd_item *drv_it)
+{
+	struct platform_device *pdev;
+	int ret;
+
+	ret = sbcd_dev_platform_create(state, parent,
+				       drv_it, &pdev);
+
+	if (ret >= 0) {
+		/* todo - check for platform data */
+
+		sbcd_add_platform_device(state, pdev);
+	}
+
+	return ret;
+}
+
+sbcd_drv_decl(dm9000, dm9000_drv_attach);
+
diff -urNp linux-2.6.20/arch/arm/common/sbcd/devices/example.c linux-2.6.20-s1t/arch/arm/common/sbcd/devices/example.c
--- linux-2.6.20/arch/arm/common/sbcd/devices/example.c	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/arch/arm/common/sbcd/devices/example.c	2007-02-07 16:29:01.000000000 +0000
@@ -0,0 +1,43 @@
+/* sbcd/kernel/linux/sbcd/devices/ax88796.c
+ *
+ * Copyright 2005 Simtec Electronics
+ *
+ * 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.
+ *
+ * SBCD device support for an example device
+*/
+
+#include <linux/kernel.h>
+#include <linux/ioport.h>
+#include <linux/device.h>
+
+#include <asm/mach/sbcd.h>
+#include <asm/mach/sbcd-info.h>
+#include <asm/mach/sbcd-types.h>
+#include <asm/mach/sbcd-utils.h>
+#include <asm/mach/sbcd-os.h>
+
+static int ax88796_drv_attach(struct sbcd_state *state,
+			      struct sbcd_item *parent,
+			      struct sbcd_item *drv_it)
+{
+	struct platform_device *pdev;
+	int ret;
+
+	printk("%s: (%p, %p, %p)\n", __FUNCTION__, state, parent, drv_it);
+
+	ret = sbcd_dev_platform_create(state, parent, drv_it, &pdev);
+
+	if (ret >= 0) {
+		/* todo - check for platform data */
+
+		sbcd_add_platform_device(state, pdev);
+	}
+
+	return ret;
+}
+
+sbcd_drv_decl(ax88796, ax88796_drv_attach);
+
diff -urNp linux-2.6.20/arch/arm/common/sbcd/devices/gpio-reg8.c linux-2.6.20-s1t/arch/arm/common/sbcd/devices/gpio-reg8.c
--- linux-2.6.20/arch/arm/common/sbcd/devices/gpio-reg8.c	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/arch/arm/common/sbcd/devices/gpio-reg8.c	2007-02-07 16:29:01.000000000 +0000
@@ -0,0 +1,152 @@
+/* sbcd/kernel/linux/sbcd/devices/gpio-reg8.c
+ *
+ * Copyright 2007 Simtec Electronics
+ *
+ * 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.
+ *
+ * Convert a device to a generic platform device
+*/
+
+#include <linux/kernel.h>
+#include <linux/device.h>
+#include <asm/io.h>
+
+#include <asm/mach/sbcd.h>
+#include <asm/mach/sbcd-info.h>
+#include <asm/mach/sbcd-types.h>
+#include <asm/mach/sbcd-utils.h>
+#include <asm/mach/sbcd-os.h>
+#include <asm/mach/sbcd-gpio.h>
+
+#include "debug.h"
+#include "platform.h"
+
+struct drv_state {
+	struct sbcd_gpio_drv	 drv;
+	spinlock_t		 lock;
+	void __iomem		*reg;
+};
+
+static inline struct drv_state *to_drv_state(struct sbcd_gpiodrv_data *d)
+{
+	return container_of(d->drv, struct drv_state, drv);
+}
+
+static int sbcd_gpio_reg8_gpio_read(struct sbcd_gpiodrv_data *data)
+{
+	return 0;
+}
+
+static int sbcd_gpio_reg8_gpio_write(struct sbcd_gpiodrv_data *data,
+				     int to)
+{
+	struct drv_state *state = to_drv_state(data);
+	unsigned long save;
+	unsigned int val;
+
+	if ((to & SBCD_GPIODRV_OUTPUT) == 0) {
+		printk(KERN_ERR "pin must be set to output\n");
+		return -EINVAL;
+	}
+
+	spin_lock_irqsave(&state->lock, save);
+	val = readb(state->reg);
+	
+	if (to & SBCD_GPIODRV_VALUE(1))
+		val |= 1 << data->val;
+	else
+		val &= ~(1 << data->val);
+
+	writeb(val, state->reg);
+	spin_unlock_irqrestore(&state->lock, save);
+
+	return 0;
+}
+
+static __init int sbcd_gpio_reg8_init(struct drv_state *state,
+				      struct sbcd_state *sbcd,
+				      struct sbcd_item *parent,
+				      struct sbcd_item *drv_it)
+{
+	struct sbcd_stack_item *sp = sbcd_stack_cur(sbcd);
+	struct sbcd_item *it;
+	struct sbcd_area *area;
+	struct sbcd_pinrange *pr;
+	resource_size_t start;
+	int level = 0;
+	int err;
+
+	printk(KERN_INFO "%s: stack %p\n", __func__, sp);
+
+	if (sp->dev == NULL) {
+		printk(KERN_ERR "parent item is not a device?\n");
+		return 1;
+	}
+	
+	for (it = sbcd_item_next(drv_it);
+	     level > 0 || (level == 0 && !sbcd_item_isend(it));
+	     it = sbcd_item_next(it)) {
+
+		if (1) {
+			printk("%s: checking %p (%02x) level %d\n",
+			       __FUNCTION__, it, it->hdr.type, level);
+		}
+
+		switch (it->hdr.type) {
+		case SBCD_TYPE_END:
+			level--;
+			break;
+
+		case SBCD_TYPE_AREA:
+			area = &it->u.area;
+			err = sbcd_map_address(sbcd, area,
+					       &start, area->start);
+			if (err)
+				return err;
+
+			state->reg = ioremap(start, 1);
+			break;
+
+		case SBCD_TYPE_PINRANGE:
+			pr = &it->u.pinrange;
+
+			printk(KERN_DEBUG "%s: attaching range %d..%d\n",
+			       __func__, pr->from.pin, pr->to.pin);
+
+			sbcd_gpio_register_dynamic(sp->dev, &state->drv,
+						   pr->from.pin, pr->to.pin);
+
+			break;
+		}
+
+		if (it->hdr.flags & SBCD_FLG_SUB)
+			level++;
+	}	
+
+	return 0;
+}
+
+
+static __init int sbcd_gpio_reg8_attach(struct sbcd_state *sbcd,
+					struct sbcd_item *parent,
+					struct sbcd_item *drv_it)
+{
+	struct drv_state *state;
+
+	state = kzalloc(sizeof(struct drv_state), GFP_KERNEL);
+	if (state == NULL) {
+		printk(KERN_ERR "no memory for new driver state\n");
+		return -ENOMEM;
+	}
+
+	spin_lock_init(&state->lock);
+
+	state->drv.gpio_read = sbcd_gpio_reg8_gpio_read;
+	state->drv.gpio_write = sbcd_gpio_reg8_gpio_write;
+
+	return sbcd_gpio_reg8_init(state, sbcd, parent, drv_it);
+}
+
+sbcd_drv_decl2(gpio_reg8, "gpio-reg8", sbcd_gpio_reg8_attach);
diff -urNp linux-2.6.20/arch/arm/common/sbcd/devices/gpio.c linux-2.6.20-s1t/arch/arm/common/sbcd/devices/gpio.c
--- linux-2.6.20/arch/arm/common/sbcd/devices/gpio.c	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/arch/arm/common/sbcd/devices/gpio.c	2007-02-07 16:29:01.000000000 +0000
@@ -0,0 +1,178 @@
+/* sbcd/kernel/linux/sbcd/devices/gpio.c
+ *
+ * Copyright 2007 Simtec Electronics
+ *
+ * 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.
+ *
+ * GPIO driver
+*/
+
+#include <linux/kernel.h>
+#include <linux/device.h>
+#include <linux/string.h>
+
+#include <asm/mach/sbcd.h>
+#include <asm/mach/sbcd-info.h>
+#include <asm/mach/sbcd-types.h>
+#include <asm/mach/sbcd-utils.h>
+#include <asm/mach/sbcd-os.h>
+#include <asm/mach/sbcd-gpio.h>
+
+#include "debug.h"
+#include "platform.h"
+
+static int sbcd_gpio_find_driver(struct sbcd_state *state,
+				 struct sbcd_gpiodrv_data *dd,
+				 struct sbcd_pininfo *pi)
+{
+	struct sbcd_dyn_gpio *dyn;
+	struct sbcd_info_dev *dev;
+	struct sbcd_info_pin *pin;
+	int ret;
+
+	dev = sbcd_info_finddev(state, pi->pin.chip);
+	if (!dev) {
+		printk(KERN_ERR "Failed to find device\n");
+		return -ENOENT;
+	}
+
+	if (dev->decl == NULL) {
+		printk(KERN_ERR "device has no decleration?\n");
+		return -EINVAL;
+	}
+
+	dd->dev = dev->decl;
+
+	dyn = sbcd_gpio_getdynamic(dev, pi->pin.pin);
+	if (dyn != NULL) {
+		printk(KERN_INFO "%s: found dynamic %p\n", __func__, dyn);
+		dd->val = pi->pin.pin - dyn->start;
+		dd->drv = dyn->drv;
+	} else {
+		printk(KERN_INFO "%s: mapping pin %d\n", __func__, pi->pin.pin);
+		if (dev->gpio == NULL || dev->gpio->pins == NULL) {
+			printk(KERN_ERR "%s: device has no gpio?\n", __func__);
+			return -ENOENT;
+		}
+
+		pin = sbcd_find_pin(dev->gpio->pins, dev->gpio->max,
+				    pi->pin.pin);
+		if (!pin)
+			return -ENOENT;
+
+		ret = sbcd_map_pin(state, &pi->pin, &dd->val);
+		if (ret) {
+			printk(KERN_ERR "failed to find pin for gpio\n");
+			return ret;
+		}
+		
+		if (dev->get_gpio) {
+			dd->drv = (dev->get_gpio)(state, pin);
+		}
+	}
+
+	return 0;
+}
+
+static struct sbcd_decl_dev *get_parent(struct sbcd_state *state)
+{
+	struct sbcd_stack_item *sp = sbcd_stack_cur(state);
+
+	if (sp->item->hdr.type == SBCD_TYPE_DEV)
+		return sp->dev->decl;
+
+	return NULL;
+}
+
+struct sbcd_gpiodrv_data *sbcd_gpio_get_driver(struct sbcd_state *state,
+					       struct sbcd_item *pitem)
+{
+        struct sbcd_pininfo *pi = &pitem->u.pinuse.info;
+        struct sbcd_pinuse *pu = &pitem->u.pinuse;
+	struct sbcd_gpiodrv_data *gd;
+	char *name;
+	int ret;
+	
+	gd = kzalloc(sizeof(struct sbcd_gpiodrv_data), GFP_KERNEL);
+	if (gd == NULL) {
+		printk(KERN_ERR "no memory for sbcd-gpio device data\n");
+		goto err_drvdata;
+	}
+
+	name = sbcd_get_str(pu, pu->name_offset);
+	name = kstrdup(name, GFP_KERNEL);
+
+	gd->parent = get_parent(state);
+	gd->name   = name;
+	gd->pinuse = *pu;
+
+	printk(KERN_INFO "pin use: drv %p: unused=%d, 0=%d, 1=%d, pull=%d\n",
+	       gd, pu->info.mode_unused, pu->info.mode_off,
+	       pu->info.mode_on, pu->info.mode_resistor);
+
+	ret = sbcd_gpio_find_driver(state, gd, pi);
+	if (ret) {
+		printk(KERN_ERR "failed to get driver\n");
+		goto err_map;
+	}
+
+	return gd;
+
+ err_map:
+	kfree(gd);
+
+ err_drvdata:
+	return NULL;
+}
+
+static int __init sbcd_gpio_attach_pin(struct sbcd_state *state,
+				       struct sbcd_item *pitem)
+{
+	struct platform_device *pdev;
+
+	pdev = sbcd_dev_platform_make(state, "sbcd-gpio");
+	if (pdev == NULL) {
+		printk(KERN_ERR "no memort for sbcd-gpio device\n");
+		return -ENOMEM;
+	}
+
+	pdev->dev.platform_data = sbcd_gpio_get_driver(state, pitem);
+
+	if (pdev->dev.platform_data)
+		return sbcd_add_platform_device(state, pdev);
+
+	return -EINVAL;
+}
+
+/* sbcd_gpio_attach
+ *
+ *
+ *
+ * Note, we should deal with the position where the driver is
+ * just attached to a single gpio pin, where parent is a pin.
+ */
+
+static __init int sbcd_gpio_attach(struct sbcd_state *state,
+				   struct sbcd_item *parent,
+				   struct sbcd_item *drv_it)
+{
+	struct sbcd_item *ptr;
+	int res = 0;
+	int ret;
+	int level;
+
+	sbcd_items_forlevel(drv_it, ptr, level) {
+		if (ptr->hdr.type == SBCD_TYPE_PIN) {
+			ret = sbcd_gpio_attach_pin(state, ptr);
+			if (ret)
+				res = ret;
+		}
+	}
+
+	return res;
+}
+
+sbcd_drv_decl(gpio, sbcd_gpio_attach);
+
diff -urNp linux-2.6.20/arch/arm/common/sbcd/devices/platform.c linux-2.6.20-s1t/arch/arm/common/sbcd/devices/platform.c
--- linux-2.6.20/arch/arm/common/sbcd/devices/platform.c	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/arch/arm/common/sbcd/devices/platform.c	2007-02-07 16:29:01.000000000 +0000
@@ -0,0 +1,443 @@
+/* sbcd/kernel/linux/sbcd/devices/platform.c
+ *
+ * Copyright 2005 Simtec Electronics
+ *
+ * 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.
+ *
+ * Convert a device to a generic platform device
+*/
+
+#include <linux/kernel.h>
+#include <linux/ioport.h>
+#include <linux/device.h>
+
+#include <asm/mach/sbcd.h>
+#include <asm/mach/sbcd-info.h>
+#include <asm/mach/sbcd-types.h>
+#include <asm/mach/sbcd-utils.h>
+#include <asm/mach/sbcd-os.h>
+
+#include <asm/mach-types.h>
+
+#include "debug.h"
+#include "platform.h"
+
+#define ALL_RESOURCES (IORESOURCE_MEM | IORESOURCE_IO | IORESOURCE_IRQ)
+
+struct sbcd_info_dev __init *sbcd_finddev_byname(struct sbcd_state *state,
+						 const char *name)
+{
+	struct sbcd_info_dev *res;
+
+	for (res = state->devs; res != NULL; res = res->next) {
+		if (strcmp(name, res->decl->name) == 0)
+			return res;
+	}
+
+	return NULL;
+}
+
+struct sbcd_info_dev * __init sbcd_info_finddev(struct sbcd_state *state,
+						unsigned int dev)
+{
+	struct sbcd_item *it;
+	const char *name;
+
+	it = sbcd_item_find(state->items, dev, SBCD_TYPE_DEV, FIND_FLG_SUB);
+	if (it == NULL)
+		return NULL;
+
+	name = sbcd_get_str(&it->u.dev, it->u.dev.name_offset);
+	return sbcd_finddev_byname(state, name);
+}
+
+struct sbcd_info_pin * __init sbcd_find_pin(struct sbcd_info_pin *pins,
+					    unsigned int max,
+					    unsigned int no)
+{
+	for (; max >= 0; max--, pins++) {
+		if (pins->pin == no)
+			return pins;
+	}
+
+	return NULL;
+}
+
+int __init sbcd_map_address(struct sbcd_state *state,
+			    struct sbcd_area *area,
+			    resource_size_t *result,
+			    __u32 val)
+{
+	struct sbcd_info_dev *dev;
+	struct sbcd_info_pin *pin;
+
+	dev = sbcd_info_finddev(state, area->cs.chip);
+	if (!dev) {
+		printk(KERN_ERR "Failed to find device\n");
+		return -ENODEV;
+	}
+
+	if (dev->cs == NULL)
+		return -ENOENT;
+
+	pin = sbcd_find_pin(dev->cs->pins, dev->cs->max,  area->cs.pin);
+	if (!pin)
+		return -ENOENT;
+
+	/* ok, we got ourselves a winner */
+
+	*result = val + pin->val;
+	return 0;
+}
+
+int __init sbcd_map_pin(struct sbcd_state *state,
+			struct sbcd_pin *spin,
+			unsigned long *result)
+{
+	struct sbcd_info_dev *dev;
+	struct sbcd_info_pin *pin;
+
+	dev = sbcd_info_finddev(state, spin->chip);
+	if (!dev) {
+		printk(KERN_ERR "Failed to find device\n");
+		return -ENODEV;
+	}
+	
+	if (dev->gpio == NULL)
+		return -ENOENT;
+
+	if (dev->gpio->pins == NULL)
+		return -ENOENT;
+
+	pin = sbcd_find_pin(dev->gpio->pins, dev->gpio->max, spin->pin);
+	if (!pin)
+		return -ENOENT;
+	
+	*result = pin->val;
+	return 0;
+}
+
+int __init sbcd_map_irq(struct sbcd_state *state,
+			struct resource *result,
+			struct sbcd_irq *irq,
+			int initialise)
+{
+	struct sbcd_info_dev *dev;
+	struct sbcd_info_pin *pin;
+	int err;
+
+	dev = sbcd_info_finddev(state, irq->pin.chip);
+	if (!dev) {
+		printk(KERN_ERR "Failed to find device\n");
+		return -ENODEV;
+	}
+
+	if (dev->cs == NULL)
+		return -ENOENT;
+
+	pin = sbcd_find_pin(dev->gpio->pins, dev->gpio->max, irq->pin.pin);
+	if (!pin)
+		return -ENOENT;
+
+	printk(KERN_DEBUG "irq: dev %p, pin %p\n", dev, pin);
+
+	if (dev->map_irq == NULL) {
+		printk(KERN_ERR "dev has no irq mapping function\n");
+		return -ENOENT;
+	} else {
+		err = (dev->map_irq)(state, pin, result);
+		if (err)
+			return err;
+
+		if (initialise) {
+			/* initialise the irq */
+			err = (dev->init_irq)(state, irq, result);
+			if (err)
+				return err;
+		}
+	}
+
+	return 0;
+}
+
+int __init sbcd_area_process_info(struct sbcd_state *state,
+				  struct sbcd_item *it,
+				  struct resource *res)
+{
+	char *optname;
+	char *optval;
+
+	sbcd_get_optvals(it, &optname, &optval);
+
+	if (strcmp(optname, "shared") == 0) {
+	} else {
+		printk(KERN_ERR "unknown area option '%s'\n", optname);
+		return -ENOENT;
+	}
+
+	return 0;
+}
+
+int __init sbcd_area_options(struct sbcd_state *state,
+			     struct sbcd_item *it,
+			     struct resource *res)
+{
+	struct sbcd_item *ptr;
+	int level;
+
+	if (sbcd_item_hassub(it)) {
+		sbcd_items_forallsub(it, ptr, level) {
+			switch (ptr->hdr.type) {
+			case SBCD_TYPE_INFO:
+				sbcd_area_process_info(state, ptr, res);
+				break;
+			}
+		}			  
+	}
+
+	return 0;
+}
+
+int __init sbcd_dev_mkresources(struct sbcd_state *state,
+				struct sbcd_item *it_dev,
+				struct platform_device *pdev,
+				unsigned int flags)
+{
+	struct sbcd_item *it;
+	struct sbcd_area *area;
+	struct sbcd_irq *irq;
+	struct resource *ptr = pdev ? pdev->resource : NULL;
+	struct resource tmp;
+	int count = 0;
+	int level = 0;
+	int err = 0;
+
+	if (0) {
+		printk(KERN_DEBUG "%s: item %p (%02x)\n", __FUNCTION__,
+		       it_dev, it_dev->hdr.type);
+	}
+
+	for (it = it_dev; level > 0 || (level == 0 && !sbcd_item_isend(it));
+	     it = sbcd_item_next(it)) {
+		if (0) {
+			printk("%s: checking %p (%02x) level %d\n",
+			       __FUNCTION__, it, it->hdr.type, level);
+		}
+
+		memset(&tmp, 0, sizeof(tmp));
+
+		switch (it->hdr.type) {
+		case SBCD_TYPE_AREA:
+			area      = &it->u.area;
+			tmp.flags = IORESOURCE_MEM;
+			tmp.name  = NULL;
+
+			printk(KERN_DEBUG "%s: %p: area %08x..%08x, %02x\n",
+			       __FUNCTION__,
+			       area, area->start, area->end, area->shift);
+			
+			err = sbcd_map_address(state, area,
+					       &tmp.start, area->start);
+
+			if (!err) 
+				err = sbcd_map_address(state, area,
+						       &tmp.end, area->end);
+
+			if (!err)
+				sbcd_area_options(state, it, &tmp);
+	  
+			break;
+
+		case SBCD_TYPE_IRQ:
+			irq	  = &it->u.irq;
+			tmp.flags = IORESOURCE_IRQ;
+			tmp.name  = NULL;
+			
+			printk(KERN_DEBUG "%s: %p: irq %d.%d, %02x\n",
+			       __FUNCTION__, 
+			       irq, irq->pin.chip, irq->pin.pin,
+			       irq->flags);
+
+			err = sbcd_map_irq(state, &tmp, irq,
+					   ptr != NULL);
+			break;
+			
+		default:
+			/* do nothing */
+			tmp.flags = 0;		
+		}
+
+		if (err)
+			return err;
+
+		/* for the moment, only consider resources that
+		 * are on the same level as oursevles, in case
+		 * we end up with driver specific resources in
+		 * the future 
+		 */
+
+		if ((flags & tmp.flags) != 0 && level == 0) {
+			count++;
+
+			if (ptr) {
+				memcpy(ptr, &tmp, sizeof(tmp));
+				ptr++;
+
+			}
+		} else if (0) {
+			printk(KERN_DEBUG "%s: flag %08x.%08lx, lev %d\n",
+			       __FUNCTION__, flags, tmp.flags, level);
+		}
+
+		if (it->hdr.flags & SBCD_FLG_SUB)
+			level++;
+
+		if (it->hdr.type == SBCD_TYPE_END)
+			level--;
+	}
+
+	printk(KERN_DEBUG "%s: found %d\n", __FUNCTION__, count); 
+	return count;
+}
+
+static int __init plat_match(struct device *dev, void *arg)
+{
+	return (strcmp((const char *)arg, dev->bus_id) == 0) ? 1 : 0;
+}
+
+static int __init sbcd_platform_getindex(struct sbcd_state *state,
+					 struct platform_device *pdev)
+{
+	char name[BUS_ID_SIZE+1];
+	int index;
+
+	for (index = 0; index < 200; index++) {
+		snprintf(name, BUS_ID_SIZE, "%s.%d", pdev->name, index);
+
+		if (!bus_find_device(&platform_bus_type, NULL,
+				     name, plat_match))
+			return index;
+	}
+
+	return -2;
+}
+
+int __init sbcd_add_platform_device(struct sbcd_state *state,
+				    struct platform_device *pdev)
+{
+	int ret;
+	int index = 0;
+
+	dbg_show_platdev(pdev, "add_dev");
+
+	if (machine_is_bast())
+		return 0;
+
+	index = sbcd_platform_getindex(state, pdev);
+	if (index < 0)
+		index = 0;
+
+	while (1) {
+		pdev->id = index;
+		ret = platform_device_register(pdev);
+		
+		if (ret == 0)
+			break;
+		else
+			printk(KERN_ERR "%s: failed to register id %d\n", 
+			       pdev->name, pdev->id);
+
+		if (++index > 64)
+			break;
+
+		pdev->id = index;
+	}
+
+	return 0;
+}
+
+struct platform_device * __init sbcd_dev_platform_make(struct sbcd_state *st,
+						       char *name)
+{
+	struct platform_device *pdev;
+
+	pdev = kzalloc(sizeof(struct platform_device), GFP_KERNEL);
+	if (pdev == NULL) {
+		printk(KERN_ERR "failed to create new platform device\n");
+	} else {
+		pdev->dev.bus = &platform_bus_type;
+		pdev->name = name;
+	}
+
+	return pdev;
+}
+
+int __init sbcd_dev_platform_create(struct sbcd_state *state,
+				    struct sbcd_item *it_dev,
+				    struct sbcd_item *it_drv,
+				    struct platform_device **result)
+{
+	struct platform_device *pdev;
+	struct sbcd_drv *drv = it_drv ? &it_drv->u.drv : NULL;
+	struct sbcd_dev *dev = &it_dev->u.dev;
+	char *name;
+	int count;
+	int ret;
+
+	if (drv) {
+		name = sbcd_get_str(drv, drv->name_offset);
+	} else {
+		name = sbcd_get_str(dev, dev->name_offset);
+	}
+
+	*result = pdev = sbcd_dev_platform_make(state, name);
+	if (!pdev)
+		return -ENOMEM;
+	
+	count = sbcd_dev_mkresources(state, sbcd_item_next(it_dev),
+				     NULL, ALL_RESOURCES);
+
+	if (count < 0) {
+		printk(KERN_ERR "failed to enumerate resources\n");
+	} else {
+		pdev->resource = kzalloc(sizeof(struct resource) * count,
+					 GFP_KERNEL);
+
+		if (pdev->resource) {
+			ret = sbcd_dev_mkresources(state,
+						   sbcd_item_next(it_dev),
+						   pdev, ALL_RESOURCES);
+			
+			if (ret != count) {
+				printk(KERN_ERR "ERROR: "
+				       "Counted %d devices, "
+				       "but only added %d\n",
+				       count, ret);
+			}
+
+			pdev->num_resources = ret;
+		}
+	}
+ 
+	*result = pdev;
+	return count;
+}
+
+int __init sbcd_dev_generic_platform(struct sbcd_state *state,
+				     struct sbcd_item *it_dev,
+				     struct sbcd_item *it_drv)
+{
+	struct platform_device *pdev;
+	int ret;
+
+	ret = sbcd_dev_platform_create(state, it_dev,
+				       it_drv, &pdev);
+
+	if (ret >= 0) {
+		sbcd_add_platform_device(state, pdev);
+	}
+
+	return ret;
+}
diff -urNp linux-2.6.20/arch/arm/common/sbcd/devices/platform.h linux-2.6.20-s1t/arch/arm/common/sbcd/devices/platform.h
--- linux-2.6.20/arch/arm/common/sbcd/devices/platform.h	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/arch/arm/common/sbcd/devices/platform.h	2007-02-07 16:29:01.000000000 +0000
@@ -0,0 +1,41 @@
+/* sbcd/kernel/linux/sbcd/devices/platform.h
+ *
+ * Copyright 2005 Simtec Electronics
+ *
+ * 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.
+*/
+
+#ifndef __SBCD_DEVICES_PLATFORM_H
+#define __SBCD_DEVICES_PLATFORM_H "$Id: platform.h,v 1.4 2005/09/21 09:48:24 ben Exp $"
+
+extern struct platform_device *sbcd_dev_platform_make(struct sbcd_state *st,
+						      char *name);
+
+extern int sbcd_dev_platform_create(struct sbcd_state *state,
+				    struct sbcd_item *it_dev,
+				    struct sbcd_item *it_drv,
+				    struct platform_device **result);
+
+extern int sbcd_dev_generic_platform(struct sbcd_state *state,
+				     struct sbcd_item *it_dev,
+				     struct sbcd_item *it_drv);
+
+extern int sbcd_add_platform_device(struct sbcd_state *state,
+				    struct platform_device *pdev);
+
+extern int sbcd_map_irq(struct sbcd_state *state,
+			struct resource *result,
+			struct sbcd_irq *irq, int init);
+
+extern int sbcd_map_pin(struct sbcd_state *state,
+			struct sbcd_pin *spin,
+			unsigned long *result);
+
+extern int sbcd_map_address(struct sbcd_state *state,
+			    struct sbcd_area *area,
+			    resource_size_t *result,
+			    __u32 val);
+
+#endif /* __SBCD_DEVICES_PLATFORM_H */
diff -urNp linux-2.6.20/arch/arm/common/sbcd/devices/simtec-gpio-p4.c linux-2.6.20-s1t/arch/arm/common/sbcd/devices/simtec-gpio-p4.c
--- linux-2.6.20/arch/arm/common/sbcd/devices/simtec-gpio-p4.c	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/arch/arm/common/sbcd/devices/simtec-gpio-p4.c	2007-02-07 16:29:01.000000000 +0000
@@ -0,0 +1,145 @@
+/* sbcd/kernel/linux/sbcd/devices/simtec-gpio-p4.c
+ *
+ * Copyright 2007 Simtec Electronics
+ *
+ * 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.
+ *
+ * SBCD device support for Simtec 4bit GPIO
+*/
+
+#include <linux/kernel.h>
+#include <linux/device.h>
+#include <asm/io.h>
+
+#include <asm/mach/sbcd.h>
+#include <asm/mach/sbcd-info.h>
+#include <asm/mach/sbcd-types.h>
+#include <asm/mach/sbcd-utils.h>
+#include <asm/mach/sbcd-os.h>
+#include <asm/mach/sbcd-gpio.h>
+
+#include "debug.h"
+#include "platform.h"
+
+struct drv_state {
+	struct sbcd_gpio_drv	 drv;
+	void __iomem		*reg;
+};
+
+static inline struct drv_state *to_drv_state(struct sbcd_gpio_drv *drv)
+{
+	return container_of(drv, struct drv_state, drv);
+}
+
+static int simtec_gpio_p4_gpio_read(struct sbcd_gpiodrv_data *data)
+{
+	return 0;
+}
+
+static int simtec_gpio_p4_gpio_write(struct sbcd_gpiodrv_data *data,
+				     int to)
+{
+	struct drv_state *state = to_drv_state(data->drv);
+	unsigned long shift = data->val * 2;
+	unsigned int val = 2 << shift;
+	
+	if ((to & SBCD_GPIODRV_OUTPUT) == 0)
+		return -EINVAL;
+
+	if (to & SBCD_GPIODRV_VALUE(1)) 
+		val |= 1 << shift;
+
+	printk(KERN_DEBUG "writing %02x => %p\n", val, state->reg);
+	writeb(val, state->reg);
+	return 0;
+}
+
+static __init int simtec_gpio_p4_init(struct drv_state *state,
+				      struct sbcd_state *sbcd,
+				      struct sbcd_item *parent,
+				      struct sbcd_item *drv_it)
+{
+	struct sbcd_stack_item *sp = sbcd_stack_cur(sbcd);
+	struct sbcd_item *it;
+	struct sbcd_area *area;
+	struct sbcd_pinrange *pr;
+	resource_size_t start;
+	int level = 0;
+	int err;
+
+	printk(KERN_INFO "%s: stack %p\n", __func__, sp);
+
+	if (sp->dev == NULL) {
+		printk(KERN_ERR "parent item is not a device?\n");
+		return 1;
+	}
+	
+	for (it = sbcd_item_next(drv_it);
+	     level > 0 || (level == 0 && !sbcd_item_isend(it));
+	     it = sbcd_item_next(it)) {
+
+		if (1) {
+			printk("%s: checking %p (%02x) level %d\n",
+			       __FUNCTION__, it, it->hdr.type, level);
+		}
+
+		switch (it->hdr.type) {
+		case SBCD_TYPE_END:
+			level--;
+			break;
+
+		case SBCD_TYPE_AREA:
+			area = &it->u.area;
+
+			printk(KERN_INFO "%s: %p: area %08x..%08x, %02x\n",
+			       __FUNCTION__,
+			       area, area->start, area->end, area->shift);
+
+			err = sbcd_map_address(sbcd, area, &start, area->start);
+			if (err)
+				return err;
+
+			state->reg = ioremap(start, 1);
+			break;
+
+		case SBCD_TYPE_PINRANGE:
+			pr = &it->u.pinrange;
+
+			printk(KERN_INFO "%s: attaching range %d..%d\n",
+			       __func__, pr->from.pin, pr->to.pin);
+
+			sbcd_gpio_register_dynamic(sp->dev, &state->drv,
+						   pr->from.pin, pr->to.pin);
+
+			break;
+		}
+
+		if (it->hdr.flags & SBCD_FLG_SUB)
+			level++;
+	}	
+
+	return 0;
+}
+
+
+static __init int simtec_gpio_p4_attach(struct sbcd_state *sbcd,
+					struct sbcd_item *parent,
+					struct sbcd_item *drv_it)
+{
+	struct drv_state *state;
+
+	state = kzalloc(sizeof(struct drv_state), GFP_KERNEL);
+	if (state == NULL) {
+		printk(KERN_ERR "no memory for new driver state\n");
+		return -ENOMEM;
+	}
+
+	state->drv.gpio_read = simtec_gpio_p4_gpio_read;
+	state->drv.gpio_write = simtec_gpio_p4_gpio_write;
+
+	return simtec_gpio_p4_init(state, sbcd, parent, drv_it);
+}
+
+sbcd_drv_decl2(gpio_simtec_p4, "gpio-simtec-p4", simtec_gpio_p4_attach);
diff -urNp linux-2.6.20/arch/arm/common/sbcd/devices/simtec-i2c.c linux-2.6.20-s1t/arch/arm/common/sbcd/devices/simtec-i2c.c
--- linux-2.6.20/arch/arm/common/sbcd/devices/simtec-i2c.c	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/arch/arm/common/sbcd/devices/simtec-i2c.c	2007-02-07 16:29:01.000000000 +0000
@@ -0,0 +1,40 @@
+/* sbcd/kernel/linux/sbcd/devices/simtec-i2c.c
+ *
+ * Copyright 2005 Simtec Electronics
+ *
+ * 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.
+ *
+ * SBCD device support for Simtec simple I2C
+*/
+
+#include <linux/kernel.h>
+#include <linux/ioport.h>
+#include <linux/device.h>
+
+#include <asm/mach/sbcd.h>
+#include <asm/mach/sbcd-info.h>
+#include <asm/mach/sbcd-types.h>
+#include <asm/mach/sbcd-utils.h>
+#include <asm/mach/sbcd-os.h>
+
+#include "platform.h"
+
+static int simtec_i2c_drv_attach(struct sbcd_state *state,
+				 struct sbcd_item *parent,
+				 struct sbcd_item *drv_it)
+{
+	struct platform_device *pdev;
+	int ret;
+
+	ret = sbcd_dev_platform_create(state, parent, drv_it, &pdev);
+
+	if (ret >= 0)
+		ret = sbcd_add_platform_device(state, pdev);
+
+	return ret;
+}
+
+sbcd_drv_decl2(simtec_i2c, "simtec-i2c",  simtec_i2c_drv_attach);
+
diff -urNp linux-2.6.20/arch/arm/common/sbcd/devices/simtec-ide.c linux-2.6.20-s1t/arch/arm/common/sbcd/devices/simtec-ide.c
--- linux-2.6.20/arch/arm/common/sbcd/devices/simtec-ide.c	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/arch/arm/common/sbcd/devices/simtec-ide.c	2007-02-07 16:29:01.000000000 +0000
@@ -0,0 +1,42 @@
+/* sbcd/kernel/linux/sbcd/devices/simtec-ide.c
+ *
+ * Copyright 2005 Simtec Electronics
+ *
+ * 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.
+ *
+ * SBCD device support for Simtec IDE
+*/
+
+#include <linux/kernel.h>
+#include <linux/ioport.h>
+#include <linux/device.h>
+
+#include <asm/mach/sbcd.h>
+#include <asm/mach/sbcd-info.h>
+#include <asm/mach/sbcd-types.h>
+#include <asm/mach/sbcd-utils.h>
+#include <asm/mach/sbcd-os.h>
+
+#include "platform.h"
+
+static int simtec_ide_drv_attach(struct sbcd_state *state,
+				 struct sbcd_item *parent,
+				 struct sbcd_item *drv_it)
+{
+	struct platform_device *pdev;
+	int ret;
+
+	ret = sbcd_dev_platform_create(state, parent, drv_it, &pdev);
+
+	if (ret >= 0) {
+		/* todo - check for platform data */
+
+		sbcd_add_platform_device(state, pdev);
+	}
+
+	return ret;
+}
+
+sbcd_drv_decl2(simtec_ide, "simtec-ide",  simtec_ide_drv_attach);
diff -urNp linux-2.6.20/arch/arm/common/sbcd/devices/simtec-lcd.c linux-2.6.20-s1t/arch/arm/common/sbcd/devices/simtec-lcd.c
--- linux-2.6.20/arch/arm/common/sbcd/devices/simtec-lcd.c	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/arch/arm/common/sbcd/devices/simtec-lcd.c	2007-02-07 16:29:01.000000000 +0000
@@ -0,0 +1,44 @@
+/* sbcd/kernel/linux/sbcd/devices/simtec-lcd.c
+ *
+ * Copyright 2005 Simtec Electronics
+ *
+ * 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.
+ *
+ * SBCD device support for Simtec 8bit LCD port
+*/
+
+#include <linux/kernel.h>
+#include <linux/ioport.h>
+#include <linux/device.h>
+
+#include <asm/mach/sbcd.h>
+#include <asm/mach/sbcd-info.h>
+#include <asm/mach/sbcd-types.h>
+#include <asm/mach/sbcd-utils.h>
+#include <asm/mach/sbcd-os.h>
+
+#include "platform.h"
+
+static int simtec_lcd_drv_attach(struct sbcd_state *state,
+				 struct sbcd_item *parent,
+				 struct sbcd_item *drv_it)
+{
+	struct platform_device *pdev;
+	int ret;
+
+	ret = sbcd_dev_platform_create(state, parent, drv_it, &pdev);
+
+	if (ret >= 0) {
+		pdev->name = "simtec-lcd-char";
+		ret = sbcd_add_platform_device(state, pdev);
+	}
+
+	return ret;
+}
+
+sbcd_drv_decl2(simtec_lcd1, "simtec-lcd-char",  simtec_lcd_drv_attach);
+sbcd_drv_decl2(simtec_lcd2, "simtec-lcd-8bit",  simtec_lcd_drv_attach);
+sbcd_drv_decl2(simtec_lcd3, "simtec-8bit-lcd",  simtec_lcd_drv_attach);
+
diff -urNp linux-2.6.20/arch/arm/common/sbcd/devices/sm501.c linux-2.6.20-s1t/arch/arm/common/sbcd/devices/sm501.c
--- linux-2.6.20/arch/arm/common/sbcd/devices/sm501.c	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/arch/arm/common/sbcd/devices/sm501.c	2007-02-07 16:29:01.000000000 +0000
@@ -0,0 +1,44 @@
+/* sbcd/kernel/linux/sbcd/devices/sm501.c
+ *
+ * Copyright 2005 Simtec Electronics
+ *
+ * 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.
+ *
+ * SBCD device support for Silicon Motion SM501
+*/
+
+#include <linux/kernel.h>
+#include <linux/ioport.h>
+#include <linux/device.h>
+
+#include <asm/mach/sbcd.h>
+#include <asm/mach/sbcd-info.h>
+#include <asm/mach/sbcd-types.h>
+#include <asm/mach/sbcd-utils.h>
+#include <asm/mach/sbcd-os.h>
+
+#include "platform.h"
+
+static __init int sm501_drv_attach(struct sbcd_state *state,
+				   struct sbcd_item *parent,
+				   struct sbcd_item *drv_it)
+{
+	struct platform_device *pdev;
+	int ret;
+
+	ret = sbcd_dev_platform_create(state, parent,
+				       drv_it, &pdev);
+
+	if (ret >= 0) {
+		/* todo - check for platform data */
+
+		sbcd_add_platform_device(state, pdev);
+	}
+
+	return ret;
+}
+
+sbcd_drv_decl(sm501, sm501_drv_attach);
+
diff -urNp linux-2.6.20/arch/arm/common/sbcd/devices/spi.c linux-2.6.20-s1t/arch/arm/common/sbcd/devices/spi.c
--- linux-2.6.20/arch/arm/common/sbcd/devices/spi.c	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/arch/arm/common/sbcd/devices/spi.c	2007-02-07 16:29:01.000000000 +0000
@@ -0,0 +1,87 @@
+/* sbcd/kernel/linux/sbcd/devices/spi.c
+ *
+ * Copyright 2007 Simtec Electronics
+ *
+ * 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.
+ *
+ * SPI core
+*/
+
+#include <linux/kernel.h>
+#include <linux/device.h>
+
+#include <linux/spi/spi.h>
+
+#include <asm/mach/sbcd.h>
+#include <asm/mach/sbcd-info.h>
+#include <asm/mach/sbcd-types.h>
+#include <asm/mach/sbcd-utils.h>
+#include <asm/mach/sbcd-os.h>
+#include <asm/mach/sbcd-gpio.h>
+
+#include "debug.h"
+
+int __init sbcd_spi_scan_child(struct sbcd_state *state,
+			       struct sbcd_child_dev *child,
+			       struct sbcd_item *parent,
+			       struct sbcd_item *driver)
+{
+
+	struct sbcd_gpiodrv_data *cs;
+	struct sbcd_item *ptr;
+	int level;
+
+
+	sbcd_items_forlevel(parent, ptr, level) {
+		switch (ptr->hdr.type) {
+		case SBCD_TYPE_PIN:
+			cs = sbcd_gpio_get_driver(state, ptr);
+
+			if (cs == NULL) {
+				printk(KERN_ERR "failed to map pin\n");
+				return -ENOENT;
+			}
+
+			child->data.spi.cs = cs;
+			break;
+		}
+	}
+
+	return 0;
+}
+
+
+int __init sbcd_spi_generic_create(struct sbcd_state *state,
+				   struct sbcd_child_drv *drv,
+				   struct sbcd_item *parent,
+				   struct sbcd_item *drv_it)
+{
+	struct sbcd_child_dev child;
+	struct spi_board_info info;
+	int ret;
+
+	child.data.spi.info = &info;
+	memset(&info, 0, sizeof(info));
+
+	info.max_speed_hz = 150 * 1000;
+	//info.mode = SPI_CPHA;
+	info.mode = SPI_MODE_1;
+
+	sbcd_spi_scan_child(state, &child, parent, drv_it);
+
+	strlcpy(info.modalias, sbcd_get_str(&drv_it->u.drv,
+					    drv_it->u.drv.name_offset),
+		sizeof(info.modalias));
+
+	printk(KERN_INFO "%s: name is %s\n", __func__, info.modalias);
+
+	ret = (drv->add_child)(state, drv, &child);
+	if (ret == 0)
+		return ret;
+
+	/* kill our info */
+
+	return ret;
+}
diff -urNp linux-2.6.20/arch/arm/common/sbcd/devices/spi.h linux-2.6.20-s1t/arch/arm/common/sbcd/devices/spi.h
--- linux-2.6.20/arch/arm/common/sbcd/devices/spi.h	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/arch/arm/common/sbcd/devices/spi.h	2007-02-07 16:29:01.000000000 +0000
@@ -0,0 +1,16 @@
+/* sbcd/kernel/linux/sbcd/devices/spi.h
+ *
+ * Copyright 2007 Simtec Electronics
+ *
+ * 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.
+ *
+ * SPI core
+*/
+
+extern int sbcd_spi_generic_create(struct sbcd_state *state,
+				   struct sbcd_child_drv *chd,
+				   struct sbcd_item *parent,
+				   struct sbcd_item *drv);
+
diff -urNp linux-2.6.20/arch/arm/common/sbcd/devices/sram.c linux-2.6.20-s1t/arch/arm/common/sbcd/devices/sram.c
--- linux-2.6.20/arch/arm/common/sbcd/devices/sram.c	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/arch/arm/common/sbcd/devices/sram.c	2007-02-07 16:29:01.000000000 +0000
@@ -0,0 +1,84 @@
+/* sbcd/kernel/linux/sbcd/devices/sram.c
+ *
+ * Copyright 2005 Simtec Electronics
+ *
+ * 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.
+ *
+ * SBCD device support for SRAM
+*/
+
+#include <linux/kernel.h>
+#include <linux/ioport.h>
+#include <linux/device.h>
+
+#include <asm/mach/sbcd.h>
+#include <asm/mach/sbcd-info.h>
+#include <asm/mach/sbcd-types.h>
+#include <asm/mach/sbcd-utils.h>
+#include <asm/mach/sbcd-os.h>
+
+#include "platform.h"
+
+#include <linux/mtd/plat-ram.h>
+
+static __init int sram_drv_bankwidth(struct sbcd_state *state,
+				     struct sbcd_item *it_dev)
+{
+	struct sbcd_area *area;
+	struct sbcd_item *it;
+	int level = 0;
+
+	for (it = it_dev; level > 0 || (level == 0 && !sbcd_item_isend(it));
+	     it = sbcd_item_next(it)) {
+
+		if (it->hdr.type == SBCD_TYPE_AREA) {
+			area = &it->u.area;
+			
+			if (area->flags & SBCD_AREA_WIDTH32)
+				return 32;
+			if (area->flags & SBCD_AREA_WIDTH16)
+				return 16;
+			if (area->flags & SBCD_AREA_WIDTH8)
+				return 8;		       
+		}
+	}
+
+	return 8;
+}
+
+static __init int sram_drv_attach(struct sbcd_state *state,
+				  struct sbcd_item *parent,
+				  struct sbcd_item *drv_it)
+{
+	struct platdata_mtd_ram *pdata;
+	struct platform_device *pdev;
+	int ret;
+
+	ret = sbcd_dev_platform_create(state, parent,
+				       drv_it, &pdev);
+
+	if (ret >= 0) {
+		pdata = kzalloc(sizeof(struct platdata_mtd_ram), GFP_KERNEL);
+		if (pdata == NULL) {
+			ret = -ENOMEM;
+			goto exit_err;
+		}
+
+		pdata->bankwidth = sram_drv_bankwidth(state, drv_it) / 8;
+		
+		dev_info(&pdev->dev, "width %d\n", pdata->bankwidth);
+		
+		pdev->dev.platform_data = pdata;
+		pdev->name = "mtd-ram";
+		sbcd_add_platform_device(state, pdev);
+	}
+
+ exit_err:
+	return ret;
+}
+
+sbcd_drv_decl(sram, sram_drv_attach);
+sbcd_drv_decl2(mtd_ram, "mtd-ram", sram_drv_attach);
+
diff -urNp linux-2.6.20/arch/arm/common/sbcd/devices/uart16550.c linux-2.6.20-s1t/arch/arm/common/sbcd/devices/uart16550.c
--- linux-2.6.20/arch/arm/common/sbcd/devices/uart16550.c	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/arch/arm/common/sbcd/devices/uart16550.c	2007-02-07 16:29:01.000000000 +0000
@@ -0,0 +1,266 @@
+/* sbcd/kernel/linux/sbcd/devices/uart16550.c
+ *
+ * Copyright 2005 Simtec Electronics
+ *
+ * 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.
+ *
+ * SBCD device support for 16550 UART
+*/
+
+#include <linux/kernel.h>
+
+#include <linux/device.h>
+#include <linux/serial_8250.h>
+
+#include <asm/mach/sbcd.h>
+#include <asm/mach/sbcd-info.h>
+#include <asm/mach/sbcd-types.h>
+#include <asm/mach/sbcd-utils.h>
+#include <asm/mach/sbcd-os.h>
+
+#include "platform.h"
+
+/* ways of specifiying uart(s):
+ *
+ * device "sio-serial" {
+ *         driver "16550";
+ *         irq     cpu irq14;
+ * 
+ *         area {
+ *                 cs      cpu cs1;
+ *                 start   0x018002f8;
+ *                 end     0x018002ff;
+ *                 shift   0;
+ *         };
+ * }
+ *
+ * two uarts, with the same area, but differing irqs, difficult
+ * to parse, as it requires forward reference to the area:
+ * 
+ * device "sio-serial" {
+ *         driver "16550";
+ *         irq     cpu irq14;
+ *	   irq	   cpu irq15;
+ * 
+ *         area {
+ *                 cs      cpu cs1;
+ *                 start   0x018002f8;
+ *                 end     0x018002ff;
+ *                 shift   0;
+ *         };
+ * }
+ *
+ * two uarts, with the different area, but same irq
+ * 
+ * device "sio-serial" {
+ *         driver "16550";
+ *         irq     cpu irq14;
+ * 
+ *         area {
+ *                 cs      cpu cs1;
+ *                 start   0x018002f8;
+ *                 end     0x018002ff;
+ *                 shift   0;
+ *         };
+ *
+ *         area {
+ *                 cs      cpu cs1;
+ *                 start   0x018003f8;
+ *                 end     0x018003ff;
+ *                 shift   0;
+ *         };
+ * }
+ *
+ * two uarts, with the different area, differnt irqs,
+ * which is unparsable, as we cannot tell if this is
+ * two, three or four devices:
+ * 
+ * device "sio-serial" {
+ *         driver "16550";
+ *         irq     cpu irq14;
+ * 
+ *         area {
+ *                 cs      cpu cs1;
+ *                 start   0x018002f8;
+ *                 end     0x018002ff;
+ *                 shift   0;
+ *         };
+ *
+ *	   irq	   cpu irq15;
+ *
+ *         area {
+ *                 cs      cpu cs1;
+ *                 start   0x018003f8;
+ *                 end     0x018003ff;
+ *                 shift   0;
+ *         };
+ * }
+*/
+
+
+struct sbcd_uart_state {
+	unsigned int		count;
+	int			level;
+
+	struct sbcd_item	*it;
+	struct sbcd_item	*area;
+	struct sbcd_item	*irq;
+
+	struct sbcd_item	*last_area;
+	struct sbcd_item	*last_irq;
+
+	struct plat_serial8250_port	*port_data;
+};
+
+static __init int uart16550_sbcd_mkitem(struct sbcd_state *state,
+					struct sbcd_uart_state *ustate,
+					struct sbcd_item  *area,
+					struct sbcd_item  *irq)
+{
+	struct sbcd_item *it = sbcd_item_next(ustate->it);
+	struct resource r_irq;
+	struct resource r_area;
+	int err;
+
+	printk(KERN_DEBUG "%s: (%p, %p, %p, %p)\n",
+	       __FUNCTION__, state, ustate, area, irq);
+
+	if (area == NULL)
+		area = sbcd_item_find(it, 0, SBCD_TYPE_AREA, 0);
+
+	if (irq == NULL)
+		irq  = sbcd_item_find(it, 0, SBCD_TYPE_IRQ, 0);
+
+	if (ustate->last_area == area && ustate->last_irq == irq) {
+		printk(KERN_DEBUG "trying repeat device\n");
+		return 0;
+	}
+
+	ustate->last_area = area;
+	ustate->last_irq  = irq;
+
+	err = sbcd_map_irq(state, &r_irq, &irq->u.irq, 0);
+	if (err) {
+		printk(KERN_DEBUG "sbcd_map_irq returned %d\n", err);
+		return err;
+	}
+
+	err = sbcd_map_address(state, &area->u.area,
+			       &r_area.start, area->u.area.start);
+
+	err = sbcd_map_address(state, &area->u.area,
+			       &r_area.end, area->u.area.end);
+	
+	if (ustate->port_data != NULL) {
+		struct plat_serial8250_port *port; 
+
+		port  = ustate->port_data + ustate->count;
+		memset(port, 0, sizeof(struct plat_serial8250_port));
+
+		port->mapbase	= r_area.start;
+		port->irq	= r_irq.start;
+		port->regshift	= area->u.area.shift;
+		port->uartclk	= 7372800;
+		port->iotype	= UPIO_MEM;
+		port->flags	= UPF_IOREMAP | UPF_BOOT_AUTOCONF;
+
+		printk(KERN_INFO "sbcd: serial %d at %08lx, shift %d\n",
+		       ustate->count, port->mapbase, port->regshift);
+	}
+	
+	ustate->count++;
+
+	return 0;
+}
+
+static __init int uart16550_sbcd_runres(struct sbcd_state *state,
+					struct sbcd_item *parent,
+					struct plat_serial8250_port *pd)
+{
+	struct sbcd_uart_state ustate;
+	struct sbcd_item *ptr;
+	int ret;
+
+	/* setup our state */
+
+	memset(&ustate, 0, sizeof(ustate));
+
+	ustate.count = 0;
+	ustate.it    = parent;
+	ustate.port_data = pd;
+	
+	sbcd_items_forlevel(parent, ptr, ustate.level) {
+
+		if (ptr->hdr.type == SBCD_TYPE_AREA) {			
+			ret = uart16550_sbcd_mkitem(state, &ustate, ptr, NULL);
+			if (ret < 0)
+				return ret;
+
+			ustate.area = ptr; 
+		}
+
+		if (ptr->hdr.type == SBCD_TYPE_IRQ) {
+			ret = uart16550_sbcd_mkitem(state, &ustate, NULL, ptr);
+			if (ret < 0)
+				return ret;
+
+			ustate.irq = ptr; 
+		}
+	}
+
+	return ustate.count;
+}
+
+static __init int uart16550_sbcd_drv_attach(struct sbcd_state *state,
+					    struct sbcd_item *parent,
+					    struct sbcd_item *drv_it)
+{
+	struct plat_serial8250_port *pd;
+	struct platform_device *pdev;
+	int ret = -ENOMEM;
+	int count;
+
+	pdev = sbcd_dev_platform_make(state, "serial8250");
+	if (pdev) {
+		count = uart16550_sbcd_runres(state, parent, NULL);
+		if (count < 0) {
+			ret = count;
+			goto out;
+		}
+
+		count++;	/* hack ftm */
+
+		if (count <= 1) {
+			printk(KERN_ERR "no io specified for %p\n", parent);
+			ret = -EINVAL;
+			goto out;
+		}
+
+		pd = kzalloc(sizeof(struct plat_serial8250_port) * count,
+			     GFP_KERNEL);
+
+		pdev->dev.platform_data = pd;
+
+		ret = uart16550_sbcd_runres(state, parent, pd);
+		ret++;
+
+		if (ret != count) {
+			printk(KERN_ERR "%s: second run has differing count"
+			       ", first run %d, second %d!\n",
+			       __FUNCTION__, count, ret);
+			ret = -EINVAL;
+		}
+		
+		if (ret >= 0) {
+			sbcd_add_platform_device(state, pdev);
+		}
+	}
+
+ out:
+	return ret;
+}
+
+sbcd_drv_decl(16550, uart16550_sbcd_drv_attach);
+
diff -urNp linux-2.6.20/arch/arm/common/sbcd/devices/vr2k-spi-cs.c linux-2.6.20-s1t/arch/arm/common/sbcd/devices/vr2k-spi-cs.c
--- linux-2.6.20/arch/arm/common/sbcd/devices/vr2k-spi-cs.c	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/arch/arm/common/sbcd/devices/vr2k-spi-cs.c	2007-02-07 16:29:01.000000000 +0000
@@ -0,0 +1,170 @@
+/* sbcd/kernel/linux/sbcd/devices/vr2k-spi-cs.c
+ *
+ * Copyright 2007 Simtec Electronics
+ *
+ * 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.
+ *
+ * VR2K spi cs
+*/
+
+#include <linux/kernel.h>
+#include <linux/device.h>
+#include <linux/delay.h>
+#include <asm/io.h>
+
+#include <asm/mach/sbcd.h>
+#include <asm/mach/sbcd-info.h>
+#include <asm/mach/sbcd-types.h>
+#include <asm/mach/sbcd-utils.h>
+#include <asm/mach/sbcd-os.h>
+#include <asm/mach/sbcd-gpio.h>
+
+#include "debug.h"
+#include "platform.h"
+
+struct drv_state {
+	struct sbcd_gpio_drv	 drv;
+	void __iomem		*reg;
+};
+
+static inline struct drv_state *to_drv_state(struct sbcd_gpio_drv *drv)
+{
+	return container_of(drv, struct drv_state, drv);
+}
+
+static int vr2k_sbcd_spics_gpio_read(struct sbcd_gpiodrv_data *data)
+{
+	return 0;
+}
+
+static int vr2k_sbcd_spics_gpio_write(struct sbcd_gpiodrv_data *data,
+				      int to)
+{
+	struct drv_state *state = to_drv_state(data->drv);
+	unsigned int val = data->val;
+
+	if ((to & SBCD_GPIODRV_OUTPUT) == 0)
+		return -EINVAL;
+
+	if (to & SBCD_GPIODRV_VALUE(1)) {
+		writeb(3<<0, state->reg);
+		udelay(10);
+		writeb(3<<2, state->reg);	/* turn of buffer last */
+	} else {
+		writeb(2 << 2, state->reg);
+		udelay(10);
+
+		if (val == 0)
+			writeb(2, state->reg);
+		mdelay(1);
+	}
+
+	return 0;
+}
+
+static __init void disable_prog(unsigned long addr)
+{
+	void *reg;
+
+	reg = ioremap(addr, 1);
+
+	if (reg) {
+		writeb(0x04, reg);
+		iounmap(reg);
+	} else
+		printk(KERN_ERR "failed remap to un-set prog pin\n");
+}
+	
+
+
+static __init int vr2k_sbcd_spics_init(struct drv_state *state,
+				       struct sbcd_state *sbcd,
+				       struct sbcd_item *parent,
+				       struct sbcd_item *drv_it)
+{
+	struct sbcd_stack_item *sp = sbcd_stack_cur(sbcd);
+	struct sbcd_item *it;
+	struct sbcd_area *area;
+	struct sbcd_pinrange *pr;
+	resource_size_t start;
+	int level = 0;
+	int err;
+
+	printk(KERN_INFO "%s: stack %p\n", __func__, sp);
+
+	if (sp->dev == NULL) {
+		printk(KERN_ERR "parent item is not a device?\n");
+		return 1;
+	}
+	
+	for (it = sbcd_item_next(drv_it);
+	     level > 0 || (level == 0 && !sbcd_item_isend(it));
+	     it = sbcd_item_next(it)) {
+
+		if (1) {
+			printk("%s: checking %p (%02x) level %d\n",
+			       __FUNCTION__, it, it->hdr.type, level);
+		}
+
+		switch (it->hdr.type) {
+		case SBCD_TYPE_END:
+			level--;
+			break;
+
+		case SBCD_TYPE_AREA:
+			area = &it->u.area;
+
+			printk(KERN_INFO "%s: %p: area %08x..%08x, %02x\n",
+			       __FUNCTION__,
+			       area, area->start, area->end, area->shift);
+
+			err = sbcd_map_address(sbcd, area, &start, area->start);
+			if (err)
+				return err;
+
+			state->reg = ioremap(start, 1);
+
+			disable_prog(start+(0x100-0xa0));
+			break;
+
+		case SBCD_TYPE_PINRANGE:
+			pr = &it->u.pinrange;
+
+			printk(KERN_INFO "%s: attaching range %d..%d\n",
+			       __func__, pr->from.pin, pr->to.pin);
+
+			sbcd_gpio_register_dynamic(sp->dev, &state->drv,
+						   pr->from.pin, pr->to.pin);
+
+			break;
+		}
+
+		if (it->hdr.flags & SBCD_FLG_SUB)
+			level++;
+	}	
+
+	return 0;
+}
+
+
+static __init int vr2k_sbcd_spics_attach(struct sbcd_state *sbcd,
+					 struct sbcd_item *parent,
+					 struct sbcd_item *drv_it)
+{
+	struct drv_state *state;
+
+	state = kzalloc(sizeof(struct drv_state), GFP_KERNEL);
+	if (state == NULL) {
+		printk(KERN_ERR "no memory for new driver state\n");
+		return -ENOMEM;
+	}
+
+	state->drv.gpio_read = vr2k_sbcd_spics_gpio_read;
+	state->drv.gpio_write = vr2k_sbcd_spics_gpio_write;
+
+	return vr2k_sbcd_spics_init(state, sbcd, parent, drv_it);
+}
+
+sbcd_drv_decl2(gpio_simtec_p4, "vr2k-spi-cs", vr2k_sbcd_spics_attach);
diff -urNp linux-2.6.20/arch/arm/common/sbcd/s3c24xx/Makefile linux-2.6.20-s1t/arch/arm/common/sbcd/s3c24xx/Makefile
--- linux-2.6.20/arch/arm/common/sbcd/s3c24xx/Makefile	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/arch/arm/common/sbcd/s3c24xx/Makefile	2007-02-07 16:29:01.000000000 +0000
@@ -0,0 +1,22 @@
+# sbcd/s3c24xx/Makefile
+#
+# Copyright 2005 Simtec Electronics
+#
+# $Id: Makefile,v 1.11 2005/10/11 12:55:40 ben Exp $
+
+obj-y				+= s3c24xx.o
+
+# inbuilt devices
+
+obj-y				+= dev-adc.o
+obj-y				+= dev-i2c.o
+obj-y				+= dev-spi.o
+obj-y				+= dev-rtc.o
+obj-y				+= dev-wdt.o
+obj-y				+= dev-usb.o
+obj-y				+= dev-lcd.o
+obj-y				+= dev-uart.o
+obj-y				+= dev-gpioled.o
+
+# machine support
+obj-$(CONFIG_SBCD_IM2440D20)	+= im2440d20.o im2440d20-mach.o im2440d20-gpio.o
\ No newline at end of file
diff -urNp linux-2.6.20/arch/arm/common/sbcd/s3c24xx/dev-adc.c linux-2.6.20-s1t/arch/arm/common/sbcd/s3c24xx/dev-adc.c
--- linux-2.6.20/arch/arm/common/sbcd/s3c24xx/dev-adc.c	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/arch/arm/common/sbcd/s3c24xx/dev-adc.c	2007-02-07 16:29:01.000000000 +0000
@@ -0,0 +1,170 @@
+/* sbcd/kernel/linux/sbcd/s3c24xx/dev-adc.c
+ *
+ * Copyright 2005 Simtec Electronics
+ *
+ * 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.
+ *
+ * S3C24XX ADC driver
+*/
+
+#include <linux/kernel.h>
+#include <linux/ioport.h>
+#include <linux/device.h>
+
+#include "s3c24xx.h"
+#include <asm/mach/sbcd-utils.h>
+#include <asm/mach/sbcd-utils-opt.h>
+
+#include "../devices/platform.h"
+
+
+#include "../../../mach-s3c2410/devs.h"
+
+#include <asm/arch/adc.h>
+
+struct our_platdata {
+	struct s3c24xx_adc_platdata	data;
+};
+
+#define OPT_MULT		(1)
+#define OPT_DIVIDER		(2)
+#define OPT_MIN			(3)
+#define OPT_MAX			(4)
+
+static struct sbcd_util_opt __initdata adc_optlist[] = {
+	{
+		.name	= "multiplier",
+		.val	= OPT_MULT,
+	}, {
+		.name	= "divider",
+		.val	= OPT_DIVIDER,
+	}, {
+		.name	= "min",
+		.val	= OPT_MIN,
+	}, {
+		.name	= "max",
+		.val	= OPT_MAX,
+	}
+};
+
+static struct sbcd_util_opts __initdata adc_opts = {
+	.opts	= adc_optlist,
+	.size	= ARRAY_SIZE(adc_optlist),
+};
+
+/* we handle the adc channels in the same way we handle gpio */
+
+static int index;
+
+static __init int s3c24xx_drv_adc_add_pin(struct sbcd_state *state,
+					  struct sbcd_item *parent,
+					  struct our_platdata *pdata,
+					  struct sbcd_pininfo *pin)
+{
+	struct s3c24xx_adc_hwmon_incfg *cfg;
+	struct sbcd_util_opt *opt;
+	struct sbcd_item *ptr;
+	unsigned long channel;
+	char *optval;
+	char *optname;
+	long val;
+	int level;
+	int ret;
+
+	ret = sbcd_map_pin(state, &pin->pin, &channel);
+	if (ret)
+		return ret;
+
+	if (get_pin_type(channel) != PIN_TYPE_ADC) {
+		printk(KERN_ERR "not an adc capable pin\n");
+		return -EINVAL;
+	}
+
+	channel = get_pin_val(channel);
+
+	cfg = kzalloc(sizeof(struct s3c24xx_adc_hwmon_incfg), GFP_KERNEL);
+	if (cfg == NULL)
+		return -ENOMEM;
+
+	pdata->data.in[index++] = cfg;
+	cfg->channel = channel;
+	
+	sbcd_items_forallsub(parent, ptr, level) {
+		switch (ptr->hdr.type) {
+		case SBCD_TYPE_INFO:
+			opt =  sbcd_util_findopt(&adc_opts, ptr,
+						 &optname, &optval);
+
+			if (opt) {
+				val = simple_strtoul(optval, NULL, 0);
+
+				switch (opt->val) {
+
+				case OPT_MULT:
+					cfg->mult = val;
+					break;
+					
+				case OPT_DIVIDER:
+					cfg->div = val;
+					break;
+
+				case OPT_MIN:
+					cfg->min = val;
+					break;
+					
+				case OPT_MAX:
+					cfg->max = val;
+					break;
+				}
+			} else {
+				printk(KERN_ERR "%s: unknown opption %s\n",
+				       __FUNCTION__, optname);
+			}
+		}
+	}
+	
+	return 0;
+}
+
+static __init int s3c24xx_drv_adc_attach(struct sbcd_state *state,
+					 struct sbcd_item *parent,
+					 struct sbcd_item *drv_it)
+{
+	struct our_platdata *pdata;
+	struct platform_device *pdev;
+	struct sbcd_item *ptr;
+	int level;
+	int ret;
+
+	pdata = kzalloc(sizeof(*pdata), GFP_KERNEL);
+	if (pdata == NULL)
+		return -ENOMEM;
+
+	printk(KERN_INFO "%s: state %p, parent %p, it %p\n",
+	       __FUNCTION__, state, parent, drv_it);
+
+	sbcd_items_forallsub(parent, ptr, level) {
+		switch (ptr->hdr.type) {
+		case SBCD_TYPE_PIN:
+			ret = s3c24xx_drv_adc_add_pin(state, ptr, pdata,
+						      &ptr->u.pinuse.info);
+			if (ret)
+				goto err;
+
+			break;
+		}
+	}
+	
+	pdev = &s3c_device_adc;
+	pdev->dev.platform_data = &pdata->data;
+
+	return sbcd_add_platform_device(state, pdev);
+
+ err:
+	kfree(pdata);
+	return ret;
+}
+
+sbcd_drv_decl2(cpu_adc, "cpu-adc", s3c24xx_drv_adc_attach);
diff -urNp linux-2.6.20/arch/arm/common/sbcd/s3c24xx/dev-gpioled.c linux-2.6.20-s1t/arch/arm/common/sbcd/s3c24xx/dev-gpioled.c
--- linux-2.6.20/arch/arm/common/sbcd/s3c24xx/dev-gpioled.c	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/arch/arm/common/sbcd/s3c24xx/dev-gpioled.c	2007-02-07 16:29:01.000000000 +0000
@@ -0,0 +1,108 @@
+/* sbcd/kernel/linux/sbcd/s3c24xx/dev-gpioled.c
+ *
+ * Copyright 2005 Simtec Electronics
+ *
+ * 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.
+ *
+ * S3C24XX SBCD GPIO LED driver
+*/
+
+#include <linux/kernel.h>
+#include <linux/ioport.h>
+#include <linux/device.h>
+
+#include <asm/mach/sbcd.h>
+#include <asm/mach/sbcd-info.h>
+#include <asm/mach/sbcd-types.h>
+#include <asm/mach/sbcd-utils.h>
+#include <asm/mach/sbcd-os.h>
+#include <asm/mach/sbcd-utils-opt.h>
+
+#include "../devices/platform.h"
+
+#include "../../../mach-s3c2410/devs.h"
+
+#include <asm/arch/leds-gpio.h>
+
+struct our_platdata {
+	struct s3c24xx_led_platdata	data;
+	unsigned char			name[32];
+};
+
+static __init int s3c24xx_drv_gpioled_attach(struct sbcd_state *state,
+					     struct sbcd_item *parent,
+					     struct sbcd_item *drv_it)
+{
+	struct our_platdata *pdata;
+	struct platform_device *pdev;
+	struct sbcd_pininfo *pininf;
+	struct sbcd_item *ptr;
+	char *optname;
+	char *optval;
+	unsigned long res;
+	int level;
+	int ret;
+
+	pdata = kzalloc(sizeof(*pdata), GFP_KERNEL);
+	if (pdata == NULL)
+		return -ENOMEM;
+
+	printk(KERN_INFO "%s: state %p, parent %p, it %p\n",
+	       __FUNCTION__, state, parent, drv_it);
+
+	sbcd_items_forallsub(parent, ptr, level) {
+		switch (ptr->hdr.type) {
+		case SBCD_TYPE_PIN:
+			pininf = &ptr->u.pinuse.info;
+			
+			if (pininf->mode_on == PIN_MODE_LOW)
+				pdata->data.flags |= S3C24XX_LEDF_ACTLOW;
+
+			if (pininf->mode_off == PIN_MODE_TRISTATE)
+				pdata->data.flags |= S3C24XX_LEDF_TRISTATE;
+
+			ret = sbcd_map_pin(state, &pininf->pin,
+					   &res);
+			if (ret)
+				goto err;
+
+			pdata->data.gpio = res;
+			printk(KERN_INFO "%s: attached to gpio %d\n",
+			       __FUNCTION__, pdata->data.gpio);
+
+			break;
+
+		case SBCD_TYPE_INFO:
+			sbcd_get_optvals(ptr, &optname, &optval);
+
+			if (strcmp(optname, "name") == 0) {
+				strncpy(pdata->name, optval,
+					sizeof( pdata->name));
+		       
+				pdata->data.name = pdata->name;
+			}
+
+			break;
+		}
+	}
+
+	pdev = kzalloc(sizeof(struct platform_device), GFP_KERNEL);
+	if (pdev) {
+		pdev->name = "s3c24xx_led";
+	} else {
+		ret = -ENOMEM;
+		goto err;
+	}
+	
+	pdev->dev.platform_data = &pdata->data;
+
+	return sbcd_add_platform_device(state, pdev);
+
+ err:
+	kfree(pdata);
+	return ret;
+}
+
+sbcd_drv_decl2(cpu_gpioled, "gpio_led", s3c24xx_drv_gpioled_attach);
diff -urNp linux-2.6.20/arch/arm/common/sbcd/s3c24xx/dev-i2c.c linux-2.6.20-s1t/arch/arm/common/sbcd/s3c24xx/dev-i2c.c
--- linux-2.6.20/arch/arm/common/sbcd/s3c24xx/dev-i2c.c	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/arch/arm/common/sbcd/s3c24xx/dev-i2c.c	2007-02-07 16:29:01.000000000 +0000
@@ -0,0 +1,156 @@
+/* sbcd/kernel/linux/sbcd/s3c24xx/dev-i2c.c
+ *
+ * Copyright 2005 Simtec Electronics
+ *
+ * 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.
+ *
+ * S3C24XX SBCD I2C driver
+*/
+
+#include <linux/kernel.h>
+#include <linux/ioport.h>
+#include <linux/device.h>
+
+#include <asm/mach/sbcd.h>
+#include <asm/mach/sbcd-info.h>
+#include <asm/mach/sbcd-types.h>
+#include <asm/mach/sbcd-utils.h>
+#include <asm/mach/sbcd-os.h>
+#include <asm/mach/sbcd-utils-opt.h>
+
+#include <asm/arch/iic.h>
+
+#include "../../../mach-s3c2410/devs.h"
+
+
+#define OPT_SLAVE	(1)
+#define OPT_FREQ	(2)
+#define OPT_MAXFREQ	(3)
+#define OPT_MINFREQ	(4)
+#define OPT_SDADLY	(5)
+#define OPT_FILTER	(6)
+
+static struct sbcd_util_opt __initdata i2c_optlist[] = {
+	{
+		.name	= "slave",
+		.val	= OPT_SLAVE,
+	}, {
+		.name	= "freq",
+		.val	= OPT_FREQ,
+	}, {
+		.name	= "maxfreq",
+		.val	= OPT_MAXFREQ,
+	}, {
+		.name	= "sda-delay",
+		.val	= OPT_SDADLY,
+	}, {
+		.name	= "minfreq",
+		.val	= OPT_MINFREQ
+	}, {
+		.name	= "filter",
+		.val	= OPT_FILTER,
+	}
+};
+
+static struct sbcd_util_opts __initdata i2c_opts = {
+	.opts	= i2c_optlist,
+	.size	= ARRAY_SIZE(i2c_optlist),
+};
+
+static __init int s3c24xx_sbcd_i2cinfo(struct sbcd_state *state,
+				       struct sbcd_item *ptr)
+{
+	struct s3c2410_platform_i2c *pd;
+	struct sbcd_util_opt *opt;
+	char *optval;
+	char *optname;
+	long val;
+	
+	opt = sbcd_util_findopt(&i2c_opts, ptr, &optname, &optval);
+	if (opt) {
+		pd = s3c_device_i2c.dev.platform_data;
+
+		if (pd == NULL) {
+			pd = kzalloc(sizeof(struct s3c2410_platform_i2c),
+				     GFP_KERNEL);
+
+			if (pd == NULL) {
+				printk(KERN_ERR "no memory for "
+				       "`struct s3c2410_platform_i2c`\n");
+
+				return -ENOMEM;
+			}
+
+			s3c_device_i2c.dev.platform_data = pd;
+		}
+
+		val = simple_strtoul(optval, NULL, 0);
+
+		printk(KERN_DEBUG "item: %s, %ld\n", optname, val);
+
+		switch (opt->val) {
+		case OPT_SLAVE:
+			pd->slave_addr = val;
+			break;
+
+		case OPT_FREQ:
+			pd->bus_freq = val;
+			break;
+
+		case OPT_MAXFREQ:
+			pd->max_freq = val;
+			break;
+
+		case OPT_MINFREQ:
+			pd->min_freq = val;
+			break;
+
+		case OPT_SDADLY:
+			pd->sda_delay = val;
+			break;
+
+		case OPT_FILTER:
+			pd->flags |= S3C_IICFLG_FILTER;
+			break;
+		}
+
+	} else {
+		printk(KERN_ERR "sbcd: cpu-i2c: no such option '%s'\n",
+		       optname);
+	}
+
+	return 0;
+}
+
+static __init int s3c24xx_drv_i2c_attach(struct sbcd_state *state,
+					 struct sbcd_item *parent,
+					 struct sbcd_item *drv_it)
+{
+	struct sbcd_item *ptr;
+	int level;
+	int ret;
+
+	sbcd_items_forallsub(parent, ptr, level) {
+		switch (ptr->hdr.type) {
+		case SBCD_TYPE_INFO:
+			ret = s3c24xx_sbcd_i2cinfo(state, ptr);
+			if (ret)
+				return ret;
+			break;
+
+		case SBCD_TYPE_DRV:
+			break;
+
+		default:
+			printk(KERN_ERR "unknown item in cpu-i2c\n");
+			printk(KERN_ERR "item: %p: %d\n", ptr, ptr->hdr.type);
+			/* TODO - better print */
+		}
+	}
+
+	return 0;
+}
+
+sbcd_drv_decl2(cpu_i2c, "cpu-i2c", s3c24xx_drv_i2c_attach);
diff -urNp linux-2.6.20/arch/arm/common/sbcd/s3c24xx/dev-lcd.c linux-2.6.20-s1t/arch/arm/common/sbcd/s3c24xx/dev-lcd.c
--- linux-2.6.20/arch/arm/common/sbcd/s3c24xx/dev-lcd.c	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/arch/arm/common/sbcd/s3c24xx/dev-lcd.c	2007-02-07 16:29:01.000000000 +0000
@@ -0,0 +1,124 @@
+/* sbcd/kernel/linux/sbcd/s3c24xx/dev-lcd.c
+ *
+ * Copyright 2005 Simtec Electronics
+ *
+ * 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.
+ *
+ * S3C24XX SBCD LCD driver
+*/
+
+#include <linux/kernel.h>
+#include <linux/ioport.h>
+#include <linux/device.h>
+
+#include <asm/mach/sbcd.h>
+#include <asm/mach/sbcd-info.h>
+#include <asm/mach/sbcd-types.h>
+#include <asm/mach/sbcd-utils.h>
+#include <asm/mach/sbcd-os.h>
+#include <asm/mach/sbcd-utils-opt.h>
+
+#include <asm/arch/fb.h>
+
+#include "../devices/platform.h"
+
+#include "../../../mach-s3c2410/devs.h"
+
+#define OPT_PORTS	(1)
+
+static struct sbcd_util_opt __initdata lcd_optlist[] = {
+	{
+		.name	= "ports",
+		.val	= OPT_PORTS,
+	}
+};
+
+static struct sbcd_util_opts __initdata lcd_opts = {
+	.opts	= lcd_optlist,
+	.size	= ARRAY_SIZE(lcd_optlist),
+};
+
+static __init int s3c24xx_sbcd_lcdinfo(struct sbcd_state *state,
+				       struct sbcd_item *ptr)
+{
+	struct sbcd_util_opt *opt;
+	char *optval;
+	char *optname;
+	long val;
+	
+	opt = sbcd_util_findopt(&lcd_opts, ptr, &optname, &optval);
+	if (opt) {
+		val = simple_strtoul(optval, NULL, 0);
+
+		printk(KERN_DEBUG "item: %s, %ld\n", optname, val);
+
+		switch (opt->val) {
+		case OPT_PORTS:
+			/* TODO */
+			break;
+		}
+
+	} else {
+		printk(KERN_ERR "sbcd: cpu-lcd: no such option '%s'\n",
+		       optname);
+	}
+
+	return 0;
+}
+
+static __init int s3c24xx_drv_lcd_attach(struct sbcd_state *state,
+					 struct sbcd_item *parent,
+					 struct sbcd_item *drv_it)
+{
+	struct s3c2410fb_mach_info *fbinfo;
+	struct sbcd_item *ptr;
+	int level;
+	int ret;
+
+	fbinfo = kzalloc(sizeof(struct s3c2410fb_mach_info), GFP_KERNEL);
+	if (!fbinfo) {
+		printk(KERN_ERR "no memory for lcd platform data\n");
+		return -ENOMEM;
+	}
+
+	fbinfo->width = 640;
+	fbinfo->height = 480;
+
+	fbinfo->xres.min = 320;
+	fbinfo->xres.max = 800;
+	fbinfo->xres.defval = 640;
+
+	fbinfo->yres.min = 240;
+	fbinfo->yres.max = 600;
+	fbinfo->yres.defval = 480;
+
+	fbinfo->bpp.min = 1;
+	fbinfo->bpp.max = 16;
+	fbinfo->bpp.defval = 16;
+
+	s3c_device_lcd.dev.platform_data = fbinfo;
+
+	sbcd_items_forallsub(parent, ptr, level) {
+		switch (ptr->hdr.type) {
+		case SBCD_TYPE_INFO:
+			ret = s3c24xx_sbcd_lcdinfo(state, ptr);
+			if (ret)
+				return ret;
+			break;
+
+		case SBCD_TYPE_DRV:
+			break;
+
+		default:
+			printk(KERN_ERR "unknown item in cpu-lcd\n");
+			printk(KERN_ERR "item: %p: %d\n", ptr, ptr->hdr.type);
+			/* TODO - better print */
+		}
+	}
+
+	return sbcd_add_platform_device(state, &s3c_device_lcd);
+}
+
+sbcd_drv_decl2(cpu_lcd, "cpu-lcd", s3c24xx_drv_lcd_attach);
diff -urNp linux-2.6.20/arch/arm/common/sbcd/s3c24xx/dev-nand.c linux-2.6.20-s1t/arch/arm/common/sbcd/s3c24xx/dev-nand.c
--- linux-2.6.20/arch/arm/common/sbcd/s3c24xx/dev-nand.c	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/arch/arm/common/sbcd/s3c24xx/dev-nand.c	2007-02-07 16:29:01.000000000 +0000
@@ -0,0 +1,55 @@
+/* sbcd/kernel/linux/sbcd/s3c24xx/dev-nand.c
+ *
+ * Copyright 2005 Simtec Electronics
+ *
+ * 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.
+ *
+ * S3C24XX SBCD NAND driver
+*/
+
+#include <linux/kernel.h>
+#include <linux/ioport.h>
+#include <linux/device.h>
+
+#include <asm/mach/sbcd.h>
+#include <asm/mach/sbcd-info.h>
+#include <asm/mach/sbcd-types.h>
+#include <asm/mach/sbcd-utils.h>
+#include <asm/mach/sbcd-os.h>
+#include <asm/mach/sbcd-utils-opt.h>
+
+#include <asm/arch/iic.h>
+
+#include "../devices/platform.h"
+
+#include "../../../mach-s3c2410/devs.h"
+
+static __init int s3c24xx_drv_nand_attach(struct sbcd_state *state,
+					 struct sbcd_item *parent,
+					 struct sbcd_item *drv_it)
+{
+	struct sbcd_item *ptr;
+	int level;
+
+	sbcd_items_forallsub(parent, ptr, level) {
+		switch (ptr->hdr.type) {
+		case SBCD_TYPE_INFO:
+			break;
+
+		case SBCD_TYPE_DRV:
+			break;
+
+		default:
+			printk(KERN_ERR "unknown item in cpu-nand\n");
+			printk(KERN_ERR "item: %p: %d\n", ptr, ptr->hdr.type);
+			/* TODO - better print */
+		}
+	}
+
+	return 0;
+	//return sbcd_add_platform_device(state, &s3c_device_nand);
+}
+
+sbcd_drv_decl2(cpu_nand, "cpu-nand", s3c24xx_drv_nand_attach);
diff -urNp linux-2.6.20/arch/arm/common/sbcd/s3c24xx/dev-rtc.c linux-2.6.20-s1t/arch/arm/common/sbcd/s3c24xx/dev-rtc.c
--- linux-2.6.20/arch/arm/common/sbcd/s3c24xx/dev-rtc.c	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/arch/arm/common/sbcd/s3c24xx/dev-rtc.c	2007-02-07 16:29:01.000000000 +0000
@@ -0,0 +1,38 @@
+/* sbcd/kernel/linux/sbcd/s3c24xx/dev-rtc.c
+ *
+ * Copyright 2005 Simtec Electronics
+ *
+ * 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.
+ *
+ * S3C24XX SBCD RTC driver
+*/
+
+#include <linux/kernel.h>
+#include <linux/ioport.h>
+#include <linux/device.h>
+
+#include <asm/mach/sbcd.h>
+#include <asm/mach/sbcd-info.h>
+#include <asm/mach/sbcd-types.h>
+#include <asm/mach/sbcd-utils.h>
+#include <asm/mach/sbcd-os.h>
+#include <asm/mach/sbcd-utils-opt.h>
+
+#include <asm/arch/iic.h>
+
+#include "../devices/platform.h"
+
+
+#include "../../../mach-s3c2410/devs.h"
+
+
+static __init int s3c24xx_drv_rtc_attach(struct sbcd_state *state,
+					 struct sbcd_item *parent,
+					 struct sbcd_item *drv_it)
+{
+	return sbcd_add_platform_device(state, &s3c_device_rtc);
+}
+
+sbcd_drv_decl2(cpu_rtc, "cpu-rtc", s3c24xx_drv_rtc_attach);
diff -urNp linux-2.6.20/arch/arm/common/sbcd/s3c24xx/dev-spi.c linux-2.6.20-s1t/arch/arm/common/sbcd/s3c24xx/dev-spi.c
--- linux-2.6.20/arch/arm/common/sbcd/s3c24xx/dev-spi.c	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/arch/arm/common/sbcd/s3c24xx/dev-spi.c	2007-02-07 16:29:01.000000000 +0000
@@ -0,0 +1,187 @@
+/* sbcd/kernel/linux/sbcd/s3c24xx/dev-spi.c
+ *
+ * Copyright 2005 Simtec Electronics
+ *	Ben Dooks <ben@simtec.co.uk>
+ *
+ * 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.
+*/
+
+#include <linux/kernel.h>
+#include <linux/device.h>
+
+#include <asm/mach/sbcd.h>
+#include <asm/mach/sbcd-info.h>
+#include <asm/mach/sbcd-types.h>
+#include <asm/mach/sbcd-utils.h>
+#include <asm/mach/sbcd-os.h>
+#include <asm/mach/sbcd-gpio.h>
+
+#include <linux/spi/spi.h>
+#include <asm/arch/spi.h>
+
+#include "../devices/spi.h"
+#include "../../../mach-s3c2410/devs.h"
+
+struct s3c24xx_spi_child {
+	struct platform_device		*dev;
+	struct sbcd_gpiodrv_data	**cs;
+	struct sbcd_child_drv		 drv;
+	struct s3c2410_spi_info		 info;
+
+	unsigned long			 cs_size;
+};
+
+static inline struct s3c24xx_spi_child *to_my_child(struct sbcd_child_drv *d)
+{
+	return container_of(d, struct s3c24xx_spi_child, drv);
+}
+
+static inline struct s3c24xx_spi_child *info_to_child(struct s3c2410_spi_info *i)
+{
+	return container_of(i, struct s3c24xx_spi_child, info);
+}
+
+
+static int __init sbcd_karray_add_atend(void **data, unsigned long *size,
+					void *add, size_t elemsz)
+{
+	int cur_sz = *size;
+	void *op = *data;
+	void *dp;
+
+	dp = kmalloc((cur_sz + 1) * elemsz, GFP_KERNEL);
+	if (dp == NULL) {
+		printk(KERN_ERR "no memory to extend array\n");
+		return -ENOMEM;
+	}
+
+	*data = dp;
+
+	if (cur_sz > 0) {
+		memcpy(dp, op, cur_sz * elemsz);
+		dp += cur_sz * elemsz;
+		kfree(op);
+	}
+
+	*size = cur_sz + 1;
+
+	memcpy(dp, add, elemsz);
+	return 0;
+}
+
+static int __init s3c24xx_spi_add_child(struct sbcd_state *state,
+					struct sbcd_child_drv *drv,
+					struct sbcd_child_dev *dev)
+{
+	struct s3c24xx_spi_child *chd = to_my_child(drv);
+	int err;
+
+	printk(KERN_DEBUG "%s(%p,%p,%p)\n", __func__, state, drv, dev);
+
+	dev->data.spi.info->chip_select = chd->info.board_size;
+
+	err = sbcd_karray_add_atend((void **)&chd->info.board_info,
+				    &chd->info.board_size,
+				    dev->data.spi.info,
+				    sizeof(struct spi_board_info));
+
+
+	if (err) {
+		printk(KERN_ERR "cannot add to device array\n");
+		return err;
+	}
+
+	err = sbcd_karray_add_atend((void **)&chd->cs, &chd->cs_size,
+				    &dev->data.spi.cs,
+				    sizeof(struct sbcd_gpiodrv_data *));
+
+	if (err) {
+		printk(KERN_ERR "cannot add to device cs array\n");
+		return err;
+	}
+
+	return 0;
+}
+
+static void s3c24xx_drv_spi_setcs(struct s3c2410_spi_info *spi, int cs, int v)
+{
+	struct s3c24xx_spi_child *chd = info_to_child(spi);
+
+	sbcd_gpio_write(chd->cs[cs], v ? SBCD_GPIO_OFF: SBCD_GPIO_ON);
+}
+
+static __init void s3c24xx_drv_spi_add(struct sbcd_state *state,
+				       void *arg)
+{
+	struct s3c24xx_spi_child *child = arg;
+
+	platform_device_register(child->dev);
+
+	dev_info(&child->dev->dev, "%lu cs, %lu boards\n",
+		 child->cs_size, child->info.board_size);
+}
+
+static struct sbcd_info_dev *get_parent(struct sbcd_state *state)
+{
+	struct sbcd_stack_item *sp = sbcd_stack_cur(state);
+
+	if (sp->item->hdr.type == SBCD_TYPE_DEV)
+		return sp->dev;
+
+	return NULL;
+}
+
+static __init int s3c24xx_drv_spi_attach(struct sbcd_state *state,
+					 struct platform_device *pdev,
+					 struct sbcd_item *parent,
+					 struct sbcd_item *drv_it)
+{
+	struct s3c24xx_spi_child *child;
+	struct sbcd_info_dev *dev;
+
+	dev = get_parent(state);
+
+	if (dev == NULL) {
+		printk(KERN_ERR "%s: no device info\n", __func__);
+		return -ENOENT;
+	}
+
+	child = kzalloc(sizeof(struct s3c24xx_spi_child), GFP_KERNEL);
+	if (child == NULL) {
+		printk(KERN_ERR "no memory for spi child info\n");
+		return -ENOMEM;
+	}
+
+	child->drv.add_child = s3c24xx_spi_add_child;
+	child->drv.add_generic = sbcd_spi_generic_create;
+	child->info.set_cs = s3c24xx_drv_spi_setcs;
+	child->dev = pdev;
+
+	pdev->dev.platform_data = &child->info;
+	sbcd_run_atend(s3c24xx_drv_spi_add, child);
+
+	dev->child = &child->drv;
+
+	return 0;
+}
+
+/* we have two spi devices */
+
+static __init int s3c24xx_drv_spi0_attach(struct sbcd_state *state,
+					  struct sbcd_item *parent,
+					  struct sbcd_item *drv_it)
+{
+	return s3c24xx_drv_spi_attach(state, &s3c_device_spi0, parent, drv_it);
+}
+
+static __init int s3c24xx_drv_spi1_attach(struct sbcd_state *state,
+					  struct sbcd_item *parent,
+					  struct sbcd_item *drv_it)
+{
+	return s3c24xx_drv_spi_attach(state, &s3c_device_spi1, parent, drv_it);
+}
+
+sbcd_drv_decl2(cpu_spi0, "cpu-spi0", s3c24xx_drv_spi0_attach);
+sbcd_drv_decl2(cpu_spi1, "cpu-spi1", s3c24xx_drv_spi1_attach);
diff -urNp linux-2.6.20/arch/arm/common/sbcd/s3c24xx/dev-uart.c linux-2.6.20-s1t/arch/arm/common/sbcd/s3c24xx/dev-uart.c
--- linux-2.6.20/arch/arm/common/sbcd/s3c24xx/dev-uart.c	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/arch/arm/common/sbcd/s3c24xx/dev-uart.c	2007-02-07 16:29:01.000000000 +0000
@@ -0,0 +1,35 @@
+/* sbcd/kernel/linux/sbcd/s3c24xx/dev-uart.c
+ *
+ * Copyright 2005 Simtec Electronics
+ *
+ * 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.
+ *
+ * S3C24XX SBCD uart driver
+*/
+
+#include <linux/kernel.h>
+#include <linux/ioport.h>
+#include <linux/device.h>
+
+#include <asm/mach/sbcd.h>
+#include <asm/mach/sbcd-info.h>
+#include <asm/mach/sbcd-types.h>
+#include <asm/mach/sbcd-utils.h>
+#include <asm/mach/sbcd-os.h>
+#include <asm/mach/sbcd-utils-opt.h>
+
+#include "../devices/platform.h"
+
+#include "../../../mach-s3c2410/devs.h"
+
+
+static __init int s3c24xx_drv_uart_attach(struct sbcd_state *state,
+					 struct sbcd_item *parent,
+					 struct sbcd_item *drv_it)
+{
+	return sbcd_add_platform_device(state, NULL);
+}
+
+sbcd_drv_decl2(cpu_uart, "cpu-uart", s3c24xx_drv_uart_attach);
diff -urNp linux-2.6.20/arch/arm/common/sbcd/s3c24xx/dev-usb.c linux-2.6.20-s1t/arch/arm/common/sbcd/s3c24xx/dev-usb.c
--- linux-2.6.20/arch/arm/common/sbcd/s3c24xx/dev-usb.c	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/arch/arm/common/sbcd/s3c24xx/dev-usb.c	2007-02-07 16:29:01.000000000 +0000
@@ -0,0 +1,101 @@
+/* sbcd/kernel/linux/sbcd/s3c24xx/dev-usb.c
+ *
+ * Copyright 2005 Simtec Electronics
+ *
+ * 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.
+ *
+ * S3C24XX SBCD USB driver
+*/
+
+#include <linux/kernel.h>
+#include <linux/ioport.h>
+#include <linux/device.h>
+
+#include <asm/mach/sbcd.h>
+#include <asm/mach/sbcd-info.h>
+#include <asm/mach/sbcd-types.h>
+#include <asm/mach/sbcd-utils.h>
+#include <asm/mach/sbcd-os.h>
+#include <asm/mach/sbcd-utils-opt.h>
+
+#include <asm/arch/usb-control.h>
+
+#include "../devices/platform.h"
+
+#include "../../../mach-s3c2410/devs.h"
+
+
+#define OPT_PORTS	(1)
+
+static struct sbcd_util_opt __initdata usb_optlist[] = {
+	{
+		.name	= "ports",
+		.val	= OPT_PORTS,
+	}
+};
+
+static struct sbcd_util_opts __initdata usb_opts = {
+	.opts	= usb_optlist,
+	.size	= ARRAY_SIZE(usb_optlist),
+};
+
+static __init int s3c24xx_sbcd_usbinfo(struct sbcd_state *state,
+				       struct sbcd_item *ptr)
+{
+	struct sbcd_util_opt *opt;
+	char *optval;
+	char *optname;
+	long val;
+	
+	opt = sbcd_util_findopt(&usb_opts, ptr, &optname, &optval);
+	if (opt) {
+		val = simple_strtoul(optval, NULL, 0);
+
+		printk(KERN_DEBUG "item: %s, %ld\n", optname, val);
+
+		switch (opt->val) {
+		case OPT_PORTS:
+			/* TODO */
+			break;
+		}
+
+	} else {
+		printk(KERN_ERR "sbcd: cpu-usb: no such option '%s'\n",
+		       optname);
+	}
+
+	return 0;
+}
+
+static __init int s3c24xx_drv_usb_attach(struct sbcd_state *state,
+					 struct sbcd_item *parent,
+					 struct sbcd_item *drv_it)
+{
+	struct sbcd_item *ptr;
+	int level;
+	int ret;
+
+	sbcd_items_forallsub(parent, ptr, level) {
+		switch (ptr->hdr.type) {
+		case SBCD_TYPE_INFO:
+			ret = s3c24xx_sbcd_usbinfo(state, ptr);
+			if (ret)
+				return ret;
+			break;
+
+		case SBCD_TYPE_DRV:
+			break;
+
+		default:
+			printk(KERN_ERR "unknown item in cpu-usb\n");
+			printk(KERN_ERR "item: %p: %d\n", ptr, ptr->hdr.type);
+			/* TODO - better print */
+		}
+	}
+
+	return sbcd_add_platform_device(state, &s3c_device_usb);
+}
+
+sbcd_drv_decl2(cpu_usb, "cpu-usb", s3c24xx_drv_usb_attach);
diff -urNp linux-2.6.20/arch/arm/common/sbcd/s3c24xx/dev-wdog.c linux-2.6.20-s1t/arch/arm/common/sbcd/s3c24xx/dev-wdog.c
--- linux-2.6.20/arch/arm/common/sbcd/s3c24xx/dev-wdog.c	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/arch/arm/common/sbcd/s3c24xx/dev-wdog.c	2007-02-07 16:29:01.000000000 +0000
@@ -0,0 +1,38 @@
+/* sbcd/kernel/linux/sbcd/s3c24xx/dev-wdog.c
+ *
+ * Copyright 2005 Simtec Electronics
+ *
+ * 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.
+ *
+ * S3C24XX SBCD watchdog driver
+*/
+
+#include <linux/kernel.h>
+#include <linux/ioport.h>
+#include <linux/device.h>
+
+#include <asm/mach/sbcd.h>
+#include <asm/mach/sbcd-info.h>
+#include <asm/mach/sbcd-types.h>
+#include <asm/mach/sbcd-utils.h>
+#include <asm/mach/sbcd-os.h>
+#include <asm/mach/sbcd-utils-opt.h>
+
+#include <asm/arch/iic.h>
+
+#include "../devices/platform.h"
+
+
+#include "../../../mach-s3c2410/devs.h"
+
+
+static __init int s3c24xx_drv_wdog_attach(struct sbcd_state *state,
+					 struct sbcd_item *parent,
+					 struct sbcd_item *drv_it)
+{
+	return sbcd_add_platform_device(state, &s3c_device_watchdog);
+}
+
+sbcd_drv_decl2(cpu_wdog, "cpu-wdog", s3c24xx_drv_wdog_attach);
diff -urNp linux-2.6.20/arch/arm/common/sbcd/s3c24xx/dev-wdt.c linux-2.6.20-s1t/arch/arm/common/sbcd/s3c24xx/dev-wdt.c
--- linux-2.6.20/arch/arm/common/sbcd/s3c24xx/dev-wdt.c	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/arch/arm/common/sbcd/s3c24xx/dev-wdt.c	2007-02-07 16:29:01.000000000 +0000
@@ -0,0 +1,38 @@
+/* sbcd/kernel/linux/sbcd/s3c24xx/dev-wdt.c
+ *
+ * Copyright 2005 Simtec Electronics
+ *
+ * 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.
+ *
+ * S3C24XX SBCD watchdog driver
+*/
+
+#include <linux/kernel.h>
+#include <linux/ioport.h>
+#include <linux/device.h>
+
+#include <asm/mach/sbcd.h>
+#include <asm/mach/sbcd-info.h>
+#include <asm/mach/sbcd-types.h>
+#include <asm/mach/sbcd-utils.h>
+#include <asm/mach/sbcd-os.h>
+#include <asm/mach/sbcd-utils-opt.h>
+
+#include <asm/arch/iic.h>
+
+#include "../devices/platform.h"
+
+
+#include "../../../mach-s3c2410/devs.h"
+
+
+static __init int s3c24xx_drv_wdt_attach(struct sbcd_state *state,
+					 struct sbcd_item *parent,
+					 struct sbcd_item *drv_it)
+{
+	return sbcd_add_platform_device(state, &s3c_device_wdt);
+}
+
+sbcd_drv_decl2(cpu_wdt, "cpu-wdt", s3c24xx_drv_wdt_attach);
diff -urNp linux-2.6.20/arch/arm/common/sbcd/s3c24xx/im2440d20-gpio.c linux-2.6.20-s1t/arch/arm/common/sbcd/s3c24xx/im2440d20-gpio.c
--- linux-2.6.20/arch/arm/common/sbcd/s3c24xx/im2440d20-gpio.c	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/arch/arm/common/sbcd/s3c24xx/im2440d20-gpio.c	2007-02-07 16:29:01.000000000 +0000
@@ -0,0 +1,334 @@
+/* im2440d20-gpio.c
+ *
+ * Copyright 2005 Simtec Electronics
+ *
+ * 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.
+ *
+ * IM2440D20: SBCD GPIO
+*/
+
+#include "s3c24xx.h"
+#include "im2440d20-mach.h"
+
+struct sbcd_info_pin __initdata im2440d20_gpio_pins[] = {
+	{
+		.pin	= 64,
+		.val	= DEFINE_PIN(A,1),
+	}, {
+		.pin	= 66,
+		.val	= DEFINE_PIN(A,2),
+	}, {
+		.pin	= 68,
+		.val	= DEFINE_PIN(A,3),
+	}, {
+		.pin	= 70,
+		.val	= DEFINE_PIN(A,4),
+	}, {
+		.pin	= 72,
+		.val	= DEFINE_PIN(A,5),
+	}, {
+		.pin	= 74,
+		.val	= DEFINE_PIN(A,6),
+	}, {
+		.pin	= 76,
+		.val	= DEFINE_PIN(A,7),
+	}, {
+		.pin	= 78,
+		.val	= DEFINE_PIN(A,8),
+	}, {
+		.pin	= 80,
+		.val	= DEFINE_PIN(A,9),
+	}, {
+		.pin	= 82,
+		.val	= DEFINE_PIN(A,10),
+	}, {
+		.pin	= 84,
+		.val	= DEFINE_PIN(A,11),
+	}, {
+		.pin	= 88,
+		.val	= DEFINE_PIN(B,0),
+	}, {
+		.pin	= 90,
+		.val	= DEFINE_PIN(B,1),
+	}, {
+		.pin	= 92,
+		.val	= DEFINE_PIN(B,2),
+	}, {
+		.pin	= 94,
+		.val	= DEFINE_PIN(B,3),
+	}, {
+		.pin	= 86,
+		.val	= DEFINE_PIN(B,4),
+	}, {
+		.pin	= 96,
+		.val	= DEFINE_PIN(B,7),
+	}, {
+		.pin	= 98,
+		.val	= DEFINE_PIN(B,8),
+	}, {
+		.pin	= 93,
+		.val	= DEFINE_PIN(B,9),
+	}, {
+		.pin	= 95,
+		.val	= DEFINE_PIN(B,10),
+	}, {
+		.pin	= 131,
+		.val	= DEFINE_PIN(C,0),
+	}, {
+		.pin	= 133,
+		.val	= DEFINE_PIN(C,1),
+	}, {
+		.pin	= 135,
+		.val	= DEFINE_PIN(C,2),
+	}, {
+		.pin	= 137,
+		.val	= DEFINE_PIN(C,3),
+	}, {
+		.pin	= 139,
+		.val	= DEFINE_PIN(C,4),
+	}, {
+		.pin	= 141,
+		.val	= DEFINE_PIN(C,8),
+	}, {
+		.pin	= 143,
+		.val	= DEFINE_PIN(C,9),
+	}, {
+		.pin	= 145,
+		.val	= DEFINE_PIN(C,10),
+	}, {
+		.pin	= 147,
+		.val	= DEFINE_PIN(C,11),
+	}, {
+		.pin	= 149,
+		.val	= DEFINE_PIN(C,12),
+	}, {
+		.pin	= 151,
+		.val	= DEFINE_PIN(C,13),
+	}, {
+		.pin	= 153,
+		.val	= DEFINE_PIN(C,14),
+	}, {
+		.pin	= 155,
+		.val	= DEFINE_PIN(C,15),
+	}, {
+		.pin	= 157,
+		.val	= DEFINE_PIN(D,0),
+	}, {
+		.pin	= 159,
+		.val	= DEFINE_PIN(D,1),
+	}, {
+		.pin	= 161,
+		.val	= DEFINE_PIN(D,2),
+	}, {
+		.pin	= 163,
+		.val	= DEFINE_PIN(D,3),
+	}, {
+		.pin	= 165,
+		.val	= DEFINE_PIN(D,4),
+	}, {
+		.pin	= 167,
+		.val	= DEFINE_PIN(D,5),
+	}, {
+		.pin	= 169,
+		.val	= DEFINE_PIN(D,6),
+	}, {
+		.pin	= 171,
+		.val	= DEFINE_PIN(D,7),
+	}, {
+		.pin	= 173,
+		.val	= DEFINE_PIN(D,8),
+	}, {
+		.pin	= 175,
+		.val	= DEFINE_PIN(D,9),
+	}, {
+		.pin	= 177,
+		.val	= DEFINE_PIN(D,10),
+	}, {
+		.pin	= 179,
+		.val	= DEFINE_PIN(D,11),
+	}, {
+		.pin	= 181,
+		.val	= DEFINE_PIN(D,12),
+	}, {
+		.pin	= 183,
+		.val	= DEFINE_PIN(D,13),
+	}, {
+		.pin	= 185,
+		.val	= DEFINE_PIN(D,14),
+	}, {
+		.pin	= 187,
+		.val	= DEFINE_PIN(D,15),
+	}, {
+		.pin	= 97,
+		.val	= DEFINE_PIN(E,0),
+	}, {
+		.pin	= 99,
+		.val	= DEFINE_PIN(E,1),
+	}, {
+		.pin	= 101,
+		.val	= DEFINE_PIN(E,2),
+	}, {
+		.pin	= 103,
+		.val	= DEFINE_PIN(E,3),
+	}, {
+		.pin	= 105,
+		.val	= DEFINE_PIN(E,4),
+	}, {
+		.pin	= 107,
+		.val	= DEFINE_PIN(E,5),
+	}, {
+		.pin	= 109,
+		.val	= DEFINE_PIN(E,6),
+	}, {
+		.pin	= 111,
+		.val	= DEFINE_PIN(E,7),
+	}, {
+		.pin	= 113,
+		.val	= DEFINE_PIN(E,8),
+	}, {
+		.pin	= 115,
+		.val	= DEFINE_PIN(E,9),
+	}, {
+		.pin	= 117,
+		.val	= DEFINE_PIN(E,10),
+	}, {
+		.pin	= 119,
+		.val	= DEFINE_PIN(E,11),
+	}, {
+		.pin	= 121,
+		.val	= DEFINE_PIN(E,12),
+	}, {
+		.pin	= 123,
+		.val	= DEFINE_PIN(E,13),
+	}, {
+		.pin	= 125,
+		.val	= DEFINE_PIN(E,14),
+	}, {
+		.pin	= 127,
+		.val	= DEFINE_PIN(E,15),
+	}, {
+		.pin	= 100,
+		.val	= DEFINE_PIN(F,0),
+	}, {
+		.pin	= 102,
+		.val	= DEFINE_PIN(F,1),
+	}, {
+		.pin	= 104,
+		.val	= DEFINE_PIN(F,2),
+	}, {
+		.pin	= 106,
+		.val	= DEFINE_PIN(F,3),
+	}, {
+		.pin	= 108,
+		.val	= DEFINE_PIN(F,4),
+	}, {
+		.pin	= 110,
+		.val	= DEFINE_PIN(F,5),
+	}, {
+		.pin	= 112,
+		.val	= DEFINE_PIN(F,6),
+	}, {
+		.pin	= 114,
+		.val	= DEFINE_PIN(F,7),
+	}, {
+		.pin	= 116,
+		.val	= DEFINE_PIN(G,0),
+	}, {
+		.pin	= 118,
+		.val	= DEFINE_PIN(G,1),
+	}, {
+		.pin	= 120,
+		.val	= DEFINE_PIN(G,2),
+	}, {
+		.pin	= 122,
+		.val	= DEFINE_PIN(G,3),
+	}, {
+		.pin	= 124,
+		.val	= DEFINE_PIN(G,4),
+	}, {
+		.pin	= 126,
+		.val	= DEFINE_PIN(G,5),
+	}, {
+		.pin	= 128,
+		.val	= DEFINE_PIN(G,6),
+	}, {
+		.pin	= 130,
+		.val	= DEFINE_PIN(G,7),
+	}, {
+		.pin	= 132,
+		.val	= DEFINE_PIN(G,8),
+	}, {
+		.pin	= 134,
+		.val	= DEFINE_PIN(G,9),
+	}, {
+		.pin	= 136,
+		.val	= DEFINE_PIN(G,10),
+	}, {
+		.pin	= 138,
+		.val	= DEFINE_PIN(G,11),
+	}, {
+		.pin	= 140,
+		.val	= DEFINE_PIN(G,12),
+	}, {
+		.pin	= 142,
+		.val	= DEFINE_PIN(G,13),
+	}, {
+		.pin	= 140,
+		.val	= DEFINE_PIN(H,0),
+	}, {
+		.pin	= 142,
+		.val	= DEFINE_PIN(H,1),
+	}, {
+		.pin	= 144,
+		.val	= DEFINE_PIN(G,2),
+	}, {
+		.pin	= 146,
+		.val	= DEFINE_PIN(G,3),
+	}, {
+		.pin	= 148,
+		.val	= DEFINE_PIN(G,4),
+	}, {
+		.pin	= 150,
+		.val	= DEFINE_PIN(G,5),
+	}, {
+		.pin	= 152,
+		.val	= DEFINE_PIN(H,7),
+	}, {
+		.pin	= 154,
+		.val	= DEFINE_PIN(G,8),
+	} , {
+		.pin	= 160,
+		.val	= DEFINE_ADC(0),
+	}, {
+		.pin	= 162,
+		.val	= DEFINE_ADC(1),
+	}, {
+		.pin	= 164,
+		.val	= DEFINE_ADC(2),
+	}, {
+		.pin	= 166,
+		.val	= DEFINE_ADC(3),
+	}, {
+		.pin	= 168,
+		.val	= DEFINE_ADC(4),
+	}, {
+		.pin	= 170,
+		.val	= DEFINE_ADC(5),
+	}, {
+		.pin	= 172,
+		.val	= DEFINE_ADC(6),
+	}, {
+		.pin	= 174,
+		.val	= DEFINE_ADC(7),
+	}
+};
+
+struct sbcd_info_gpio __initdata im2440d20_gpio = {
+	.pins	= im2440d20_gpio_pins,
+	.max	= ARRAY_SIZE(im2440d20_gpio_pins),
+};
+
+/* end */
+
diff -urNp linux-2.6.20/arch/arm/common/sbcd/s3c24xx/im2440d20-mach.c linux-2.6.20-s1t/arch/arm/common/sbcd/s3c24xx/im2440d20-mach.c
--- linux-2.6.20/arch/arm/common/sbcd/s3c24xx/im2440d20-mach.c	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/arch/arm/common/sbcd/s3c24xx/im2440d20-mach.c	2007-02-07 16:29:01.000000000 +0000
@@ -0,0 +1,61 @@
+/* kernel/common/s3c24xx/mach-im2440d20.c
+ *
+ * Copyright 2005 Simtec Electronics
+ *
+ * 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.
+ *
+ * Machine data for Simtec IM2440D20
+*/
+
+#include "s3c24xx.h"
+#include "im2440d20-mach.h"
+
+#include "../../../mach-s3c2410/devs.h"
+
+static struct sbcd_info_pin __initdata im2440d20_cs_pins[] = {
+	{
+		.pin	= 52,
+		.val	= 0x08000000,
+	}, {
+		.pin	= 54,
+		.val	= 0x10000000,
+	}, {
+		.pin	= 56,
+		.val	= 0x18000000,
+	}, {
+		.pin	= 58,
+		.val	= 0x20000000,
+	}, {
+		.pin	= 60,
+		.val	= 0x28000000,
+	}
+};
+
+static struct sbcd_info_cs __initdata im2440d20_cs = {
+	.pins	= im2440d20_cs_pins,
+	.max	= ARRAY_SIZE(im2440d20_cs_pins),
+};
+
+static struct platform_device __initdata *im2440d20_default_devs[] = {
+	&s3c_device_usb,
+	&s3c_device_wdt,
+	&s3c_device_rtc,
+	&s3c_device_sdi,
+};
+
+struct sbcd_decl_dev im2440d20_decl = {
+	.name		= "cpu",
+};
+
+struct sbcd_info_dev __initdata im2440d20_mach = {
+	.cs		= &im2440d20_cs,
+	.decl		= &im2440d20_decl,
+	.gpio		= &im2440d20_gpio,
+	.map_irq	= sbcd_s3c24xx_map_irq,
+	.init_irq	= sbcd_s3c24xx_init_irq,
+	.get_gpio	= sbcd_s3c24xx_get_gpio,
+	.default_dev	= im2440d20_default_devs,
+	.default_size	= ARRAY_SIZE(im2440d20_default_devs),
+};
diff -urNp linux-2.6.20/arch/arm/common/sbcd/s3c24xx/im2440d20-mach.h linux-2.6.20-s1t/arch/arm/common/sbcd/s3c24xx/im2440d20-mach.h
--- linux-2.6.20/arch/arm/common/sbcd/s3c24xx/im2440d20-mach.h	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/arch/arm/common/sbcd/s3c24xx/im2440d20-mach.h	2007-02-07 16:29:01.000000000 +0000
@@ -0,0 +1,13 @@
+/* sbcd/s3c24xx/im2440d20-mach.h
+ *
+ * Copyright 2005 Simtec Electronics
+ *
+ * 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.
+ *
+ * IM2440D20: SBCD machine data
+*/
+
+extern struct sbcd_info_gpio im2440d20_gpio;
+extern struct sbcd_info_dev  im2440d20_mach;
diff -urNp linux-2.6.20/arch/arm/common/sbcd/s3c24xx/im2440d20.c linux-2.6.20-s1t/arch/arm/common/sbcd/s3c24xx/im2440d20.c
--- linux-2.6.20/arch/arm/common/sbcd/s3c24xx/im2440d20.c	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/arch/arm/common/sbcd/s3c24xx/im2440d20.c	2007-02-07 16:29:01.000000000 +0000
@@ -0,0 +1,26 @@
+/* sbcd/s3c24xx/im2440d20.c
+ *
+ * Copyright 2005 Simtec Electronics
+ *
+ * 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.
+ *
+ * IM2440D20: SBCD machine data
+*/
+
+#include "s3c24xx.h"
+#include "im2440d20-mach.h"
+
+#include <asm/mach-types.h>
+
+static int __init s3c24xx_im2440d20_init(void)
+{
+	if (machine_is_osiris() || machine_is_bast()) {
+		return sbcd_init_board(&im2440d20_mach);
+	}
+
+	return 0;
+}
+
+core_initcall(s3c24xx_im2440d20_init);
diff -urNp linux-2.6.20/arch/arm/common/sbcd/s3c24xx/s3c24xx.c linux-2.6.20-s1t/arch/arm/common/sbcd/s3c24xx/s3c24xx.c
--- linux-2.6.20/arch/arm/common/sbcd/s3c24xx/s3c24xx.c	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/arch/arm/common/sbcd/s3c24xx/s3c24xx.c	2007-02-07 16:29:01.000000000 +0000
@@ -0,0 +1,83 @@
+/* sbcd/s3c24xx/s3c24xx.c
+ *
+ * Copyright 2005 Simtec Electronics
+ *
+ * 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.
+ *
+ * SBCD support for S3C24XX
+*/
+
+#include "s3c24xx.h"
+
+#include <linux/errno.h>
+#include <linux/ioport.h>
+#include <linux/device.h>
+
+#include <asm/arch/hardware.h>
+
+int __init sbcd_s3c24xx_init_irq(struct sbcd_state *state,
+				 struct sbcd_irq *irq,
+				 struct resource *res)
+{
+	return 0;
+}
+
+int __init sbcd_s3c24xx_map_irq(struct sbcd_state *state,
+				struct sbcd_info_pin *gpio,
+				struct resource *irq)
+{
+	int val;
+
+	if (state == NULL || irq == NULL || gpio == NULL)
+		return -EINVAL;
+
+	val = s3c2410_gpio_getirq(gpio->val);
+	if (val >= 0) {
+		irq->start = irq->end = val;
+		return 0;
+	}
+
+	return -ENOENT;
+}
+
+static int sbcd_s3c24xx_gpio_read(struct sbcd_gpiodrv_data *data)
+{
+	return s3c2410_gpio_getpin(data->val);
+}
+
+static int sbcd_s3c24xx_gpio_write(struct sbcd_gpiodrv_data *data,
+				   int to)
+{
+	unsigned int pull = sbcd_gpio_getpull(to);
+	unsigned int value = sbcd_gpio_getvalue(to);
+
+	switch (sbcd_gpio_getmode(to)) {
+	case SBCD_GPIODRV_OUTPUT:
+		s3c2410_gpio_cfgpin(data->val, S3C2410_GPIO_OUTPUT);
+		s3c2410_gpio_setpin(data->val, value);
+		s3c2410_gpio_pullup(data->val, 0);
+		break;
+
+	case SBCD_GPIODRV_INPUT:
+	case SBCD_GPIODRV_TRISTATE:
+		s3c2410_gpio_pullup(data->val,
+				    (pull == SBCD_GPIODRV_PULL_UP) ? 0 : 1);
+		s3c2410_gpio_cfgpin(data->val, S3C2410_GPIO_INPUT);
+		break;
+	}
+
+	return 0;
+}
+
+static struct sbcd_gpio_drv s3c24xx_gpio_drv = {
+	.gpio_write	= sbcd_s3c24xx_gpio_write,
+	.gpio_read	= sbcd_s3c24xx_gpio_read,
+};
+	
+struct sbcd_gpio_drv *sbcd_s3c24xx_get_gpio(struct sbcd_state *state,
+					    struct sbcd_info_pin *gpio)
+{
+	return &s3c24xx_gpio_drv;
+}
diff -urNp linux-2.6.20/arch/arm/common/sbcd/s3c24xx/s3c24xx.h linux-2.6.20-s1t/arch/arm/common/sbcd/s3c24xx/s3c24xx.h
--- linux-2.6.20/arch/arm/common/sbcd/s3c24xx/s3c24xx.h	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/arch/arm/common/sbcd/s3c24xx/s3c24xx.h	2007-02-07 16:29:01.000000000 +0000
@@ -0,0 +1,44 @@
+/* sbcd/s3c24xx/s3c24xx.h
+ *
+ * Copyright 2005 Simtec Electronics
+ *
+ * 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.
+*/
+
+#include <linux/kernel.h>
+#include <linux/stddef.h>
+#include <linux/string.h>
+#include <linux/init.h>
+
+#include <asm/mach/sbcd.h>
+#include <asm/mach/sbcd-types.h>
+#include <asm/mach/sbcd-info.h>
+#include <asm/mach/sbcd-os.h>
+#include <asm/mach/sbcd-gpio.h>
+
+#include <asm/arch/regs-gpio.h>
+
+/* gpio support */
+
+#define PIN_TYPE_GPIO		(0x0 << 28)
+#define PIN_TYPE_ADC		(0x1 << 28)
+
+#define get_pin_type(p) ((p) & (0xf << 28))
+#define get_pin_val(p)  ((p) & ~(0xf << 28))
+
+#define DEFINE_PIN(bank, pin) S3C2410_GP##bank##pin
+
+#define DEFINE_ADC(adc)	(PIN_TYPE_ADC | (adc))
+
+extern int sbcd_s3c24xx_map_irq(struct sbcd_state *state,
+				struct sbcd_info_pin *gpio,
+				struct resource *irq);
+
+extern int sbcd_s3c24xx_init_irq(struct sbcd_state *state,
+				 struct sbcd_irq *irq,
+				 struct resource *res);
+
+extern struct sbcd_gpio_drv *sbcd_s3c24xx_get_gpio(struct sbcd_state *state,
+						   struct sbcd_info_pin *gpio);
diff -urNp linux-2.6.20/arch/arm/common/sbcd/sbcd-gpio.c linux-2.6.20-s1t/arch/arm/common/sbcd/sbcd-gpio.c
--- linux-2.6.20/arch/arm/common/sbcd/sbcd-gpio.c	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/arch/arm/common/sbcd/sbcd-gpio.c	2007-02-07 16:29:01.000000000 +0000
@@ -0,0 +1,128 @@
+/* arch/arm/common/sbcd/sbcd.c
+ *
+ * Copyright 2007 Simtec Electronics
+ *
+ * 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.
+ *
+ * SBCD core GPIO
+*/
+
+#include <linux/kernel.h>
+#include <linux/string.h>
+
+#include <asm/mach/sbcd.h>
+#include <asm/mach/sbcd-types.h>
+#include <asm/mach/sbcd-info.h>
+#include <asm/mach/sbcd-os.h>
+#include <asm/mach/sbcd-gpio.h>
+
+int sbcd_gpio_register_dynamic(struct sbcd_info_dev *dev,
+			       struct sbcd_gpio_drv *drv,
+			       unsigned int from,
+			       unsigned int to)
+{
+	struct sbcd_dyn_gpio *dyn;
+
+	printk(KERN_DEBUG "registering dynamic gpio for %p (%s) %d..%d\n",
+	       dev, dev->decl->name, from, to);
+
+	dyn = kzalloc(sizeof(struct sbcd_dyn_gpio), GFP_KERNEL);
+	if (dyn == NULL) {
+		printk(KERN_ERR "no memory to register dynamic gpio\n");
+		return -ENOMEM;
+	}
+
+	dyn->start = from;
+	dyn->end = to;
+	dyn->drv = drv;
+
+	dyn->next = dev->dyn_gpio;
+	dev->dyn_gpio = dyn;
+
+	return 0;
+}
+
+struct sbcd_dyn_gpio *sbcd_gpio_getdynamic(struct sbcd_info_dev *dev,
+					   unsigned int pin)
+{
+	struct sbcd_dyn_gpio *dyn;
+	struct sbcd_dyn_gpio *res = NULL;
+
+	for (dyn = dev->dyn_gpio; dyn != NULL; dyn = dyn->next) {
+		printk(KERN_INFO "%s: %d checking %p (%d..%d)\n",
+		       __func__, pin, dyn, dyn->start, dyn->end);
+
+		if (pin >= dyn->start && pin <= dyn->end) {
+			res = dyn;
+			break;
+		}
+	}
+
+	return res;
+}
+
+int sbcd_gpio_read(struct sbcd_gpiodrv_data *data)
+{
+	int ret = (data->drv->gpio_read)(data) ? 1 : 0;
+
+	if (data->pinuse.info.flags & PIN_FLG_INPUT_INVERT)
+		ret ^= 1;
+
+	return ret;
+}
+
+int sbcd_gpio_write(struct sbcd_gpiodrv_data *data, int to)
+{
+	unsigned int mode = 0;
+	unsigned int set = 0;
+
+	switch (to) {
+	case SBCD_GPIO_OFF:
+		mode = data->pinuse.info.mode_off;
+		break;
+	case SBCD_GPIO_ON:
+		mode = data->pinuse.info.mode_on;
+		break;
+	case SBCD_GPIO_UNUSED:
+		mode = data->pinuse.info.mode_unused;
+		break;
+
+	case SBCD_GPIO_INPUT:
+		set |= SBCD_GPIODRV_INPUT;
+	case SBCD_GPIO_TRISTATE:
+		mode = PIN_MODE_TRISTATE;
+
+		switch (data->pinuse.info.mode_resistor) {
+		case PIN_MODE_LOW:
+			set |= SBCD_GPIODRV_PULL_DOWN;
+			break;
+		case PIN_MODE_HIGH:
+			set |= SBCD_GPIODRV_PULL_DOWN;
+			break;
+		case PIN_MODE_TRISTATE:
+		case PIN_MODE_NONE:
+			set |= SBCD_GPIODRV_PULL_NONE;
+			break;
+		}
+	}
+
+	switch (mode) {
+	case PIN_MODE_LOW:
+		set |= SBCD_GPIODRV_OUTPUT | SBCD_GPIODRV_VALUE(0);
+		break;
+	case PIN_MODE_HIGH:
+		set |= SBCD_GPIODRV_OUTPUT | SBCD_GPIODRV_VALUE(1);
+		break;
+	case PIN_MODE_TRISTATE:
+		set |= SBCD_GPIODRV_TRISTATE;
+		break;
+
+	case PIN_MODE_NONE:
+		printk(KERN_ERR "pin does not have a mode set?\n");
+		return -EINVAL;
+	}
+
+	return (data->drv->gpio_write)(data, set);
+}
diff -urNp linux-2.6.20/arch/arm/common/sbcd/sbcd-main.h linux-2.6.20-s1t/arch/arm/common/sbcd/sbcd-main.h
--- linux-2.6.20/arch/arm/common/sbcd/sbcd-main.h	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/arch/arm/common/sbcd/sbcd-main.h	2007-02-07 16:29:01.000000000 +0000
@@ -0,0 +1,10 @@
+/* arch/arm/common/sbcd/sbcd-main.h
+ *
+ * Copyright 2005 Simtec Electronics
+ *
+ * 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.
+*/
+
+extern int sbcd_config(struct sbcd_header *hdr, int len);
diff -urNp linux-2.6.20/arch/arm/common/sbcd/sbcd-tag.c linux-2.6.20-s1t/arch/arm/common/sbcd/sbcd-tag.c
--- linux-2.6.20/arch/arm/common/sbcd/sbcd-tag.c	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/arch/arm/common/sbcd/sbcd-tag.c	2007-02-07 16:29:01.000000000 +0000
@@ -0,0 +1,47 @@
+/* arch/arm/common/sbcd/sbcd-tag.c
+ *
+ * Copyright 2005 Simtec Electronics
+ *
+ * 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.
+*/
+
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/stddef.h>
+
+#include <asm/setup.h>
+
+#include <asm/mach/sbcd.h>
+#include <asm/mach/sbcd-types.h>
+#include <asm/mach/sbcd-utils.h>
+
+#include "sbcd-main.h"
+
+static int __init parse_tag_sbcd(const struct tag *tag)
+{
+	struct tag_sbcd *sbcd = (struct tag_sbcd *)&tag->u;
+	struct sbcd_header *hdr;
+
+	printk(KERN_INFO "sbcd: Simtec Board Configuration Data"
+	       "Copyright 2005 Simtec Electronics\n");
+
+	printk(KERN_INFO "sbcd[%p]: data at %08lx, %ld bytes\n",
+	       sbcd, sbcd->sbcd_data, sbcd->sbcd_len);
+
+	hdr = (struct sbcd_header *)phys_to_virt(sbcd->sbcd_data);
+
+	printk(KERN_INFO "sbcd[%p] - data at %p\n", sbcd, hdr);
+
+	if (le32_to_cpu(hdr->magic) != SBCD_HDR_MAGIC) {
+		printk("sbcd: header magic is corrupt (%08x)\n",
+		       le32_to_cpu(hdr->magic));
+		return 0;
+	}
+
+	sbcd_config(hdr, sbcd->sbcd_len);
+	return 0;
+}
+
+__tagtable(ATAG_SBCD, parse_tag_sbcd);
diff -urNp linux-2.6.20/arch/arm/common/sbcd/sbcd.c linux-2.6.20-s1t/arch/arm/common/sbcd/sbcd.c
--- linux-2.6.20/arch/arm/common/sbcd/sbcd.c	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/arch/arm/common/sbcd/sbcd.c	2007-02-07 16:29:01.000000000 +0000
@@ -0,0 +1,426 @@
+/* arch/arm/common/sbcd/sbcd.c
+ *
+ * Copyright 2005 Simtec Electronics
+ *
+ * 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.
+ *
+ * SBCD core
+*/
+
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/stddef.h>
+#include <linux/bootmem.h>
+
+#include <asm/mach/sbcd.h>
+#include <asm/mach/sbcd-types.h>
+#include <asm/mach/sbcd-utils.h>
+#include <asm/mach/sbcd-info.h>
+#include <asm/mach/sbcd-os.h>
+
+#include "sbcd-main.h"
+
+static struct sbcd_header *sbcd_hdr;
+
+static inline char *drv_name(struct sbcd_drv *drv)
+{
+	return sbcd_get_str(drv, drv->name_offset);
+}
+
+static inline char *sbcd_dev_name(struct sbcd_dev *dev)
+{
+	return sbcd_get_str(dev, dev->name_offset);
+}
+
+struct sbcd_atend_item {
+	struct sbcd_atend_item	*next;
+	void			(*fn)(struct sbcd_state *state, void *arg);
+	void			*arg;
+};
+
+static struct sbcd_atend_item *end_list;
+
+void sbcd_run_atend(void (*fn)(struct sbcd_state *state, void *arg), void *arg)
+{
+	struct sbcd_atend_item *item;
+
+	item = kzalloc(sizeof(struct sbcd_atend_item), GFP_KERNEL);
+	if (item) {
+		item->next = end_list;
+		item->fn = fn;
+		item->arg = arg;
+		end_list = item;
+	}
+}
+
+void sbcd_do_atend(struct sbcd_state *state)
+{
+	struct sbcd_atend_item *ptr = end_list;
+
+	for (; ptr != NULL; ptr = ptr->next) {
+		(ptr->fn)(state, ptr->arg);
+	}
+}
+
+int sbcd_board_has_driver(const char *name)
+{
+	struct sbcd_item *item, *st;
+	int index = 0;
+
+	if (sbcd_hdr == NULL)
+		return 0;
+
+	st = sbcd_item_first(sbcd_hdr);
+
+	for (index = 0;; index++) {
+		item = sbcd_item_find(st, index, SBCD_TYPE_DRV, FIND_FLG_SUB);
+
+		if (item == NULL)
+			return 0;
+
+		if (strcmp(drv_name(&item->u.drv), name) == 0)
+			break;
+	}
+
+	return 1;
+}
+
+
+static inline int ptr_offset(void *a, void *b)
+{
+	return a - b;
+}
+
+static void __init sbcd_dbg_showitem(struct sbcd_item *item)
+{
+	if (0) {
+		printk(KERN_INFO "sbcd[%p (%d)]: item %02x, len %04x\n",
+		       item, ptr_offset(item, sbcd_hdr),
+		       item->hdr.type, le16_to_cpu(item->hdr.length));
+	}
+}
+
+static void __init sbcd_show_info(struct sbcd_item *item)
+{
+	char *ptr = item->u.info;
+	char *val = ptr + strlen(ptr) + 1;
+
+	printk(KERN_INFO "sbcd: %16s = %s\n", ptr, val);	
+}
+
+static void __init sbcd_show_dev(struct sbcd_item *item)
+{
+	printk(KERN_INFO "sbcd: device %s\n", sbcd_dev_name(&item->u.dev));
+}
+
+static struct sbcd_drv_decl *drv_list;
+
+int __init sbcd_drv_add(struct sbcd_drv_decl *drv)
+{
+	drv->next = drv_list;
+	drv_list = drv;
+
+	return 0;
+}
+
+static __init struct sbcd_drv_decl *sbcd_drv_find(const char *name)
+{
+	struct sbcd_drv_decl *drv = drv_list;
+
+	for (; drv != NULL; drv = drv->next) {
+		if (strcmp(drv->name, name) == 0)
+			return drv;
+	}
+
+	return NULL;
+}
+
+struct sbcd_info_dev *sbcd_get_parent(struct sbcd_state *state,
+				      struct sbcd_item *parent,
+				      struct sbcd_item *drv_it)
+{
+	struct sbcd_info_dev *res = NULL;
+	struct sbcd_item *ptr;
+	struct sbcd_parent *pp;
+	int level = 0;
+
+	for (ptr = parent; level >= 0; ptr = sbcd_item_next(ptr)) {
+		switch (ptr->hdr.type) {
+		case SBCD_TYPE_PARENT:
+			pp = &ptr->u.parent;
+			
+			res = sbcd_info_finddev(state, pp->device);
+			level = -2;	/* ensure we quit with a result */
+			break;
+
+		case SBCD_TYPE_END:
+			level--;
+			break;
+		}
+
+		if (ptr->hdr.flags & SBCD_FLG_SUB)
+			level++;
+	}
+
+	return res;
+}
+
+static __init int sbcd_try_generic_attach(struct sbcd_state *state,
+					  struct sbcd_item *parent,
+					  struct sbcd_item *drv_it)
+{
+	struct sbcd_info_dev *pdev = sbcd_get_parent(state, parent, drv_it);
+	int ret = -ENOENT;
+
+	printk(KERN_DEBUG "%s: parent is %p\n", __func__, pdev);
+
+	if (pdev != NULL && pdev->child != NULL) {
+		printk(KERN_INFO "'%s' generic add\n", pdev->decl->name);
+
+		if (pdev->child->add_generic != NULL)
+			ret = (pdev->child->add_generic)(state, pdev->child,
+							 parent, drv_it);
+	}
+
+	return ret;
+}
+
+static __init int sbcd_attach_drv(struct sbcd_state *state,
+				  struct sbcd_item *parent,
+				  struct sbcd_item *drv_it)
+{
+	struct sbcd_drv_decl *drv_decl;
+	struct sbcd_drv *drv;
+	char *drv_name;
+	int ret = 0;
+
+	drv = &drv_it->u.drv;
+	drv_name = sbcd_get_str(drv, drv->name_offset);
+
+	printk(KERN_DEBUG "sbcd[%p] - attaching driver %p (%s)\n",
+	       parent, drv, drv_name);
+
+	drv_decl = sbcd_drv_find(drv_name);
+	if (drv_decl == NULL) {
+		ret = sbcd_try_generic_attach(state, parent, drv_it);
+	} else {
+		printk(KERN_DEBUG "sbcd[%p] - calling %p->%p\n",
+		       parent, drv_decl, drv_decl->attach);
+
+		ret = (drv_decl->attach)(state, parent, drv_it);	
+		if (ret < 0) {
+			printk("sbcd: error %d attaching driver %s to %s\n",
+			       ret, drv_decl->name, 
+			       sbcd_get_str(&parent->u.dev, 
+					    parent->u.dev.name_offset));
+		}
+	}
+
+	return ret;
+}
+
+static void __init sbcd_atend_dofree(struct sbcd_state *state, void *ptr)
+{
+	kfree(ptr);
+}
+
+static void __init sbcd_atend_free(void *ptr)
+{
+	sbcd_run_atend(sbcd_atend_dofree, ptr);
+}
+
+static int __init sbcd_process_dev(struct sbcd_state *state,
+				   struct sbcd_item *item)
+{
+	struct sbcd_stack_item *sp = sbcd_stack_cur(state);
+	struct sbcd_info_dev *dev;
+	struct sbcd_item *drv_it;
+	int index;
+
+	if (!(item->hdr.flags & SBCD_FLG_SUB))
+		goto out;
+
+	printk(KERN_INFO "%s: stack %p\n", __func__, sp);
+	dev = sbcd_finddev_byname(state, sbcd_dev_name(&item->u.dev));
+	sp->dev = dev;
+
+	if (dev == NULL) {
+		dev = kzalloc(sizeof(struct sbcd_info_dev), GFP_KERNEL);
+		sp->dev = dev;
+
+		dev->decl = kzalloc(sizeof(struct sbcd_decl_dev), GFP_KERNEL);
+		dev->decl->name = sbcd_dev_name(&item->u.dev);
+		dev->next = state->devs;
+
+		state->devs = dev;
+		sbcd_atend_free(sp->dev);
+	}
+
+	printk(KERN_DEBUG "checking for device drivers...\n");
+
+	for (index = 0; index < 256; index++) {
+		drv_it = sbcd_item_find(sbcd_item_next(item),
+					index, SBCD_TYPE_DRV, 0);
+
+		if (drv_it == NULL)
+			break;
+
+		sp->drv = drv_it;
+		sbcd_attach_drv(state, item, drv_it);       
+	}
+
+ out:
+	return 0;
+}
+
+static int __init sbcd_process_item(struct sbcd_state *state,
+				    struct sbcd_item *item)
+{
+	switch (item->hdr.type) {
+
+	case SBCD_TYPE_INFO:
+		sbcd_show_info(item);		       
+		break;
+
+	case SBCD_TYPE_DEV:
+		sbcd_show_dev(item);
+		sbcd_process_dev(state, item);
+		break;
+
+	case SBCD_TYPE_END:
+		break;
+
+	case SBCD_TYPE_DRV:
+	case SBCD_TYPE_IRQ:
+	case SBCD_TYPE_AREA:
+	case SBCD_TYPE_PIN:
+		// not to be being here please
+		break;
+			
+
+	default:
+		printk("sbcd[%p] - unknown item\n", item);
+	}
+
+	return 0;
+}
+
+static int __init sbcd_run_config(struct sbcd_state *state,
+				  struct sbcd_header *hdr, __u32 len)
+{
+	struct sbcd_item *ptr = sbcd_item_first(hdr);
+	struct sbcd_item *end = sbcd_item_last(hdr);
+	unsigned int level = 0;
+
+	printk(KERN_INFO "sbcd: running items %p..%p\n", ptr, end);
+
+	for (; ptr < end; ptr = sbcd_item_next(ptr)) {
+		sbcd_dbg_showitem(ptr);
+
+		if (ptr->hdr.length == 0) {
+			printk(KERN_ERR "zero length item at %p\n", ptr);
+			break;
+		}
+
+		if (level == 0) {
+			sbcd_stack_push(state, ptr);
+			sbcd_process_item(state, ptr);
+		}
+
+		if (ptr->hdr.flags & SBCD_FLG_SUB)
+			level++;
+		else
+			sbcd_stack_pop(state);
+
+		if (ptr->hdr.type == SBCD_TYPE_END) {
+			sbcd_stack_pop(state);
+			level--;
+		}
+	}
+
+	return 0;
+}
+
+// we cannot allocate any memory in the tag parse code
+// as neither allocator has been initialised
+
+static __initdata unsigned char tmp_saveblock[4096];
+
+int __init sbcd_config(struct sbcd_header *hdr, int datalen)
+{
+	struct sbcd_header *nh;
+	unsigned int len;
+	sbcd_hdr = hdr;
+
+	len = le16_to_cpu(hdr->length) << 2;
+
+	//nh = kmalloc(le16_to_cpu(hdr->length), GFP_KERNEL);
+	//nh = __alloc_bootmem((len + 3) & ~3, 4, 0);
+	nh = NULL;
+
+	if (nh == NULL && len <= sizeof(tmp_saveblock))
+		nh = (struct sbcd_header *)tmp_saveblock;
+
+	printk(KERN_DEBUG "nh=%p\n", nh);
+
+	//sbcd_run_config(hdr, 0);
+	if (nh) {
+		sbcd_hdr = nh;
+		memcpy(nh, hdr, len);
+	} else {
+		sbcd_hdr = NULL;
+		printk(KERN_ERR "cannot save sbcd data\n");
+		return -ENOMEM;
+	}
+
+	return 0;
+}
+
+static __init int sbcd_save_data(void)
+{
+	if (sbcd_hdr) {
+		unsigned int len = le16_to_cpu(sbcd_hdr->length) << 2;
+		struct sbcd_header *nh;
+
+		nh = kmalloc(len, GFP_KERNEL);
+
+		printk(KERN_DEBUG "nh=%p, len=%d\n", nh, len);
+
+		if (nh) {
+			memcpy(nh, sbcd_hdr, len);
+			sbcd_hdr = nh;
+		}
+	}
+
+	return 0;
+}
+
+core_initcall(sbcd_save_data);
+
+int __init sbcd_init_board(struct sbcd_info_dev *dev)
+{
+	struct sbcd_state state;
+
+	printk("sbcd: board initialising (%p)\n", dev);
+
+	if (sbcd_hdr == NULL) {
+		unsigned int count;
+
+		printk(KERN_ERR "no sbcd data found, using default\n");
+
+		for (count = 0; count < dev->default_size; count++)
+			platform_device_register(dev->default_dev[count]);
+
+		return -EINVAL;
+	}
+
+	state.items = sbcd_item_first(sbcd_hdr);
+	state.devs  = dev;
+
+	sbcd_run_config(&state, sbcd_hdr, 0);
+	sbcd_do_atend(&state);
+
+	return 0;
+}
diff -urNp linux-2.6.20/arch/arm/common/sbcd/utils/Makefile linux-2.6.20-s1t/arch/arm/common/sbcd/utils/Makefile
--- linux-2.6.20/arch/arm/common/sbcd/utils/Makefile	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/arch/arm/common/sbcd/utils/Makefile	2007-02-07 16:29:01.000000000 +0000
@@ -0,0 +1,7 @@
+# sbcd/utils/Makefile
+#
+# Copyright 2005 Simtec Electronics
+#
+# $Id: Makefile,v 1.1 2005/09/22 16:40:02 ben Exp $
+
+obj-y		+= sbcd-opt.o
diff -urNp linux-2.6.20/arch/arm/common/sbcd/utils/sbcd-opt.c linux-2.6.20-s1t/arch/arm/common/sbcd/utils/sbcd-opt.c
--- linux-2.6.20/arch/arm/common/sbcd/utils/sbcd-opt.c	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/arch/arm/common/sbcd/utils/sbcd-opt.c	2007-02-07 16:29:01.000000000 +0000
@@ -0,0 +1,44 @@
+/* kernel/common/utils/sbcd-opt.c
+ *
+ * Copyright 2005 Simtec Electronics
+ *
+ * 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.
+ *
+*/
+
+#include <linux/kernel.h>
+#include <linux/string.h>
+
+#include <asm/mach/sbcd.h>
+#include <asm/mach/sbcd-types.h>
+#include <asm/mach/sbcd-utils.h>
+#include <asm/mach/sbcd-info.h>
+#include <asm/mach/sbcd-os.h>
+#include <asm/mach/sbcd-utils-opt.h>
+
+typedef struct sbcd_util_opt sbcd_util_opt_t;  /* fix substituion in script */
+
+sbcd_util_opt_t *sbcd_util_findopt(struct sbcd_util_opts *opt,
+				   struct sbcd_item *item,
+				   char **name,
+				   char **val)
+{
+	struct sbcd_util_opt *ptr = opt->opts;
+	int opts = opt->size;
+	char *optname;
+
+	sbcd_get_optvals(item, &optname, val);
+
+	if (name)
+		*name = optname;
+
+	for (; opts > 0; opts--, ptr++) {
+		if (strcmp(ptr->name, optname) == 0)
+			return ptr;
+	}
+
+	return NULL;
+}
+
diff -urNp linux-2.6.20/arch/arm/configs/s3c2410_defconfig linux-2.6.20-s1t/arch/arm/configs/s3c2410_defconfig
--- linux-2.6.20/arch/arm/configs/s3c2410_defconfig	2007-02-04 18:44:54.000000000 +0000
+++ linux-2.6.20-s1t/arch/arm/configs/s3c2410_defconfig	2007-02-07 16:29:01.000000000 +0000
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.19-rc4
-# Fri Nov  3 17:41:31 2006
+# Linux kernel version: 2.6.19-simtec3p1
+# Tue Jan 30 16:23:35 2007
 #
 CONFIG_ARM=y
 # CONFIG_GENERIC_TIME is not set
@@ -43,7 +43,7 @@ CONFIG_CC_OPTIMIZE_FOR_SIZE=y
 CONFIG_SYSCTL=y
 # CONFIG_EMBEDDED is not set
 CONFIG_UID16=y
-# CONFIG_SYSCTL_SYSCALL is not set
+CONFIG_SYSCTL_SYSCALL=y
 CONFIG_KALLSYMS=y
 # CONFIG_KALLSYMS_ALL is not set
 # CONFIG_KALLSYMS_EXTRA_PASS is not set
@@ -68,7 +68,7 @@ CONFIG_BASE_SMALL=0
 CONFIG_MODULES=y
 CONFIG_MODULE_UNLOAD=y
 # CONFIG_MODULE_FORCE_UNLOAD is not set
-# CONFIG_MODVERSIONS is not set
+CONFIG_MODVERSIONS=y
 # CONFIG_MODULE_SRCVERSION_ALL is not set
 CONFIG_KMOD=y
 
@@ -138,19 +138,25 @@ CONFIG_ARCH_SMDK2410=y
 CONFIG_ARCH_S3C2440=y
 CONFIG_SMDK2440_CPU2440=y
 CONFIG_SMDK2440_CPU2442=y
-CONFIG_MACH_S3C2413=y
-CONFIG_MACH_SMDK2413=y
+# CONFIG_MACH_SMDK2413 is not set
 CONFIG_MACH_VR1000=y
 CONFIG_MACH_RX3715=y
 CONFIG_MACH_OTOM=y
 CONFIG_MACH_NEXCODER_2440=y
-CONFIG_MACH_VSTMS=y
+# CONFIG_MACH_VSTMS is not set
+
+#
+# Board drivers and common code
+#
+# CONFIG_SMDK_AX88780 is not set
+
+#
+# Core configuration
+#
 CONFIG_S3C2410_CLOCK=y
 CONFIG_S3C2410_PM=y
 CONFIG_CPU_S3C2410_DMA=y
 CONFIG_CPU_S3C2410=y
-CONFIG_S3C2412_PM=y
-CONFIG_CPU_S3C2412=y
 CONFIG_CPU_S3C244X=y
 CONFIG_CPU_S3C2440=y
 CONFIG_CPU_S3C2442=y
@@ -159,7 +165,7 @@ CONFIG_CPU_S3C2442=y
 # S3C2410 Boot
 #
 # CONFIG_S3C2410_BOOT_WATCHDOG is not set
-# CONFIG_S3C2410_BOOT_ERROR_RESET is not set
+CONFIG_S3C2410_BOOT_ERROR_RESET=y
 
 #
 # S3C2410 Setup
@@ -169,6 +175,7 @@ CONFIG_S3C2410_DMA=y
 # CONFIG_S3C2410_PM_DEBUG is not set
 # CONFIG_S3C2410_PM_CHECK is not set
 CONFIG_PM_SIMTEC=y
+CONFIG_SIMTEC_AUDIO=y
 CONFIG_S3C2410_LOWLEVEL_UART_PORT=0
 
 #
@@ -176,11 +183,8 @@ CONFIG_S3C2410_LOWLEVEL_UART_PORT=0
 #
 CONFIG_CPU_32=y
 CONFIG_CPU_ARM920T=y
-CONFIG_CPU_ARM926T=y
 CONFIG_CPU_32v4T=y
-CONFIG_CPU_32v5=y
 CONFIG_CPU_ABRT_EV4T=y
-CONFIG_CPU_ABRT_EV5TJ=y
 CONFIG_CPU_CACHE_V4WT=y
 CONFIG_CPU_CACHE_VIVT=y
 CONFIG_CPU_COPY_V4WB=y
@@ -195,7 +199,9 @@ CONFIG_CPU_CP15_MMU=y
 # CONFIG_CPU_ICACHE_DISABLE is not set
 # CONFIG_CPU_DCACHE_DISABLE is not set
 # CONFIG_CPU_DCACHE_WRITETHROUGH is not set
-# CONFIG_CPU_CACHE_ROUND_ROBIN is not set
+CONFIG_SIMTEC_SBCD=y
+CONFIG_SBCD=y
+CONFIG_SBCD_IM2440D20=y
 
 #
 # Bus support
@@ -242,9 +248,8 @@ CONFIG_CMDLINE="root=/dev/hda1 ro init=/
 # At least one emulation must be selected
 #
 CONFIG_FPE_NWFPE=y
-# CONFIG_FPE_NWFPE_XP is not set
+CONFIG_FPE_NWFPE_XP=y
 # CONFIG_FPE_FASTFPE is not set
-# CONFIG_VFP is not set
 
 #
 # Userspace binary formats
@@ -258,7 +263,7 @@ CONFIG_BINFMT_AOUT=y
 # Power management options
 #
 CONFIG_PM=y
-# CONFIG_PM_LEGACY is not set
+CONFIG_PM_LEGACY=y
 # CONFIG_PM_DEBUG is not set
 # CONFIG_PM_SYSFS_DEPRECATED is not set
 CONFIG_APM=y
@@ -272,7 +277,8 @@ CONFIG_NET=y
 # Networking options
 #
 # CONFIG_NETDEBUG is not set
-# CONFIG_PACKET is not set
+CONFIG_PACKET=y
+# CONFIG_PACKET_MMAP is not set
 CONFIG_UNIX=y
 CONFIG_XFRM=y
 # CONFIG_XFRM_USER is not set
@@ -283,7 +289,7 @@ CONFIG_INET=y
 # CONFIG_IP_ADVANCED_ROUTER is not set
 CONFIG_IP_FIB_HASH=y
 CONFIG_IP_PNP=y
-# CONFIG_IP_PNP_DHCP is not set
+CONFIG_IP_PNP_DHCP=y
 CONFIG_IP_PNP_BOOTP=y
 # CONFIG_IP_PNP_RARP is not set
 # CONFIG_NET_IPIP is not set
@@ -325,7 +331,7 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
 # CONFIG_TIPC is not set
 # CONFIG_ATM is not set
 # CONFIG_BRIDGE is not set
-# CONFIG_VLAN_8021Q is not set
+CONFIG_VLAN_8021Q=y
 # CONFIG_DECNET is not set
 # CONFIG_LLC2 is not set
 # CONFIG_IPX is not set
@@ -347,7 +353,13 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
 # CONFIG_HAMRADIO is not set
 # CONFIG_IRDA is not set
 # CONFIG_BT is not set
-# CONFIG_IEEE80211 is not set
+CONFIG_IEEE80211=y
+# CONFIG_IEEE80211_DEBUG is not set
+CONFIG_IEEE80211_CRYPT_WEP=y
+CONFIG_IEEE80211_CRYPT_CCMP=y
+# CONFIG_IEEE80211_CRYPT_TKIP is not set
+# CONFIG_IEEE80211_SOFTMAC is not set
+CONFIG_WIRELESS_EXT=y
 
 #
 # Device Drivers
@@ -356,16 +368,16 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
 #
 # Generic Driver Options
 #
-CONFIG_STANDALONE=y
-CONFIG_PREVENT_FIRMWARE_BUILD=y
-# CONFIG_FW_LOADER is not set
+# CONFIG_STANDALONE is not set
+# CONFIG_PREVENT_FIRMWARE_BUILD is not set
+CONFIG_FW_LOADER=y
 # CONFIG_DEBUG_DRIVER is not set
 # CONFIG_SYS_HYPERVISOR is not set
 
 #
 # Connector - unified userspace <-> kernelspace linker
 #
-# CONFIG_CONNECTOR is not set
+CONFIG_CONNECTOR=m
 
 #
 # Memory Technology Devices (MTD)
@@ -455,7 +467,7 @@ CONFIG_MTD_NAND=y
 CONFIG_MTD_NAND_IDS=y
 CONFIG_MTD_NAND_S3C2410=y
 # CONFIG_MTD_NAND_S3C2410_DEBUG is not set
-# CONFIG_MTD_NAND_S3C2410_HWECC is not set
+CONFIG_MTD_NAND_S3C2410_HWECC=y
 # CONFIG_MTD_NAND_S3C2410_CLKSTOP is not set
 # CONFIG_MTD_NAND_DISKONCHIP is not set
 # CONFIG_MTD_NAND_NANDSIM is not set
@@ -468,10 +480,13 @@ CONFIG_MTD_NAND_S3C2410=y
 #
 # Parallel port support
 #
-CONFIG_PARPORT=y
-# CONFIG_PARPORT_PC is not set
+CONFIG_PARPORT=m
+CONFIG_PARPORT_PC=m
+CONFIG_PARPORT_PC_FIFO=y
+CONFIG_PARPORT_PC_SUPERIO=y
+CONFIG_PARPORT_NOT_PC=y
 # CONFIG_PARPORT_GSC is not set
-# CONFIG_PARPORT_AX88796 is not set
+CONFIG_PARPORT_AX88796=m
 CONFIG_PARPORT_1284=y
 
 #
@@ -482,6 +497,7 @@ CONFIG_PARPORT_1284=y
 #
 # Block devices
 #
+# CONFIG_PARIDE is not set
 # CONFIG_BLK_DEV_COW_COMMON is not set
 CONFIG_BLK_DEV_LOOP=y
 # CONFIG_BLK_DEV_CRYPTOLOOP is not set
@@ -508,8 +524,9 @@ CONFIG_BLK_DEV_IDE=y
 CONFIG_BLK_DEV_IDEDISK=y
 # CONFIG_IDEDISK_MULTI_MODE is not set
 CONFIG_BLK_DEV_IDECD=y
-CONFIG_BLK_DEV_IDETAPE=m
+# CONFIG_BLK_DEV_IDETAPE is not set
 CONFIG_BLK_DEV_IDEFLOPPY=m
+# CONFIG_BLK_DEV_IDESCSI is not set
 # CONFIG_IDE_TASK_IOCTL is not set
 
 #
@@ -518,6 +535,7 @@ CONFIG_BLK_DEV_IDEFLOPPY=m
 CONFIG_IDE_GENERIC=y
 # CONFIG_IDE_ARM is not set
 CONFIG_BLK_DEV_IDE_BAST=y
+CONFIG_BLK_DEV_IDE_SIMTEC=y
 # CONFIG_IDE_CHIPSETS is not set
 # CONFIG_BLK_DEV_IDEDMA is not set
 # CONFIG_IDEDMA_AUTO is not set
@@ -527,8 +545,62 @@ CONFIG_BLK_DEV_IDE_BAST=y
 # SCSI device support
 #
 # CONFIG_RAID_ATTRS is not set
-# CONFIG_SCSI is not set
+CONFIG_SCSI=y
 # CONFIG_SCSI_NETLINK is not set
+CONFIG_SCSI_PROC_FS=y
+
+#
+# SCSI support type (disk, tape, CD-ROM)
+#
+CONFIG_BLK_DEV_SD=m
+# CONFIG_CHR_DEV_ST is not set
+# CONFIG_CHR_DEV_OSST is not set
+CONFIG_BLK_DEV_SR=m
+# CONFIG_BLK_DEV_SR_VENDOR is not set
+CONFIG_CHR_DEV_SG=m
+CONFIG_CHR_DEV_SCH=m
+
+#
+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
+#
+CONFIG_SCSI_MULTI_LUN=y
+CONFIG_SCSI_CONSTANTS=y
+# CONFIG_SCSI_LOGGING is not set
+
+#
+# SCSI Transports
+#
+# CONFIG_SCSI_SPI_ATTRS is not set
+# CONFIG_SCSI_FC_ATTRS is not set
+# CONFIG_SCSI_ISCSI_ATTRS is not set
+# CONFIG_SCSI_SAS_ATTRS is not set
+# CONFIG_SCSI_SAS_LIBSAS is not set
+
+#
+# SCSI low-level drivers
+#
+# CONFIG_ISCSI_TCP is not set
+# CONFIG_SCSI_AHA152X is not set
+# CONFIG_SCSI_AIC7XXX_OLD is not set
+# CONFIG_SCSI_IN2000 is not set
+# CONFIG_SCSI_DTC3280 is not set
+# CONFIG_SCSI_FUTURE_DOMAIN is not set
+# CONFIG_SCSI_GENERIC_NCR5380 is not set
+# CONFIG_SCSI_GENERIC_NCR5380_MMIO is not set
+# CONFIG_SCSI_PPA is not set
+# CONFIG_SCSI_IMM is not set
+# CONFIG_SCSI_NCR53C406A is not set
+# CONFIG_SCSI_PAS16 is not set
+# CONFIG_SCSI_PSI240I is not set
+# CONFIG_SCSI_QLOGIC_FAS is not set
+# CONFIG_SCSI_SYM53C416 is not set
+# CONFIG_SCSI_T128 is not set
+# CONFIG_SCSI_DEBUG is not set
+
+#
+# Serial ATA (prod) and Parallel ATA (experimental) drivers
+#
+# CONFIG_ATA is not set
 
 #
 # Multi-device support (RAID and LVM)
@@ -582,6 +654,8 @@ CONFIG_DM9000=y
 # CONFIG_HP100 is not set
 # CONFIG_NET_ISA is not set
 # CONFIG_NET_PCI is not set
+CONFIG_AX88796=y
+CONFIG_AX88780=y
 # CONFIG_NET_POCKET is not set
 
 #
@@ -600,15 +674,42 @@ CONFIG_DM9000=y
 #
 # Wireless LAN (non-hamradio)
 #
-# CONFIG_NET_RADIO is not set
+CONFIG_NET_RADIO=y
+# CONFIG_NET_WIRELESS_RTNETLINK is not set
+
+#
+# Obsolete Wireless cards support (pre-802.11)
+#
+# CONFIG_STRIP is not set
+# CONFIG_ARLAN is not set
+# CONFIG_WAVELAN is not set
+
+#
+# Wireless 802.11b ISA/PCI cards support
+#
+# CONFIG_USB_ZD1201 is not set
+# CONFIG_HOSTAP is not set
+CONFIG_NET_WIRELESS=y
 
 #
 # Wan interfaces
 #
 # CONFIG_WAN is not set
 # CONFIG_PLIP is not set
-# CONFIG_PPP is not set
-# CONFIG_SLIP is not set
+CONFIG_PPP=m
+# CONFIG_PPP_MULTILINK is not set
+# CONFIG_PPP_FILTER is not set
+CONFIG_PPP_ASYNC=m
+CONFIG_PPP_SYNC_TTY=m
+CONFIG_PPP_DEFLATE=m
+CONFIG_PPP_BSDCOMP=m
+CONFIG_PPP_MPPE=m
+CONFIG_PPPOE=m
+CONFIG_SLIP=m
+# CONFIG_SLIP_COMPRESSED is not set
+CONFIG_SLHC=m
+# CONFIG_SLIP_SMART is not set
+# CONFIG_SLIP_MODE_SLIP6 is not set
 # CONFIG_SHAPER is not set
 # CONFIG_NETCONSOLE is not set
 # CONFIG_NETPOLL is not set
@@ -629,31 +730,21 @@ CONFIG_INPUT=y
 # Userland interfaces
 #
 CONFIG_INPUT_MOUSEDEV=y
-CONFIG_INPUT_MOUSEDEV_PSAUX=y
+# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
 CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
 CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
-# CONFIG_INPUT_JOYDEV is not set
-# CONFIG_INPUT_TSDEV is not set
-# CONFIG_INPUT_EVDEV is not set
+CONFIG_INPUT_JOYDEV=m
+CONFIG_INPUT_TSDEV=m
+CONFIG_INPUT_TSDEV_SCREEN_X=240
+CONFIG_INPUT_TSDEV_SCREEN_Y=320
+CONFIG_INPUT_EVDEV=m
 # CONFIG_INPUT_EVBUG is not set
 
 #
 # Input Device Drivers
 #
-CONFIG_INPUT_KEYBOARD=y
-CONFIG_KEYBOARD_ATKBD=y
-# CONFIG_KEYBOARD_SUNKBD is not set
-# CONFIG_KEYBOARD_LKKBD is not set
-# CONFIG_KEYBOARD_XTKBD is not set
-# CONFIG_KEYBOARD_NEWTON is not set
-# CONFIG_KEYBOARD_STOWAWAY is not set
-CONFIG_INPUT_MOUSE=y
-CONFIG_MOUSE_PS2=y
-# CONFIG_MOUSE_SERIAL is not set
-# CONFIG_MOUSE_INPORT is not set
-# CONFIG_MOUSE_LOGIBM is not set
-# CONFIG_MOUSE_PC110PAD is not set
-# CONFIG_MOUSE_VSXXXAA is not set
+# CONFIG_INPUT_KEYBOARD is not set
+# CONFIG_INPUT_MOUSE is not set
 # CONFIG_INPUT_JOYSTICK is not set
 # CONFIG_INPUT_TOUCHSCREEN is not set
 # CONFIG_INPUT_MISC is not set
@@ -664,7 +755,6 @@ CONFIG_MOUSE_PS2=y
 CONFIG_SERIO=y
 CONFIG_SERIO_SERPORT=y
 # CONFIG_SERIO_PARKBD is not set
-CONFIG_SERIO_LIBPS2=y
 # CONFIG_SERIO_RAW is not set
 # CONFIG_GAMEPORT is not set
 
@@ -718,9 +808,8 @@ CONFIG_SERIAL_CORE_CONSOLE=y
 CONFIG_UNIX98_PTYS=y
 CONFIG_LEGACY_PTYS=y
 CONFIG_LEGACY_PTY_COUNT=256
-CONFIG_PRINTER=y
-# CONFIG_LP_CONSOLE is not set
-CONFIG_PPDEV=y
+# CONFIG_PRINTER is not set
+# CONFIG_PPDEV is not set
 # CONFIG_TIPAR is not set
 
 #
@@ -765,17 +854,18 @@ CONFIG_HW_RANDOM=y
 # TPM devices
 #
 # CONFIG_TCG_TPM is not set
+# CONFIG_SIMTEC_LCD is not set
 
 #
 # I2C support
 #
 CONFIG_I2C=y
-CONFIG_I2C_CHARDEV=m
+CONFIG_I2C_CHARDEV=y
 
 #
 # I2C Algorithms
 #
-CONFIG_I2C_ALGOBIT=m
+CONFIG_I2C_ALGOBIT=y
 # CONFIG_I2C_ALGOPCF is not set
 # CONFIG_I2C_ALGOPCA is not set
 
@@ -788,19 +878,23 @@ CONFIG_I2C_ISA=m
 # CONFIG_I2C_PARPORT is not set
 # CONFIG_I2C_PARPORT_LIGHT is not set
 CONFIG_I2C_S3C2410=y
+# CONFIG_I2C_S3C2410_CLKIDLE is not set
+CONFIG_I2C_SIMTEC=m
 # CONFIG_I2C_STUB is not set
 # CONFIG_I2C_PCA_ISA is not set
 
 #
 # Miscellaneous I2C Chip support
 #
+CONFIG_BAST_PMU=y
 # CONFIG_SENSORS_DS1337 is not set
 # CONFIG_SENSORS_DS1374 is not set
-CONFIG_SENSORS_EEPROM=m
+CONFIG_SENSORS_EEPROM=y
 # CONFIG_SENSORS_PCF8574 is not set
 # CONFIG_SENSORS_PCA9539 is not set
 # CONFIG_SENSORS_PCF8591 is not set
 # CONFIG_SENSORS_MAX6875 is not set
+CONFIG_SENSORS_M41ST87=y
 # CONFIG_I2C_DEBUG_CORE is not set
 # CONFIG_I2C_DEBUG_ALGO is not set
 # CONFIG_I2C_DEBUG_BUS is not set
@@ -816,14 +910,15 @@ CONFIG_SPI_MASTER=y
 #
 # SPI Master Controller Drivers
 #
-CONFIG_SPI_BITBANG=m
+CONFIG_SPI_BITBANG=y
 # CONFIG_SPI_BUTTERFLY is not set
-CONFIG_SPI_S3C24XX_GPIO=m
-CONFIG_SPI_S3C24XX=m
+CONFIG_SPI_S3C24XX_GPIO=y
+CONFIG_SPI_S3C24XX=y
 
 #
 # SPI Protocol Masters
 #
+CONFIG_SPI_TLE62X0=y
 
 #
 # Dallas's 1-wire bus
@@ -863,6 +958,7 @@ CONFIG_SENSORS_LM85=m
 # CONFIG_SENSORS_LM92 is not set
 # CONFIG_SENSORS_MAX1619 is not set
 # CONFIG_SENSORS_PC87360 is not set
+CONFIG_SENSORS_S3C_ADC=m
 # CONFIG_SENSORS_SMSC47M1 is not set
 # CONFIG_SENSORS_SMSC47M192 is not set
 # CONFIG_SENSORS_SMSC47B397 is not set
@@ -879,6 +975,13 @@ CONFIG_SENSORS_LM85=m
 # Misc devices
 #
 # CONFIG_TIFM_CORE is not set
+CONFIG_GPIO_SBCD_BASE=y
+CONFIG_GPIO_SBCD=y
+
+#
+# Multifunction device drivers
+#
+CONFIG_MFD_SM501=y
 
 #
 # LED devices
@@ -897,12 +1000,72 @@ CONFIG_LEDS_S3C24XX=m
 CONFIG_LEDS_TRIGGERS=y
 CONFIG_LEDS_TRIGGER_TIMER=m
 # CONFIG_LEDS_TRIGGER_IDE_DISK is not set
-CONFIG_LEDS_TRIGGER_HEARTBEAT=m
+# CONFIG_LEDS_TRIGGER_HEARTBEAT is not set
 
 #
 # Multimedia devices
 #
-# CONFIG_VIDEO_DEV is not set
+CONFIG_VIDEO_DEV=y
+CONFIG_VIDEO_V4L1=y
+CONFIG_VIDEO_V4L1_COMPAT=y
+CONFIG_VIDEO_V4L2=y
+
+#
+# Video Capture Adapters
+#
+
+#
+# Video Capture Adapters
+#
+CONFIG_VIDEO_ADV_DEBUG=y
+CONFIG_VIDEO_HELPER_CHIPS_AUTO=y
+# CONFIG_VIDEO_VIVI is not set
+# CONFIG_VIDEO_PMS is not set
+# CONFIG_VIDEO_BWQCAM is not set
+# CONFIG_VIDEO_CQCAM is not set
+# CONFIG_VIDEO_W9966 is not set
+CONFIG_VIDEO_CPIA=y
+# CONFIG_VIDEO_CPIA_PP is not set
+CONFIG_VIDEO_CPIA_USB=m
+# CONFIG_VIDEO_CPIA2 is not set
+# CONFIG_VIDEO_SAA5246A is not set
+# CONFIG_VIDEO_SAA5249 is not set
+# CONFIG_TUNER_3036 is not set
+
+#
+# V4L USB devices
+#
+# CONFIG_VIDEO_PVRUSB2 is not set
+# CONFIG_VIDEO_EM28XX is not set
+# CONFIG_USB_VICAM is not set
+# CONFIG_USB_IBMCAM is not set
+# CONFIG_USB_KONICAWC is not set
+# CONFIG_USB_QUICKCAM_MESSENGER is not set
+# CONFIG_USB_ET61X251 is not set
+# CONFIG_VIDEO_OVCAMCHIP is not set
+# CONFIG_USB_W9968CF is not set
+# CONFIG_USB_OV511 is not set
+# CONFIG_USB_SE401 is not set
+# CONFIG_USB_SN9C102 is not set
+# CONFIG_USB_STV680 is not set
+# CONFIG_USB_ZC0301 is not set
+# CONFIG_USB_PWC is not set
+
+#
+# Radio Adapters
+#
+# CONFIG_RADIO_CADET is not set
+# CONFIG_RADIO_RTRACK is not set
+# CONFIG_RADIO_RTRACK2 is not set
+# CONFIG_RADIO_AZTECH is not set
+# CONFIG_RADIO_GEMTEK is not set
+# CONFIG_RADIO_SF16FMI is not set
+# CONFIG_RADIO_SF16FMR2 is not set
+# CONFIG_RADIO_TERRATEC is not set
+# CONFIG_RADIO_TRUST is not set
+# CONFIG_RADIO_TYPHOON is not set
+# CONFIG_RADIO_ZOLTRIX is not set
+# CONFIG_USB_DSBR is not set
 
 #
 # Digital Video Broadcasting Devices
@@ -921,11 +1084,12 @@ CONFIG_FB_CFB_COPYAREA=y
 CONFIG_FB_CFB_IMAGEBLIT=y
 # CONFIG_FB_MACMODES is not set
 # CONFIG_FB_BACKLIGHT is not set
-CONFIG_FB_MODE_HELPERS=y
+# CONFIG_FB_MODE_HELPERS is not set
 # CONFIG_FB_TILEBLITTING is not set
 # CONFIG_FB_S1D13XXX is not set
-CONFIG_FB_S3C2410=y
+CONFIG_FB_S3C2410=m
 # CONFIG_FB_S3C2410_DEBUG is not set
+CONFIG_FB_SM501=y
 # CONFIG_FB_VIRTUAL is not set
 
 #
@@ -949,7 +1113,56 @@ CONFIG_FONT_8x16=y
 #
 # Sound
 #
-# CONFIG_SOUND is not set
+CONFIG_SOUND=y
+
+#
+# Advanced Linux Sound Architecture
+#
+CONFIG_SND=y
+CONFIG_SND_TIMER=y
+CONFIG_SND_PCM=y
+# CONFIG_SND_SEQUENCER is not set
+CONFIG_SND_OSSEMUL=y
+CONFIG_SND_MIXER_OSS=y
+CONFIG_SND_PCM_OSS=y
+CONFIG_SND_PCM_OSS_PLUGINS=y
+# CONFIG_SND_DYNAMIC_MINORS is not set
+CONFIG_SND_SUPPORT_OLD_API=y
+CONFIG_SND_VERBOSE_PROCFS=y
+# CONFIG_SND_VERBOSE_PRINTK is not set
+# CONFIG_SND_DEBUG is not set
+
+#
+# Generic devices
+#
+# CONFIG_SND_DUMMY is not set
+# CONFIG_SND_MTPAV is not set
+# CONFIG_SND_MTS64 is not set
+# CONFIG_SND_SERIAL_U16550 is not set
+# CONFIG_SND_MPU401 is not set
+
+#
+# ALSA ARM devices
+#
+CONFIG_SND_S3C2410=y
+# CONFIG_SND_S3C2410_DBG is not set
+# CONFIG_SND_S3C2410_DBG_DMA is not set
+CONFIG_SND_TLV320AIC23=y
+CONFIG_SND_TLV320AIC33=y
+CONFIG_SND_S3C2410_TLV320AIC23=y
+CONFIG_SND_S3C2410_TLV320AIC33=y
+CONFIG_SND_VR2K_AMP=y
+CONFIG_SND_HERMES_AMP=y
+
+#
+# USB devices
+#
+# CONFIG_SND_USB_AUDIO is not set
+
+#
+# Open Sound System
+#
+# CONFIG_SOUND_PRIME is not set
 
 #
 # USB support
@@ -991,6 +1204,18 @@ CONFIG_USB_OHCI_LITTLE_ENDIAN=y
 #
 # may also be needed; see USB_STORAGE Help for more information
 #
+CONFIG_USB_STORAGE=y
+# CONFIG_USB_STORAGE_DEBUG is not set
+# CONFIG_USB_STORAGE_DATAFAB is not set
+# CONFIG_USB_STORAGE_FREECOM is not set
+# CONFIG_USB_STORAGE_ISD200 is not set
+# CONFIG_USB_STORAGE_DPCM is not set
+# CONFIG_USB_STORAGE_USBAT is not set
+# CONFIG_USB_STORAGE_SDDR09 is not set
+# CONFIG_USB_STORAGE_SDDR55 is not set
+# CONFIG_USB_STORAGE_JUMPSHOT is not set
+# CONFIG_USB_STORAGE_ALAUDA is not set
+# CONFIG_USB_STORAGE_KARMA is not set
 # CONFIG_USB_LIBUSUAL is not set
 
 #
@@ -1020,6 +1245,7 @@ CONFIG_USB_OHCI_LITTLE_ENDIAN=y
 # USB Imaging devices
 #
 # CONFIG_USB_MDC800 is not set
+# CONFIG_USB_MICROTEK is not set
 
 #
 # USB Network Adapters
@@ -1028,6 +1254,7 @@ CONFIG_USB_OHCI_LITTLE_ENDIAN=y
 # CONFIG_USB_KAWETH is not set
 # CONFIG_USB_PEGASUS is not set
 # CONFIG_USB_RTL8150 is not set
+# CONFIG_USB_USBNET_MII is not set
 # CONFIG_USB_USBNET is not set
 CONFIG_USB_MON=y
 
@@ -1074,7 +1301,11 @@ CONFIG_USB_MON=y
 #
 # MMC/SD Card support
 #
-# CONFIG_MMC is not set
+CONFIG_MMC=m
+# CONFIG_MMC_DEBUG is not set
+CONFIG_MMC_BLOCK=m
+# CONFIG_MMC_S3C2410 is not set
+# CONFIG_MMC_TIFM_SD is not set
 
 #
 # Real Time Clock
@@ -1164,7 +1395,8 @@ CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
 CONFIG_PROC_FS=y
 CONFIG_PROC_SYSCTL=y
 CONFIG_SYSFS=y
-# CONFIG_TMPFS is not set
+CONFIG_TMPFS=y
+# CONFIG_TMPFS_POSIX_ACL is not set
 # CONFIG_HUGETLB_PAGE is not set
 CONFIG_RAMFS=y
 # CONFIG_CONFIGFS_FS is not set
@@ -1187,11 +1419,14 @@ CONFIG_JFFS2_FS_DEBUG=0
 CONFIG_JFFS2_FS_WRITEBUFFER=y
 # CONFIG_JFFS2_SUMMARY is not set
 # CONFIG_JFFS2_FS_XATTR is not set
-# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
-CONFIG_JFFS2_ZLIB=y
-CONFIG_JFFS2_RTIME=y
+CONFIG_JFFS2_COMPRESSION_OPTIONS=y
+# CONFIG_JFFS2_ZLIB is not set
+# CONFIG_JFFS2_RTIME is not set
 # CONFIG_JFFS2_RUBIN is not set
-# CONFIG_CRAMFS is not set
+# CONFIG_JFFS2_CMODE_NONE is not set
+CONFIG_JFFS2_CMODE_PRIORITY=y
+# CONFIG_JFFS2_CMODE_SIZE is not set
+CONFIG_CRAMFS=y
 # CONFIG_VXFS_FS is not set
 # CONFIG_HPFS_FS is not set
 # CONFIG_QNX4FS_FS is not set
@@ -1245,11 +1480,11 @@ CONFIG_SOLARIS_X86_PARTITION=y
 #
 CONFIG_NLS=y
 CONFIG_NLS_DEFAULT="iso8859-1"
-# CONFIG_NLS_CODEPAGE_437 is not set
+CONFIG_NLS_CODEPAGE_437=y
 # CONFIG_NLS_CODEPAGE_737 is not set
 # CONFIG_NLS_CODEPAGE_775 is not set
-# CONFIG_NLS_CODEPAGE_850 is not set
-# CONFIG_NLS_CODEPAGE_852 is not set
+CONFIG_NLS_CODEPAGE_850=y
+CONFIG_NLS_CODEPAGE_852=y
 # CONFIG_NLS_CODEPAGE_855 is not set
 # CONFIG_NLS_CODEPAGE_857 is not set
 # CONFIG_NLS_CODEPAGE_860 is not set
@@ -1269,7 +1504,7 @@ CONFIG_NLS_DEFAULT="iso8859-1"
 # CONFIG_NLS_CODEPAGE_1250 is not set
 # CONFIG_NLS_CODEPAGE_1251 is not set
 # CONFIG_NLS_ASCII is not set
-# CONFIG_NLS_ISO8859_1 is not set
+CONFIG_NLS_ISO8859_1=y
 # CONFIG_NLS_ISO8859_2 is not set
 # CONFIG_NLS_ISO8859_3 is not set
 # CONFIG_NLS_ISO8859_4 is not set
@@ -1303,10 +1538,10 @@ CONFIG_DETECT_SOFTLOCKUP=y
 # CONFIG_DEBUG_SLAB is not set
 # CONFIG_DEBUG_RT_MUTEXES is not set
 # CONFIG_RT_MUTEX_TESTER is not set
-# CONFIG_DEBUG_SPINLOCK is not set
+CONFIG_DEBUG_SPINLOCK=y
 CONFIG_DEBUG_MUTEXES=y
 # CONFIG_DEBUG_RWSEMS is not set
-# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
+CONFIG_DEBUG_SPINLOCK_SLEEP=y
 # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
 # CONFIG_DEBUG_KOBJECT is not set
 CONFIG_DEBUG_BUGVERBOSE=y
@@ -1334,12 +1569,46 @@ CONFIG_DEBUG_S3C2410_UART=0
 #
 # Cryptographic options
 #
-# CONFIG_CRYPTO is not set
+CONFIG_CRYPTO=y
+CONFIG_CRYPTO_ALGAPI=y
+CONFIG_CRYPTO_BLKCIPHER=y
+CONFIG_CRYPTO_HASH=y
+CONFIG_CRYPTO_MANAGER=y
+CONFIG_CRYPTO_HMAC=y
+# CONFIG_CRYPTO_NULL is not set
+# CONFIG_CRYPTO_MD4 is not set
+CONFIG_CRYPTO_MD5=y
+CONFIG_CRYPTO_SHA1=y
+# CONFIG_CRYPTO_SHA256 is not set
+# CONFIG_CRYPTO_SHA512 is not set
+# CONFIG_CRYPTO_WP512 is not set
+# CONFIG_CRYPTO_TGR192 is not set
+CONFIG_CRYPTO_ECB=y
+CONFIG_CRYPTO_CBC=m
+CONFIG_CRYPTO_DES=y
+# CONFIG_CRYPTO_BLOWFISH is not set
+# CONFIG_CRYPTO_TWOFISH is not set
+# CONFIG_CRYPTO_SERPENT is not set
+CONFIG_CRYPTO_AES=y
+# CONFIG_CRYPTO_CAST5 is not set
+# CONFIG_CRYPTO_CAST6 is not set
+# CONFIG_CRYPTO_TEA is not set
+CONFIG_CRYPTO_ARC4=y
+# CONFIG_CRYPTO_KHAZAD is not set
+# CONFIG_CRYPTO_ANUBIS is not set
+CONFIG_CRYPTO_DEFLATE=y
+# CONFIG_CRYPTO_MICHAEL_MIC is not set
+# CONFIG_CRYPTO_CRC32C is not set
+# CONFIG_CRYPTO_TEST is not set
+
+#
+# Hardware crypto devices
+#
 
 #
 # Library routines
 #
-# CONFIG_CRC_CCITT is not set
+CONFIG_CRC_CCITT=y
 # CONFIG_CRC16 is not set
 CONFIG_CRC32=y
 # CONFIG_LIBCRC32C is not set
diff -urNp linux-2.6.20/arch/arm/configs/s3c2410_defconfig.orig linux-2.6.20-s1t/arch/arm/configs/s3c2410_defconfig.orig
--- linux-2.6.20/arch/arm/configs/s3c2410_defconfig.orig	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/arch/arm/configs/s3c2410_defconfig.orig	2007-02-04 18:44:54.000000000 +0000
@@ -0,0 +1,1348 @@
+#
+# Automatically generated make config: don't edit
+# Linux kernel version: 2.6.19-rc4
+# Fri Nov  3 17:41:31 2006
+#
+CONFIG_ARM=y
+# CONFIG_GENERIC_TIME is not set
+CONFIG_MMU=y
+CONFIG_GENERIC_HARDIRQS=y
+CONFIG_TRACE_IRQFLAGS_SUPPORT=y
+CONFIG_HARDIRQS_SW_RESEND=y
+CONFIG_GENERIC_IRQ_PROBE=y
+CONFIG_RWSEM_GENERIC_SPINLOCK=y
+CONFIG_GENERIC_HWEIGHT=y
+CONFIG_GENERIC_CALIBRATE_DELAY=y
+CONFIG_VECTORS_BASE=0xffff0000
+CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
+
+#
+# Code maturity level options
+#
+CONFIG_EXPERIMENTAL=y
+CONFIG_BROKEN_ON_SMP=y
+CONFIG_INIT_ENV_ARG_LIMIT=32
+
+#
+# General setup
+#
+CONFIG_LOCALVERSION=""
+CONFIG_LOCALVERSION_AUTO=y
+CONFIG_SWAP=y
+CONFIG_SYSVIPC=y
+# CONFIG_IPC_NS is not set
+# CONFIG_POSIX_MQUEUE is not set
+# CONFIG_BSD_PROCESS_ACCT is not set
+# CONFIG_TASKSTATS is not set
+# CONFIG_UTS_NS is not set
+# CONFIG_AUDIT is not set
+# CONFIG_IKCONFIG is not set
+# CONFIG_RELAY is not set
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+CONFIG_SYSCTL=y
+# CONFIG_EMBEDDED is not set
+CONFIG_UID16=y
+# CONFIG_SYSCTL_SYSCALL is not set
+CONFIG_KALLSYMS=y
+# CONFIG_KALLSYMS_ALL is not set
+# CONFIG_KALLSYMS_EXTRA_PASS is not set
+CONFIG_HOTPLUG=y
+CONFIG_PRINTK=y
+CONFIG_BUG=y
+CONFIG_ELF_CORE=y
+CONFIG_BASE_FULL=y
+CONFIG_FUTEX=y
+CONFIG_EPOLL=y
+CONFIG_SHMEM=y
+CONFIG_SLAB=y
+CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_RT_MUTEXES=y
+# CONFIG_TINY_SHMEM is not set
+CONFIG_BASE_SMALL=0
+# CONFIG_SLOB is not set
+
+#
+# Loadable module support
+#
+CONFIG_MODULES=y
+CONFIG_MODULE_UNLOAD=y
+# CONFIG_MODULE_FORCE_UNLOAD is not set
+# CONFIG_MODVERSIONS is not set
+# CONFIG_MODULE_SRCVERSION_ALL is not set
+CONFIG_KMOD=y
+
+#
+# Block layer
+#
+CONFIG_BLOCK=y
+# CONFIG_BLK_DEV_IO_TRACE is not set
+
+#
+# IO Schedulers
+#
+CONFIG_IOSCHED_NOOP=y
+CONFIG_IOSCHED_AS=y
+CONFIG_IOSCHED_DEADLINE=y
+CONFIG_IOSCHED_CFQ=y
+CONFIG_DEFAULT_AS=y
+# CONFIG_DEFAULT_DEADLINE is not set
+# CONFIG_DEFAULT_CFQ is not set
+# CONFIG_DEFAULT_NOOP is not set
+CONFIG_DEFAULT_IOSCHED="anticipatory"
+
+#
+# System Type
+#
+# CONFIG_ARCH_AAEC2000 is not set
+# CONFIG_ARCH_INTEGRATOR is not set
+# CONFIG_ARCH_REALVIEW is not set
+# CONFIG_ARCH_VERSATILE is not set
+# CONFIG_ARCH_AT91 is not set
+# CONFIG_ARCH_CLPS7500 is not set
+# CONFIG_ARCH_CLPS711X is not set
+# CONFIG_ARCH_CO285 is not set
+# CONFIG_ARCH_EBSA110 is not set
+# CONFIG_ARCH_EP93XX is not set
+# CONFIG_ARCH_FOOTBRIDGE is not set
+# CONFIG_ARCH_NETX is not set
+# CONFIG_ARCH_H720X is not set
+# CONFIG_ARCH_IMX is not set
+# CONFIG_ARCH_IOP32X is not set
+# CONFIG_ARCH_IOP33X is not set
+# CONFIG_ARCH_IXP4XX is not set
+# CONFIG_ARCH_IXP2000 is not set
+# CONFIG_ARCH_IXP23XX is not set
+# CONFIG_ARCH_L7200 is not set
+# CONFIG_ARCH_PNX4008 is not set
+# CONFIG_ARCH_PXA is not set
+# CONFIG_ARCH_RPC is not set
+# CONFIG_ARCH_SA1100 is not set
+CONFIG_ARCH_S3C2410=y
+# CONFIG_ARCH_SHARK is not set
+# CONFIG_ARCH_LH7A40X is not set
+# CONFIG_ARCH_OMAP is not set
+
+#
+# S3C24XX Implementations
+#
+# CONFIG_MACH_AML_M5900 is not set
+CONFIG_MACH_ANUBIS=y
+CONFIG_MACH_OSIRIS=y
+CONFIG_ARCH_BAST=y
+CONFIG_BAST_PC104_IRQ=y
+CONFIG_ARCH_H1940=y
+CONFIG_MACH_N30=y
+CONFIG_MACH_SMDK=y
+CONFIG_ARCH_SMDK2410=y
+CONFIG_ARCH_S3C2440=y
+CONFIG_SMDK2440_CPU2440=y
+CONFIG_SMDK2440_CPU2442=y
+CONFIG_MACH_S3C2413=y
+CONFIG_MACH_SMDK2413=y
+CONFIG_MACH_VR1000=y
+CONFIG_MACH_RX3715=y
+CONFIG_MACH_OTOM=y
+CONFIG_MACH_NEXCODER_2440=y
+CONFIG_MACH_VSTMS=y
+CONFIG_S3C2410_CLOCK=y
+CONFIG_S3C2410_PM=y
+CONFIG_CPU_S3C2410_DMA=y
+CONFIG_CPU_S3C2410=y
+CONFIG_S3C2412_PM=y
+CONFIG_CPU_S3C2412=y
+CONFIG_CPU_S3C244X=y
+CONFIG_CPU_S3C2440=y
+CONFIG_CPU_S3C2442=y
+
+#
+# S3C2410 Boot
+#
+# CONFIG_S3C2410_BOOT_WATCHDOG is not set
+# CONFIG_S3C2410_BOOT_ERROR_RESET is not set
+
+#
+# S3C2410 Setup
+#
+CONFIG_S3C2410_DMA=y
+# CONFIG_S3C2410_DMA_DEBUG is not set
+# CONFIG_S3C2410_PM_DEBUG is not set
+# CONFIG_S3C2410_PM_CHECK is not set
+CONFIG_PM_SIMTEC=y
+CONFIG_S3C2410_LOWLEVEL_UART_PORT=0
+
+#
+# Processor Type
+#
+CONFIG_CPU_32=y
+CONFIG_CPU_ARM920T=y
+CONFIG_CPU_ARM926T=y
+CONFIG_CPU_32v4T=y
+CONFIG_CPU_32v5=y
+CONFIG_CPU_ABRT_EV4T=y
+CONFIG_CPU_ABRT_EV5TJ=y
+CONFIG_CPU_CACHE_V4WT=y
+CONFIG_CPU_CACHE_VIVT=y
+CONFIG_CPU_COPY_V4WB=y
+CONFIG_CPU_TLB_V4WBI=y
+CONFIG_CPU_CP15=y
+CONFIG_CPU_CP15_MMU=y
+
+#
+# Processor Features
+#
+# CONFIG_ARM_THUMB is not set
+# CONFIG_CPU_ICACHE_DISABLE is not set
+# CONFIG_CPU_DCACHE_DISABLE is not set
+# CONFIG_CPU_DCACHE_WRITETHROUGH is not set
+# CONFIG_CPU_CACHE_ROUND_ROBIN is not set
+
+#
+# Bus support
+#
+CONFIG_ISA=y
+
+#
+# PCCARD (PCMCIA/CardBus) support
+#
+# CONFIG_PCCARD is not set
+
+#
+# Kernel Features
+#
+# CONFIG_PREEMPT is not set
+# CONFIG_NO_IDLE_HZ is not set
+CONFIG_HZ=200
+# CONFIG_AEABI is not set
+# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
+CONFIG_SELECT_MEMORY_MODEL=y
+CONFIG_FLATMEM_MANUAL=y
+# CONFIG_DISCONTIGMEM_MANUAL is not set
+# CONFIG_SPARSEMEM_MANUAL is not set
+CONFIG_FLATMEM=y
+CONFIG_FLAT_NODE_MEM_MAP=y
+# CONFIG_SPARSEMEM_STATIC is not set
+CONFIG_SPLIT_PTLOCK_CPUS=4096
+# CONFIG_RESOURCES_64BIT is not set
+CONFIG_ALIGNMENT_TRAP=y
+
+#
+# Boot options
+#
+CONFIG_ZBOOT_ROM_TEXT=0x0
+CONFIG_ZBOOT_ROM_BSS=0x0
+CONFIG_CMDLINE="root=/dev/hda1 ro init=/bin/bash console=ttySAC0"
+# CONFIG_XIP_KERNEL is not set
+
+#
+# Floating point emulation
+#
+
+#
+# At least one emulation must be selected
+#
+CONFIG_FPE_NWFPE=y
+# CONFIG_FPE_NWFPE_XP is not set
+# CONFIG_FPE_FASTFPE is not set
+# CONFIG_VFP is not set
+
+#
+# Userspace binary formats
+#
+CONFIG_BINFMT_ELF=y
+CONFIG_BINFMT_AOUT=y
+# CONFIG_BINFMT_MISC is not set
+# CONFIG_ARTHUR is not set
+
+#
+# Power management options
+#
+CONFIG_PM=y
+# CONFIG_PM_LEGACY is not set
+# CONFIG_PM_DEBUG is not set
+# CONFIG_PM_SYSFS_DEPRECATED is not set
+CONFIG_APM=y
+
+#
+# Networking
+#
+CONFIG_NET=y
+
+#
+# Networking options
+#
+# CONFIG_NETDEBUG is not set
+# CONFIG_PACKET is not set
+CONFIG_UNIX=y
+CONFIG_XFRM=y
+# CONFIG_XFRM_USER is not set
+# CONFIG_XFRM_SUB_POLICY is not set
+# CONFIG_NET_KEY is not set
+CONFIG_INET=y
+# CONFIG_IP_MULTICAST is not set
+# CONFIG_IP_ADVANCED_ROUTER is not set
+CONFIG_IP_FIB_HASH=y
+CONFIG_IP_PNP=y
+# CONFIG_IP_PNP_DHCP is not set
+CONFIG_IP_PNP_BOOTP=y
+# CONFIG_IP_PNP_RARP is not set
+# CONFIG_NET_IPIP is not set
+# CONFIG_NET_IPGRE is not set
+# CONFIG_ARPD is not set
+# CONFIG_SYN_COOKIES is not set
+# CONFIG_INET_AH is not set
+# CONFIG_INET_ESP is not set
+# CONFIG_INET_IPCOMP is not set
+# CONFIG_INET_XFRM_TUNNEL is not set
+# CONFIG_INET_TUNNEL is not set
+CONFIG_INET_XFRM_MODE_TRANSPORT=y
+CONFIG_INET_XFRM_MODE_TUNNEL=y
+CONFIG_INET_XFRM_MODE_BEET=y
+CONFIG_INET_DIAG=y
+CONFIG_INET_TCP_DIAG=y
+# CONFIG_TCP_CONG_ADVANCED is not set
+CONFIG_TCP_CONG_CUBIC=y
+CONFIG_DEFAULT_TCP_CONG="cubic"
+# CONFIG_IPV6 is not set
+# CONFIG_INET6_XFRM_TUNNEL is not set
+# CONFIG_INET6_TUNNEL is not set
+# CONFIG_NETWORK_SECMARK is not set
+# CONFIG_NETFILTER is not set
+
+#
+# DCCP Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP_DCCP is not set
+
+#
+# SCTP Configuration (EXPERIMENTAL)
+#
+# CONFIG_IP_SCTP is not set
+
+#
+# TIPC Configuration (EXPERIMENTAL)
+#
+# CONFIG_TIPC is not set
+# CONFIG_ATM is not set
+# CONFIG_BRIDGE is not set
+# CONFIG_VLAN_8021Q is not set
+# CONFIG_DECNET is not set
+# CONFIG_LLC2 is not set
+# CONFIG_IPX is not set
+# CONFIG_ATALK is not set
+# CONFIG_X25 is not set
+# CONFIG_LAPB is not set
+# CONFIG_ECONET is not set
+# CONFIG_WAN_ROUTER is not set
+
+#
+# QoS and/or fair queueing
+#
+# CONFIG_NET_SCHED is not set
+
+#
+# Network testing
+#
+# CONFIG_NET_PKTGEN is not set
+# CONFIG_HAMRADIO is not set
+# CONFIG_IRDA is not set
+# CONFIG_BT is not set
+# CONFIG_IEEE80211 is not set
+
+#
+# Device Drivers
+#
+
+#
+# Generic Driver Options
+#
+CONFIG_STANDALONE=y
+CONFIG_PREVENT_FIRMWARE_BUILD=y
+# CONFIG_FW_LOADER is not set
+# CONFIG_DEBUG_DRIVER is not set
+# CONFIG_SYS_HYPERVISOR is not set
+
+#
+# Connector - unified userspace <-> kernelspace linker
+#
+# CONFIG_CONNECTOR is not set
+
+#
+# Memory Technology Devices (MTD)
+#
+CONFIG_MTD=y
+# CONFIG_MTD_DEBUG is not set
+# CONFIG_MTD_CONCAT is not set
+CONFIG_MTD_PARTITIONS=y
+CONFIG_MTD_REDBOOT_PARTS=y
+CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-1
+CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED=y
+# CONFIG_MTD_REDBOOT_PARTS_READONLY is not set
+CONFIG_MTD_CMDLINE_PARTS=y
+# CONFIG_MTD_AFS_PARTS is not set
+
+#
+# User Modules And Translation Layers
+#
+CONFIG_MTD_CHAR=y
+CONFIG_MTD_BLOCK=y
+# CONFIG_FTL is not set
+# CONFIG_NFTL is not set
+# CONFIG_INFTL is not set
+# CONFIG_RFD_FTL is not set
+# CONFIG_SSFDC is not set
+
+#
+# RAM/ROM/Flash chip drivers
+#
+CONFIG_MTD_CFI=y
+CONFIG_MTD_JEDECPROBE=y
+CONFIG_MTD_GEN_PROBE=y
+# CONFIG_MTD_CFI_ADV_OPTIONS is not set
+CONFIG_MTD_MAP_BANK_WIDTH_1=y
+CONFIG_MTD_MAP_BANK_WIDTH_2=y
+CONFIG_MTD_MAP_BANK_WIDTH_4=y
+# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
+CONFIG_MTD_MAP_BANK_WIDTH_16=y
+# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
+CONFIG_MTD_CFI_I1=y
+CONFIG_MTD_CFI_I2=y
+# CONFIG_MTD_CFI_I4 is not set
+# CONFIG_MTD_CFI_I8 is not set
+CONFIG_MTD_CFI_INTELEXT=y
+CONFIG_MTD_CFI_AMDSTD=y
+# CONFIG_MTD_CFI_STAA is not set
+CONFIG_MTD_CFI_UTIL=y
+# CONFIG_MTD_RAM is not set
+CONFIG_MTD_ROM=y
+# CONFIG_MTD_ABSENT is not set
+# CONFIG_MTD_OBSOLETE_CHIPS is not set
+
+#
+# Mapping drivers for chip access
+#
+# CONFIG_MTD_COMPLEX_MAPPINGS is not set
+# CONFIG_MTD_PHYSMAP is not set
+# CONFIG_MTD_ARM_INTEGRATOR is not set
+# CONFIG_MTD_IMPA7 is not set
+CONFIG_MTD_BAST=y
+CONFIG_MTD_BAST_MAXSIZE=4
+# CONFIG_MTD_PLATRAM is not set
+
+#
+# Self-contained MTD device drivers
+#
+# CONFIG_MTD_DATAFLASH is not set
+# CONFIG_MTD_M25P80 is not set
+# CONFIG_MTD_SLRAM is not set
+# CONFIG_MTD_PHRAM is not set
+# CONFIG_MTD_MTDRAM is not set
+# CONFIG_MTD_BLOCK2MTD is not set
+
+#
+# Disk-On-Chip Device Drivers
+#
+# CONFIG_MTD_DOC2000 is not set
+# CONFIG_MTD_DOC2001 is not set
+# CONFIG_MTD_DOC2001PLUS is not set
+
+#
+# NAND Flash Device Drivers
+#
+CONFIG_MTD_NAND=y
+# CONFIG_MTD_NAND_VERIFY_WRITE is not set
+# CONFIG_MTD_NAND_ECC_SMC is not set
+CONFIG_MTD_NAND_IDS=y
+CONFIG_MTD_NAND_S3C2410=y
+# CONFIG_MTD_NAND_S3C2410_DEBUG is not set
+# CONFIG_MTD_NAND_S3C2410_HWECC is not set
+# CONFIG_MTD_NAND_S3C2410_CLKSTOP is not set
+# CONFIG_MTD_NAND_DISKONCHIP is not set
+# CONFIG_MTD_NAND_NANDSIM is not set
+
+#
+# OneNAND Flash Device Drivers
+#
+# CONFIG_MTD_ONENAND is not set
+
+#
+# Parallel port support
+#
+CONFIG_PARPORT=y
+# CONFIG_PARPORT_PC is not set
+# CONFIG_PARPORT_GSC is not set
+# CONFIG_PARPORT_AX88796 is not set
+CONFIG_PARPORT_1284=y
+
+#
+# Plug and Play support
+#
+# CONFIG_PNP is not set
+
+#
+# Block devices
+#
+# CONFIG_BLK_DEV_COW_COMMON is not set
+CONFIG_BLK_DEV_LOOP=y
+# CONFIG_BLK_DEV_CRYPTOLOOP is not set
+CONFIG_BLK_DEV_NBD=m
+# CONFIG_BLK_DEV_UB is not set
+CONFIG_BLK_DEV_RAM=y
+CONFIG_BLK_DEV_RAM_COUNT=16
+CONFIG_BLK_DEV_RAM_SIZE=4096
+CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
+CONFIG_BLK_DEV_INITRD=y
+# CONFIG_CDROM_PKTCDVD is not set
+CONFIG_ATA_OVER_ETH=m
+
+#
+# ATA/ATAPI/MFM/RLL support
+#
+CONFIG_IDE=y
+CONFIG_BLK_DEV_IDE=y
+
+#
+# Please see Documentation/ide.txt for help/info on IDE drives
+#
+# CONFIG_BLK_DEV_IDE_SATA is not set
+CONFIG_BLK_DEV_IDEDISK=y
+# CONFIG_IDEDISK_MULTI_MODE is not set
+CONFIG_BLK_DEV_IDECD=y
+CONFIG_BLK_DEV_IDETAPE=m
+CONFIG_BLK_DEV_IDEFLOPPY=m
+# CONFIG_IDE_TASK_IOCTL is not set
+
+#
+# IDE chipset support/bugfixes
+#
+CONFIG_IDE_GENERIC=y
+# CONFIG_IDE_ARM is not set
+CONFIG_BLK_DEV_IDE_BAST=y
+# CONFIG_IDE_CHIPSETS is not set
+# CONFIG_BLK_DEV_IDEDMA is not set
+# CONFIG_IDEDMA_AUTO is not set
+# CONFIG_BLK_DEV_HD is not set
+
+#
+# SCSI device support
+#
+# CONFIG_RAID_ATTRS is not set
+# CONFIG_SCSI is not set
+# CONFIG_SCSI_NETLINK is not set
+
+#
+# Multi-device support (RAID and LVM)
+#
+# CONFIG_MD is not set
+
+#
+# Fusion MPT device support
+#
+# CONFIG_FUSION is not set
+
+#
+# IEEE 1394 (FireWire) support
+#
+
+#
+# I2O device support
+#
+
+#
+# Network device support
+#
+CONFIG_NETDEVICES=y
+# CONFIG_DUMMY is not set
+# CONFIG_BONDING is not set
+# CONFIG_EQUALIZER is not set
+# CONFIG_TUN is not set
+
+#
+# ARCnet devices
+#
+# CONFIG_ARCNET is not set
+
+#
+# PHY device support
+#
+# CONFIG_PHYLIB is not set
+
+#
+# Ethernet (10 or 100Mbit)
+#
+CONFIG_NET_ETHERNET=y
+CONFIG_MII=y
+# CONFIG_NET_VENDOR_3COM is not set
+# CONFIG_NET_VENDOR_SMC is not set
+# CONFIG_SMC91X is not set
+CONFIG_DM9000=y
+# CONFIG_NET_VENDOR_RACAL is not set
+# CONFIG_AT1700 is not set
+# CONFIG_DEPCA is not set
+# CONFIG_HP100 is not set
+# CONFIG_NET_ISA is not set
+# CONFIG_NET_PCI is not set
+# CONFIG_NET_POCKET is not set
+
+#
+# Ethernet (1000 Mbit)
+#
+
+#
+# Ethernet (10000 Mbit)
+#
+
+#
+# Token Ring devices
+#
+# CONFIG_TR is not set
+
+#
+# Wireless LAN (non-hamradio)
+#
+# CONFIG_NET_RADIO is not set
+
+#
+# Wan interfaces
+#
+# CONFIG_WAN is not set
+# CONFIG_PLIP is not set
+# CONFIG_PPP is not set
+# CONFIG_SLIP is not set
+# CONFIG_SHAPER is not set
+# CONFIG_NETCONSOLE is not set
+# CONFIG_NETPOLL is not set
+# CONFIG_NET_POLL_CONTROLLER is not set
+
+#
+# ISDN subsystem
+#
+# CONFIG_ISDN is not set
+
+#
+# Input device support
+#
+CONFIG_INPUT=y
+# CONFIG_INPUT_FF_MEMLESS is not set
+
+#
+# Userland interfaces
+#
+CONFIG_INPUT_MOUSEDEV=y
+CONFIG_INPUT_MOUSEDEV_PSAUX=y
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
+# CONFIG_INPUT_JOYDEV is not set
+# CONFIG_INPUT_TSDEV is not set
+# CONFIG_INPUT_EVDEV is not set
+# CONFIG_INPUT_EVBUG is not set
+
+#
+# Input Device Drivers
+#
+CONFIG_INPUT_KEYBOARD=y
+CONFIG_KEYBOARD_ATKBD=y
+# CONFIG_KEYBOARD_SUNKBD is not set
+# CONFIG_KEYBOARD_LKKBD is not set
+# CONFIG_KEYBOARD_XTKBD is not set
+# CONFIG_KEYBOARD_NEWTON is not set
+# CONFIG_KEYBOARD_STOWAWAY is not set
+CONFIG_INPUT_MOUSE=y
+CONFIG_MOUSE_PS2=y
+# CONFIG_MOUSE_SERIAL is not set
+# CONFIG_MOUSE_INPORT is not set
+# CONFIG_MOUSE_LOGIBM is not set
+# CONFIG_MOUSE_PC110PAD is not set
+# CONFIG_MOUSE_VSXXXAA is not set
+# CONFIG_INPUT_JOYSTICK is not set
+# CONFIG_INPUT_TOUCHSCREEN is not set
+# CONFIG_INPUT_MISC is not set
+
+#
+# Hardware I/O ports
+#
+CONFIG_SERIO=y
+CONFIG_SERIO_SERPORT=y
+# CONFIG_SERIO_PARKBD is not set
+CONFIG_SERIO_LIBPS2=y
+# CONFIG_SERIO_RAW is not set
+# CONFIG_GAMEPORT is not set
+
+#
+# Character devices
+#
+CONFIG_VT=y
+CONFIG_VT_CONSOLE=y
+CONFIG_HW_CONSOLE=y
+# CONFIG_VT_HW_CONSOLE_BINDING is not set
+CONFIG_SERIAL_NONSTANDARD=y
+# CONFIG_COMPUTONE is not set
+# CONFIG_ROCKETPORT is not set
+# CONFIG_CYCLADES is not set
+# CONFIG_DIGIEPCA is not set
+# CONFIG_MOXA_INTELLIO is not set
+# CONFIG_MOXA_SMARTIO is not set
+# CONFIG_ISI is not set
+# CONFIG_SYNCLINKMP is not set
+# CONFIG_N_HDLC is not set
+# CONFIG_RISCOM8 is not set
+# CONFIG_SPECIALIX is not set
+# CONFIG_SX is not set
+# CONFIG_RIO is not set
+# CONFIG_STALDRV is not set
+
+#
+# Serial drivers
+#
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
+CONFIG_SERIAL_8250_NR_UARTS=8
+CONFIG_SERIAL_8250_RUNTIME_UARTS=4
+CONFIG_SERIAL_8250_EXTENDED=y
+CONFIG_SERIAL_8250_MANY_PORTS=y
+CONFIG_SERIAL_8250_SHARE_IRQ=y
+# CONFIG_SERIAL_8250_DETECT_IRQ is not set
+# CONFIG_SERIAL_8250_RSA is not set
+# CONFIG_SERIAL_8250_FOURPORT is not set
+# CONFIG_SERIAL_8250_ACCENT is not set
+# CONFIG_SERIAL_8250_BOCA is not set
+# CONFIG_SERIAL_8250_HUB6 is not set
+
+#
+# Non-8250 serial port support
+#
+CONFIG_SERIAL_S3C2410=y
+CONFIG_SERIAL_S3C2410_CONSOLE=y
+CONFIG_SERIAL_CORE=y
+CONFIG_SERIAL_CORE_CONSOLE=y
+CONFIG_UNIX98_PTYS=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
+CONFIG_PRINTER=y
+# CONFIG_LP_CONSOLE is not set
+CONFIG_PPDEV=y
+# CONFIG_TIPAR is not set
+
+#
+# IPMI
+#
+# CONFIG_IPMI_HANDLER is not set
+
+#
+# Watchdog Cards
+#
+CONFIG_WATCHDOG=y
+# CONFIG_WATCHDOG_NOWAYOUT is not set
+
+#
+# Watchdog Device Drivers
+#
+# CONFIG_SOFT_WATCHDOG is not set
+CONFIG_S3C2410_WATCHDOG=y
+
+#
+# ISA-based Watchdog Cards
+#
+# CONFIG_PCWATCHDOG is not set
+# CONFIG_MIXCOMWD is not set
+# CONFIG_WDT is not set
+
+#
+# USB-based Watchdog Cards
+#
+# CONFIG_USBPCWATCHDOG is not set
+CONFIG_HW_RANDOM=y
+# CONFIG_NVRAM is not set
+# CONFIG_DTLK is not set
+# CONFIG_R3964 is not set
+
+#
+# Ftape, the floppy tape device driver
+#
+# CONFIG_RAW_DRIVER is not set
+
+#
+# TPM devices
+#
+# CONFIG_TCG_TPM is not set
+
+#
+# I2C support
+#
+CONFIG_I2C=y
+CONFIG_I2C_CHARDEV=m
+
+#
+# I2C Algorithms
+#
+CONFIG_I2C_ALGOBIT=m
+# CONFIG_I2C_ALGOPCF is not set
+# CONFIG_I2C_ALGOPCA is not set
+
+#
+# I2C Hardware Bus support
+#
+# CONFIG_I2C_ELEKTOR is not set
+CONFIG_I2C_ISA=m
+# CONFIG_I2C_OCORES is not set
+# CONFIG_I2C_PARPORT is not set
+# CONFIG_I2C_PARPORT_LIGHT is not set
+CONFIG_I2C_S3C2410=y
+# CONFIG_I2C_STUB is not set
+# CONFIG_I2C_PCA_ISA is not set
+
+#
+# Miscellaneous I2C Chip support
+#
+# CONFIG_SENSORS_DS1337 is not set
+# CONFIG_SENSORS_DS1374 is not set
+CONFIG_SENSORS_EEPROM=m
+# CONFIG_SENSORS_PCF8574 is not set
+# CONFIG_SENSORS_PCA9539 is not set
+# CONFIG_SENSORS_PCF8591 is not set
+# CONFIG_SENSORS_MAX6875 is not set
+# CONFIG_I2C_DEBUG_CORE is not set
+# CONFIG_I2C_DEBUG_ALGO is not set
+# CONFIG_I2C_DEBUG_BUS is not set
+# CONFIG_I2C_DEBUG_CHIP is not set
+
+#
+# SPI support
+#
+CONFIG_SPI=y
+# CONFIG_SPI_DEBUG is not set
+CONFIG_SPI_MASTER=y
+
+#
+# SPI Master Controller Drivers
+#
+CONFIG_SPI_BITBANG=m
+# CONFIG_SPI_BUTTERFLY is not set
+CONFIG_SPI_S3C24XX_GPIO=m
+CONFIG_SPI_S3C24XX=m
+
+#
+# SPI Protocol Masters
+#
+
+#
+# Dallas's 1-wire bus
+#
+# CONFIG_W1 is not set
+
+#
+# Hardware Monitoring support
+#
+CONFIG_HWMON=y
+CONFIG_HWMON_VID=m
+# CONFIG_SENSORS_ABITUGURU is not set
+# CONFIG_SENSORS_ADM1021 is not set
+# CONFIG_SENSORS_ADM1025 is not set
+# CONFIG_SENSORS_ADM1026 is not set
+# CONFIG_SENSORS_ADM1031 is not set
+# CONFIG_SENSORS_ADM9240 is not set
+# CONFIG_SENSORS_ASB100 is not set
+# CONFIG_SENSORS_ATXP1 is not set
+# CONFIG_SENSORS_DS1621 is not set
+# CONFIG_SENSORS_F71805F is not set
+# CONFIG_SENSORS_FSCHER is not set
+# CONFIG_SENSORS_FSCPOS is not set
+# CONFIG_SENSORS_GL518SM is not set
+# CONFIG_SENSORS_GL520SM is not set
+# CONFIG_SENSORS_IT87 is not set
+# CONFIG_SENSORS_LM63 is not set
+# CONFIG_SENSORS_LM70 is not set
+CONFIG_SENSORS_LM75=m
+# CONFIG_SENSORS_LM77 is not set
+CONFIG_SENSORS_LM78=m
+# CONFIG_SENSORS_LM80 is not set
+# CONFIG_SENSORS_LM83 is not set
+CONFIG_SENSORS_LM85=m
+# CONFIG_SENSORS_LM87 is not set
+# CONFIG_SENSORS_LM90 is not set
+# CONFIG_SENSORS_LM92 is not set
+# CONFIG_SENSORS_MAX1619 is not set
+# CONFIG_SENSORS_PC87360 is not set
+# CONFIG_SENSORS_SMSC47M1 is not set
+# CONFIG_SENSORS_SMSC47M192 is not set
+# CONFIG_SENSORS_SMSC47B397 is not set
+# CONFIG_SENSORS_VT1211 is not set
+# CONFIG_SENSORS_W83781D is not set
+# CONFIG_SENSORS_W83791D is not set
+# CONFIG_SENSORS_W83792D is not set
+# CONFIG_SENSORS_W83L785TS is not set
+# CONFIG_SENSORS_W83627HF is not set
+# CONFIG_SENSORS_W83627EHF is not set
+# CONFIG_HWMON_DEBUG_CHIP is not set
+
+#
+# Misc devices
+#
+# CONFIG_TIFM_CORE is not set
+
+#
+# LED devices
+#
+CONFIG_NEW_LEDS=y
+CONFIG_LEDS_CLASS=m
+
+#
+# LED drivers
+#
+CONFIG_LEDS_S3C24XX=m
+
+#
+# LED Triggers
+#
+CONFIG_LEDS_TRIGGERS=y
+CONFIG_LEDS_TRIGGER_TIMER=m
+# CONFIG_LEDS_TRIGGER_IDE_DISK is not set
+CONFIG_LEDS_TRIGGER_HEARTBEAT=m
+
+#
+# Multimedia devices
+#
+# CONFIG_VIDEO_DEV is not set
+
+#
+# Digital Video Broadcasting Devices
+#
+# CONFIG_DVB is not set
+# CONFIG_USB_DABUSB is not set
+
+#
+# Graphics support
+#
+CONFIG_FIRMWARE_EDID=y
+CONFIG_FB=y
+# CONFIG_FB_DDC is not set
+CONFIG_FB_CFB_FILLRECT=y
+CONFIG_FB_CFB_COPYAREA=y
+CONFIG_FB_CFB_IMAGEBLIT=y
+# CONFIG_FB_MACMODES is not set
+# CONFIG_FB_BACKLIGHT is not set
+CONFIG_FB_MODE_HELPERS=y
+# CONFIG_FB_TILEBLITTING is not set
+# CONFIG_FB_S1D13XXX is not set
+CONFIG_FB_S3C2410=y
+# CONFIG_FB_S3C2410_DEBUG is not set
+# CONFIG_FB_VIRTUAL is not set
+
+#
+# Console display driver support
+#
+# CONFIG_VGA_CONSOLE is not set
+# CONFIG_MDA_CONSOLE is not set
+CONFIG_DUMMY_CONSOLE=y
+CONFIG_FRAMEBUFFER_CONSOLE=y
+# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
+# CONFIG_FONTS is not set
+CONFIG_FONT_8x8=y
+CONFIG_FONT_8x16=y
+
+#
+# Logo configuration
+#
+# CONFIG_LOGO is not set
+# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
+
+#
+# Sound
+#
+# CONFIG_SOUND is not set
+
+#
+# USB support
+#
+CONFIG_USB_ARCH_HAS_HCD=y
+CONFIG_USB_ARCH_HAS_OHCI=y
+# CONFIG_USB_ARCH_HAS_EHCI is not set
+CONFIG_USB=y
+# CONFIG_USB_DEBUG is not set
+
+#
+# Miscellaneous USB options
+#
+CONFIG_USB_DEVICEFS=y
+# CONFIG_USB_BANDWIDTH is not set
+# CONFIG_USB_DYNAMIC_MINORS is not set
+# CONFIG_USB_SUSPEND is not set
+# CONFIG_USB_OTG is not set
+
+#
+# USB Host Controller Drivers
+#
+# CONFIG_USB_ISP116X_HCD is not set
+CONFIG_USB_OHCI_HCD=y
+# CONFIG_USB_OHCI_BIG_ENDIAN is not set
+CONFIG_USB_OHCI_LITTLE_ENDIAN=y
+# CONFIG_USB_SL811_HCD is not set
+
+#
+# USB Device Class drivers
+#
+# CONFIG_USB_ACM is not set
+# CONFIG_USB_PRINTER is not set
+
+#
+# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
+#
+
+#
+# may also be needed; see USB_STORAGE Help for more information
+#
+# CONFIG_USB_LIBUSUAL is not set
+
+#
+# USB Input Devices
+#
+# CONFIG_USB_HID is not set
+
+#
+# USB HID Boot Protocol drivers
+#
+# CONFIG_USB_KBD is not set
+# CONFIG_USB_MOUSE is not set
+# CONFIG_USB_AIPTEK is not set
+# CONFIG_USB_WACOM is not set
+# CONFIG_USB_ACECAD is not set
+# CONFIG_USB_KBTAB is not set
+# CONFIG_USB_POWERMATE is not set
+# CONFIG_USB_TOUCHSCREEN is not set
+# CONFIG_USB_YEALINK is not set
+# CONFIG_USB_XPAD is not set
+# CONFIG_USB_ATI_REMOTE is not set
+# CONFIG_USB_ATI_REMOTE2 is not set
+# CONFIG_USB_KEYSPAN_REMOTE is not set
+# CONFIG_USB_APPLETOUCH is not set
+
+#
+# USB Imaging devices
+#
+# CONFIG_USB_MDC800 is not set
+
+#
+# USB Network Adapters
+#
+# CONFIG_USB_CATC is not set
+# CONFIG_USB_KAWETH is not set
+# CONFIG_USB_PEGASUS is not set
+# CONFIG_USB_RTL8150 is not set
+# CONFIG_USB_USBNET is not set
+CONFIG_USB_MON=y
+
+#
+# USB port drivers
+#
+# CONFIG_USB_USS720 is not set
+
+#
+# USB Serial Converter support
+#
+# CONFIG_USB_SERIAL is not set
+
+#
+# USB Miscellaneous drivers
+#
+# CONFIG_USB_EMI62 is not set
+# CONFIG_USB_EMI26 is not set
+# CONFIG_USB_ADUTUX is not set
+# CONFIG_USB_AUERSWALD is not set
+# CONFIG_USB_RIO500 is not set
+# CONFIG_USB_LEGOTOWER is not set
+# CONFIG_USB_LCD is not set
+# CONFIG_USB_LED is not set
+# CONFIG_USB_CYPRESS_CY7C63 is not set
+# CONFIG_USB_CYTHERM is not set
+# CONFIG_USB_PHIDGET is not set
+# CONFIG_USB_IDMOUSE is not set
+# CONFIG_USB_FTDI_ELAN is not set
+# CONFIG_USB_APPLEDISPLAY is not set
+# CONFIG_USB_LD is not set
+# CONFIG_USB_TRANCEVIBRATOR is not set
+# CONFIG_USB_TEST is not set
+
+#
+# USB DSL modem support
+#
+
+#
+# USB Gadget Support
+#
+# CONFIG_USB_GADGET is not set
+
+#
+# MMC/SD Card support
+#
+# CONFIG_MMC is not set
+
+#
+# Real Time Clock
+#
+CONFIG_RTC_LIB=y
+CONFIG_RTC_CLASS=y
+CONFIG_RTC_HCTOSYS=y
+CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
+# CONFIG_RTC_DEBUG is not set
+
+#
+# RTC interfaces
+#
+CONFIG_RTC_INTF_SYSFS=y
+CONFIG_RTC_INTF_PROC=y
+CONFIG_RTC_INTF_DEV=y
+# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
+
+#
+# RTC drivers
+#
+# CONFIG_RTC_DRV_X1205 is not set
+# CONFIG_RTC_DRV_DS1307 is not set
+# CONFIG_RTC_DRV_DS1553 is not set
+# CONFIG_RTC_DRV_ISL1208 is not set
+# CONFIG_RTC_DRV_DS1672 is not set
+# CONFIG_RTC_DRV_DS1742 is not set
+# CONFIG_RTC_DRV_PCF8563 is not set
+# CONFIG_RTC_DRV_PCF8583 is not set
+# CONFIG_RTC_DRV_RS5C348 is not set
+# CONFIG_RTC_DRV_RS5C372 is not set
+CONFIG_RTC_DRV_S3C=y
+# CONFIG_RTC_DRV_M48T86 is not set
+# CONFIG_RTC_DRV_TEST is not set
+# CONFIG_RTC_DRV_MAX6902 is not set
+# CONFIG_RTC_DRV_V3020 is not set
+
+#
+# File systems
+#
+CONFIG_EXT2_FS=y
+# CONFIG_EXT2_FS_XATTR is not set
+# CONFIG_EXT2_FS_XIP is not set
+CONFIG_EXT3_FS=y
+CONFIG_EXT3_FS_XATTR=y
+# CONFIG_EXT3_FS_POSIX_ACL is not set
+# CONFIG_EXT3_FS_SECURITY is not set
+# CONFIG_EXT4DEV_FS is not set
+CONFIG_JBD=y
+# CONFIG_JBD_DEBUG is not set
+CONFIG_FS_MBCACHE=y
+# CONFIG_REISERFS_FS is not set
+# CONFIG_JFS_FS is not set
+# CONFIG_FS_POSIX_ACL is not set
+# CONFIG_XFS_FS is not set
+# CONFIG_GFS2_FS is not set
+# CONFIG_OCFS2_FS is not set
+# CONFIG_MINIX_FS is not set
+CONFIG_ROMFS_FS=y
+CONFIG_INOTIFY=y
+CONFIG_INOTIFY_USER=y
+# CONFIG_QUOTA is not set
+CONFIG_DNOTIFY=y
+# CONFIG_AUTOFS_FS is not set
+# CONFIG_AUTOFS4_FS is not set
+# CONFIG_FUSE_FS is not set
+
+#
+# CD-ROM/DVD Filesystems
+#
+# CONFIG_ISO9660_FS is not set
+# CONFIG_UDF_FS is not set
+
+#
+# DOS/FAT/NT Filesystems
+#
+CONFIG_FAT_FS=y
+CONFIG_MSDOS_FS=y
+CONFIG_VFAT_FS=y
+CONFIG_FAT_DEFAULT_CODEPAGE=437
+CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
+# CONFIG_NTFS_FS is not set
+
+#
+# Pseudo filesystems
+#
+CONFIG_PROC_FS=y
+CONFIG_PROC_SYSCTL=y
+CONFIG_SYSFS=y
+# CONFIG_TMPFS is not set
+# CONFIG_HUGETLB_PAGE is not set
+CONFIG_RAMFS=y
+# CONFIG_CONFIGFS_FS is not set
+
+#
+# Miscellaneous filesystems
+#
+# CONFIG_ADFS_FS is not set
+# CONFIG_AFFS_FS is not set
+# CONFIG_HFS_FS is not set
+# CONFIG_HFSPLUS_FS is not set
+# CONFIG_BEFS_FS is not set
+# CONFIG_BFS_FS is not set
+# CONFIG_EFS_FS is not set
+CONFIG_JFFS_FS=y
+CONFIG_JFFS_FS_VERBOSE=0
+# CONFIG_JFFS_PROC_FS is not set
+CONFIG_JFFS2_FS=y
+CONFIG_JFFS2_FS_DEBUG=0
+CONFIG_JFFS2_FS_WRITEBUFFER=y
+# CONFIG_JFFS2_SUMMARY is not set
+# CONFIG_JFFS2_FS_XATTR is not set
+# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
+CONFIG_JFFS2_ZLIB=y
+CONFIG_JFFS2_RTIME=y
+# CONFIG_JFFS2_RUBIN is not set
+# CONFIG_CRAMFS is not set
+# CONFIG_VXFS_FS is not set
+# CONFIG_HPFS_FS is not set
+# CONFIG_QNX4FS_FS is not set
+# CONFIG_SYSV_FS is not set
+# CONFIG_UFS_FS is not set
+
+#
+# Network File Systems
+#
+CONFIG_NFS_FS=y
+# CONFIG_NFS_V3 is not set
+# CONFIG_NFS_V4 is not set
+# CONFIG_NFS_DIRECTIO is not set
+# CONFIG_NFSD is not set
+CONFIG_ROOT_NFS=y
+CONFIG_LOCKD=y
+CONFIG_NFS_COMMON=y
+CONFIG_SUNRPC=y
+# CONFIG_RPCSEC_GSS_KRB5 is not set
+# CONFIG_RPCSEC_GSS_SPKM3 is not set
+# CONFIG_SMB_FS is not set
+# CONFIG_CIFS is not set
+# CONFIG_NCP_FS is not set
+# CONFIG_CODA_FS is not set
+# CONFIG_AFS_FS is not set
+# CONFIG_9P_FS is not set
+
+#
+# Partition Types
+#
+CONFIG_PARTITION_ADVANCED=y
+# CONFIG_ACORN_PARTITION is not set
+# CONFIG_OSF_PARTITION is not set
+# CONFIG_AMIGA_PARTITION is not set
+# CONFIG_ATARI_PARTITION is not set
+# CONFIG_MAC_PARTITION is not set
+CONFIG_MSDOS_PARTITION=y
+CONFIG_BSD_DISKLABEL=y
+# CONFIG_MINIX_SUBPARTITION is not set
+CONFIG_SOLARIS_X86_PARTITION=y
+# CONFIG_UNIXWARE_DISKLABEL is not set
+# CONFIG_LDM_PARTITION is not set
+# CONFIG_SGI_PARTITION is not set
+# CONFIG_ULTRIX_PARTITION is not set
+# CONFIG_SUN_PARTITION is not set
+# CONFIG_KARMA_PARTITION is not set
+# CONFIG_EFI_PARTITION is not set
+
+#
+# Native Language Support
+#
+CONFIG_NLS=y
+CONFIG_NLS_DEFAULT="iso8859-1"
+# CONFIG_NLS_CODEPAGE_437 is not set
+# CONFIG_NLS_CODEPAGE_737 is not set
+# CONFIG_NLS_CODEPAGE_775 is not set
+# CONFIG_NLS_CODEPAGE_850 is not set
+# CONFIG_NLS_CODEPAGE_852 is not set
+# CONFIG_NLS_CODEPAGE_855 is not set
+# CONFIG_NLS_CODEPAGE_857 is not set
+# CONFIG_NLS_CODEPAGE_860 is not set
+# CONFIG_NLS_CODEPAGE_861 is not set
+# CONFIG_NLS_CODEPAGE_862 is not set
+# CONFIG_NLS_CODEPAGE_863 is not set
+# CONFIG_NLS_CODEPAGE_864 is not set
+# CONFIG_NLS_CODEPAGE_865 is not set
+# CONFIG_NLS_CODEPAGE_866 is not set
+# CONFIG_NLS_CODEPAGE_869 is not set
+# CONFIG_NLS_CODEPAGE_936 is not set
+# CONFIG_NLS_CODEPAGE_950 is not set
+# CONFIG_NLS_CODEPAGE_932 is not set
+# CONFIG_NLS_CODEPAGE_949 is not set
+# CONFIG_NLS_CODEPAGE_874 is not set
+# CONFIG_NLS_ISO8859_8 is not set
+# CONFIG_NLS_CODEPAGE_1250 is not set
+# CONFIG_NLS_CODEPAGE_1251 is not set
+# CONFIG_NLS_ASCII is not set
+# CONFIG_NLS_ISO8859_1 is not set
+# CONFIG_NLS_ISO8859_2 is not set
+# CONFIG_NLS_ISO8859_3 is not set
+# CONFIG_NLS_ISO8859_4 is not set
+# CONFIG_NLS_ISO8859_5 is not set
+# CONFIG_NLS_ISO8859_6 is not set
+# CONFIG_NLS_ISO8859_7 is not set
+# CONFIG_NLS_ISO8859_9 is not set
+# CONFIG_NLS_ISO8859_13 is not set
+# CONFIG_NLS_ISO8859_14 is not set
+# CONFIG_NLS_ISO8859_15 is not set
+# CONFIG_NLS_KOI8_R is not set
+# CONFIG_NLS_KOI8_U is not set
+# CONFIG_NLS_UTF8 is not set
+
+#
+# Profiling support
+#
+# CONFIG_PROFILING is not set
+
+#
+# Kernel hacking
+#
+# CONFIG_PRINTK_TIME is not set
+CONFIG_ENABLE_MUST_CHECK=y
+CONFIG_MAGIC_SYSRQ=y
+# CONFIG_UNUSED_SYMBOLS is not set
+CONFIG_DEBUG_KERNEL=y
+CONFIG_LOG_BUF_SHIFT=16
+CONFIG_DETECT_SOFTLOCKUP=y
+# CONFIG_SCHEDSTATS is not set
+# CONFIG_DEBUG_SLAB is not set
+# CONFIG_DEBUG_RT_MUTEXES is not set
+# CONFIG_RT_MUTEX_TESTER is not set
+# CONFIG_DEBUG_SPINLOCK is not set
+CONFIG_DEBUG_MUTEXES=y
+# CONFIG_DEBUG_RWSEMS is not set
+# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
+# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
+# CONFIG_DEBUG_KOBJECT is not set
+CONFIG_DEBUG_BUGVERBOSE=y
+CONFIG_DEBUG_INFO=y
+# CONFIG_DEBUG_FS is not set
+# CONFIG_DEBUG_VM is not set
+# CONFIG_DEBUG_LIST is not set
+CONFIG_FRAME_POINTER=y
+CONFIG_FORCED_INLINING=y
+# CONFIG_HEADERS_CHECK is not set
+# CONFIG_RCU_TORTURE_TEST is not set
+CONFIG_DEBUG_USER=y
+# CONFIG_DEBUG_ERRORS is not set
+CONFIG_DEBUG_LL=y
+# CONFIG_DEBUG_ICEDCC is not set
+CONFIG_DEBUG_S3C2410_PORT=y
+CONFIG_DEBUG_S3C2410_UART=0
+
+#
+# Security options
+#
+# CONFIG_KEYS is not set
+# CONFIG_SECURITY is not set
+
+#
+# Cryptographic options
+#
+# CONFIG_CRYPTO is not set
+
+#
+# Library routines
+#
+# CONFIG_CRC_CCITT is not set
+# CONFIG_CRC16 is not set
+CONFIG_CRC32=y
+# CONFIG_LIBCRC32C is not set
+CONFIG_ZLIB_INFLATE=y
+CONFIG_ZLIB_DEFLATE=y
+CONFIG_PLIST=y
diff -urNp linux-2.6.20/arch/arm/configs/s3c2410_defconfig.rej linux-2.6.20-s1t/arch/arm/configs/s3c2410_defconfig.rej
--- linux-2.6.20/arch/arm/configs/s3c2410_defconfig.rej	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/arch/arm/configs/s3c2410_defconfig.rej	2007-02-07 16:29:01.000000000 +0000
@@ -0,0 +1,19 @@
+*************** CONFIG_FORCED_INLINING=y
+*** 1319,1326 ****
+  # CONFIG_HEADERS_CHECK is not set
+  # CONFIG_RCU_TORTURE_TEST is not set
+  CONFIG_DEBUG_USER=y
+- # CONFIG_DEBUG_WAITQ is not set
+- # CONFIG_DEBUG_ERRORS is not set
+  CONFIG_DEBUG_LL=y
+  # CONFIG_DEBUG_ICEDCC is not set
+  CONFIG_DEBUG_S3C2410_PORT=y
+--- 1554,1561 ----
+  # CONFIG_HEADERS_CHECK is not set
+  # CONFIG_RCU_TORTURE_TEST is not set
+  CONFIG_DEBUG_USER=y
++ CONFIG_DEBUG_WAITQ=y
++ CONFIG_DEBUG_ERRORS=y
+  CONFIG_DEBUG_LL=y
+  # CONFIG_DEBUG_ICEDCC is not set
+  CONFIG_DEBUG_S3C2410_PORT=y
diff -urNp linux-2.6.20/arch/arm/kernel/setup.c linux-2.6.20-s1t/arch/arm/kernel/setup.c
--- linux-2.6.20/arch/arm/kernel/setup.c	2007-02-04 18:44:54.000000000 +0000
+++ linux-2.6.20-s1t/arch/arm/kernel/setup.c	2007-02-07 16:29:01.000000000 +0000
@@ -28,6 +28,7 @@
 #include <asm/elf.h>
 #include <asm/procinfo.h>
 #include <asm/setup.h>
+#include <asm/fpsetup.h>
 #include <asm/mach-types.h>
 #include <asm/cacheflush.h>
 #include <asm/tlbflush.h>
diff -urNp linux-2.6.20/arch/arm/mach-s3c2410/Kconfig linux-2.6.20-s1t/arch/arm/mach-s3c2410/Kconfig
--- linux-2.6.20/arch/arm/mach-s3c2410/Kconfig	2007-02-04 18:44:54.000000000 +0000
+++ linux-2.6.20-s1t/arch/arm/mach-s3c2410/Kconfig	2007-02-07 16:29:04.000000000 +0000
@@ -31,6 +31,7 @@ config ARCH_BAST
 	select CPU_S3C2410
 	select PM_SIMTEC if PM
 	select ISA
+	select SIMTEC_AUDIO
 	help
 	  Say Y here if you are using the Simtec Electronics EB2410ITX
 	  development board (also known as BAST)
@@ -117,6 +118,7 @@ config MACH_VR1000
 	bool "Thorcom VR1000"
 	select PM_SIMTEC if PM
 	select CPU_S3C2410
+	select SIMTEC_AUDIO
 	help
 	  Say Y here if you are using the Thorcom VR1000 board.
 
@@ -153,6 +155,20 @@ config MACH_VSTMS
 
 endmenu
 
+comment "Board drivers and common code"
+
+config SMDK_AX88780
+	tristate "SMDK with AX88780 extension"
+	depends on ARCH_S3C2440 || ARCH_SMDK2410
+	help
+	  Driver setup for the AX88780 extension board for the SMDK
+	  bus connector.
+
+	  This driver can be built as a module.
+
+comment "Core configuration"
+
+
 config S3C2410_CLOCK
 	bool
 	help
@@ -192,6 +208,13 @@ config S3C2412_PM
 	help
 	  Internal config node to apply S3C2412 power management
 
+config S3C2412_PM
+	bool
+	default y if PM
+	depends on CPU_S3C2412
+	help
+	  Internal config node to apply S3C2412 power management
+
 config CPU_S3C2412
 	bool
 	depends on ARCH_S3C2410
@@ -306,6 +329,10 @@ config PM_SIMTEC
 	  Common power management code for systems that are
 	  compatible with the Simtec style of power management
 
+config SIMTEC_AUDIO
+	bool
+	depends on ARCH_BAST || MACH_ANUBIS || MACH_OSIRIS || MACH_VR1000
+
 config S3C2410_LOWLEVEL_UART_PORT
 	int "S3C2410 UART to use for low-level messages"
 	default 0
diff -urNp linux-2.6.20/arch/arm/mach-s3c2410/Kconfig.orig linux-2.6.20-s1t/arch/arm/mach-s3c2410/Kconfig.orig
--- linux-2.6.20/arch/arm/mach-s3c2410/Kconfig.orig	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/arch/arm/mach-s3c2410/Kconfig.orig	2007-02-04 18:44:54.000000000 +0000
@@ -0,0 +1,321 @@
+if ARCH_S3C2410
+
+menu "S3C24XX Implementations"
+
+config MACH_AML_M5900
+	bool "AML M5900 Series"
+	select CPU_S3C2410
+	select PM_SIMTEC if PM
+	help
+	   Say Y here if you are using the American Microsystems M5900 Series
+           <http://www.amltd.com>
+
+config MACH_ANUBIS
+	bool "Simtec Electronics ANUBIS"
+	select CPU_S3C2440
+	select PM_SIMTEC if PM
+	help
+	  Say Y here if you are using the Simtec Electronics ANUBIS
+	  development system
+
+config MACH_OSIRIS
+	bool "Simtec IM2440D20 (OSIRIS) module"
+	select CPU_S3C2440
+	select PM_SIMTEC if PM
+	help
+	  Say Y here if you are using the Simtec IM2440D20 module, also
+	  known as the Osiris.
+
+config ARCH_BAST
+	bool "Simtec Electronics BAST (EB2410ITX)"
+	select CPU_S3C2410
+	select PM_SIMTEC if PM
+	select ISA
+	help
+	  Say Y here if you are using the Simtec Electronics EB2410ITX
+	  development board (also known as BAST)
+
+	  Product page: <http://www.simtec.co.uk/products/EB2410ITX/>.
+
+config BAST_PC104_IRQ
+	bool "BAST PC104 IRQ support"
+	depends on ARCH_BAST
+	default y
+	help
+	  Say Y	here to enable the PC104 IRQ routing on the
+	  Simtec BAST (EB2410ITX)
+
+config PM_H1940
+	bool
+	help
+	  Internal node for H1940 and related PM
+
+config ARCH_H1940
+	bool "IPAQ H1940"
+	select CPU_S3C2410
+	select PM_H1940 if PM
+	help
+	  Say Y here if you are using the HP IPAQ H1940
+
+	  <http://www.handhelds.org/projects/h1940.html>.
+
+config MACH_N30
+	bool "Acer N30"
+	select CPU_S3C2410
+	help
+	  Say Y here if you are using the Acer N30
+
+	  <http://zoo.weinigel.se/n30>.
+
+config MACH_SMDK
+	bool
+	help
+	  Common machine code for SMDK2410 and SMDK2440
+
+config ARCH_SMDK2410
+	bool "SMDK2410/A9M2410"
+	select CPU_S3C2410
+	select MACH_SMDK
+	help
+	   Say Y here if you are using the SMDK2410 or the derived module A9M2410
+           <http://www.fsforth.de>
+
+config ARCH_S3C2440
+	bool "SMDK2440"
+	select CPU_S3C2440
+	select MACH_SMDK
+	help
+	  Say Y here if you are using the SMDK2440.
+
+config SMDK2440_CPU2440
+	bool "SMDK2440 with S3C2440 CPU module"
+	depends on ARCH_S3C2440
+	default y if ARCH_S3C2440
+	select CPU_S3C2440
+
+config SMDK2440_CPU2442
+	bool "SMDM2440 with S3C2442 CPU module"
+	depends on ARCH_S3C2440
+	select CPU_S3C2442
+
+config MACH_S3C2413
+	bool
+	help
+	  Internal node for S3C2413 version of SMDK2413, so that
+	  machine_is_s3c2413() will work when MACH_SMDK2413 is
+	  selected
+
+config MACH_SMDK2413
+	bool "SMDK2413"
+	select CPU_S3C2412
+	select MACH_S3C2413
+	select MACH_SMDK
+	help
+	  Say Y here if you are using an SMDK2413
+
+config MACH_VR1000
+	bool "Thorcom VR1000"
+	select PM_SIMTEC if PM
+	select CPU_S3C2410
+	help
+	  Say Y here if you are using the Thorcom VR1000 board.
+
+	  This linux port is currently being maintained by Simtec, on behalf
+	  of Thorcom. Any queries, please contact Thorcom first.
+
+config MACH_RX3715
+	bool "HP iPAQ rx3715"
+	select CPU_S3C2440
+	select PM_H1940 if PM
+	help
+	  Say Y here if you are using the HP iPAQ rx3715.
+
+	  See <http://www.handhelds.org/projects/rx3715.html> for more
+	  information on this project
+
+config MACH_OTOM
+ 	bool "NexVision OTOM Board"
+ 	select CPU_S3C2410
+	help
+ 	  Say Y here if you are using the Nex Vision OTOM board
+
+config MACH_NEXCODER_2440
+ 	bool "NexVision NEXCODER 2440 Light Board"
+ 	select CPU_S3C2440
+	help
+ 	  Say Y here if you are using the Nex Vision NEXCODER 2440 Light Board
+
+config MACH_VSTMS
+	bool "VMSTMS"
+	select CPU_S3C2412
+	help
+	  Say Y here if you are using an VSTMS board
+
+endmenu
+
+config S3C2410_CLOCK
+	bool
+	help
+	  Clock code for the S3C2410, and similar processors
+
+config S3C2410_PM
+	bool
+	help
+	  Power Management code common to S3C2410 and better
+
+config CPU_S3C2410_DMA
+	bool
+	depends on S3C2410_DMA && (CPU_S3C2410 || CPU_S3C2442)
+	default y if CPU_S3C2410 || CPU_S3C2442
+	help
+	  DMA device selection for S3C2410 and compatible CPUs
+
+config CPU_S3C2410
+	bool
+	depends on ARCH_S3C2410
+	select S3C2410_CLOCK
+	select S3C2410_PM if PM
+	help
+	  Support for S3C2410 and S3C2410A family from the S3C24XX line
+	  of Samsung Mobile CPUs.
+
+# internal node to signify if we are only dealing with an S3C2412
+
+config CPU_S3C2412_ONLY
+	bool
+	depends on ARCH_S3C2410 && !CPU_S3C2400 && !CPU_S3C2410 && \
+		   !CPU_S3C2440 && !CPU_S3C2442 && CPU_S3C2412
+	default y if CPU_S3C2412
+
+config S3C2412_PM
+	bool
+	help
+	  Internal config node to apply S3C2412 power management
+
+config CPU_S3C2412
+	bool
+	depends on ARCH_S3C2410
+	select S3C2412_PM if PM
+	help
+	  Support for the S3C2412 and S3C2413 SoCs from the S3C24XX line
+
+config CPU_S3C244X
+	bool
+	depends on ARCH_S3C2410 && (CPU_S3C2440 || CPU_S3C2442)
+	help
+	  Support for S3C2440 and S3C2442 Samsung Mobile CPU based systems.
+
+config CPU_S3C2440
+	bool
+	depends on ARCH_S3C2410
+	select S3C2410_CLOCK
+	select S3C2410_PM if PM
+	select CPU_S3C244X
+	help
+	  Support for S3C2440 Samsung Mobile CPU based systems.
+
+config CPU_S3C2442
+	bool
+	depends on ARCH_S3C2420
+	select S3C2410_CLOCK
+	select S3C2410_PM if PM
+	select CPU_S3C244X
+	help
+	  Support for S3C2442 Samsung Mobile CPU based systems.
+
+comment "S3C2410 Boot"
+
+config S3C2410_BOOT_WATCHDOG
+	bool "S3C2410 Initialisation watchdog"
+	depends on ARCH_S3C2410 && S3C2410_WATCHDOG
+	help
+	  Say y to enable the watchdog during the kernel decompression
+	  stage. If the kernel fails to uncompress, then the watchdog
+	  will trigger a reset and the system should restart.
+
+	  Although this uses the same hardware unit as the kernel watchdog
+	  driver, it is not a replacement for it. If you use this option,
+	  you will have to use the watchdg driver to either stop the timeout
+	  or restart it. If you do not, then your kernel will reboot after
+	  startup.
+
+	  The driver uses a fixed timeout value, so the exact time till the
+	  system resets depends on the value of PCLK. The timeout on an
+	  200MHz s3c2410 should be about 30 seconds.
+
+config S3C2410_BOOT_ERROR_RESET
+	bool "S3C2410 Reboot on decompression error"
+	depends on ARCH_S3C2410
+	help
+	  Say y here to use the watchdog to reset the system if the
+	  kernel decompressor detects an error during decompression.
+
+
+comment "S3C2410 Setup"
+
+config S3C2410_DMA
+	bool "S3C2410 DMA support"
+	depends on ARCH_S3C2410
+	help
+	  S3C2410 DMA support. This is needed for drivers like sound which
+	  use the S3C2410's DMA system to move data to and from the
+	  peripheral blocks.
+
+config S3C2410_DMA_DEBUG
+	bool "S3C2410 DMA support debug"
+	depends on ARCH_S3C2410 && S3C2410_DMA
+	help
+	  Enable debugging output for the DMA code. This option sends info
+	  to the kernel log, at priority KERN_DEBUG.
+
+	  Note, it is easy to create and fill the log buffer in a small
+	  amount of time, as well as using an significant percentage of
+	  the CPU time doing so.
+
+
+config S3C2410_PM_DEBUG
+	bool "S3C2410 PM Suspend debug"
+	depends on ARCH_S3C2410 && PM
+	help
+	  Say Y here if you want verbose debugging from the PM Suspend and
+	  Resume code. See <file:Documentation/arm/Samsung-S3C24XX/Suspend.txt>
+	  for more information.
+
+config S3C2410_PM_CHECK
+	bool "S3C2410 PM Suspend Memory CRC"
+	depends on ARCH_S3C2410 && PM && CRC32
+	help
+ 	  Enable the PM code's memory area checksum over sleep. This option
+	  will generate CRCs of all blocks of memory, and store them before
+	  going to sleep. The blocks are then checked on resume for any
+	  errors.
+
+config S3C2410_PM_CHECK_CHUNKSIZE
+	int "S3C2410 PM Suspend CRC Chunksize (KiB)"
+	depends on ARCH_S3C2410 && PM && S3C2410_PM_CHECK
+	default 64
+	help
+	  Set the chunksize in Kilobytes of the CRC for checking memory
+	  corruption over suspend and resume. A smaller value will mean that
+	  the CRC data block will take more memory, but wil identify any
+	  faults with better precision.
+
+config PM_SIMTEC
+	bool
+	help
+	  Common power management code for systems that are
+	  compatible with the Simtec style of power management
+
+config S3C2410_LOWLEVEL_UART_PORT
+	int "S3C2410 UART to use for low-level messages"
+	default 0
+	help
+	  Choice of which UART port to use for the low-level messages,
+	  such as the `Uncompressing...` at start time. The value of
+	  this configuration should be between zero and two. The port
+	  must have been initialised by the boot-loader before use.
+
+	  Note, this does not affect the port used by the debug messages,
+	  which is a separate configuration.
+
+endif
diff -urNp linux-2.6.20/arch/arm/mach-s3c2410/Kconfig.rej linux-2.6.20-s1t/arch/arm/mach-s3c2410/Kconfig.rej
--- linux-2.6.20/arch/arm/mach-s3c2410/Kconfig.rej	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/arch/arm/mach-s3c2410/Kconfig.rej	2007-02-07 16:29:04.000000000 +0000
@@ -0,0 +1,35 @@
+*************** config MACH_AML_M5900
+*** 12,17 ****
+  config MACH_ANUBIS
+  	bool "Simtec Electronics ANUBIS"
+  	select CPU_S3C2440
+  	help
+  	  Say Y here if you are using the Simtec Electronics ANUBIS
+  	  development system
+--- 12,18 ----
+  config MACH_ANUBIS
+  	bool "Simtec Electronics ANUBIS"
+  	select CPU_S3C2440
++ 	select SIMTEC_AUDIO
+  	help
+  	  Say Y here if you are using the Simtec Electronics ANUBIS
+  	  development system
+*************** config MACH_ANUBIS
+*** 19,24 ****
+  config MACH_OSIRIS
+  	bool "Simtec IM2440D20 (OSIRIS) module"
+  	select CPU_S3C2440
+  	help
+  	  Say Y here if you are using the Simtec IM2440D20 module, also
+  	  known as the Osiris.
+--- 20,29 ----
+  config MACH_OSIRIS
+  	bool "Simtec IM2440D20 (OSIRIS) module"
+  	select CPU_S3C2440
++ 	select SIMTEC_SBCD
++ 	select SBCD
++ 	select SIMTEC_AUDIO
++ 	select SBCD_IM2440D20
+  	help
+  	  Say Y here if you are using the Simtec IM2440D20 module, also
+  	  known as the Osiris.
diff -urNp linux-2.6.20/arch/arm/mach-s3c2410/Makefile linux-2.6.20-s1t/arch/arm/mach-s3c2410/Makefile
--- linux-2.6.20/arch/arm/mach-s3c2410/Makefile	2007-02-04 18:44:54.000000000 +0000
+++ linux-2.6.20-s1t/arch/arm/mach-s3c2410/Makefile	2007-02-07 16:29:07.000000000 +0000
@@ -33,6 +33,10 @@ obj-$(CONFIG_PM)		+= pm.o sleep.o
 obj-$(CONFIG_PM_SIMTEC)		+= pm-simtec.o
 obj-$(CONFIG_PM_H1940)		+= pm-h1940.o
 
+# Audio support
+
+obj-$(CONFIG_SIMTEC_AUDIO)	+= audio-simtec.o
+
 # S3C2412 support
 obj-$(CONFIG_CPU_S3C2412)	+= s3c2412.o
 obj-$(CONFIG_CPU_S3C2412)	+= s3c2412-irq.o
@@ -89,4 +93,5 @@ obj-$(CONFIG_MACH_OTOM)		+= mach-otom.o
 obj-$(CONFIG_MACH_NEXCODER_2440) += mach-nexcoder.o
 obj-$(CONFIG_MACH_VSTMS)	+= mach-vstms.o
 
-obj-$(CONFIG_MACH_SMDK)		+= common-smdk.o
\ No newline at end of file
+obj-$(CONFIG_MACH_SMDK)		+= common-smdk.o
+obj-$(CONFIG_MACH_SMDK_AX88780)	+= smdk-ax88780.o
\ No newline at end of file
diff -urNp linux-2.6.20/arch/arm/mach-s3c2410/Makefile.orig linux-2.6.20-s1t/arch/arm/mach-s3c2410/Makefile.orig
--- linux-2.6.20/arch/arm/mach-s3c2410/Makefile.orig	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/arch/arm/mach-s3c2410/Makefile.orig	2007-02-04 18:44:54.000000000 +0000
@@ -0,0 +1,92 @@
+
+#
+# Makefile for the linux kernel.
+#
+
+# Object file lists.
+
+obj-y			:= cpu.o irq.o time.o gpio.o clock.o devs.o
+obj-m			:=
+obj-n			:=
+obj-			:=
+obj-dma-y		:=
+obj-dma-n		:=
+
+# DMA
+obj-$(CONFIG_S3C2410_DMA)	+= dma.o
+
+# S3C2400 support files
+obj-$(CONFIG_CPU_S3C2400)	+= s3c2400-gpio.o
+
+# S3C2410 support files
+
+obj-$(CONFIG_CPU_S3C2410)	+= s3c2410.o
+obj-$(CONFIG_CPU_S3C2410)	+= s3c2410-gpio.o
+obj-$(CONFIG_CPU_S3C2410)	+= s3c2410-irq.o
+
+obj-$(CONFIG_S3C2410_PM)	+= s3c2410-pm.o s3c2410-sleep.o
+obj-$(CONFIG_CPU_S3C2410_DMA)	+= s3c2410-dma.o
+
+# Power Management support
+
+obj-$(CONFIG_PM)		+= pm.o sleep.o
+obj-$(CONFIG_PM_SIMTEC)		+= pm-simtec.o
+obj-$(CONFIG_PM_H1940)		+= pm-h1940.o
+
+# S3C2412 support
+obj-$(CONFIG_CPU_S3C2412)	+= s3c2412.o
+obj-$(CONFIG_CPU_S3C2412)	+= s3c2412-irq.o
+obj-$(CONFIG_CPU_S3C2412)	+= s3c2412-clock.o
+obj-dma-$(CONFIG_CPU_S3C2412)	+= s3c2412-dma.o
+
+obj-$(CONFIG_S3C2412_PM)	+= s3c2412-pm.o
+
+#
+# S3C244X support
+
+obj-$(CONFIG_CPU_S3C244X)	+= s3c244x.o
+obj-$(CONFIG_CPU_S3C244X)	+= s3c244x-irq.o
+
+# Clock control
+
+obj-$(CONFIG_S3C2410_CLOCK)	+= s3c2410-clock.o
+
+# S3C2440 support
+
+obj-$(CONFIG_CPU_S3C2440)	+= s3c2440.o s3c2440-dsc.o
+obj-$(CONFIG_CPU_S3C2440)	+= s3c2440-irq.o
+obj-$(CONFIG_CPU_S3C2440)	+= s3c2440-clock.o
+obj-$(CONFIG_CPU_S3C2440)	+= s3c2410-gpio.o
+obj-dma-$(CONFIG_CPU_S3C2440)	+= s3c2440-dma.o
+
+# S3C2442 support
+
+obj-$(CONFIG_CPU_S3C2442)	+= s3c2442.o
+obj-$(CONFIG_CPU_S3C2442)	+= s3c2442-clock.o
+
+# bast extras
+
+obj-$(CONFIG_BAST_PC104_IRQ)	+= bast-irq.o
+
+# merge in dma objects
+
+obj-y				+= $(obj-dma-y)
+
+# machine specific support
+
+obj-$(CONFIG_MACH_AML_M5900)	+= mach-amlm5900.o
+obj-$(CONFIG_MACH_ANUBIS)	+= mach-anubis.o
+obj-$(CONFIG_MACH_OSIRIS)	+= mach-osiris.o
+obj-$(CONFIG_ARCH_BAST)		+= mach-bast.o usb-simtec.o
+obj-$(CONFIG_ARCH_H1940)	+= mach-h1940.o
+obj-$(CONFIG_MACH_N30)		+= mach-n30.o
+obj-$(CONFIG_ARCH_SMDK2410)	+= mach-smdk2410.o
+obj-$(CONFIG_MACH_SMDK2413)	+= mach-smdk2413.o
+obj-$(CONFIG_ARCH_S3C2440)	+= mach-smdk2440.o
+obj-$(CONFIG_MACH_VR1000)	+= mach-vr1000.o usb-simtec.o
+obj-$(CONFIG_MACH_RX3715)	+= mach-rx3715.o
+obj-$(CONFIG_MACH_OTOM)		+= mach-otom.o
+obj-$(CONFIG_MACH_NEXCODER_2440) += mach-nexcoder.o
+obj-$(CONFIG_MACH_VSTMS)	+= mach-vstms.o
+
+obj-$(CONFIG_MACH_SMDK)		+= common-smdk.o
\ No newline at end of file
diff -urNp linux-2.6.20/arch/arm/mach-s3c2410/audio-simtec.c linux-2.6.20-s1t/arch/arm/mach-s3c2410/audio-simtec.c
--- linux-2.6.20/arch/arm/mach-s3c2410/audio-simtec.c	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/arch/arm/mach-s3c2410/audio-simtec.c	2007-02-07 16:29:01.000000000 +0000
@@ -0,0 +1,220 @@
+/* linux/arch/arm/mach-s3c2410/audio-simtec.c
+ *
+ * Copyright (c) 2005 Simtec Electronics
+ *	http://armlinux.simtec.co.uk/
+ *	Ben Dooks <ben@simtec.co.uk>
+ *
+ * http://www.simtec.co.uk/products/EB2410ITX/
+ *
+ * Audio driver for various Simtec S3C24XX implementations
+ *
+ * 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.
+ *
+*/
+
+#include <linux/kernel.h>
+#include <linux/types.h>
+#include <linux/interrupt.h>
+#include <linux/list.h>
+#include <linux/timer.h>
+#include <linux/init.h>
+#include <linux/device.h>
+#include <linux/clk.h>
+
+#include <sound/driver.h>
+#include <sound/core.h>
+#include <sound/pcm.h>
+#include <sound/control.h>
+
+#include <asm/mach/arch.h>
+#include <asm/mach/map.h>
+#include <asm/mach/irq.h>
+
+#include <asm/arch/bast-map.h>
+#include <asm/arch/bast-irq.h>
+#include <asm/arch/bast-cpld.h>
+
+#include <asm/hardware.h>
+#include <asm/io.h>
+#include <asm/irq.h>
+#include <asm/mach-types.h>
+
+#include <sound/driver.h>
+#include <sound/core.h>
+#include <sound/pcm.h>
+
+#include <asm/arch/regs-iis.h>
+#include <asm/arch/regs-gpio.h>
+#include <asm/arch/audio.h>
+
+#include <asm/mach/sbcd.h>
+
+#include "devs.h"
+#include "pm.h"
+
+/* platform ops for audio */
+
+static inline int has_lr_routing(void)
+{
+	return machine_is_bast() || machine_is_vr1000();
+}
+
+static int simtec_audio_startup(void *pw)
+{
+	unsigned int tmp;
+	unsigned long flags;
+
+	local_irq_save(flags);
+
+	if (has_lr_routing()) {
+		tmp = __raw_readb(BAST_VA_CTRL1);
+		tmp &= ~BAST_CPLD_CTRL1_LRMASK;
+		tmp |= BAST_CPLD_CTRL1_LRCDAC;
+		__raw_writeb(tmp, BAST_VA_CTRL1);
+	}
+
+	local_irq_restore(flags);
+
+	return 0;
+}
+
+static void simtec_audio_shutdown(void *pw)
+{
+	unsigned int tmp;
+	unsigned long flags;
+
+	/* switch off LR clock routing */
+
+	local_irq_save(flags);
+
+	if (has_lr_routing()) {
+		tmp = __raw_readb(BAST_VA_CTRL1);
+		tmp &= ~BAST_CPLD_CTRL1_LRMASK;
+		tmp |= BAST_CPLD_CTRL1_LRCOFF;
+		__raw_writeb(tmp, BAST_VA_CTRL1);
+	}
+
+	local_irq_restore(flags);
+}
+
+static int simtec_audio_matchdev(struct device *dev)
+{
+	printk("%s: dev = %p\n", __FUNCTION__, dev);
+
+	if (dev->parent == NULL || dev->parent->parent == NULL)
+		return 0;
+
+	printk("%s: %s\n", __FUNCTION__, dev->parent->bus_id);
+	if (strncmp(dev->parent->bus_id, "i2c", strlen("i2c")) != 0)
+		return 0;
+
+	printk("%s: %s\n", __FUNCTION__, dev->parent->parent->bus_id);
+	if (strncmp(dev->parent->parent->bus_id, "s3c24",
+		    strlen("s3c24")) == 0)
+		return 1;
+
+	return 0;
+}
+
+/* device registration info */
+
+static struct s3c24xx_iis_ops simtec_audio_ops = {
+	.startup	= simtec_audio_startup,
+	.shutdown	= simtec_audio_shutdown,
+};
+
+static struct s3c24xx_platdata_iis simtec_audio_platdata = {
+	.ops		= &simtec_audio_ops,
+	.codec_clk	= "clkout0",
+	.match_dev	= simtec_audio_matchdev,
+};
+
+static struct platform_device audio_dev = {
+	.name	= "s3c24xx-tlv320aic23",
+	.dev	= {
+		.parent		= &s3c_device_iis.dev,
+		.platform_data	= &simtec_audio_platdata,
+	},
+};
+
+static struct platform_device audio_dev2 = {
+	.name	= "s3c24xx-tlv320aic33",
+	.dev	= {
+		.parent		= &s3c_device_iis.dev,
+		.platform_data	= &simtec_audio_platdata,
+	},
+};
+
+static struct resource vr2k_amp_resource[] = {
+	[0]	= {
+		.start		= S3C2410_CS1 + 0xc0,
+		.end		= S3C2410_CS1 + 0xc1,
+		.flags		= IORESOURCE_MEM,
+	},
+};
+
+static struct platform_device vr2k_amp = {
+	.name		= "vr2k-amp",
+	.id		= -1,
+	.num_resources	= ARRAY_SIZE(vr2k_amp_resource),
+	.resource	= vr2k_amp_resource,
+	.dev	= {
+		.parent		= &s3c_device_iis.dev,		
+	},
+};
+
+static struct resource hermes_amp_resource[] = {
+	[0]	= {
+		.start		= S3C2410_CS1 + 0x140,
+		.end		= S3C2410_CS1 + 0x141,
+		.flags		= IORESOURCE_MEM,
+	},
+};
+
+static struct platform_device hermes_amp = {
+	.name		= "hermes-amp",
+	.id		= -1,
+	.num_resources	= ARRAY_SIZE(hermes_amp_resource),
+	.resource	= hermes_amp_resource,
+	.dev	= {
+		.parent		= &s3c_device_iis.dev,		
+	},
+};
+
+static int __init simtec_audio2_init(void)
+{
+	if (machine_is_osiris() && sbcd_board_has_driver("tlv320aic33")) {
+		printk(KERN_INFO "Adding TLV320AIC33 Audio driver\n");
+		platform_device_register(&s3c_device_iis);
+		platform_device_register(&audio_dev2);
+
+		if (sbcd_board_has_driver("hermes-amp"))
+			platform_device_register(&hermes_amp);
+	}
+
+	return 0;
+}
+
+device_initcall(simtec_audio2_init);
+
+static int __init simtec_audio_init(void)
+{
+	if (!machine_is_bast() && !machine_is_vr1000() &&
+	    !machine_is_anubis() && !sbcd_board_has_driver("bast-audio")) 
+		return 0;
+
+	printk(KERN_INFO "Simtec TLV320AIC23 Audio platform driver\n");
+
+	simtec_audio_shutdown(NULL);
+
+	platform_device_register(&s3c_device_iis);
+
+	if (sbcd_board_has_driver("vr2k-amp"))
+		platform_device_register(&vr2k_amp);
+
+	return platform_device_register(&audio_dev);
+}
+
+device_initcall(simtec_audio_init);
diff -urNp linux-2.6.20/arch/arm/mach-s3c2410/cpu.c linux-2.6.20-s1t/arch/arm/mach-s3c2410/cpu.c
--- linux-2.6.20/arch/arm/mach-s3c2410/cpu.c	2007-02-04 18:44:54.000000000 +0000
+++ linux-2.6.20-s1t/arch/arm/mach-s3c2410/cpu.c	2007-02-07 16:29:01.000000000 +0000
@@ -60,6 +60,21 @@ struct cpu_table {
 	const char	*name;
 };
 
+/* ioport map */
+
+void __iomem *ioport_map(unsigned long port, unsigned int nr)
+{
+        return (void __iomem *) (port);
+}
+
+void ioport_unmap(void __iomem *addr)
+{
+        /* Nothing to do */
+}
+
+EXPORT_SYMBOL(ioport_map);
+EXPORT_SYMBOL(ioport_unmap);
+
 /* table of supported CPUs */
 
 static const char name_s3c2400[]  = "S3C2400";
@@ -134,6 +149,15 @@ static struct cpu_table cpu_ids[] __init
 		.init		= s3c2412_init,
 		.name		= name_s3c2412,
 	},
+	{			/* a newer version of the s3c2412 */
+		.idcode		= 0x32412003,
+		.idmask		= 0xffffffff,
+		.map_io		= s3c2412_map_io,
+		.init_clocks	= s3c2412_init_clocks,
+		.init_uarts	= s3c2412_init_uarts,
+		.init		= s3c2412_init,
+		.name		= name_s3c2412,
+	},
 	{
 		.idcode		= 0x0,   /* S3C2400 doesn't have an idcode */
 		.idmask		= 0xffffffff,
diff -urNp linux-2.6.20/arch/arm/mach-s3c2410/cpu.c.orig linux-2.6.20-s1t/arch/arm/mach-s3c2410/cpu.c.orig
--- linux-2.6.20/arch/arm/mach-s3c2410/cpu.c.orig	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/arch/arm/mach-s3c2410/cpu.c.orig	2007-02-04 18:44:54.000000000 +0000
@@ -0,0 +1,357 @@
+/* linux/arch/arm/mach-s3c2410/cpu.c
+ *
+ * Copyright (c) 2004-2005 Simtec Electronics
+ *	http://www.simtec.co.uk/products/SWLINUX/
+ *	Ben Dooks <ben@simtec.co.uk>
+ *
+ * S3C24XX CPU Support
+ *
+ * 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 <linux/init.h>
+#include <linux/module.h>
+#include <linux/interrupt.h>
+#include <linux/ioport.h>
+#include <linux/serial_core.h>
+#include <linux/platform_device.h>
+
+#include <asm/hardware.h>
+#include <asm/irq.h>
+#include <asm/io.h>
+#include <asm/delay.h>
+
+#include <asm/mach/arch.h>
+#include <asm/mach/map.h>
+
+#include <asm/arch/regs-gpio.h>
+#include <asm/arch/regs-serial.h>
+
+#include "cpu.h"
+#include "devs.h"
+#include "clock.h"
+#include "s3c2400.h"
+#include "s3c2410.h"
+#include "s3c2412.h"
+#include "s3c244x.h"
+#include "s3c2440.h"
+#include "s3c2442.h"
+
+struct cpu_table {
+	unsigned long	idcode;
+	unsigned long	idmask;
+	void		(*map_io)(struct map_desc *mach_desc, int size);
+	void		(*init_uarts)(struct s3c2410_uartcfg *cfg, int no);
+	void		(*init_clocks)(int xtal);
+	int		(*init)(void);
+	const char	*name;
+};
+
+/* table of supported CPUs */
+
+static const char name_s3c2400[]  = "S3C2400";
+static const char name_s3c2410[]  = "S3C2410";
+static const char name_s3c2412[]  = "S3C2412";
+static const char name_s3c2440[]  = "S3C2440";
+static const char name_s3c2442[]  = "S3C2442";
+static const char name_s3c2410a[] = "S3C2410A";
+static const char name_s3c2440a[] = "S3C2440A";
+
+static struct cpu_table cpu_ids[] __initdata = {
+	{
+		.idcode		= 0x32410000,
+		.idmask		= 0xffffffff,
+		.map_io		= s3c2410_map_io,
+		.init_clocks	= s3c2410_init_clocks,
+		.init_uarts	= s3c2410_init_uarts,
+		.init		= s3c2410_init,
+		.name		= name_s3c2410
+	},
+	{
+		.idcode		= 0x32410002,
+		.idmask		= 0xffffffff,
+		.map_io		= s3c2410_map_io,
+		.init_clocks	= s3c2410_init_clocks,
+		.init_uarts	= s3c2410_init_uarts,
+		.init		= s3c2410_init,
+		.name		= name_s3c2410a
+	},
+	{
+		.idcode		= 0x32440000,
+		.idmask		= 0xffffffff,
+		.map_io		= s3c244x_map_io,
+		.init_clocks	= s3c244x_init_clocks,
+		.init_uarts	= s3c244x_init_uarts,
+		.init		= s3c2440_init,
+		.name		= name_s3c2440
+	},
+	{
+		.idcode		= 0x32440001,
+		.idmask		= 0xffffffff,
+		.map_io		= s3c244x_map_io,
+		.init_clocks	= s3c244x_init_clocks,
+		.init_uarts	= s3c244x_init_uarts,
+		.init		= s3c2440_init,
+		.name		= name_s3c2440a
+	},
+	{
+		.idcode		= 0x32440aaa,
+		.idmask		= 0xffffffff,
+		.map_io		= s3c244x_map_io,
+		.init_clocks	= s3c244x_init_clocks,
+		.init_uarts	= s3c244x_init_uarts,
+		.init		= s3c2442_init,
+		.name		= name_s3c2442
+	},
+	{
+		.idcode		= 0x32412001,
+		.idmask		= 0xffffffff,
+		.map_io		= s3c2412_map_io,
+		.init_clocks	= s3c2412_init_clocks,
+		.init_uarts	= s3c2412_init_uarts,
+		.init		= s3c2412_init,
+		.name		= name_s3c2412,
+	},
+	{			/* a newer version of the s3c2412 */
+		.idcode		= 0x32412003,
+		.idmask		= 0xffffffff,
+		.map_io		= s3c2412_map_io,
+		.init_clocks	= s3c2412_init_clocks,
+		.init_uarts	= s3c2412_init_uarts,
+		.init		= s3c2412_init,
+		.name		= name_s3c2412,
+	},
+	{
+		.idcode		= 0x0,   /* S3C2400 doesn't have an idcode */
+		.idmask		= 0xffffffff,
+		.map_io		= s3c2400_map_io,
+		.init_clocks	= s3c2400_init_clocks,
+		.init_uarts	= s3c2400_init_uarts,
+		.init		= s3c2400_init,
+		.name		= name_s3c2400
+	},
+};
+
+/* minimal IO mapping */
+
+static struct map_desc s3c_iodesc[] __initdata = {
+	IODESC_ENT(GPIO),
+	IODESC_ENT(IRQ),
+	IODESC_ENT(MEMCTRL),
+	IODESC_ENT(UART)
+};
+
+
+static struct cpu_table *
+s3c_lookup_cpu(unsigned long idcode)
+{
+	struct cpu_table *tab;
+	int count;
+
+	tab = cpu_ids;
+	for (count = 0; count < ARRAY_SIZE(cpu_ids); count++, tab++) {
+		if ((idcode & tab->idmask) == tab->idcode)
+			return tab;
+	}
+
+	return NULL;
+}
+
+/* board information */
+
+static struct s3c24xx_board *board;
+
+void s3c24xx_set_board(struct s3c24xx_board *b)
+{
+	int i;
+
+	board = b;
+
+	if (b->clocks_count != 0) {
+		struct clk **ptr = b->clocks;
+
+		for (i = b->clocks_count; i > 0; i--, ptr++)
+			s3c24xx_register_clock(*ptr);
+	}
+}
+
+/* cpu information */
+
+static struct cpu_table *cpu;
+
+static unsigned long s3c24xx_read_idcode_v5(void)
+{
+#if defined(CONFIG_CPU_S3C2412) || defined(CONFIG_CPU_S3C2413)
+	return __raw_readl(S3C2412_GSTATUS1);
+#else
+	return 1UL;	/* don't look like an 2400 */
+#endif
+}
+
+static unsigned long s3c24xx_read_idcode_v4(void)
+{
+#ifndef CONFIG_CPU_S3C2400
+	return __raw_readl(S3C2410_GSTATUS1);
+#else
+	return 0UL;
+#endif
+}
+
+void __init s3c24xx_init_io(struct map_desc *mach_desc, int size)
+{
+	unsigned long idcode = 0x0;
+
+	/* initialise the io descriptors we need for initialisation */
+	iotable_init(s3c_iodesc, ARRAY_SIZE(s3c_iodesc));
+
+	if (cpu_architecture() >= CPU_ARCH_ARMv5) {
+		idcode = s3c24xx_read_idcode_v5();
+	} else {
+		idcode = s3c24xx_read_idcode_v4();
+	}
+
+	cpu = s3c_lookup_cpu(idcode);
+
+	if (cpu == NULL) {
+		printk(KERN_ERR "Unknown CPU type 0x%08lx\n", idcode);
+		panic("Unknown S3C24XX CPU");
+	}
+
+	printk("CPU %s (id 0x%08lx)\n", cpu->name, idcode);
+
+	if (cpu->map_io == NULL || cpu->init == NULL) {
+		printk(KERN_ERR "CPU %s support not enabled\n", cpu->name);
+		panic("Unsupported S3C24XX CPU");
+	}
+
+	(cpu->map_io)(mach_desc, size);
+}
+
+/* s3c24xx_init_clocks
+ *
+ * Initialise the clock subsystem and associated information from the
+ * given master crystal value.
+ *
+ * xtal  = 0 -> use default PLL crystal value (normally 12MHz)
+ *      != 0 -> PLL crystal value in Hz
+*/
+
+void __init s3c24xx_init_clocks(int xtal)
+{
+	if (xtal == 0)
+		xtal = 12*1000*1000;
+
+	if (cpu == NULL)
+		panic("s3c24xx_init_clocks: no cpu setup?\n");
+
+	if (cpu->init_clocks == NULL)
+		panic("s3c24xx_init_clocks: cpu has no clock init\n");
+	else
+		(cpu->init_clocks)(xtal);
+}
+
+/* uart management */
+
+static int nr_uarts __initdata = 0;
+
+static struct s3c2410_uartcfg uart_cfgs[3];
+
+/* s3c24xx_init_uartdevs
+ *
+ * copy the specified platform data and configuration into our central
+ * set of devices, before the data is thrown away after the init process.
+ *
+ * This also fills in the array passed to the serial driver for the
+ * early initialisation of the console.
+*/
+
+void __init s3c24xx_init_uartdevs(char *name,
+				  struct s3c24xx_uart_resources *res,
+				  struct s3c2410_uartcfg *cfg, int no)
+{
+	struct platform_device *platdev;
+	struct s3c2410_uartcfg *cfgptr = uart_cfgs;
+	struct s3c24xx_uart_resources *resp;
+	int uart;
+
+	memcpy(cfgptr, cfg, sizeof(struct s3c2410_uartcfg) * no);
+
+	for (uart = 0; uart < no; uart++, cfg++, cfgptr++) {
+		platdev = s3c24xx_uart_src[cfgptr->hwport];
+
+		resp = res + cfgptr->hwport;
+
+		s3c24xx_uart_devs[uart] = platdev;
+
+		platdev->name = name;
+		platdev->resource = resp->resources;
+		platdev->num_resources = resp->nr_resources;
+
+		platdev->dev.platform_data = cfgptr;
+	}
+
+	nr_uarts = no;
+}
+
+void __init s3c24xx_init_uarts(struct s3c2410_uartcfg *cfg, int no)
+{
+	if (cpu == NULL)
+		return;
+
+	if (cpu->init_uarts == NULL) {
+		printk(KERN_ERR "s3c24xx_init_uarts: cpu has no uart init\n");
+	} else
+		(cpu->init_uarts)(cfg, no);
+}
+
+static int __init s3c_arch_init(void)
+{
+	int ret;
+
+	// do the correct init for cpu
+
+	if (cpu == NULL)
+		panic("s3c_arch_init: NULL cpu\n");
+
+	ret = (cpu->init)();
+	if (ret != 0)
+		return ret;
+
+	ret = platform_add_devices(s3c24xx_uart_devs, nr_uarts);
+	if (ret != 0)
+		return ret;
+
+	if (board != NULL) {
+		struct platform_device **ptr = board->devices;
+		int i;
+
+		for (i = 0; i < board->devices_count; i++, ptr++) {
+			ret = platform_device_register(*ptr);
+
+			if (ret) {
+				printk(KERN_ERR "s3c24xx: failed to add board device %s (%d) @%p\n", (*ptr)->name, ret, *ptr);
+			}
+		}
+
+		/* mask any error, we may not need all these board
+		 * devices */
+		ret = 0;
+	}
+
+	return ret;
+}
+
+arch_initcall(s3c_arch_init);
diff -urNp linux-2.6.20/arch/arm/mach-s3c2410/devs.c linux-2.6.20-s1t/arch/arm/mach-s3c2410/devs.c
--- linux-2.6.20/arch/arm/mach-s3c2410/devs.c	2007-02-04 18:44:54.000000000 +0000
+++ linux-2.6.20-s1t/arch/arm/mach-s3c2410/devs.c	2007-02-07 16:29:01.000000000 +0000
@@ -29,6 +29,7 @@
 #include <asm/irq.h>
 
 #include <asm/arch/regs-serial.h>
+#include <asm/arch/udc.h>
 
 #include "devs.h"
 #include "cpu.h"
@@ -230,6 +231,20 @@ struct platform_device s3c_device_usbgad
 
 EXPORT_SYMBOL(s3c_device_usbgadget);
 
+void __init s3c24xx_udc_set_platdata(struct s3c2410_udc_mach_info *pd)
+{
+	struct s3c2410_udc_mach_info *npd;
+
+	npd = kmalloc(sizeof(*npd), GFP_KERNEL);
+	if (npd) {
+		memcpy(npd, pd, sizeof(*npd));
+		s3c_device_usbgadget.dev.platform_data = npd;
+	} else {
+		printk(KERN_ERR "no memory for udc platform data\n");
+	}
+}
+
+
 /* Watchdog */
 
 static struct resource s3c_wdt_resource[] = {
diff -urNp linux-2.6.20/arch/arm/mach-s3c2410/devs.c.orig linux-2.6.20-s1t/arch/arm/mach-s3c2410/devs.c.orig
--- linux-2.6.20/arch/arm/mach-s3c2410/devs.c.orig	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/arch/arm/mach-s3c2410/devs.c.orig	2007-02-04 18:44:54.000000000 +0000
@@ -0,0 +1,585 @@
+/* linux/arch/arm/mach-s3c2410/devs.c
+ *
+ * Copyright (c) 2004 Simtec Electronics
+ *	Ben Dooks <ben@simtec.co.uk>
+ *
+ * Base S3C24XX platform device definitions
+ *
+ * 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.
+ *
+*/
+
+#include <linux/kernel.h>
+#include <linux/types.h>
+#include <linux/interrupt.h>
+#include <linux/list.h>
+#include <linux/timer.h>
+#include <linux/init.h>
+#include <linux/serial_core.h>
+#include <linux/platform_device.h>
+
+#include <asm/mach/arch.h>
+#include <asm/mach/map.h>
+#include <asm/mach/irq.h>
+#include <asm/arch/fb.h>
+#include <asm/hardware.h>
+#include <asm/io.h>
+#include <asm/irq.h>
+
+#include <asm/arch/regs-serial.h>
+
+#include "devs.h"
+#include "cpu.h"
+
+/* Serial port registrations */
+
+static struct resource s3c2410_uart0_resource[] = {
+	[0] = {
+		.start = S3C2410_PA_UART0,
+		.end   = S3C2410_PA_UART0 + 0x3fff,
+		.flags = IORESOURCE_MEM,
+	},
+	[1] = {
+		.start = IRQ_S3CUART_RX0,
+		.end   = IRQ_S3CUART_ERR0,
+		.flags = IORESOURCE_IRQ,
+	}
+};
+
+static struct resource s3c2410_uart1_resource[] = {
+	[0] = {
+		.start = S3C2410_PA_UART1,
+		.end   = S3C2410_PA_UART1 + 0x3fff,
+		.flags = IORESOURCE_MEM,
+	},
+	[1] = {
+		.start = IRQ_S3CUART_RX1,
+		.end   = IRQ_S3CUART_ERR1,
+		.flags = IORESOURCE_IRQ,
+	}
+};
+
+static struct resource s3c2410_uart2_resource[] = {
+	[0] = {
+		.start = S3C2410_PA_UART2,
+		.end   = S3C2410_PA_UART2 + 0x3fff,
+		.flags = IORESOURCE_MEM,
+	},
+	[1] = {
+		.start = IRQ_S3CUART_RX2,
+		.end   = IRQ_S3CUART_ERR2,
+		.flags = IORESOURCE_IRQ,
+	}
+};
+
+struct s3c24xx_uart_resources s3c2410_uart_resources[] __initdata = {
+	[0] = {
+		.resources	= s3c2410_uart0_resource,
+		.nr_resources	= ARRAY_SIZE(s3c2410_uart0_resource),
+	},
+	[1] = {
+		.resources	= s3c2410_uart1_resource,
+		.nr_resources	= ARRAY_SIZE(s3c2410_uart1_resource),
+	},
+	[2] = {
+		.resources	= s3c2410_uart2_resource,
+		.nr_resources	= ARRAY_SIZE(s3c2410_uart2_resource),
+	},
+};
+
+/* yart devices */
+
+static struct platform_device s3c24xx_uart_device0 = {
+	.id		= 0,
+};
+
+static struct platform_device s3c24xx_uart_device1 = {
+	.id		= 1,
+};
+
+static struct platform_device s3c24xx_uart_device2 = {
+	.id		= 2,
+};
+
+struct platform_device *s3c24xx_uart_src[3] = {
+	&s3c24xx_uart_device0,
+	&s3c24xx_uart_device1,
+	&s3c24xx_uart_device2,
+};
+
+struct platform_device *s3c24xx_uart_devs[3] = {
+};
+
+/* USB Host Controller */
+
+static struct resource s3c_usb_resource[] = {
+	[0] = {
+		.start = S3C24XX_PA_USBHOST,
+		.end   = S3C24XX_PA_USBHOST + S3C24XX_SZ_USBHOST - 1,
+		.flags = IORESOURCE_MEM,
+	},
+	[1] = {
+		.start = IRQ_USBH,
+		.end   = IRQ_USBH,
+		.flags = IORESOURCE_IRQ,
+	}
+};
+
+static u64 s3c_device_usb_dmamask = 0xffffffffUL;
+
+struct platform_device s3c_device_usb = {
+	.name		  = "s3c2410-ohci",
+	.id		  = -1,
+	.num_resources	  = ARRAY_SIZE(s3c_usb_resource),
+	.resource	  = s3c_usb_resource,
+	.dev              = {
+		.dma_mask = &s3c_device_usb_dmamask,
+		.coherent_dma_mask = 0xffffffffUL
+	}
+};
+
+EXPORT_SYMBOL(s3c_device_usb);
+
+/* LCD Controller */
+
+static struct resource s3c_lcd_resource[] = {
+	[0] = {
+		.start = S3C24XX_PA_LCD,
+		.end   = S3C24XX_PA_LCD + S3C24XX_SZ_LCD - 1,
+		.flags = IORESOURCE_MEM,
+	},
+	[1] = {
+		.start = IRQ_LCD,
+		.end   = IRQ_LCD,
+		.flags = IORESOURCE_IRQ,
+	}
+
+};
+
+static u64 s3c_device_lcd_dmamask = 0xffffffffUL;
+
+struct platform_device s3c_device_lcd = {
+	.name		  = "s3c2410-lcd",
+	.id		  = -1,
+	.num_resources	  = ARRAY_SIZE(s3c_lcd_resource),
+	.resource	  = s3c_lcd_resource,
+	.dev              = {
+		.dma_mask		= &s3c_device_lcd_dmamask,
+		.coherent_dma_mask	= 0xffffffffUL
+	}
+};
+
+EXPORT_SYMBOL(s3c_device_lcd);
+
+void __init s3c24xx_fb_set_platdata(struct s3c2410fb_mach_info *pd)
+{
+	struct s3c2410fb_mach_info *npd;
+
+	npd = kmalloc(sizeof(*npd), GFP_KERNEL);
+	if (npd) {
+		memcpy(npd, pd, sizeof(*npd));
+		s3c_device_lcd.dev.platform_data = npd;
+	} else {
+		printk(KERN_ERR "no memory for LCD platform data\n");
+	}
+}
+
+/* NAND Controller */
+
+static struct resource s3c_nand_resource[] = {
+	[0] = {
+		.start = S3C2410_PA_NAND,
+		.end   = S3C2410_PA_NAND + S3C24XX_SZ_NAND - 1,
+		.flags = IORESOURCE_MEM,
+	}
+};
+
+struct platform_device s3c_device_nand = {
+	.name		  = "s3c2410-nand",
+	.id		  = -1,
+	.num_resources	  = ARRAY_SIZE(s3c_nand_resource),
+	.resource	  = s3c_nand_resource,
+};
+
+EXPORT_SYMBOL(s3c_device_nand);
+
+/* USB Device (Gadget)*/
+
+static struct resource s3c_usbgadget_resource[] = {
+	[0] = {
+		.start = S3C24XX_PA_USBDEV,
+		.end   = S3C24XX_PA_USBDEV + S3C24XX_SZ_USBDEV - 1,
+		.flags = IORESOURCE_MEM,
+	},
+	[1] = {
+		.start = IRQ_USBD,
+		.end   = IRQ_USBD,
+		.flags = IORESOURCE_IRQ,
+	}
+
+};
+
+struct platform_device s3c_device_usbgadget = {
+	.name		  = "s3c2410-usbgadget",
+	.id		  = -1,
+	.num_resources	  = ARRAY_SIZE(s3c_usbgadget_resource),
+	.resource	  = s3c_usbgadget_resource,
+};
+
+EXPORT_SYMBOL(s3c_device_usbgadget);
+
+/* Watchdog */
+
+static struct resource s3c_wdt_resource[] = {
+	[0] = {
+		.start = S3C24XX_PA_WATCHDOG,
+		.end   = S3C24XX_PA_WATCHDOG + S3C24XX_SZ_WATCHDOG - 1,
+		.flags = IORESOURCE_MEM,
+	},
+	[1] = {
+		.start = IRQ_WDT,
+		.end   = IRQ_WDT,
+		.flags = IORESOURCE_IRQ,
+	}
+
+};
+
+struct platform_device s3c_device_wdt = {
+	.name		  = "s3c2410-wdt",
+	.id		  = -1,
+	.num_resources	  = ARRAY_SIZE(s3c_wdt_resource),
+	.resource	  = s3c_wdt_resource,
+};
+
+EXPORT_SYMBOL(s3c_device_wdt);
+
+/* I2C */
+
+static struct resource s3c_i2c_resource[] = {
+	[0] = {
+		.start = S3C24XX_PA_IIC,
+		.end   = S3C24XX_PA_IIC + S3C24XX_SZ_IIC - 1,
+		.flags = IORESOURCE_MEM,
+	},
+	[1] = {
+		.start = IRQ_IIC,
+		.end   = IRQ_IIC,
+		.flags = IORESOURCE_IRQ,
+	}
+
+};
+
+struct platform_device s3c_device_i2c = {
+	.name		  = "s3c2410-i2c",
+	.id		  = -1,
+	.num_resources	  = ARRAY_SIZE(s3c_i2c_resource),
+	.resource	  = s3c_i2c_resource,
+};
+
+EXPORT_SYMBOL(s3c_device_i2c);
+
+/* IIS */
+
+static struct resource s3c_iis_resource[] = {
+	[0] = {
+		.start = S3C24XX_PA_IIS,
+		.end   = S3C24XX_PA_IIS + S3C24XX_SZ_IIS -1,
+		.flags = IORESOURCE_MEM,
+	}
+};
+
+static u64 s3c_device_iis_dmamask = 0xffffffffUL;
+
+struct platform_device s3c_device_iis = {
+	.name		  = "s3c2410-iis",
+	.id		  = -1,
+	.num_resources	  = ARRAY_SIZE(s3c_iis_resource),
+	.resource	  = s3c_iis_resource,
+	.dev              = {
+		.dma_mask = &s3c_device_iis_dmamask,
+		.coherent_dma_mask = 0xffffffffUL
+	}
+};
+
+EXPORT_SYMBOL(s3c_device_iis);
+
+/* RTC */
+
+static struct resource s3c_rtc_resource[] = {
+	[0] = {
+		.start = S3C24XX_PA_RTC,
+		.end   = S3C24XX_PA_RTC + 0xff,
+		.flags = IORESOURCE_MEM,
+	},
+	[1] = {
+		.start = IRQ_RTC,
+		.end   = IRQ_RTC,
+		.flags = IORESOURCE_IRQ,
+	},
+	[2] = {
+		.start = IRQ_TICK,
+		.end   = IRQ_TICK,
+		.flags = IORESOURCE_IRQ
+	}
+};
+
+struct platform_device s3c_device_rtc = {
+	.name		  = "s3c2410-rtc",
+	.id		  = -1,
+	.num_resources	  = ARRAY_SIZE(s3c_rtc_resource),
+	.resource	  = s3c_rtc_resource,
+};
+
+EXPORT_SYMBOL(s3c_device_rtc);
+
+/* ADC */
+
+static struct resource s3c_adc_resource[] = {
+	[0] = {
+		.start = S3C24XX_PA_ADC,
+		.end   = S3C24XX_PA_ADC + S3C24XX_SZ_ADC - 1,
+		.flags = IORESOURCE_MEM,
+	},
+	[1] = {
+		.start = IRQ_TC,
+		.end   = IRQ_TC,
+		.flags = IORESOURCE_IRQ,
+	},
+	[2] = {
+		.start = IRQ_ADC,
+		.end   = IRQ_ADC,
+		.flags = IORESOURCE_IRQ,
+	}
+
+};
+
+struct platform_device s3c_device_adc = {
+	.name		  = "s3c2410-adc",
+	.id		  = -1,
+	.num_resources	  = ARRAY_SIZE(s3c_adc_resource),
+	.resource	  = s3c_adc_resource,
+};
+
+/* SDI */
+
+static struct resource s3c_sdi_resource[] = {
+	[0] = {
+		.start = S3C2410_PA_SDI,
+		.end   = S3C2410_PA_SDI + S3C24XX_SZ_SDI - 1,
+		.flags = IORESOURCE_MEM,
+	},
+	[1] = {
+		.start = IRQ_SDI,
+		.end   = IRQ_SDI,
+		.flags = IORESOURCE_IRQ,
+	}
+
+};
+
+struct platform_device s3c_device_sdi = {
+	.name		  = "s3c2410-sdi",
+	.id		  = -1,
+	.num_resources	  = ARRAY_SIZE(s3c_sdi_resource),
+	.resource	  = s3c_sdi_resource,
+};
+
+EXPORT_SYMBOL(s3c_device_sdi);
+
+/* SPI (0) */
+
+static struct resource s3c_spi0_resource[] = {
+	[0] = {
+		.start = S3C24XX_PA_SPI,
+		.end   = S3C24XX_PA_SPI + 0x1f,
+		.flags = IORESOURCE_MEM,
+	},
+	[1] = {
+		.start = IRQ_SPI0,
+		.end   = IRQ_SPI0,
+		.flags = IORESOURCE_IRQ,
+	}
+
+};
+
+static u64 s3c_device_spi0_dmamask = 0xffffffffUL;
+
+struct platform_device s3c_device_spi0 = {
+	.name		  = "s3c2410-spi",
+	.id		  = 0,
+	.num_resources	  = ARRAY_SIZE(s3c_spi0_resource),
+	.resource	  = s3c_spi0_resource,
+        .dev              = {
+                .dma_mask = &s3c_device_spi0_dmamask,
+                .coherent_dma_mask = 0xffffffffUL
+        }
+};
+
+EXPORT_SYMBOL(s3c_device_spi0);
+
+/* SPI (1) */
+
+static struct resource s3c_spi1_resource[] = {
+	[0] = {
+		.start = S3C24XX_PA_SPI + 0x20,
+		.end   = S3C24XX_PA_SPI + 0x20 + 0x1f,
+		.flags = IORESOURCE_MEM,
+	},
+	[1] = {
+		.start = IRQ_SPI1,
+		.end   = IRQ_SPI1,
+		.flags = IORESOURCE_IRQ,
+	}
+
+};
+
+static u64 s3c_device_spi1_dmamask = 0xffffffffUL;
+
+struct platform_device s3c_device_spi1 = {
+	.name		  = "s3c2410-spi",
+	.id		  = 1,
+	.num_resources	  = ARRAY_SIZE(s3c_spi1_resource),
+	.resource	  = s3c_spi1_resource,
+        .dev              = {
+                .dma_mask = &s3c_device_spi1_dmamask,
+                .coherent_dma_mask = 0xffffffffUL
+        }
+};
+
+EXPORT_SYMBOL(s3c_device_spi1);
+
+/* pwm timer blocks */
+
+static struct resource s3c_timer0_resource[] = {
+	[0] = {
+		.start = S3C24XX_PA_TIMER + 0x0C,
+		.end   = S3C24XX_PA_TIMER + 0x0C + 0xB,
+		.flags = IORESOURCE_MEM,
+	},
+	[1] = {
+		.start = IRQ_TIMER0,
+		.end   = IRQ_TIMER0,
+		.flags = IORESOURCE_IRQ,
+	}
+
+};
+
+struct platform_device s3c_device_timer0 = {
+	.name		  = "s3c2410-timer",
+	.id		  = 0,
+	.num_resources	  = ARRAY_SIZE(s3c_timer0_resource),
+	.resource	  = s3c_timer0_resource,
+};
+
+EXPORT_SYMBOL(s3c_device_timer0);
+
+/* timer 1 */
+
+static struct resource s3c_timer1_resource[] = {
+	[0] = {
+		.start = S3C24XX_PA_TIMER + 0x18,
+		.end   = S3C24XX_PA_TIMER + 0x23,
+		.flags = IORESOURCE_MEM,
+	},
+	[1] = {
+		.start = IRQ_TIMER1,
+		.end   = IRQ_TIMER1,
+		.flags = IORESOURCE_IRQ,
+	}
+
+};
+
+struct platform_device s3c_device_timer1 = {
+	.name		  = "s3c2410-timer",
+	.id		  = 1,
+	.num_resources	  = ARRAY_SIZE(s3c_timer1_resource),
+	.resource	  = s3c_timer1_resource,
+};
+
+EXPORT_SYMBOL(s3c_device_timer1);
+
+/* timer 2 */
+
+static struct resource s3c_timer2_resource[] = {
+	[0] = {
+		.start = S3C24XX_PA_TIMER + 0x24,
+		.end   = S3C24XX_PA_TIMER + 0x2F,
+		.flags = IORESOURCE_MEM,
+	},
+	[1] = {
+		.start = IRQ_TIMER2,
+		.end   = IRQ_TIMER2,
+		.flags = IORESOURCE_IRQ,
+	}
+
+};
+
+struct platform_device s3c_device_timer2 = {
+	.name		  = "s3c2410-timer",
+	.id		  = 2,
+	.num_resources	  = ARRAY_SIZE(s3c_timer2_resource),
+	.resource	  = s3c_timer2_resource,
+};
+
+EXPORT_SYMBOL(s3c_device_timer2);
+
+/* timer 3 */
+
+static struct resource s3c_timer3_resource[] = {
+	[0] = {
+		.start = S3C24XX_PA_TIMER + 0x30,
+		.end   = S3C24XX_PA_TIMER + 0x3B,
+		.flags = IORESOURCE_MEM,
+	},
+	[1] = {
+		.start = IRQ_TIMER3,
+		.end   = IRQ_TIMER3,
+		.flags = IORESOURCE_IRQ,
+	}
+
+};
+
+struct platform_device s3c_device_timer3 = {
+	.name		  = "s3c2410-timer",
+	.id		  = 3,
+	.num_resources	  = ARRAY_SIZE(s3c_timer3_resource),
+	.resource	  = s3c_timer3_resource,
+};
+
+EXPORT_SYMBOL(s3c_device_timer3);
+
+#ifdef CONFIG_CPU_S3C2440
+
+/* Camif Controller */
+
+static struct resource s3c_camif_resource[] = {
+	[0] = {
+		.start = S3C2440_PA_CAMIF,
+		.end   = S3C2440_PA_CAMIF + S3C2440_SZ_CAMIF - 1,
+		.flags = IORESOURCE_MEM,
+	},
+	[1] = {
+		.start = IRQ_CAM,
+		.end   = IRQ_CAM,
+		.flags = IORESOURCE_IRQ,
+	}
+
+};
+
+static u64 s3c_device_camif_dmamask = 0xffffffffUL;
+
+struct platform_device s3c_device_camif = {
+	.name		  = "s3c2440-camif",
+	.id		  = -1,
+	.num_resources	  = ARRAY_SIZE(s3c_camif_resource),
+	.resource	  = s3c_camif_resource,
+	.dev              = {
+		.dma_mask = &s3c_device_camif_dmamask,
+		.coherent_dma_mask = 0xffffffffUL
+	}
+};
+
+EXPORT_SYMBOL(s3c_device_camif);
+
+#endif // CONFIG_CPU_S32440
diff -urNp linux-2.6.20/arch/arm/mach-s3c2410/devs.h linux-2.6.20-s1t/arch/arm/mach-s3c2410/devs.h
--- linux-2.6.20/arch/arm/mach-s3c2410/devs.h	2007-02-04 18:44:54.000000000 +0000
+++ linux-2.6.20-s1t/arch/arm/mach-s3c2410/devs.h	2007-02-07 16:29:01.000000000 +0000
@@ -9,6 +9,7 @@
  * it under the terms of the GNU General Public License version 2 as
  * published by the Free Software Foundation.
 */
+
 #include <linux/platform_device.h>
 
 struct s3c24xx_uart_resources {
diff -urNp linux-2.6.20/arch/arm/mach-s3c2410/dma-sysfs.c linux-2.6.20-s1t/arch/arm/mach-s3c2410/dma-sysfs.c
--- linux-2.6.20/arch/arm/mach-s3c2410/dma-sysfs.c	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/arch/arm/mach-s3c2410/dma-sysfs.c	2007-02-07 16:29:01.000000000 +0000
@@ -0,0 +1,200 @@
+/* linux/arm/arm/mach-s3c2410/dma-sysfs.c
+ *
+ * (c) 2006 Simtec Electronics
+ *	Ben Dooks <ben@simtec.co.uk>
+ *
+ * S3C24XX DMA sysfs device interface
+ *
+ * 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.
+ *
+*/
+
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/sched.h>
+#include <linux/spinlock.h>
+#include <linux/interrupt.h>
+#include <linux/sysdev.h>
+
+#include <asm/system.h>
+#include <asm/irq.h>
+#include <asm/hardware.h>
+#include <asm/io.h>
+#include <asm/dma.h>
+
+//#include <asm/arch/map.h>
+
+#include "dma.h"
+
+static const char *s3c2410_dma_decode_state(enum s3c2410_dma_state state)
+{
+	switch (state) {
+	case S3C2410_DMA_IDLE:
+		return "Idle";
+	case S3C2410_DMA_RUNNING:
+		return "Running";
+	case S3C2410_DMA_PAUSED:
+		return "Paused";
+	default:
+		return "Invalid";
+	}
+
+	return NULL;
+}
+
+static const char *s3c2410_dma_decode_loadstate(enum s3c2410_dma_loadst state)
+{
+	switch (state) {
+	case S3C2410_DMALOAD_NONE:
+		return "Nothing Loaded";
+	case S3C2410_DMALOAD_1LOADED:
+		return "1 Loaded";
+	case S3C2410_DMALOAD_1RUNNING:
+		return "1 Running";
+	case S3C2410_DMALOAD_1LOADED_1RUNNING:
+		return "1 Loaded, 1 Running";
+	default:
+		return "Invalid Load State";
+	}
+
+	return NULL;
+}
+
+static const char *s3c2410_dma_decode_source(enum s3c2410_dmasrc source)
+{
+	switch (source) {
+	case S3C2410_DMASRC_HW:
+		return "Hardware";
+	case S3C2410_DMASRC_MEM:
+		return "Memory";
+	default:
+		return "Unknown Source";
+	}
+
+	return NULL;
+}
+
+struct outbuff {
+	char		*buff;
+	int		 offset;
+	int		 size;
+};
+
+static inline void outbuf_init(struct outbuff *ob, char *buf, int size)
+{
+	ob->buff   = buf;
+	ob->offset = 0;
+	ob->size   = size;
+}
+
+static void outbuf_pf(struct outbuff *ob, const char *fmt, ...)
+{
+	va_list va;
+
+	va_start(va, fmt);
+
+	ob->offset += vsnprintf(ob->buff + ob->offset,
+				ob->size - ob->offset,
+				fmt, va);
+	va_end(va);
+}
+
+static inline struct s3c2410_dma_chan *dev_to_chan(struct sys_device *dev)
+{
+	return &s3c2410_chans[dev->id];
+}
+
+static ssize_t dma_sysfs_show_regs(struct sys_device *dev, char *buf)
+{
+	struct s3c2410_dma_chan *chan = dev_to_chan(dev);
+	struct outbuff buff;
+
+	outbuf_init(&buff, buf, PAGE_SIZE);
+
+	outbuf_pf(&buff, "DISRC\t\t\t%08lx\n",  readl(chan->regs + 0x00));
+	outbuf_pf(&buff, "DISRCC\t\t\t%08lx\n", readl(chan->regs + 0x04));
+	outbuf_pf(&buff, "DIDST\t\t\t%08lx\n",  readl(chan->regs + 0x08));
+	outbuf_pf(&buff, "DIDSTC\t\t\t%08lx\n", readl(chan->regs + 0x0C));
+	outbuf_pf(&buff, "DCON\t\t\t%08lx\n",   readl(chan->regs + 0x10));
+	outbuf_pf(&buff, "DSTAT\t\t\t%08lx\n",  readl(chan->regs + 0x14));
+	outbuf_pf(&buff, "DCSRC\t\t\t%08lx\n",  readl(chan->regs + 0x18));
+	outbuf_pf(&buff, "DCDST\t\t\t%08lx\n",  readl(chan->regs + 0x1C));
+	outbuf_pf(&buff, "DMTRG\t\t\t%08lx\n",  readl(chan->regs + 0x20));
+
+	return buff.offset;
+}
+
+static ssize_t dma_sysfs_show_state(struct sys_device *dev, char *buf)
+{
+	struct s3c2410_dma_chan *chan = dev_to_chan(dev);
+	struct outbuff buff;
+
+	outbuf_init(&buff, buf, PAGE_SIZE);
+
+	outbuf_pf(&buff, "IRQ:\t\t\t\t%d\n", chan->irq);
+	outbuf_pf(&buff, "Register Base:\t\t\t0x%08x\n", chan->regs);
+	outbuf_pf(&buff, "Address Register:\t\t0x%08lx\n", chan->addr_reg);
+	outbuf_pf(&buff, "Hardware Register:\t\t0x%08lx\n", chan->dev_addr);
+	outbuf_pf(&buff, "Load Timeout:\t\t\t0x%08x\n", chan->load_timeout);
+	outbuf_pf(&buff, "Data Source:\t\t\t%s\n", 
+		  s3c2410_dma_decode_source(chan->source));
+	
+	outbuf_pf(&buff, "Channel State:\t\t\t%s (%d)\n",
+		  s3c2410_dma_decode_state(chan->state), chan->state);
+
+	outbuf_pf(&buff, "Load State:\t\t\t%s (%d)\n", 
+		  s3c2410_dma_decode_loadstate(chan->load_state), 
+		  chan->load_state);
+
+	if (chan->client != NULL) {
+		outbuf_pf(&buff, "Claimed by:\t\t\t%s\n",
+			  chan->client->name);
+	} else {
+		outbuf_pf(&buff, "Claimed by:\t\t\tNo-one\n");
+	}
+
+	return buff.offset;
+}
+
+static SYSDEV_ATTR(regs, S_IRUGO, dma_sysfs_show_regs, NULL);
+static SYSDEV_ATTR(state, S_IRUGO, dma_sysfs_show_state, NULL);
+
+struct sysdev_attribute *attrs[] = {
+	&attr_regs,
+	&attr_state,
+};
+
+static int dma_sysfs_attach(struct sys_device *dev)
+{
+	int i;
+
+	for (i = 0; i < ARRAY_SIZE(attrs); i++)
+		sysdev_create_file(dev, attrs[i]);
+	
+	return 0;
+}
+
+static int dma_sysfs_remove(struct sys_device *dev)
+{
+	int i;
+
+	for (i = 0; i < ARRAY_SIZE(attrs); i++)
+		sysdev_create_file(dev, attrs[i]);
+	
+	return 0;
+}
+
+static struct sysdev_driver dma_sysfs_driver = {
+	.add	= dma_sysfs_attach,
+	.remove	= dma_sysfs_remove,
+};
+
+static int __init s3c24xx_init_dma_sysfs(void)
+{
+	return sysdev_driver_register(&dma_sysclass, &dma_sysfs_driver);
+}
+
+
+arch_initcall(s3c24xx_init_dma_sysfs);
diff -urNp linux-2.6.20/arch/arm/mach-s3c2410/irq.c.rej linux-2.6.20-s1t/arch/arm/mach-s3c2410/irq.c.rej
--- linux-2.6.20/arch/arm/mach-s3c2410/irq.c.rej	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/arch/arm/mach-s3c2410/irq.c.rej	2007-02-07 16:29:04.000000000 +0000
@@ -0,0 +1,108 @@
+*************** s3c_irqext_mask(unsigned int irqno)
+*** 206,223 ****
+  	mask = __raw_readl(S3C24XX_EINTMASK);
+  	mask |= ( 1UL << irqno);
+  	__raw_writel(mask, S3C24XX_EINTMASK);
+- 
+- 	if (irqno <= (IRQ_EINT7 - EXTINT_OFF)) {
+- 		/* check to see if all need masking */
+- 
+- 		if ((mask & (0xf << 4)) == (0xf << 4)) {
+- 			/* all masked, mask the parent */
+- 			s3c_irq_mask(IRQ_EINT4t7);
+- 		}
+- 	} else {
+- 		/* todo: the same check as above for the rest of the irq regs...*/
+- 
+- 	}
+  }
+  
+  static void
+--- 206,211 ----
+  	mask = __raw_readl(S3C24XX_EINTMASK);
+  	mask |= ( 1UL << irqno);
+  	__raw_writel(mask, S3C24XX_EINTMASK);
+  }
+  
+  static void
+*************** s3c_irqext_ack(unsigned int irqno)
+*** 229,235 ****
+  
+  	bit = 1UL << (irqno - EXTINT_OFF);
+  
+- 
+  	mask = __raw_readl(S3C24XX_EINTMASK);
+  
+  	__raw_writel(bit, S3C24XX_EINTPEND);
+--- 217,222 ----
+  
+  	bit = 1UL << (irqno - EXTINT_OFF);
+  
+  	mask = __raw_readl(S3C24XX_EINTMASK);
+  
+  	__raw_writel(bit, S3C24XX_EINTPEND);
+*************** s3c_irqext_unmask(unsigned int irqno)
+*** 258,265 ****
+  	mask = __raw_readl(S3C24XX_EINTMASK);
+  	mask &= ~( 1UL << irqno);
+  	__raw_writel(mask, S3C24XX_EINTMASK);
+- 
+- 	s3c_irq_unmask((irqno <= (IRQ_EINT7 - EXTINT_OFF)) ? IRQ_EINT4t7 : IRQ_EINT8t23);
+  }
+  
+  int
+--- 245,250 ----
+  	mask = __raw_readl(S3C24XX_EINTMASK);
+  	mask &= ~( 1UL << irqno);
+  	__raw_writel(mask, S3C24XX_EINTMASK);
+  }
+  
+  int
+*************** void __init s3c24xx_init_irq(void)
+*** 737,743 ****
+  		case IRQ_UART1:
+  		case IRQ_UART2:
+  		case IRQ_ADCPARENT:
+- 			set_irq_chip(irqno, &s3c_irq_level_chip);
+  			set_irq_handler(irqno, do_level_IRQ);
+  			break;
+  
+--- 722,728 ----
+  		case IRQ_UART1:
+  		case IRQ_UART2:
+  		case IRQ_ADCPARENT:
++ 			set_irq_chip(irqno, &s3c_irq_chip);
+  			set_irq_handler(irqno, do_level_IRQ);
+  			break;
+  
+*************** void __init s3c24xx_init_irq(void)
+*** 769,782 ****
+  	for (irqno = IRQ_EINT0; irqno <= IRQ_EINT3; irqno++) {
+  		irqdbf("registering irq %d (ext int)\n", irqno);
+  		set_irq_chip(irqno, &s3c_irq_eint0t4);
+- 		set_irq_handler(irqno, do_edge_IRQ);
+  		set_irq_flags(irqno, IRQF_VALID);
+  	}
+  
+  	for (irqno = IRQ_EINT4; irqno <= IRQ_EINT23; irqno++) {
+  		irqdbf("registering irq %d (extended s3c irq)\n", irqno);
+  		set_irq_chip(irqno, &s3c_irqext_chip);
+- 		set_irq_handler(irqno, do_edge_IRQ);
+  		set_irq_flags(irqno, IRQF_VALID);
+  	}
+  
+--- 754,767 ----
+  	for (irqno = IRQ_EINT0; irqno <= IRQ_EINT3; irqno++) {
+  		irqdbf("registering irq %d (ext int)\n", irqno);
+  		set_irq_chip(irqno, &s3c_irq_eint0t4);
++ 		set_irq_handler(irqno, do_level_IRQ);
+  		set_irq_flags(irqno, IRQF_VALID);
+  	}
+  
+  	for (irqno = IRQ_EINT4; irqno <= IRQ_EINT23; irqno++) {
+  		irqdbf("registering irq %d (extended s3c irq)\n", irqno);
+  		set_irq_chip(irqno, &s3c_irqext_chip);
++ 		set_irq_handler(irqno, do_level_IRQ);
+  		set_irq_flags(irqno, IRQF_VALID);
+  	}
+  
diff -urNp linux-2.6.20/arch/arm/mach-s3c2410/mach-anubis.c linux-2.6.20-s1t/arch/arm/mach-s3c2410/mach-anubis.c
--- linux-2.6.20/arch/arm/mach-s3c2410/mach-anubis.c	2007-02-04 18:44:54.000000000 +0000
+++ linux-2.6.20-s1t/arch/arm/mach-s3c2410/mach-anubis.c	2007-02-07 16:29:04.000000000 +0000
@@ -18,6 +18,9 @@
 #include <linux/serial_core.h>
 #include <linux/platform_device.h>
 
+#include <linux/sm501.h>
+#include <linux/sm501-regs.h>
+
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
 #include <asm/mach/irq.h>
@@ -42,6 +45,8 @@
 #include <linux/mtd/nand_ecc.h>
 #include <linux/mtd/partitions.h>
 
+#include <net/ax88796-plat.h>
+
 #include "clock.h"
 #include "devs.h"
 #include "cpu.h"
@@ -260,6 +265,98 @@ static struct platform_device anubis_dev
 	.resource	= anubis_ide1_resource,
 };
 
+/* Asix AX88796 10/100 ethernet controller */
+
+static struct ax_plat_data anubis_asix_platdata = {
+	.flags		= AXFLG_MAC_FROMDEV,
+	.wordlength	= 2,
+	.dcr_val	= 0x48,
+	.rcr_val	= 0x40,
+};
+
+static struct resource anubis_asix_resource[] = {
+	[0] = {
+		.start = S3C2410_CS5,
+		.end   = S3C2410_CS5 + (0x20 * 0x20) -1,
+		.flags = IORESOURCE_MEM
+	},
+	[1] = {
+		.start = IRQ_ASIX,
+		.end   = IRQ_ASIX,
+		.flags = IORESOURCE_IRQ
+	}
+};
+
+static struct platform_device anubis_device_asix = {
+	.name		= "ax88796",
+	.id		= 0,
+	.num_resources	= ARRAY_SIZE(anubis_asix_resource),
+	.resource	= anubis_asix_resource,
+	.dev		= {
+		.platform_data = &anubis_asix_platdata,
+	}
+};
+
+static struct resource anubis_sm501_resource[] = {
+	[0] = {
+		.start	= S3C2410_CS2,
+		.end	= S3C2410_CS2 + SZ_8M,
+		.flags	= IORESOURCE_MEM,
+	},
+	[1] = {
+		.start	= S3C2410_CS2 + SZ_64M - SZ_2M,
+		.end	= S3C2410_CS2 + SZ_64M - 1,
+		.flags	= IORESOURCE_MEM,
+	},
+	[2] = {
+		.start	= IRQ_EINT0,
+		.end	= IRQ_EINT0,
+		.flags	= IORESOURCE_IRQ,
+	},
+};
+
+struct sm501_initdata anubis_sm501_initdata = {
+	.gpio_high	= {
+		.set	= 0x3F000000,		/* 24bit panel */
+		.mask	= 0x0,
+	},
+	.misc_timing	= {
+		.set	= 0x010100,		/* SDRAM timing */
+		.mask	= 0x1F1F00,
+	},
+	.misc_control	= {
+		.set	= SM501_MISC_PNL_24BIT,
+		.mask	= 0,
+	},
+};
+
+struct sm501_platdata_gpio_i2c anubis_sm501_gpio_i2c[] = {
+	[0] = {
+		.pin_scl	= 44,
+		.pin_sda	= 45,
+	},
+	[1] = {
+		.pin_scl	= 40,
+		.pin_sda	= 41,
+	},
+};
+
+struct sm501_platdata anubis_sm501_platdata = {
+	.init		= &anubis_sm501_initdata,
+	.gpio_i2c	= anubis_sm501_gpio_i2c,
+	.gpio_i2c_nr	= ARRAY_SIZE(anubis_sm501_gpio_i2c),
+};
+
+static struct platform_device anubis_device_sm501 = {
+	.name		= "sm501",
+	.id		= 0,
+	.num_resources	= ARRAY_SIZE(anubis_sm501_resource),
+	.resource	= anubis_sm501_resource,
+	.dev		= {
+		.platform_data = &anubis_sm501_platdata,
+	},
+};
+
 /* Standard Anubis devices */
 
 static struct platform_device *anubis_devices[] __initdata = {
@@ -271,6 +368,8 @@ static struct platform_device *anubis_de
 	&s3c_device_nand,
 	&anubis_device_ide0,
 	&anubis_device_ide1,
+	&anubis_device_asix,
+	&anubis_device_sm501,
 };
 
 static struct clk *anubis_clocks[] = {
@@ -310,7 +409,10 @@ static void __init anubis_map_io(void)
 	s3c24xx_init_uarts(anubis_uartcfgs, ARRAY_SIZE(anubis_uartcfgs));
 	s3c24xx_set_board(&anubis_board);
 
+	enable_irq_wake(IRQ_EINT4);	/* temporary from sm-detect */
+
 	/* ensure that the GPIO is setup */
+	s3c2410_gpio_cfgpin(S3C2410_GPA0, S3C2410_GPA0_OUT);
 	s3c2410_gpio_setpin(S3C2410_GPA0, 1);
 }
 
diff -urNp linux-2.6.20/arch/arm/mach-s3c2410/mach-anubis.c.orig linux-2.6.20-s1t/arch/arm/mach-s3c2410/mach-anubis.c.orig
--- linux-2.6.20/arch/arm/mach-s3c2410/mach-anubis.c.orig	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/arch/arm/mach-s3c2410/mach-anubis.c.orig	2007-02-04 18:44:54.000000000 +0000
@@ -0,0 +1,325 @@
+/* linux/arch/arm/mach-s3c2410/mach-anubis.c
+ *
+ * Copyright (c) 2003-2005 Simtec Electronics
+ *	http://armlinux.simtec.co.uk/
+ *	Ben Dooks <ben@simtec.co.uk>
+ *
+ * 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.
+*/
+
+#include <linux/kernel.h>
+#include <linux/types.h>
+#include <linux/interrupt.h>
+#include <linux/list.h>
+#include <linux/timer.h>
+#include <linux/init.h>
+#include <linux/serial_core.h>
+#include <linux/platform_device.h>
+
+#include <asm/mach/arch.h>
+#include <asm/mach/map.h>
+#include <asm/mach/irq.h>
+
+#include <asm/arch/anubis-map.h>
+#include <asm/arch/anubis-irq.h>
+#include <asm/arch/anubis-cpld.h>
+
+#include <asm/hardware.h>
+#include <asm/io.h>
+#include <asm/irq.h>
+#include <asm/mach-types.h>
+
+#include <asm/arch/regs-serial.h>
+#include <asm/arch/regs-gpio.h>
+#include <asm/arch/regs-mem.h>
+#include <asm/arch/regs-lcd.h>
+#include <asm/arch/nand.h>
+
+#include <linux/mtd/mtd.h>
+#include <linux/mtd/nand.h>
+#include <linux/mtd/nand_ecc.h>
+#include <linux/mtd/partitions.h>
+
+#include "clock.h"
+#include "devs.h"
+#include "cpu.h"
+
+#define COPYRIGHT ", (c) 2005 Simtec Electronics"
+
+static struct map_desc anubis_iodesc[] __initdata = {
+  /* ISA IO areas */
+
+  {
+	.virtual	= (u32)S3C24XX_VA_ISA_BYTE,
+	.pfn		= __phys_to_pfn(0x0),
+	.length		= SZ_4M,
+	.type		= MT_DEVICE,
+  }, {
+	.virtual	= (u32)S3C24XX_VA_ISA_WORD,
+	.pfn		= __phys_to_pfn(0x0),
+	.length 	= SZ_4M,
+	.type		= MT_DEVICE,
+  },
+
+  /* we could possibly compress the next set down into a set of smaller tables
+   * pagetables, but that would mean using an L2 section, and it still means
+   * we cannot actually feed the same register to an LDR due to 16K spacing
+   */
+
+  /* CPLD control registers */
+
+  {
+	.virtual	= (u32)ANUBIS_VA_CTRL1,
+	.pfn		= __phys_to_pfn(ANUBIS_PA_CTRL1),
+	.length		= SZ_4K,
+	.type		= MT_DEVICE,
+  }, {
+	.virtual	= (u32)ANUBIS_VA_CTRL2,
+	.pfn		= __phys_to_pfn(ANUBIS_PA_CTRL2),
+	.length		= SZ_4K,
+	.type		= MT_DEVICE,
+  },
+};
+
+#define UCON S3C2410_UCON_DEFAULT | S3C2410_UCON_UCLK
+#define ULCON S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB
+#define UFCON S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE
+
+static struct s3c24xx_uart_clksrc anubis_serial_clocks[] = {
+	[0] = {
+		.name		= "uclk",
+		.divisor	= 1,
+		.min_baud	= 0,
+		.max_baud	= 0,
+	},
+	[1] = {
+		.name		= "pclk",
+		.divisor	= 1,
+		.min_baud	= 0,
+		.max_baud	= 0,
+	}
+};
+
+
+static struct s3c2410_uartcfg anubis_uartcfgs[] __initdata = {
+	[0] = {
+		.hwport	     = 0,
+		.flags	     = 0,
+		.ucon	     = UCON,
+		.ulcon	     = ULCON,
+		.ufcon	     = UFCON,
+		.clocks	     = anubis_serial_clocks,
+		.clocks_size = ARRAY_SIZE(anubis_serial_clocks),
+	},
+	[1] = {
+		.hwport	     = 2,
+		.flags	     = 0,
+		.ucon	     = UCON,
+		.ulcon	     = ULCON,
+		.ufcon	     = UFCON,
+		.clocks	     = anubis_serial_clocks,
+		.clocks_size = ARRAY_SIZE(anubis_serial_clocks),
+	},
+};
+
+/* NAND Flash on Anubis board */
+
+static int external_map[]   = { 2 };
+static int chip0_map[]      = { 0 };
+static int chip1_map[]      = { 1 };
+
+static struct mtd_partition anubis_default_nand_part[] = {
+	[0] = {
+		.name	= "Boot Agent",
+		.size	= SZ_16K,
+		.offset	= 0,
+	},
+	[1] = {
+		.name	= "/boot",
+		.size	= SZ_4M - SZ_16K,
+		.offset	= SZ_16K,
+	},
+	[2] = {
+		.name	= "user1",
+		.offset	= SZ_4M,
+		.size	= SZ_32M - SZ_4M,
+	},
+	[3] = {
+		.name	= "user2",
+		.offset	= SZ_32M,
+		.size	= MTDPART_SIZ_FULL,
+	}
+};
+
+/* the Anubis has 3 selectable slots for nand-flash, the two
+ * on-board chip areas, as well as the external slot.
+ *
+ * Note, there is no current hot-plug support for the External
+ * socket.
+*/
+
+static struct s3c2410_nand_set anubis_nand_sets[] = {
+	[1] = {
+		.name		= "External",
+		.nr_chips	= 1,
+		.nr_map		= external_map,
+		.nr_partitions	= ARRAY_SIZE(anubis_default_nand_part),
+		.partitions	= anubis_default_nand_part,
+	},
+	[0] = {
+		.name		= "chip0",
+		.nr_chips	= 1,
+		.nr_map		= chip0_map,
+		.nr_partitions	= ARRAY_SIZE(anubis_default_nand_part),
+		.partitions	= anubis_default_nand_part,
+	},
+	[2] = {
+		.name		= "chip1",
+		.nr_chips	= 1,
+		.nr_map		= chip1_map,
+		.nr_partitions	= ARRAY_SIZE(anubis_default_nand_part),
+		.partitions	= anubis_default_nand_part,
+	},
+};
+
+static void anubis_nand_select(struct s3c2410_nand_set *set, int slot)
+{
+	unsigned int tmp;
+
+	slot = set->nr_map[slot] & 3;
+
+	pr_debug("anubis_nand: selecting slot %d (set %p,%p)\n",
+		 slot, set, set->nr_map);
+
+	tmp = __raw_readb(ANUBIS_VA_CTRL1);
+	tmp &= ~ANUBIS_CTRL1_NANDSEL;
+	tmp |= slot;
+
+	pr_debug("anubis_nand: ctrl1 now %02x\n", tmp);
+
+	__raw_writeb(tmp, ANUBIS_VA_CTRL1);
+}
+
+static struct s3c2410_platform_nand anubis_nand_info = {
+	.tacls		= 25,
+	.twrph0		= 55,
+	.twrph1		= 40,
+	.nr_sets	= ARRAY_SIZE(anubis_nand_sets),
+	.sets		= anubis_nand_sets,
+	.select_chip	= anubis_nand_select,
+};
+
+/* IDE channels */
+
+static struct resource anubis_ide0_resource[] = {
+	{
+		.start	= S3C2410_CS3,
+		.end	= S3C2410_CS3 + (8*32) - 1,
+		.flags	= IORESOURCE_MEM,
+	}, {
+		.start	= S3C2410_CS3 + (1<<26),
+		.end	= S3C2410_CS3 + (1<<26) + (8*32) - 1,
+		.flags	= IORESOURCE_MEM,
+	}, {
+		.start	= IRQ_IDE0,
+		.end	= IRQ_IDE0,
+		.flags	= IORESOURCE_IRQ,
+	},
+};
+
+static struct platform_device anubis_device_ide0 = {
+	.name		= "simtec-ide",
+	.id		= 0,
+	.num_resources	= ARRAY_SIZE(anubis_ide0_resource),
+	.resource	= anubis_ide0_resource,
+};
+
+static struct resource anubis_ide1_resource[] = {
+	{
+		.start	= S3C2410_CS4,
+		.end	= S3C2410_CS4 + (8*32) - 1,
+		.flags	= IORESOURCE_MEM,
+	}, {
+		.start	= S3C2410_CS4 + (1<<26),
+		.end	= S3C2410_CS4 + (1<<26) + (8*32) - 1,
+		.flags	= IORESOURCE_MEM,
+	}, {
+		.start	= IRQ_IDE0,
+		.end	= IRQ_IDE0,
+		.flags	= IORESOURCE_IRQ,
+	},
+};
+
+
+static struct platform_device anubis_device_ide1 = {
+	.name		= "simtec-ide",
+	.id		= 1,
+	.num_resources	= ARRAY_SIZE(anubis_ide1_resource),
+	.resource	= anubis_ide1_resource,
+};
+
+/* Standard Anubis devices */
+
+static struct platform_device *anubis_devices[] __initdata = {
+	&s3c_device_usb,
+	&s3c_device_wdt,
+	&s3c_device_adc,
+	&s3c_device_i2c,
+ 	&s3c_device_rtc,
+	&s3c_device_nand,
+	&anubis_device_ide0,
+	&anubis_device_ide1,
+};
+
+static struct clk *anubis_clocks[] = {
+	&s3c24xx_dclk0,
+	&s3c24xx_dclk1,
+	&s3c24xx_clkout0,
+	&s3c24xx_clkout1,
+	&s3c24xx_uclk,
+};
+
+static struct s3c24xx_board anubis_board __initdata = {
+	.devices       = anubis_devices,
+	.devices_count = ARRAY_SIZE(anubis_devices),
+	.clocks	       = anubis_clocks,
+	.clocks_count  = ARRAY_SIZE(anubis_clocks),
+};
+
+static void __init anubis_map_io(void)
+{
+	/* initialise the clocks */
+
+	s3c24xx_dclk0.parent = NULL;
+	s3c24xx_dclk0.rate   = 12*1000*1000;
+
+	s3c24xx_dclk1.parent = NULL;
+	s3c24xx_dclk1.rate   = 24*1000*1000;
+
+	s3c24xx_clkout0.parent  = &s3c24xx_dclk0;
+	s3c24xx_clkout1.parent  = &s3c24xx_dclk1;
+
+	s3c24xx_uclk.parent  = &s3c24xx_clkout1;
+
+	s3c_device_nand.dev.platform_data = &anubis_nand_info;
+
+	s3c24xx_init_io(anubis_iodesc, ARRAY_SIZE(anubis_iodesc));
+	s3c24xx_init_clocks(0);
+	s3c24xx_init_uarts(anubis_uartcfgs, ARRAY_SIZE(anubis_uartcfgs));
+	s3c24xx_set_board(&anubis_board);
+
+	/* ensure that the GPIO is setup */
+	s3c2410_gpio_setpin(S3C2410_GPA0, 1);
+}
+
+MACHINE_START(ANUBIS, "Simtec-Anubis")
+	/* Maintainer: Ben Dooks <ben@simtec.co.uk> */
+	.phys_io	= S3C2410_PA_UART,
+	.io_pg_offst	= (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,
+	.boot_params	= S3C2410_SDRAM_PA + 0x100,
+	.map_io		= anubis_map_io,
+	.init_irq	= s3c24xx_init_irq,
+	.timer		= &s3c24xx_timer,
+MACHINE_END
diff -urNp linux-2.6.20/arch/arm/mach-s3c2410/mach-bast.c linux-2.6.20-s1t/arch/arm/mach-s3c2410/mach-bast.c
--- linux-2.6.20/arch/arm/mach-s3c2410/mach-bast.c	2007-02-04 18:44:54.000000000 +0000
+++ linux-2.6.20-s1t/arch/arm/mach-s3c2410/mach-bast.c	2007-02-07 16:29:04.000000000 +0000
@@ -20,6 +20,8 @@
 #include <linux/platform_device.h>
 #include <linux/dm9000.h>
 
+#include <net/ax88796-plat.h>
+
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
 #include <asm/mach/irq.h>
@@ -41,6 +43,7 @@
 
 #include <asm/arch/nand.h>
 #include <asm/arch/iic.h>
+#include <asm/arch/adc.h>
 #include <asm/arch/fb.h>
 
 #include <linux/mtd/mtd.h>
@@ -72,12 +75,12 @@
 
 static struct map_desc bast_iodesc[] __initdata = {
   /* ISA IO areas */
-  {
-	  .virtual	= (u32)S3C24XX_VA_ISA_BYTE,
+  { 
+	  .virtual	= (u32)S3C24XX_VA_ISA_BYTE, 
 	  .pfn		= PA_CS2(BAST_PA_ISAIO),
 	  .length	= SZ_16M,
 	  .type		= MT_DEVICE,
-  }, {
+  }, { 
 	  .virtual	= (u32)S3C24XX_VA_ISA_WORD,
 	  .pfn		= PA_CS3(BAST_PA_ISAIO),
 	  .length	= SZ_16M,
@@ -87,9 +90,9 @@ static struct map_desc bast_iodesc[] __i
   {
 	  .virtual	= (u32)BAST_VA_CTRL1,
 	  .pfn		= __phys_to_pfn(BAST_PA_CTRL1),
-	  .length	= SZ_1M,
+	  .length	= SZ_1M, 
 	  .type		= MT_DEVICE,
-  }, {
+  }, { 
 	  .virtual	= (u32)BAST_VA_CTRL2,
 	  .pfn		= __phys_to_pfn(BAST_PA_CTRL2),
 	  .length	= SZ_1M,
@@ -99,7 +102,7 @@ static struct map_desc bast_iodesc[] __i
 	  .pfn		= __phys_to_pfn(BAST_PA_CTRL3),
 	  .length	= SZ_1M,
 	  .type		= MT_DEVICE,
-  }, {
+  }, { 
 	  .virtual	= (u32)BAST_VA_CTRL4,
 	  .pfn		= __phys_to_pfn(BAST_PA_CTRL4),
 	  .length	= SZ_1M,
@@ -109,7 +112,7 @@ static struct map_desc bast_iodesc[] __i
   {
 	  .virtual	= (u32)BAST_VA_PC104_IRQREQ,
 	  .pfn		= __phys_to_pfn(BAST_PA_PC104_IRQREQ),
-	  .length	= SZ_1M,
+	  .length	= SZ_1M, 
 	  .type		= MT_DEVICE,
   }, {
 	  .virtual	= (u32)BAST_VA_PC104_IRQRAW,
@@ -128,8 +131,6 @@ static struct map_desc bast_iodesc[] __i
    * are only 8bit */
 
   /* slow, byte */
-  { VA_C2(BAST_VA_ISAIO),   PA_CS2(BAST_PA_ISAIO),    SZ_16M, MT_DEVICE },
-  { VA_C2(BAST_VA_ISAMEM),  PA_CS2(BAST_PA_ISAMEM),   SZ_16M, MT_DEVICE },
   { VA_C2(BAST_VA_SUPERIO), PA_CS2(BAST_PA_SUPERIO),  SZ_1M,  MT_DEVICE },
   { VA_C2(BAST_VA_IDEPRI),  PA_CS3(BAST_PA_IDEPRI),   SZ_1M,  MT_DEVICE },
   { VA_C2(BAST_VA_IDESEC),  PA_CS3(BAST_PA_IDESEC),   SZ_1M,  MT_DEVICE },
@@ -146,8 +147,6 @@ static struct map_desc bast_iodesc[] __i
   { VA_C3(BAST_VA_IDESECAUX), PA_CS3(BAST_PA_IDESECAUX), SZ_1M, MT_DEVICE },
 
   /* fast, byte */
-  { VA_C4(BAST_VA_ISAIO),   PA_CS4(BAST_PA_ISAIO),    SZ_16M, MT_DEVICE },
-  { VA_C4(BAST_VA_ISAMEM),  PA_CS4(BAST_PA_ISAMEM),   SZ_16M, MT_DEVICE },
   { VA_C4(BAST_VA_SUPERIO), PA_CS4(BAST_PA_SUPERIO),  SZ_1M,  MT_DEVICE },
   { VA_C4(BAST_VA_IDEPRI),  PA_CS5(BAST_PA_IDEPRI),   SZ_1M,  MT_DEVICE },
   { VA_C4(BAST_VA_IDESEC),  PA_CS5(BAST_PA_IDESEC),   SZ_1M,  MT_DEVICE },
@@ -155,8 +154,6 @@ static struct map_desc bast_iodesc[] __i
   { VA_C4(BAST_VA_IDESECAUX), PA_CS5(BAST_PA_IDESECAUX), SZ_1M, MT_DEVICE },
 
   /* fast, word */
-  { VA_C5(BAST_VA_ISAIO),   PA_CS5(BAST_PA_ISAIO),    SZ_16M, MT_DEVICE },
-  { VA_C5(BAST_VA_ISAMEM),  PA_CS5(BAST_PA_ISAMEM),   SZ_16M, MT_DEVICE },
   { VA_C5(BAST_VA_SUPERIO), PA_CS5(BAST_PA_SUPERIO),  SZ_1M,  MT_DEVICE },
   { VA_C5(BAST_VA_IDEPRI),  PA_CS5(BAST_PA_IDEPRI),   SZ_1M,  MT_DEVICE },
   { VA_C5(BAST_VA_IDESEC),  PA_CS5(BAST_PA_IDESEC),   SZ_1M,  MT_DEVICE },
@@ -409,6 +406,73 @@ static struct s3c2410_platform_i2c bast_
 	.max_freq	= 130*1000,
 };
 
+/* Asix AX88796 10/100 ethernet controller */
+
+static struct ax_plat_data bast_asix_platdata = {
+	.flags		= AXFLG_MAC_FROMDEV,
+	.wordlength	= 2,
+	.dcr_val	= 0x48,
+	.rcr_val	= 0x40,
+};
+
+static struct resource bast_asix_resource[] = {
+	[0] = {
+		.start = S3C2410_CS5 + BAST_PA_ASIXNET,
+		.end   = S3C2410_CS5 + BAST_PA_ASIXNET + (0x18 * 0x20) - 1,
+		.flags = IORESOURCE_MEM
+	},
+	[1] = {
+		.start = S3C2410_CS5 + BAST_PA_ASIXNET + (0x1f * 0x20),
+		.end   = S3C2410_CS5 + BAST_PA_ASIXNET + (0x1f * 0x20),
+		.flags = IORESOURCE_MEM,
+	},
+	[2] = {
+		.start = IRQ_ASIX,
+		.end   = IRQ_ASIX,
+		.flags = IORESOURCE_IRQ
+	}
+};
+
+static struct resource bast_asixpp_resource[] = {
+	[0] = {
+		.start = S3C2410_CS5 + BAST_PA_ASIXNET + (0x18 * 0x20) ,
+		.end   = S3C2410_CS5 + BAST_PA_ASIXNET + (0x1b * 0x20) - 1,
+		.flags = IORESOURCE_MEM,
+	}
+};
+
+static struct platform_device bast_device_axpp = {
+	.name		= "ax88796-pp",
+	.id		= 0,
+	.num_resources	= ARRAY_SIZE(bast_asixpp_resource),
+	.resource	= bast_asixpp_resource,
+};
+
+static struct platform_device bast_device_asix = {
+	.name		= "ax88796",
+	.id		= 0,
+	.num_resources	= ARRAY_SIZE(bast_asix_resource),
+	.resource	= bast_asix_resource,
+	.dev		= {
+		.platform_data = &bast_asix_platdata
+	}
+};
+
+/* ADC/HWMon information */
+
+struct s3c24xx_adc_hwmon_incfg bast_adc_vcore = {
+	.channel	= 3,
+	.min		= 0,
+	.max		= 4095,
+	.mult		= 3300,
+	.div		= 0x400,
+};
+
+struct s3c24xx_adc_platdata bast_adc_info = {
+	.in[2]		= &bast_adc_vcore,
+};
+
+
 
 static struct s3c2410fb_mach_info __initdata bast_lcd_info = {
 	.width		= 640,
@@ -448,11 +512,13 @@ static struct platform_device *bast_devi
 	&s3c_device_lcd,
 	&s3c_device_wdt,
 	&s3c_device_i2c,
-	&s3c_device_iis,
  	&s3c_device_rtc,
+	&s3c_device_adc,
 	&s3c_device_nand,
 	&bast_device_nor,
 	&bast_device_dm9k,
+	&bast_device_asix,
+	&bast_device_axpp,
 	&bast_sio,
 };
 
@@ -487,7 +553,8 @@ static void __init bast_map_io(void)
 	s3c24xx_uclk.parent  = &s3c24xx_clkout1;
 
 	s3c_device_nand.dev.platform_data = &bast_nand_info;
-	s3c_device_i2c.dev.platform_data = &bast_i2c_info;
+	s3c_device_i2c.dev.platform_data  = &bast_i2c_info;
+	s3c_device_adc.dev.platform_data  = &bast_adc_info;
 
 	s3c24xx_init_io(bast_iodesc, ARRAY_SIZE(bast_iodesc));
 	s3c24xx_init_clocks(0);
diff -urNp linux-2.6.20/arch/arm/mach-s3c2410/mach-bast.c.orig linux-2.6.20-s1t/arch/arm/mach-s3c2410/mach-bast.c.orig
--- linux-2.6.20/arch/arm/mach-s3c2410/mach-bast.c.orig	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/arch/arm/mach-s3c2410/mach-bast.c.orig	2007-02-04 18:44:54.000000000 +0000
@@ -0,0 +1,513 @@
+/* linux/arch/arm/mach-s3c2410/mach-bast.c
+ *
+ * Copyright (c) 2003-2005 Simtec Electronics
+ *   Ben Dooks <ben@simtec.co.uk>
+ *
+ * http://www.simtec.co.uk/products/EB2410ITX/
+ *
+ * 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.
+*/
+
+#include <linux/kernel.h>
+#include <linux/types.h>
+#include <linux/interrupt.h>
+#include <linux/list.h>
+#include <linux/timer.h>
+#include <linux/init.h>
+#include <linux/serial_core.h>
+#include <linux/platform_device.h>
+#include <linux/dm9000.h>
+
+#include <asm/mach/arch.h>
+#include <asm/mach/map.h>
+#include <asm/mach/irq.h>
+
+#include <asm/arch/bast-map.h>
+#include <asm/arch/bast-irq.h>
+#include <asm/arch/bast-cpld.h>
+
+#include <asm/hardware.h>
+#include <asm/io.h>
+#include <asm/irq.h>
+#include <asm/mach-types.h>
+
+//#include <asm/debug-ll.h>
+#include <asm/arch/regs-serial.h>
+#include <asm/arch/regs-gpio.h>
+#include <asm/arch/regs-mem.h>
+#include <asm/arch/regs-lcd.h>
+
+#include <asm/arch/nand.h>
+#include <asm/arch/iic.h>
+#include <asm/arch/fb.h>
+
+#include <linux/mtd/mtd.h>
+#include <linux/mtd/nand.h>
+#include <linux/mtd/nand_ecc.h>
+#include <linux/mtd/partitions.h>
+
+#include <linux/serial_8250.h>
+
+#include "clock.h"
+#include "devs.h"
+#include "cpu.h"
+#include "usb-simtec.h"
+
+#define COPYRIGHT ", (c) 2004-2005 Simtec Electronics"
+
+/* macros for virtual address mods for the io space entries */
+#define VA_C5(item) ((unsigned long)(item) + BAST_VAM_CS5)
+#define VA_C4(item) ((unsigned long)(item) + BAST_VAM_CS4)
+#define VA_C3(item) ((unsigned long)(item) + BAST_VAM_CS3)
+#define VA_C2(item) ((unsigned long)(item) + BAST_VAM_CS2)
+
+/* macros to modify the physical addresses for io space */
+
+#define PA_CS2(item) (__phys_to_pfn((item) + S3C2410_CS2))
+#define PA_CS3(item) (__phys_to_pfn((item) + S3C2410_CS3))
+#define PA_CS4(item) (__phys_to_pfn((item) + S3C2410_CS4))
+#define PA_CS5(item) (__phys_to_pfn((item) + S3C2410_CS5))
+
+static struct map_desc bast_iodesc[] __initdata = {
+  /* ISA IO areas */
+  {
+	  .virtual	= (u32)S3C24XX_VA_ISA_BYTE,
+	  .pfn		= PA_CS2(BAST_PA_ISAIO),
+	  .length	= SZ_16M,
+	  .type		= MT_DEVICE,
+  }, {
+	  .virtual	= (u32)S3C24XX_VA_ISA_WORD,
+	  .pfn		= PA_CS3(BAST_PA_ISAIO),
+	  .length	= SZ_16M,
+	  .type		= MT_DEVICE,
+  },
+  /* bast CPLD control registers, and external interrupt controls */
+  {
+	  .virtual	= (u32)BAST_VA_CTRL1,
+	  .pfn		= __phys_to_pfn(BAST_PA_CTRL1),
+	  .length	= SZ_1M,
+	  .type		= MT_DEVICE,
+  }, {
+	  .virtual	= (u32)BAST_VA_CTRL2,
+	  .pfn		= __phys_to_pfn(BAST_PA_CTRL2),
+	  .length	= SZ_1M,
+	  .type		= MT_DEVICE,
+  }, {
+	  .virtual	= (u32)BAST_VA_CTRL3,
+	  .pfn		= __phys_to_pfn(BAST_PA_CTRL3),
+	  .length	= SZ_1M,
+	  .type		= MT_DEVICE,
+  }, {
+	  .virtual	= (u32)BAST_VA_CTRL4,
+	  .pfn		= __phys_to_pfn(BAST_PA_CTRL4),
+	  .length	= SZ_1M,
+	  .type		= MT_DEVICE,
+  },
+  /* PC104 IRQ mux */
+  {
+	  .virtual	= (u32)BAST_VA_PC104_IRQREQ,
+	  .pfn		= __phys_to_pfn(BAST_PA_PC104_IRQREQ),
+	  .length	= SZ_1M,
+	  .type		= MT_DEVICE,
+  }, {
+	  .virtual	= (u32)BAST_VA_PC104_IRQRAW,
+	  .pfn		= __phys_to_pfn(BAST_PA_PC104_IRQRAW),
+	  .length	= SZ_1M,
+	  .type		= MT_DEVICE,
+  }, {
+	  .virtual	= (u32)BAST_VA_PC104_IRQMASK,
+	  .pfn		= __phys_to_pfn(BAST_PA_PC104_IRQMASK),
+	  .length	= SZ_1M,
+	  .type		= MT_DEVICE,
+  },
+
+  /* peripheral space... one for each of fast/slow/byte/16bit */
+  /* note, ide is only decoded in word space, even though some registers
+   * are only 8bit */
+
+  /* slow, byte */
+  { VA_C2(BAST_VA_ISAIO),   PA_CS2(BAST_PA_ISAIO),    SZ_16M, MT_DEVICE },
+  { VA_C2(BAST_VA_ISAMEM),  PA_CS2(BAST_PA_ISAMEM),   SZ_16M, MT_DEVICE },
+  { VA_C2(BAST_VA_SUPERIO), PA_CS2(BAST_PA_SUPERIO),  SZ_1M,  MT_DEVICE },
+  { VA_C2(BAST_VA_IDEPRI),  PA_CS3(BAST_PA_IDEPRI),   SZ_1M,  MT_DEVICE },
+  { VA_C2(BAST_VA_IDESEC),  PA_CS3(BAST_PA_IDESEC),   SZ_1M,  MT_DEVICE },
+  { VA_C2(BAST_VA_IDEPRIAUX), PA_CS3(BAST_PA_IDEPRIAUX), SZ_1M, MT_DEVICE },
+  { VA_C2(BAST_VA_IDESECAUX), PA_CS3(BAST_PA_IDESECAUX), SZ_1M, MT_DEVICE },
+
+  /* slow, word */
+  { VA_C3(BAST_VA_ISAIO),   PA_CS3(BAST_PA_ISAIO),    SZ_16M, MT_DEVICE },
+  { VA_C3(BAST_VA_ISAMEM),  PA_CS3(BAST_PA_ISAMEM),   SZ_16M, MT_DEVICE },
+  { VA_C3(BAST_VA_SUPERIO), PA_CS3(BAST_PA_SUPERIO),  SZ_1M,  MT_DEVICE },
+  { VA_C3(BAST_VA_IDEPRI),  PA_CS3(BAST_PA_IDEPRI),   SZ_1M,  MT_DEVICE },
+  { VA_C3(BAST_VA_IDESEC),  PA_CS3(BAST_PA_IDESEC),   SZ_1M,  MT_DEVICE },
+  { VA_C3(BAST_VA_IDEPRIAUX), PA_CS3(BAST_PA_IDEPRIAUX), SZ_1M, MT_DEVICE },
+  { VA_C3(BAST_VA_IDESECAUX), PA_CS3(BAST_PA_IDESECAUX), SZ_1M, MT_DEVICE },
+
+  /* fast, byte */
+  { VA_C4(BAST_VA_ISAIO),   PA_CS4(BAST_PA_ISAIO),    SZ_16M, MT_DEVICE },
+  { VA_C4(BAST_VA_ISAMEM),  PA_CS4(BAST_PA_ISAMEM),   SZ_16M, MT_DEVICE },
+  { VA_C4(BAST_VA_SUPERIO), PA_CS4(BAST_PA_SUPERIO),  SZ_1M,  MT_DEVICE },
+  { VA_C4(BAST_VA_IDEPRI),  PA_CS5(BAST_PA_IDEPRI),   SZ_1M,  MT_DEVICE },
+  { VA_C4(BAST_VA_IDESEC),  PA_CS5(BAST_PA_IDESEC),   SZ_1M,  MT_DEVICE },
+  { VA_C4(BAST_VA_IDEPRIAUX), PA_CS5(BAST_PA_IDEPRIAUX), SZ_1M, MT_DEVICE },
+  { VA_C4(BAST_VA_IDESECAUX), PA_CS5(BAST_PA_IDESECAUX), SZ_1M, MT_DEVICE },
+
+  /* fast, word */
+  { VA_C5(BAST_VA_ISAIO),   PA_CS5(BAST_PA_ISAIO),    SZ_16M, MT_DEVICE },
+  { VA_C5(BAST_VA_ISAMEM),  PA_CS5(BAST_PA_ISAMEM),   SZ_16M, MT_DEVICE },
+  { VA_C5(BAST_VA_SUPERIO), PA_CS5(BAST_PA_SUPERIO),  SZ_1M,  MT_DEVICE },
+  { VA_C5(BAST_VA_IDEPRI),  PA_CS5(BAST_PA_IDEPRI),   SZ_1M,  MT_DEVICE },
+  { VA_C5(BAST_VA_IDESEC),  PA_CS5(BAST_PA_IDESEC),   SZ_1M,  MT_DEVICE },
+  { VA_C5(BAST_VA_IDEPRIAUX), PA_CS5(BAST_PA_IDEPRIAUX), SZ_1M, MT_DEVICE },
+  { VA_C5(BAST_VA_IDESECAUX), PA_CS5(BAST_PA_IDESECAUX), SZ_1M, MT_DEVICE },
+};
+
+#define UCON S3C2410_UCON_DEFAULT | S3C2410_UCON_UCLK
+#define ULCON S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB
+#define UFCON S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE
+
+static struct s3c24xx_uart_clksrc bast_serial_clocks[] = {
+	[0] = {
+		.name		= "uclk",
+		.divisor	= 1,
+		.min_baud	= 0,
+		.max_baud	= 0,
+	},
+	[1] = {
+		.name		= "pclk",
+		.divisor	= 1,
+		.min_baud	= 0,
+		.max_baud	= 0,
+	}
+};
+
+
+static struct s3c2410_uartcfg bast_uartcfgs[] __initdata = {
+	[0] = {
+		.hwport	     = 0,
+		.flags	     = 0,
+		.ucon	     = UCON,
+		.ulcon	     = ULCON,
+		.ufcon	     = UFCON,
+		.clocks	     = bast_serial_clocks,
+		.clocks_size = ARRAY_SIZE(bast_serial_clocks),
+	},
+	[1] = {
+		.hwport	     = 1,
+		.flags	     = 0,
+		.ucon	     = UCON,
+		.ulcon	     = ULCON,
+		.ufcon	     = UFCON,
+		.clocks	     = bast_serial_clocks,
+		.clocks_size = ARRAY_SIZE(bast_serial_clocks),
+	},
+	/* port 2 is not actually used */
+	[2] = {
+		.hwport	     = 2,
+		.flags	     = 0,
+		.ucon	     = UCON,
+		.ulcon	     = ULCON,
+		.ufcon	     = UFCON,
+		.clocks	     = bast_serial_clocks,
+		.clocks_size = ARRAY_SIZE(bast_serial_clocks),
+	}
+};
+
+/* NOR Flash on BAST board */
+
+static struct resource bast_nor_resource[] = {
+	[0] = {
+		.start = S3C2410_CS1 + 0x4000000,
+		.end   = S3C2410_CS1 + 0x4000000 + (32*1024*1024) - 1,
+		.flags = IORESOURCE_MEM,
+	}
+};
+
+static struct platform_device bast_device_nor = {
+	.name		= "bast-nor",
+	.id		= -1,
+	.num_resources	= ARRAY_SIZE(bast_nor_resource),
+	.resource	= bast_nor_resource,
+};
+
+/* NAND Flash on BAST board */
+
+
+static int smartmedia_map[] = { 0 };
+static int chip0_map[] = { 1 };
+static int chip1_map[] = { 2 };
+static int chip2_map[] = { 3 };
+
+static struct mtd_partition bast_default_nand_part[] = {
+	[0] = {
+		.name	= "Boot Agent",
+		.size	= SZ_16K,
+		.offset	= 0,
+	},
+	[1] = {
+		.name	= "/boot",
+		.size	= SZ_4M - SZ_16K,
+		.offset	= SZ_16K,
+	},
+	[2] = {
+		.name	= "user",
+		.offset	= SZ_4M,
+		.size	= MTDPART_SIZ_FULL,
+	}
+};
+
+/* the bast has 4 selectable slots for nand-flash, the three
+ * on-board chip areas, as well as the external SmartMedia
+ * slot.
+ *
+ * Note, there is no current hot-plug support for the SmartMedia
+ * socket.
+*/
+
+static struct s3c2410_nand_set bast_nand_sets[] = {
+	[0] = {
+		.name		= "SmartMedia",
+		.nr_chips	= 1,
+		.nr_map		= smartmedia_map,
+		.nr_partitions	= ARRAY_SIZE(bast_default_nand_part),
+		.partitions	= bast_default_nand_part,
+	},
+	[1] = {
+		.name		= "chip0",
+		.nr_chips	= 1,
+		.nr_map		= chip0_map,
+		.nr_partitions	= ARRAY_SIZE(bast_default_nand_part),
+		.partitions	= bast_default_nand_part,
+	},
+	[2] = {
+		.name		= "chip1",
+		.nr_chips	= 1,
+		.nr_map		= chip1_map,
+		.nr_partitions	= ARRAY_SIZE(bast_default_nand_part),
+		.partitions	= bast_default_nand_part,
+	},
+	[3] = {
+		.name		= "chip2",
+		.nr_chips	= 1,
+		.nr_map		= chip2_map,
+		.nr_partitions	= ARRAY_SIZE(bast_default_nand_part),
+		.partitions	= bast_default_nand_part,
+	}
+};
+
+static void bast_nand_select(struct s3c2410_nand_set *set, int slot)
+{
+	unsigned int tmp;
+
+	slot = set->nr_map[slot] & 3;
+
+	pr_debug("bast_nand: selecting slot %d (set %p,%p)\n",
+		 slot, set, set->nr_map);
+
+	tmp = __raw_readb(BAST_VA_CTRL2);
+	tmp &= BAST_CPLD_CTLR2_IDERST;
+	tmp |= slot;
+	tmp |= BAST_CPLD_CTRL2_WNAND;
+
+	pr_debug("bast_nand: ctrl2 now %02x\n", tmp);
+
+	__raw_writeb(tmp, BAST_VA_CTRL2);
+}
+
+static struct s3c2410_platform_nand bast_nand_info = {
+	.tacls		= 30,
+	.twrph0		= 60,
+	.twrph1		= 60,
+	.nr_sets	= ARRAY_SIZE(bast_nand_sets),
+	.sets		= bast_nand_sets,
+	.select_chip	= bast_nand_select,
+};
+
+/* DM9000 */
+
+static struct resource bast_dm9k_resource[] = {
+	[0] = {
+		.start = S3C2410_CS5 + BAST_PA_DM9000,
+		.end   = S3C2410_CS5 + BAST_PA_DM9000 + 3,
+		.flags = IORESOURCE_MEM,
+	},
+	[1] = {
+		.start = S3C2410_CS5 + BAST_PA_DM9000 + 0x40,
+		.end   = S3C2410_CS5 + BAST_PA_DM9000 + 0x40 + 0x3f,
+		.flags = IORESOURCE_MEM,
+	},
+	[2] = {
+		.start = IRQ_DM9000,
+		.end   = IRQ_DM9000,
+		.flags = IORESOURCE_IRQ,
+	}
+
+};
+
+/* for the moment we limit ourselves to 16bit IO until some
+ * better IO routines can be written and tested
+*/
+
+static struct dm9000_plat_data bast_dm9k_platdata = {
+	.flags		= DM9000_PLATF_16BITONLY,
+};
+
+static struct platform_device bast_device_dm9k = {
+	.name		= "dm9000",
+	.id		= 0,
+	.num_resources	= ARRAY_SIZE(bast_dm9k_resource),
+	.resource	= bast_dm9k_resource,
+	.dev		= {
+		.platform_data = &bast_dm9k_platdata,
+	}
+};
+
+/* serial devices */
+
+#define SERIAL_BASE  (S3C2410_CS2 + BAST_PA_SUPERIO)
+#define SERIAL_FLAGS (UPF_BOOT_AUTOCONF | UPF_IOREMAP | UPF_SHARE_IRQ)
+#define SERIAL_CLK   (1843200)
+
+static struct plat_serial8250_port bast_sio_data[] = {
+	[0] = {
+		.mapbase	= SERIAL_BASE + 0x2f8,
+		.irq		= IRQ_PCSERIAL1,
+		.flags		= SERIAL_FLAGS,
+		.iotype		= UPIO_MEM,
+		.regshift	= 0,
+		.uartclk	= SERIAL_CLK,
+	},
+	[1] = {
+		.mapbase	= SERIAL_BASE + 0x3f8,
+		.irq		= IRQ_PCSERIAL2,
+		.flags		= SERIAL_FLAGS,
+		.iotype		= UPIO_MEM,
+		.regshift	= 0,
+		.uartclk	= SERIAL_CLK,
+	},
+	{ }
+};
+
+static struct platform_device bast_sio = {
+	.name			= "serial8250",
+	.id			= PLAT8250_DEV_PLATFORM,
+	.dev			= {
+		.platform_data	= &bast_sio_data,
+	},
+};
+
+/* we have devices on the bus which cannot work much over the
+ * standard 100KHz i2c bus frequency
+*/
+
+static struct s3c2410_platform_i2c bast_i2c_info = {
+	.flags		= 0,
+	.slave_addr	= 0x10,
+	.bus_freq	= 100*1000,
+	.max_freq	= 130*1000,
+};
+
+
+static struct s3c2410fb_mach_info __initdata bast_lcd_info = {
+	.width		= 640,
+	.height		= 480,
+
+	.xres		= {
+		.min		= 320,
+		.max		= 1024,
+		.defval		= 640,
+	},
+
+	.yres		= {
+		.min		= 240,
+		.max	        = 600,
+		.defval		= 480,
+	},
+
+	.bpp		= {
+		.min		= 4,
+		.max		= 16,
+		.defval		= 8,
+	},
+
+	.regs		= {
+		.lcdcon1	= 0x00000176,
+		.lcdcon2	= 0x1d77c7c2,
+		.lcdcon3	= 0x013a7f13,
+		.lcdcon4	= 0x00000057,
+		.lcdcon5	= 0x00014b02,
+	}
+};
+
+/* Standard BAST devices */
+
+static struct platform_device *bast_devices[] __initdata = {
+	&s3c_device_usb,
+	&s3c_device_lcd,
+	&s3c_device_wdt,
+	&s3c_device_i2c,
+	&s3c_device_iis,
+ 	&s3c_device_rtc,
+	&s3c_device_nand,
+	&bast_device_nor,
+	&bast_device_dm9k,
+	&bast_sio,
+};
+
+static struct clk *bast_clocks[] = {
+	&s3c24xx_dclk0,
+	&s3c24xx_dclk1,
+	&s3c24xx_clkout0,
+	&s3c24xx_clkout1,
+	&s3c24xx_uclk,
+};
+
+static struct s3c24xx_board bast_board __initdata = {
+	.devices       = bast_devices,
+	.devices_count = ARRAY_SIZE(bast_devices),
+	.clocks	       = bast_clocks,
+	.clocks_count  = ARRAY_SIZE(bast_clocks),
+};
+
+static void __init bast_map_io(void)
+{
+	/* initialise the clocks */
+
+	s3c24xx_dclk0.parent = NULL;
+	s3c24xx_dclk0.rate   = 12*1000*1000;
+
+	s3c24xx_dclk1.parent = NULL;
+	s3c24xx_dclk1.rate   = 24*1000*1000;
+
+	s3c24xx_clkout0.parent  = &s3c24xx_dclk0;
+	s3c24xx_clkout1.parent  = &s3c24xx_dclk1;
+
+	s3c24xx_uclk.parent  = &s3c24xx_clkout1;
+
+	s3c_device_nand.dev.platform_data = &bast_nand_info;
+	s3c_device_i2c.dev.platform_data = &bast_i2c_info;
+
+	s3c24xx_init_io(bast_iodesc, ARRAY_SIZE(bast_iodesc));
+	s3c24xx_init_clocks(0);
+	s3c24xx_init_uarts(bast_uartcfgs, ARRAY_SIZE(bast_uartcfgs));
+	s3c24xx_set_board(&bast_board);
+	usb_simtec_init();
+}
+
+static void __init bast_init(void)
+{
+	s3c24xx_fb_set_platdata(&bast_lcd_info);
+}
+
+MACHINE_START(BAST, "Simtec-BAST")
+	/* Maintainer: Ben Dooks <ben@simtec.co.uk> */
+	.phys_io	= S3C2410_PA_UART,
+	.io_pg_offst	= (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,
+	.boot_params	= S3C2410_SDRAM_PA + 0x100,
+	.map_io		= bast_map_io,
+	.init_irq	= s3c24xx_init_irq,
+	.init_machine	= bast_init,
+	.timer		= &s3c24xx_timer,
+MACHINE_END
diff -urNp linux-2.6.20/arch/arm/mach-s3c2410/mach-osiris.c linux-2.6.20-s1t/arch/arm/mach-s3c2410/mach-osiris.c
--- linux-2.6.20/arch/arm/mach-s3c2410/mach-osiris.c	2007-02-04 18:44:54.000000000 +0000
+++ linux-2.6.20-s1t/arch/arm/mach-s3c2410/mach-osiris.c	2007-02-07 16:29:04.000000000 +0000
@@ -67,12 +67,22 @@ static struct map_desc osiris_iodesc[] _
   {
 	  .virtual	= (u32)OSIRIS_VA_CTRL1,
 	  .pfn		= __phys_to_pfn(OSIRIS_PA_CTRL1),
-	  .length	= SZ_16K,
+	  .length	= SZ_1M,
 	  .type		= MT_DEVICE,
   }, {
 	  .virtual	= (u32)OSIRIS_VA_CTRL2,
 	  .pfn		= __phys_to_pfn(OSIRIS_PA_CTRL2),
-	  .length	= SZ_16K,
+	  .length	= SZ_1M,
+	  .type		= MT_DEVICE,
+  }, {
+	  .virtual	= (u32)OSIRIS_VA_CTRL3,
+	  .pfn		= __phys_to_pfn(OSIRIS_PA_CTRL3),
+	  .length	= SZ_1M,
+	  .type		= MT_DEVICE,
+  }, {
+	  .virtual	= (u32)OSIRIS_VA_CTRL4,
+	  .pfn		= __phys_to_pfn(OSIRIS_PA_CTRL4),
+	  .length	= SZ_1M,
 	  .type		= MT_DEVICE,
   },
 };
@@ -184,6 +194,15 @@ static struct s3c2410_nand_set osiris_na
 		.nr_partitions	= ARRAY_SIZE(osiris_default_nand_part),
 		.partitions	= osiris_default_nand_part,
 	},
+	[2] = {
+		.hwport	     = 2,
+		.flags	     = 0,
+		.ucon	     = UCON,
+		.ulcon	     = ULCON,
+		.ufcon	     = UFCON,
+		.clocks	     = osiris_serial_clocks,
+		.clocks_size = ARRAY_SIZE(osiris_serial_clocks),
+	}
 };
 
 static void osiris_nand_select(struct s3c2410_nand_set *set, int slot)
@@ -282,6 +301,12 @@ static void __init osiris_map_io(void)
 	s3c24xx_init_uarts(osiris_uartcfgs, ARRAY_SIZE(osiris_uartcfgs));
 	s3c24xx_set_board(&osiris_board);
 
+	/* show current controls */
+
+	printk(KERN_INFO "OSIRIS CPLD controls: %04x, %04x, %04x, %04x\n",
+	       __raw_readw(OSIRIS_VA_CTRL1), __raw_readw(OSIRIS_VA_CTRL2),
+	       __raw_readw(OSIRIS_VA_CTRL3), __raw_readw(OSIRIS_VA_CTRL4));
+
 	/* fix bus configuration (nBE settings wrong on ABLE pre v2.20) */
 
 	local_irq_save(flags);
diff -urNp linux-2.6.20/arch/arm/mach-s3c2410/mach-osiris.c.orig linux-2.6.20-s1t/arch/arm/mach-s3c2410/mach-osiris.c.orig
--- linux-2.6.20/arch/arm/mach-s3c2410/mach-osiris.c.orig	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/arch/arm/mach-s3c2410/mach-osiris.c.orig	2007-02-04 18:44:54.000000000 +0000
@@ -0,0 +1,303 @@
+/* linux/arch/arm/mach-s3c2410/mach-osiris.c
+ *
+ * Copyright (c) 2005 Simtec Electronics
+ *	http://armlinux.simtec.co.uk/
+ *	Ben Dooks <ben@simtec.co.uk>
+ *
+ * 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.
+*/
+
+#include <linux/kernel.h>
+#include <linux/types.h>
+#include <linux/interrupt.h>
+#include <linux/list.h>
+#include <linux/timer.h>
+#include <linux/init.h>
+#include <linux/device.h>
+#include <linux/serial_core.h>
+
+#include <asm/mach/arch.h>
+#include <asm/mach/map.h>
+#include <asm/mach/irq.h>
+
+#include <asm/arch/osiris-map.h>
+#include <asm/arch/osiris-cpld.h>
+
+#include <asm/hardware.h>
+#include <asm/io.h>
+#include <asm/irq.h>
+#include <asm/mach-types.h>
+
+#include <asm/arch/regs-serial.h>
+#include <asm/arch/regs-gpio.h>
+#include <asm/arch/regs-mem.h>
+#include <asm/arch/regs-lcd.h>
+#include <asm/arch/nand.h>
+
+#include <linux/mtd/mtd.h>
+#include <linux/mtd/nand.h>
+#include <linux/mtd/nand_ecc.h>
+#include <linux/mtd/partitions.h>
+
+#include "clock.h"
+#include "devs.h"
+#include "cpu.h"
+
+/* onboard perihpheral map */
+
+static struct map_desc osiris_iodesc[] __initdata = {
+  /* ISA IO areas (may be over-written later) */
+
+  {
+	  .virtual	= (u32)S3C24XX_VA_ISA_BYTE,
+	  .pfn		= __phys_to_pfn(S3C2410_CS5),
+	  .length	= SZ_16M,
+	  .type		= MT_DEVICE,
+  }, {
+	  .virtual	= (u32)S3C24XX_VA_ISA_WORD,
+	  .pfn		= __phys_to_pfn(S3C2410_CS5),
+	  .length	= SZ_16M,
+	  .type		= MT_DEVICE,
+  },
+
+  /* CPLD control registers */
+
+  {
+	  .virtual	= (u32)OSIRIS_VA_CTRL1,
+	  .pfn		= __phys_to_pfn(OSIRIS_PA_CTRL1),
+	  .length	= SZ_16K,
+	  .type		= MT_DEVICE,
+  }, {
+	  .virtual	= (u32)OSIRIS_VA_CTRL2,
+	  .pfn		= __phys_to_pfn(OSIRIS_PA_CTRL2),
+	  .length	= SZ_16K,
+	  .type		= MT_DEVICE,
+  },
+};
+
+#define UCON S3C2410_UCON_DEFAULT | S3C2410_UCON_UCLK
+#define ULCON S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB
+#define UFCON S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE
+
+static struct s3c24xx_uart_clksrc osiris_serial_clocks[] = {
+	[0] = {
+		.name		= "uclk",
+		.divisor	= 1,
+		.min_baud	= 0,
+		.max_baud	= 0,
+	},
+	[1] = {
+		.name		= "pclk",
+		.divisor	= 1,
+		.min_baud	= 0,
+		.max_baud	= 0,
+	}
+};
+
+static struct s3c2410_uartcfg osiris_uartcfgs[] __initdata = {
+	[0] = {
+		.hwport	     = 0,
+		.flags	     = 0,
+		.ucon	     = UCON,
+		.ulcon	     = ULCON,
+		.ufcon	     = UFCON,
+		.clocks	     = osiris_serial_clocks,
+		.clocks_size = ARRAY_SIZE(osiris_serial_clocks),
+	},
+	[1] = {
+		.hwport	     = 1,
+		.flags	     = 0,
+		.ucon	     = UCON,
+		.ulcon	     = ULCON,
+		.ufcon	     = UFCON,
+		.clocks	     = osiris_serial_clocks,
+		.clocks_size = ARRAY_SIZE(osiris_serial_clocks),
+	},
+	[2] = {
+		.hwport	     = 2,
+		.flags	     = 0,
+		.ucon	     = UCON,
+		.ulcon	     = ULCON,
+		.ufcon	     = UFCON,
+		.clocks	     = osiris_serial_clocks,
+		.clocks_size = ARRAY_SIZE(osiris_serial_clocks),
+	}
+};
+
+/* NAND Flash on Osiris board */
+
+static int external_map[]   = { 2 };
+static int chip0_map[]      = { 0 };
+static int chip1_map[]      = { 1 };
+
+static struct mtd_partition osiris_default_nand_part[] = {
+	[0] = {
+		.name	= "Boot Agent",
+		.size	= SZ_16K,
+		.offset	= 0,
+	},
+	[1] = {
+		.name	= "/boot",
+		.size	= SZ_4M - SZ_16K,
+		.offset	= SZ_16K,
+	},
+	[2] = {
+		.name	= "user1",
+		.offset	= SZ_4M,
+		.size	= SZ_32M - SZ_4M,
+	},
+	[3] = {
+		.name	= "user2",
+		.offset	= SZ_32M,
+		.size	= MTDPART_SIZ_FULL,
+	}
+};
+
+/* the Osiris has 3 selectable slots for nand-flash, the two
+ * on-board chip areas, as well as the external slot.
+ *
+ * Note, there is no current hot-plug support for the External
+ * socket.
+*/
+
+static struct s3c2410_nand_set osiris_nand_sets[] = {
+	[1] = {
+		.name		= "External",
+		.nr_chips	= 1,
+		.nr_map		= external_map,
+		.nr_partitions	= ARRAY_SIZE(osiris_default_nand_part),
+		.partitions	= osiris_default_nand_part,
+	},
+	[0] = {
+		.name		= "chip0",
+		.nr_chips	= 1,
+		.nr_map		= chip0_map,
+		.nr_partitions	= ARRAY_SIZE(osiris_default_nand_part),
+		.partitions	= osiris_default_nand_part,
+	},
+	[2] = {
+		.name		= "chip1",
+		.nr_chips	= 1,
+		.nr_map		= chip1_map,
+		.nr_partitions	= ARRAY_SIZE(osiris_default_nand_part),
+		.partitions	= osiris_default_nand_part,
+	},
+};
+
+static void osiris_nand_select(struct s3c2410_nand_set *set, int slot)
+{
+	unsigned int tmp;
+
+	slot = set->nr_map[slot] & 3;
+
+	pr_debug("osiris_nand: selecting slot %d (set %p,%p)\n",
+		 slot, set, set->nr_map);
+
+	tmp = __raw_readb(OSIRIS_VA_CTRL1);
+	tmp &= ~OSIRIS_CTRL1_NANDSEL;
+	tmp |= slot;
+
+	pr_debug("osiris_nand: ctrl1 now %02x\n", tmp);
+
+	__raw_writeb(tmp, OSIRIS_VA_CTRL1);
+}
+
+static struct s3c2410_platform_nand osiris_nand_info = {
+	.tacls		= 25,
+	.twrph0		= 60,
+	.twrph1		= 60,
+	.nr_sets	= ARRAY_SIZE(osiris_nand_sets),
+	.sets		= osiris_nand_sets,
+	.select_chip	= osiris_nand_select,
+};
+
+/* PCMCIA control and configuration */
+
+static struct resource osiris_pcmcia_resource[] = {
+	[0] = {
+		.start	= 0x0f000000,
+		.end	= 0x0f100000,
+		.flags	= IORESOURCE_MEM,
+	},
+	[1] = {
+		.start	= 0x0c000000,
+		.end	= 0x0c100000,
+		.flags	= IORESOURCE_MEM,
+	}
+};
+
+static struct platform_device osiris_pcmcia = {
+	.name		= "osiris-pcmcia",
+	.id		= -1,
+	.num_resources	= ARRAY_SIZE(osiris_pcmcia_resource),
+	.resource	= osiris_pcmcia_resource,
+};
+
+/* Standard Osiris devices */
+
+static struct platform_device *osiris_devices[] __initdata = {
+	&s3c_device_i2c,
+	&s3c_device_nand,
+	&osiris_pcmcia,
+};
+
+static struct clk *osiris_clocks[] = {
+	&s3c24xx_dclk0,
+	&s3c24xx_dclk1,
+	&s3c24xx_clkout0,
+	&s3c24xx_clkout1,
+	&s3c24xx_uclk,
+};
+
+static struct s3c24xx_board osiris_board __initdata = {
+	.devices       = osiris_devices,
+	.devices_count = ARRAY_SIZE(osiris_devices),
+	.clocks	       = osiris_clocks,
+	.clocks_count  = ARRAY_SIZE(osiris_clocks),
+};
+
+static void __init osiris_map_io(void)
+{
+	unsigned long flags;
+
+	/* initialise the clocks */
+
+	s3c24xx_dclk0.parent = NULL;
+	s3c24xx_dclk0.rate   = 12*1000*1000;
+
+	s3c24xx_dclk1.parent = NULL;
+	s3c24xx_dclk1.rate   = 24*1000*1000;
+
+	s3c24xx_clkout0.parent  = &s3c24xx_dclk0;
+	s3c24xx_clkout1.parent  = &s3c24xx_dclk1;
+
+	s3c24xx_uclk.parent  = &s3c24xx_clkout1;
+
+	s3c_device_nand.dev.platform_data = &osiris_nand_info;
+
+	s3c24xx_init_io(osiris_iodesc, ARRAY_SIZE(osiris_iodesc));
+	s3c24xx_init_clocks(0);
+	s3c24xx_init_uarts(osiris_uartcfgs, ARRAY_SIZE(osiris_uartcfgs));
+	s3c24xx_set_board(&osiris_board);
+
+	/* fix bus configuration (nBE settings wrong on ABLE pre v2.20) */
+
+	local_irq_save(flags);
+	__raw_writel(__raw_readl(S3C2410_BWSCON) | S3C2410_BWSCON_ST1 | S3C2410_BWSCON_ST2 | S3C2410_BWSCON_ST3 | S3C2410_BWSCON_ST4 | S3C2410_BWSCON_ST5, S3C2410_BWSCON);
+	local_irq_restore(flags);
+
+	/* write-protect line to the NAND */
+	s3c2410_gpio_setpin(S3C2410_GPA0, 1);
+}
+
+MACHINE_START(OSIRIS, "Simtec-OSIRIS")
+	/* Maintainer: Ben Dooks <ben@simtec.co.uk> */
+	.phys_io	= S3C2410_PA_UART,
+	.io_pg_offst	= (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,
+	.boot_params	= S3C2410_SDRAM_PA + 0x100,
+	.map_io		= osiris_map_io,
+	.init_irq	= s3c24xx_init_irq,
+	.timer		= &s3c24xx_timer,
+MACHINE_END
diff -urNp linux-2.6.20/arch/arm/mach-s3c2410/mach-smdk2440.c linux-2.6.20-s1t/arch/arm/mach-s3c2410/mach-smdk2440.c
--- linux-2.6.20/arch/arm/mach-s3c2410/mach-smdk2440.c	2007-02-04 18:44:54.000000000 +0000
+++ linux-2.6.20-s1t/arch/arm/mach-s3c2410/mach-smdk2440.c	2007-02-07 16:29:04.000000000 +0000
@@ -25,6 +25,7 @@
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
 #include <asm/mach/irq.h>
+#include <asm/arch/udc.h>
 
 #include <asm/hardware.h>
 #include <asm/hardware/iomd.h>
@@ -167,12 +168,38 @@ static struct s3c2410fb_mach_info smdk24
 	},
 };
 
+
+static void smdk2440_usb_pullup(enum s3c2410_udc_cmd_e cmd)
+{
+	printk(KERN_DEBUG "udc: pullup(%d)\n",cmd);
+
+	switch (cmd)
+	{
+		case S3C2410_UDC_P_ENABLE :
+			s3c2410_gpio_setpin(S3C2410_GPG12, 1);
+			break;
+
+		case S3C2410_UDC_P_DISABLE :
+			s3c2410_gpio_setpin(S3C2410_GPG12, 0);
+			break;
+
+		case S3C2410_UDC_P_RESET :
+		default:
+			break;
+	}
+}
+
+static struct s3c2410_udc_mach_info smdk2440_udc_cfg __initdata = {
+	.udc_command	= smdk2440_usb_pullup,
+};
+
 static struct platform_device *smdk2440_devices[] __initdata = {
 	&s3c_device_usb,
 	&s3c_device_lcd,
 	&s3c_device_wdt,
 	&s3c_device_i2c,
 	&s3c_device_iis,
+	&s3c_device_usbgadget,
 };
 
 static struct s3c24xx_board smdk2440_board __initdata = {
@@ -190,6 +217,11 @@ static void __init smdk2440_map_io(void)
 
 static void __init smdk2440_machine_init(void)
 {
+	/* configure usb pull-up control */
+	s3c2410_gpio_cfgpin(S3C2410_GPG12, S3C2410_GPG12_OUTP);
+	s3c2410_gpio_setpin(S3C2410_GPG12, 0);
+
+	s3c24xx_udc_set_platdata(&smdk2440_udc_cfg);
 	s3c24xx_fb_set_platdata(&smdk2440_lcd_cfg);
 
 	smdk_machine_init();
diff -urNp linux-2.6.20/arch/arm/mach-s3c2410/mach-smdk2440.c.orig linux-2.6.20-s1t/arch/arm/mach-s3c2410/mach-smdk2440.c.orig
--- linux-2.6.20/arch/arm/mach-s3c2410/mach-smdk2440.c.orig	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/arch/arm/mach-s3c2410/mach-smdk2440.c.orig	2007-02-04 18:44:54.000000000 +0000
@@ -0,0 +1,208 @@
+/* linux/arch/arm/mach-s3c2410/mach-smdk2440.c
+ *
+ * Copyright (c) 2004,2005 Simtec Electronics
+ *	Ben Dooks <ben@simtec.co.uk>
+ *
+ * http://www.fluff.org/ben/smdk2440/
+ *
+ * Thanks to Dimity Andric and TomTom for the loan of an SMDK2440.
+ *
+ * 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.
+ *
+*/
+
+#include <linux/kernel.h>
+#include <linux/types.h>
+#include <linux/interrupt.h>
+#include <linux/list.h>
+#include <linux/timer.h>
+#include <linux/init.h>
+#include <linux/serial_core.h>
+#include <linux/platform_device.h>
+
+#include <asm/mach/arch.h>
+#include <asm/mach/map.h>
+#include <asm/mach/irq.h>
+
+#include <asm/hardware.h>
+#include <asm/hardware/iomd.h>
+#include <asm/io.h>
+#include <asm/irq.h>
+#include <asm/mach-types.h>
+
+//#include <asm/debug-ll.h>
+#include <asm/arch/regs-serial.h>
+#include <asm/arch/regs-gpio.h>
+#include <asm/arch/regs-lcd.h>
+
+#include <asm/arch/idle.h>
+#include <asm/arch/fb.h>
+
+#include "s3c2410.h"
+#include "s3c2440.h"
+#include "clock.h"
+#include "devs.h"
+#include "cpu.h"
+
+#include "common-smdk.h"
+
+static struct map_desc smdk2440_iodesc[] __initdata = {
+	/* ISA IO Space map (memory space selected by A24) */
+
+	{
+		.virtual	= (u32)S3C24XX_VA_ISA_WORD,
+		.pfn		= __phys_to_pfn(S3C2410_CS2),
+		.length		= 0x10000,
+		.type		= MT_DEVICE,
+	}, {
+		.virtual	= (u32)S3C24XX_VA_ISA_WORD + 0x10000,
+		.pfn		= __phys_to_pfn(S3C2410_CS2 + (1<<24)),
+		.length		= SZ_4M,
+		.type		= MT_DEVICE,
+	}, {
+		.virtual	= (u32)S3C24XX_VA_ISA_BYTE,
+		.pfn		= __phys_to_pfn(S3C2410_CS2),
+		.length		= 0x10000,
+		.type		= MT_DEVICE,
+	}, {
+		.virtual	= (u32)S3C24XX_VA_ISA_BYTE + 0x10000,
+		.pfn		= __phys_to_pfn(S3C2410_CS2 + (1<<24)),
+		.length		= SZ_4M,
+		.type		= MT_DEVICE,
+	}
+};
+
+#define UCON S3C2410_UCON_DEFAULT | S3C2410_UCON_UCLK
+#define ULCON S3C2410_LCON_CS8 | S3C2410_LCON_PNONE | S3C2410_LCON_STOPB
+#define UFCON S3C2410_UFCON_RXTRIG8 | S3C2410_UFCON_FIFOMODE
+
+static struct s3c2410_uartcfg smdk2440_uartcfgs[] __initdata = {
+	[0] = {
+		.hwport	     = 0,
+		.flags	     = 0,
+		.ucon	     = 0x3c5,
+		.ulcon	     = 0x03,
+		.ufcon	     = 0x51,
+	},
+	[1] = {
+		.hwport	     = 1,
+		.flags	     = 0,
+		.ucon	     = 0x3c5,
+		.ulcon	     = 0x03,
+		.ufcon	     = 0x51,
+	},
+	/* IR port */
+	[2] = {
+		.hwport	     = 2,
+		.flags	     = 0,
+		.ucon	     = 0x3c5,
+		.ulcon	     = 0x43,
+		.ufcon	     = 0x51,
+	}
+};
+
+/* LCD driver info */
+
+static struct s3c2410fb_mach_info smdk2440_lcd_cfg __initdata = {
+	.regs	= {
+
+		.lcdcon1	= S3C2410_LCDCON1_TFT16BPP |
+				  S3C2410_LCDCON1_TFT |
+				  S3C2410_LCDCON1_CLKVAL(0x04),
+
+		.lcdcon2	= S3C2410_LCDCON2_VBPD(7) |
+				  S3C2410_LCDCON2_LINEVAL(319) |
+				  S3C2410_LCDCON2_VFPD(6) |
+				  S3C2410_LCDCON2_VSPW(3),
+
+		.lcdcon3	= S3C2410_LCDCON3_HBPD(19) |
+				  S3C2410_LCDCON3_HOZVAL(239) |
+				  S3C2410_LCDCON3_HFPD(7),
+
+		.lcdcon4	= S3C2410_LCDCON4_MVAL(0) |
+				  S3C2410_LCDCON4_HSPW(3),
+
+		.lcdcon5	= S3C2410_LCDCON5_FRM565 |
+				  S3C2410_LCDCON5_INVVLINE |
+				  S3C2410_LCDCON5_INVVFRAME |
+				  S3C2410_LCDCON5_PWREN |
+				  S3C2410_LCDCON5_HWSWP,
+	},
+
+#if 0
+	/* currently setup by downloader */
+	.gpccon		= 0xaa940659,
+	.gpccon_mask	= 0xffffffff,
+	.gpcup		= 0x0000ffff,
+	.gpcup_mask	= 0xffffffff,
+	.gpdcon		= 0xaa84aaa0,
+	.gpdcon_mask	= 0xffffffff,
+	.gpdup		= 0x0000faff,
+	.gpdup_mask	= 0xffffffff,
+#endif
+
+	.lpcsel		= ((0xCE6) & ~7) | 1<<4,
+
+	.width		= 240,
+	.height		= 320,
+
+	.xres		= {
+		.min	= 240,
+		.max	= 240,
+		.defval	= 240,
+	},
+
+	.yres		= {
+		.min	= 320,
+		.max	= 320,
+		.defval = 320,
+	},
+
+	.bpp		= {
+		.min	= 16,
+		.max	= 16,
+		.defval = 16,
+	},
+};
+
+static struct platform_device *smdk2440_devices[] __initdata = {
+	&s3c_device_usb,
+	&s3c_device_lcd,
+	&s3c_device_wdt,
+	&s3c_device_i2c,
+	&s3c_device_iis,
+};
+
+static struct s3c24xx_board smdk2440_board __initdata = {
+	.devices       = smdk2440_devices,
+	.devices_count = ARRAY_SIZE(smdk2440_devices)
+};
+
+static void __init smdk2440_map_io(void)
+{
+	s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));
+	s3c24xx_init_clocks(16934400);
+	s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));
+	s3c24xx_set_board(&smdk2440_board);
+}
+
+static void __init smdk2440_machine_init(void)
+{
+	s3c24xx_fb_set_platdata(&smdk2440_lcd_cfg);
+
+	smdk_machine_init();
+}
+
+MACHINE_START(S3C2440, "SMDK2440")
+	/* Maintainer: Ben Dooks <ben@fluff.org> */
+	.phys_io	= S3C2410_PA_UART,
+	.io_pg_offst	= (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,
+	.boot_params	= S3C2410_SDRAM_PA + 0x100,
+
+	.init_irq	= s3c24xx_init_irq,
+	.map_io		= smdk2440_map_io,
+	.init_machine	= smdk2440_machine_init,
+	.timer		= &s3c24xx_timer,
+MACHINE_END
diff -urNp linux-2.6.20/arch/arm/mach-s3c2410/s3c2410-dma.c.orig linux-2.6.20-s1t/arch/arm/mach-s3c2410/s3c2410-dma.c.orig
--- linux-2.6.20/arch/arm/mach-s3c2410/s3c2410-dma.c.orig	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/arch/arm/mach-s3c2410/s3c2410-dma.c.orig	2007-02-04 18:44:54.000000000 +0000
@@ -0,0 +1,161 @@
+/* linux/arch/arm/mach-s3c2410/s3c2410-dma.c
+ *
+ * Copyright (c) 2006 Simtec Electronics
+ *	Ben Dooks <ben@simtec.co.uk>
+ *
+ * S3C2410 DMA selection
+ *
+ * http://armlinux.simtec.co.uk/
+ *
+ * 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.
+*/
+
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/sysdev.h>
+#include <linux/serial_core.h>
+
+#include <asm/dma.h>
+#include <asm/arch/dma.h>
+#include "dma.h"
+
+#include "cpu.h"
+
+#include <asm/arch/regs-serial.h>
+#include <asm/arch/regs-gpio.h>
+#include <asm/arch/regs-ac97.h>
+#include <asm/arch/regs-mem.h>
+#include <asm/arch/regs-lcd.h>
+#include <asm/arch/regs-sdi.h>
+#include <asm/arch/regs-iis.h>
+#include <asm/arch/regs-spi.h>
+
+static struct s3c24xx_dma_map __initdata s3c2410_dma_mappings[] = {
+	[DMACH_XD0] = {
+		.name		= "xdreq0",
+		.channels[0]	= S3C2410_DCON_CH0_XDREQ0 | DMA_CH_VALID,
+	},
+	[DMACH_XD1] = {
+		.name		= "xdreq1",
+		.channels[1]	= S3C2410_DCON_CH1_XDREQ1 | DMA_CH_VALID,
+	},
+	[DMACH_SDI] = {
+		.name		= "sdi",
+		.channels[0]	= S3C2410_DCON_CH0_SDI | DMA_CH_VALID,
+		.channels[2]	= S3C2410_DCON_CH2_SDI | DMA_CH_VALID,
+		.channels[3]	= S3C2410_DCON_CH3_SDI | DMA_CH_VALID,
+		.hw_addr.to	= S3C2410_PA_IIS + S3C2410_IISFIFO,
+		.hw_addr.from	= S3C2410_PA_IIS + S3C2410_IISFIFO,
+	},
+	[DMACH_SPI0] = {
+		.name		= "spi0",
+		.channels[1]	= S3C2410_DCON_CH1_SPI | DMA_CH_VALID,
+		.hw_addr.to	= S3C2410_PA_SPI + S3C2410_SPTDAT,
+		.hw_addr.from	= S3C2410_PA_SPI + S3C2410_SPRDAT,
+	},
+	[DMACH_SPI1] = {
+		.name		= "spi1",
+		.channels[3]	= S3C2410_DCON_CH3_SPI | DMA_CH_VALID,
+		.hw_addr.to	= S3C2410_PA_SPI + 0x20 + S3C2410_SPTDAT,
+		.hw_addr.from	= S3C2410_PA_SPI + 0x20 + S3C2410_SPRDAT,
+	},
+	[DMACH_UART0] = {
+		.name		= "uart0",
+		.channels[0]	= S3C2410_DCON_CH0_UART0 | DMA_CH_VALID,
+		.hw_addr.to	= S3C2410_PA_UART0 + S3C2410_UTXH,
+		.hw_addr.from	= S3C2410_PA_UART0 + S3C2410_URXH,
+	},
+	[DMACH_UART1] = {
+		.name		= "uart1",
+		.channels[1]	= S3C2410_DCON_CH1_UART1 | DMA_CH_VALID,
+		.hw_addr.to	= S3C2410_PA_UART1 + S3C2410_UTXH,
+		.hw_addr.from	= S3C2410_PA_UART1 + S3C2410_URXH,
+	},
+      	[DMACH_UART2] = {
+		.name		= "uart2",
+		.channels[3]	= S3C2410_DCON_CH3_UART2 | DMA_CH_VALID,
+		.hw_addr.to	= S3C2410_PA_UART2 + S3C2410_UTXH,
+		.hw_addr.from	= S3C2410_PA_UART2 + S3C2410_URXH,
+	},
+	[DMACH_TIMER] = {
+		.name		= "timer",
+		.channels[0]	= S3C2410_DCON_CH0_TIMER | DMA_CH_VALID,
+		.channels[2]	= S3C2410_DCON_CH2_TIMER | DMA_CH_VALID,
+		.channels[3]	= S3C2410_DCON_CH3_TIMER | DMA_CH_VALID,
+	},
+	[DMACH_I2S_IN] = {
+		.name		= "i2s-sdi",
+		.channels[1]	= S3C2410_DCON_CH1_I2SSDI | DMA_CH_VALID,
+		.channels[2]	= S3C2410_DCON_CH2_I2SSDI | DMA_CH_VALID,
+		.hw_addr.from	= S3C2410_PA_IIS + S3C2410_IISFIFO,
+	},
+	[DMACH_I2S_OUT] = {
+		.name		= "i2s-sdo",
+		.channels[2]	= S3C2410_DCON_CH2_I2SSDO | DMA_CH_VALID,
+		.hw_addr.to	= S3C2410_PA_IIS + S3C2410_IISFIFO,
+	},
+	[DMACH_USB_EP1] = {
+		.name		= "usb-ep1",
+		.channels[0]	= S3C2410_DCON_CH0_USBEP1 | DMA_CH_VALID,
+	},
+	[DMACH_USB_EP2] = {
+		.name		= "usb-ep2",
+		.channels[1]	= S3C2410_DCON_CH1_USBEP2 | DMA_CH_VALID,
+	},
+	[DMACH_USB_EP3] = {
+		.name		= "usb-ep3",
+		.channels[2]	= S3C2410_DCON_CH2_USBEP3 | DMA_CH_VALID,
+	},
+	[DMACH_USB_EP4] = {
+		.name		= "usb-ep4",
+		.channels[3]	=S3C2410_DCON_CH3_USBEP4 | DMA_CH_VALID,
+	},
+};
+
+static void s3c2410_dma_select(struct s3c2410_dma_chan *chan,
+			       struct s3c24xx_dma_map *map)
+{
+	chan->dcon = map->channels[chan->number] & ~DMA_CH_VALID;
+}
+
+static struct s3c24xx_dma_selection __initdata s3c2410_dma_sel = {
+	.select		= s3c2410_dma_select,
+	.dcon_mask	= 7 << 24,
+	.map		= s3c2410_dma_mappings,
+	.map_size	= ARRAY_SIZE(s3c2410_dma_mappings),
+};
+
+static int s3c2410_dma_add(struct sys_device *sysdev)
+{
+	return s3c24xx_dma_init_map(&s3c2410_dma_sel);
+}
+
+#if defined(CONFIG_CPU_S3C2410)
+static struct sysdev_driver s3c2410_dma_driver = {
+	.add	= s3c2410_dma_add,
+};
+
+static int __init s3c2410_dma_init(void)
+{
+	return sysdev_driver_register(&s3c2410_sysclass, &s3c2410_dma_driver);
+}
+
+arch_initcall(s3c2410_dma_init);
+#endif
+
+#if defined(CONFIG_CPU_S3C2442)
+/* S3C2442 DMA contains the same selection table as the S3C2410 */
+static struct sysdev_driver s3c2442_dma_driver = {
+	.add	= s3c2410_dma_add,
+};
+
+static int __init s3c2442_dma_init(void)
+{
+	return sysdev_driver_register(&s3c2442_sysclass, &s3c2442_dma_driver);
+}
+
+arch_initcall(s3c2442_dma_init);
+#endif
+
diff -urNp linux-2.6.20/arch/arm/mach-s3c2410/s3c2410-dma.c.rej linux-2.6.20-s1t/arch/arm/mach-s3c2410/s3c2410-dma.c.rej
--- linux-2.6.20/arch/arm/mach-s3c2410/s3c2410-dma.c.rej	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/arch/arm/mach-s3c2410/s3c2410-dma.c.rej	2007-02-07 16:29:14.000000000 +0000
@@ -0,0 +1,51 @@
+*************** static int s3c2410_dma_add(struct sys_de
+*** 131,136 ****
+  	return s3c24xx_dma_init_map(&s3c2410_dma_sel);
+  }
+  
+  static struct sysdev_driver s3c2410_dma_driver = {
+  	.add	= s3c2410_dma_add,
+  };
+--- 131,137 ----
+  	return s3c24xx_dma_init_map(&s3c2410_dma_sel);
+  }
+  
++ #ifdef CONFIG_CPU_S3C2410
+  static struct sysdev_driver s3c2410_dma_driver = {
+  	.add	= s3c2410_dma_add,
+  };
+*************** static int __init s3c2410_dma_init(void)
+*** 141,149 ****
+  }
+  
+  arch_initcall(s3c2410_dma_init);
+  
+  /* S3C2442 DMA contains the same selection table as the S3C2410 */
+  
+  static struct sysdev_driver s3c2442_dma_driver = {
+  	.add	= s3c2410_dma_add,
+  };
+--- 142,152 ----
+  }
+  
+  arch_initcall(s3c2410_dma_init);
++ #endif
+  
+  /* S3C2442 DMA contains the same selection table as the S3C2410 */
+  
++ #ifdef CONFIG_CPU_S3C2442
+  static struct sysdev_driver s3c2442_dma_driver = {
+  	.add	= s3c2410_dma_add,
+  };
+*************** static int __init s3c2442_dma_init(void)
+*** 154,158 ****
+  }
+  
+  arch_initcall(s3c2442_dma_init);
+- 
+- 
+--- 157,160 ----
+  }
+  
+  arch_initcall(s3c2442_dma_init);
++ #endif
diff -urNp linux-2.6.20/arch/arm/mach-s3c2410/s3c2410-pm.c.orig linux-2.6.20-s1t/arch/arm/mach-s3c2410/s3c2410-pm.c.orig
--- linux-2.6.20/arch/arm/mach-s3c2410/s3c2410-pm.c.orig	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/arch/arm/mach-s3c2410/s3c2410-pm.c.orig	2007-02-04 18:44:54.000000000 +0000
@@ -0,0 +1,156 @@
+/* linux/arch/arm/mach-s3c2410/s3c2410-pm.c
+ *
+ * Copyright (c) 2006 Simtec Electronics
+ *	Ben Dooks <ben@simtec.co.uk>
+ *
+ * S3C2410 (and compatible) Power Manager (Suspend-To-RAM) support
+ *
+ * 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 <linux/init.h>
+#include <linux/suspend.h>
+#include <linux/errno.h>
+#include <linux/time.h>
+#include <linux/sysdev.h>
+
+#include <asm/hardware.h>
+#include <asm/io.h>
+
+#include <asm/mach-types.h>
+
+#include <asm/arch/regs-gpio.h>
+#include <asm/arch/h1940.h>
+
+#include "cpu.h"
+#include "pm.h"
+
+#ifdef CONFIG_S3C2410_PM_DEBUG
+extern void pm_dbg(const char *fmt, ...);
+#define DBG(fmt...) pm_dbg(fmt)
+#else
+#define DBG(fmt...) printk(KERN_DEBUG fmt)
+#endif
+
+static void s3c2410_pm_prepare(void)
+{
+	/* ensure at least GSTATUS3 has the resume address */
+
+	__raw_writel(virt_to_phys(s3c2410_cpu_resume), S3C2410_GSTATUS3);
+
+	DBG("GSTATUS3 0x%08x\n", __raw_readl(S3C2410_GSTATUS3));
+	DBG("GSTATUS4 0x%08x\n", __raw_readl(S3C2410_GSTATUS4));
+
+	if (machine_is_h1940()) {
+		void *base = phys_to_virt(H1940_SUSPEND_CHECK);
+		unsigned long ptr;
+		unsigned long calc = 0;
+
+		/* generate check for the bootloader to check on resume */
+
+		for (ptr = 0; ptr < 0x40000; ptr += 0x400)
+			calc += __raw_readl(base+ptr);
+
+		__raw_writel(calc, phys_to_virt(H1940_SUSPEND_CHECKSUM));
+	}
+
+	/* the RX3715 uses similar code and the same H1940 and the
+	 * same offsets for resume and checksum pointers */
+
+	if (machine_is_rx3715()) {
+		void *base = phys_to_virt(H1940_SUSPEND_CHECK);
+		unsigned long ptr;
+		unsigned long calc = 0;
+
+		/* generate check for the bootloader to check on resume */
+
+		for (ptr = 0; ptr < 0x40000; ptr += 0x4)
+			calc += __raw_readl(base+ptr);
+
+		__raw_writel(calc, phys_to_virt(H1940_SUSPEND_CHECKSUM));
+	}
+
+	if ( machine_is_aml_m5900() )
+		s3c2410_gpio_setpin(S3C2410_GPF2, 1);
+
+}
+
+static int s3c2410_pm_resume(struct sys_device *dev)
+{
+	unsigned long tmp;
+
+	/* unset the return-from-sleep flag, to ensure reset */
+
+	tmp = __raw_readl(S3C2410_GSTATUS2);
+	tmp &= S3C2410_GSTATUS2_OFFRESET;
+	__raw_writel(tmp, S3C2410_GSTATUS2);
+
+	if ( machine_is_aml_m5900() )
+		s3c2410_gpio_setpin(S3C2410_GPF2, 0);
+
+	return 0;
+}
+
+static int s3c2410_pm_add(struct sys_device *dev)
+{
+	pm_cpu_prep = s3c2410_pm_prepare;
+	pm_cpu_sleep = s3c2410_cpu_suspend;
+
+	return 0;
+}
+
+#if defined(CONFIG_CPU_S3C2410)
+static struct sysdev_driver s3c2410_pm_driver = {
+	.add		= s3c2410_pm_add,
+	.resume		= s3c2410_pm_resume,
+};
+
+/* register ourselves */
+
+static int __init s3c2410_pm_drvinit(void)
+{
+	return sysdev_driver_register(&s3c2410_sysclass, &s3c2410_pm_driver);
+}
+
+arch_initcall(s3c2410_pm_drvinit);
+#endif
+
+#if defined(CONFIG_CPU_S3C2440)
+static struct sysdev_driver s3c2440_pm_driver = {
+	.add		= s3c2410_pm_add,
+	.resume		= s3c2410_pm_resume,
+};
+
+static int __init s3c2440_pm_drvinit(void)
+{
+	return sysdev_driver_register(&s3c2440_sysclass, &s3c2440_pm_driver);
+}
+
+arch_initcall(s3c2440_pm_drvinit);
+#endif
+
+#if defined(CONFIG_CPU_S3C2442)
+static struct sysdev_driver s3c2442_pm_driver = {
+	.add		= s3c2410_pm_add,
+	.resume		= s3c2410_pm_resume,
+};
+
+static int __init s3c2442_pm_drvinit(void)
+{
+	return sysdev_driver_register(&s3c2442_sysclass, &s3c2442_pm_driver);
+}
+
+arch_initcall(s3c2442_pm_drvinit);
+#endif
diff -urNp linux-2.6.20/arch/arm/mach-s3c2410/smdk-ax88780.c linux-2.6.20-s1t/arch/arm/mach-s3c2410/smdk-ax88780.c
--- linux-2.6.20/arch/arm/mach-s3c2410/smdk-ax88780.c	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/arch/arm/mach-s3c2410/smdk-ax88780.c	2007-02-07 16:29:14.000000000 +0000
@@ -0,0 +1,102 @@
+/* linux/arch/arm/mach-s3c2410/mach-smdk2440.c
+ *
+ * Copyright 2006  Ben Dooks <ben-linux@fluff.org>
+ *
+ * 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.
+*/
+
+#include <linux/kernel.h>
+#include <linux/types.h>
+#include <linux/interrupt.h>
+#include <linux/list.h>
+#include <linux/timer.h>
+#include <linux/init.h>
+#include <linux/clk.h>
+#include <linux/platform_device.h>
+
+#include <asm/mach/arch.h>
+#include <asm/mach/map.h>
+#include <asm/mach/irq.h>
+
+#include <asm/arch/regs-gpio.h>
+#include <asm/arch/regs-mem.h>
+
+static struct resource ax88780_resource[] = {
+	[0] = {
+		.start	= S3C2410_CS1,
+		.end	= S3C2410_CS1 SZ_64K - 1,
+		.flags	= IORESOURCE_MEM,
+	},
+	[1] = {
+		.start	= IRQ_EINT11,
+		.end	= IRQ_EINT11,
+		.flags	= IORESOURCE_IRQ,
+	},
+};
+
+static struct platform_device device_ax88780 = {
+	.name		= "ax88780",
+	.id		= 0,
+	.num_resources	= ARRAY_SIZE(ax88780_resource),
+	.resource	= ax88780_resource,
+};
+
+static int supported_board(void)
+{
+	return machine_is_smdk2410() || machine_is_smdk2440();
+}
+
+static int __init smdk_ax8870_init(void)
+{
+	unsigned long flags;
+	unsigned long bwscon;
+
+	if (!supported_board())
+		return 0;
+
+	/* using CS1, EINT11, needs a clock on CLKOUT0 */
+	
+	s3c2410_gpio_cfgpin(S3C2410_GPH9, S3C2410_GPH9_CLKOUT0);
+
+	clk_set_parent(&s3c24xx_clkout0, clk_get(NULL, "hclk"));
+
+	/* set timing of BankCon 1 */
+	__raw_writel(S3C2410_BANKCON_Tacs2 | S3C2410_BANKCON_Tcos2 |
+		     S3C2410_BANKCON_Tacc8 | S3C2410_BANKCON_Tcoh2 |
+		     S3C2410_BANKCON_Tcah0,  S3C2410_BANKCON1);
+
+	local_irq_save(flags);
+	
+	bwscon = __raw_readl(S3C2410_BWSCON);
+	bwscon &= ~(15 << 4);
+	bwscon |= S3C2410_BWSCON_DW1_32;
+	//bwscon |= S3C2410_BWSCON_WS1;
+	bwscon |= S3C2410_BWSCON_ST1;
+	
+	__raw_writel(bwscon, S3C2410_BWSCON);
+	local_irq_restore(flags);
+
+#if 1
+	printk("BWSCON  = %08x\n",  __raw_readl(S3C2410_BWSCON));
+	printk("BANKCON1 = %08x\n", __raw_readl(S3C2410_BANKCON1));
+	printk("DCLKCON  = %08x\n", __raw_readl(S3C2410_DCLKCON));
+	printk("MISCCR   = %08x\n", __raw_readl(S3C2410_MISCCR));
+#endif
+
+	return platform_device_register(&device_ax88780);
+}
+
+static void smdk_ax88780_exit(void)
+{
+	if (supported_board())
+		platform_device_unregister(&device_ax88780);
+}
+
+module_init(smdk_ax88780_init);
+module_exit(smdk_ax88780_exit);
+
+MODULE_DESCRIPTION("Asix AX8870 on SMDK board");
+MODULE_AUTHOR("Ben Dooks <ben-linux@fluff.org>");
+MODULE_LICENSE("GPL v2");
diff -urNp linux-2.6.20/drivers/base/bus.c~ linux-2.6.20-s1t/drivers/base/bus.c~
--- linux-2.6.20/drivers/base/bus.c~	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/drivers/base/bus.c~	2007-02-07 16:29:14.000000000 +0000
@@ -0,0 +1,800 @@
+/*
+ * bus.c - bus driver management
+ *
+ * Copyright (c) 2002-3 Patrick Mochel
+ * Copyright (c) 2002-3 Open Source Development Labs
+ *
+ * This file is released under the GPLv2
+ *
+ */
+
+#include <linux/device.h>
+#include <linux/module.h>
+#include <linux/errno.h>
+#include <linux/init.h>
+#include <linux/string.h>
+#include "base.h"
+#include "power/power.h"
+
+#define to_bus_attr(_attr) container_of(_attr, struct bus_attribute, attr)
+#define to_bus(obj) container_of(obj, struct bus_type, subsys.kset.kobj)
+
+/*
+ * sysfs bindings for drivers
+ */
+
+#define to_drv_attr(_attr) container_of(_attr, struct driver_attribute, attr)
+#define to_driver(obj) container_of(obj, struct device_driver, kobj)
+
+
+static ssize_t
+drv_attr_show(struct kobject * kobj, struct attribute * attr, char * buf)
+{
+	struct driver_attribute * drv_attr = to_drv_attr(attr);
+	struct device_driver * drv = to_driver(kobj);
+	ssize_t ret = -EIO;
+
+	if (drv_attr->show)
+		ret = drv_attr->show(drv, buf);
+	return ret;
+}
+
+static ssize_t
+drv_attr_store(struct kobject * kobj, struct attribute * attr,
+	       const char * buf, size_t count)
+{
+	struct driver_attribute * drv_attr = to_drv_attr(attr);
+	struct device_driver * drv = to_driver(kobj);
+	ssize_t ret = -EIO;
+
+	if (drv_attr->store)
+		ret = drv_attr->store(drv, buf, count);
+	return ret;
+}
+
+static struct sysfs_ops driver_sysfs_ops = {
+	.show	= drv_attr_show,
+	.store	= drv_attr_store,
+};
+
+
+static void driver_release(struct kobject * kobj)
+{
+	struct device_driver * drv = to_driver(kobj);
+	complete(&drv->unloaded);
+}
+
+static struct kobj_type ktype_driver = {
+	.sysfs_ops	= &driver_sysfs_ops,
+	.release	= driver_release,
+};
+
+
+/*
+ * sysfs bindings for buses
+ */
+
+
+static ssize_t
+bus_attr_show(struct kobject * kobj, struct attribute * attr, char * buf)
+{
+	struct bus_attribute * bus_attr = to_bus_attr(attr);
+	struct bus_type * bus = to_bus(kobj);
+	ssize_t ret = 0;
+
+	if (bus_attr->show)
+		ret = bus_attr->show(bus, buf);
+	return ret;
+}
+
+static ssize_t
+bus_attr_store(struct kobject * kobj, struct attribute * attr,
+	       const char * buf, size_t count)
+{
+	struct bus_attribute * bus_attr = to_bus_attr(attr);
+	struct bus_type * bus = to_bus(kobj);
+	ssize_t ret = 0;
+
+	if (bus_attr->store)
+		ret = bus_attr->store(bus, buf, count);
+	return ret;
+}
+
+static struct sysfs_ops bus_sysfs_ops = {
+	.show	= bus_attr_show,
+	.store	= bus_attr_store,
+};
+
+int bus_create_file(struct bus_type * bus, struct bus_attribute * attr)
+{
+	int error;
+	if (get_bus(bus)) {
+		error = sysfs_create_file(&bus->subsys.kset.kobj, &attr->attr);
+		put_bus(bus);
+	} else
+		error = -EINVAL;
+	return error;
+}
+
+void bus_remove_file(struct bus_type * bus, struct bus_attribute * attr)
+{
+	if (get_bus(bus)) {
+		sysfs_remove_file(&bus->subsys.kset.kobj, &attr->attr);
+		put_bus(bus);
+	}
+}
+
+static struct kobj_type ktype_bus = {
+	.sysfs_ops	= &bus_sysfs_ops,
+
+};
+
+static decl_subsys(bus, &ktype_bus, NULL);
+
+
+#ifdef CONFIG_HOTPLUG
+
+/* Manually detach a device from its associated driver. */
+static int driver_helper(struct device *dev, void *data)
+{
+	const char *name = data;
+
+	if (strcmp(name, dev->bus_id) == 0)
+		return 1;
+	return 0;
+}
+
+static ssize_t driver_unbind(struct device_driver *drv,
+			     const char *buf, size_t count)
+{
+	struct bus_type *bus = get_bus(drv->bus);
+	struct device *dev;
+	int err = -ENODEV;
+
+	dev = bus_find_device(bus, NULL, (void *)buf, driver_helper);
+	if (dev && dev->driver == drv) {
+		if (dev->parent)	/* Needed for USB */
+			down(&dev->parent->sem);
+		device_release_driver(dev);
+		if (dev->parent)
+			up(&dev->parent->sem);
+		err = count;
+	}
+	put_device(dev);
+	put_bus(bus);
+	return err;
+}
+static DRIVER_ATTR(unbind, S_IWUSR, NULL, driver_unbind);
+
+/*
+ * Manually attach a device to a driver.
+ * Note: the driver must want to bind to the device,
+ * it is not possible to override the driver's id table.
+ */
+static ssize_t driver_bind(struct device_driver *drv,
+			   const char *buf, size_t count)
+{
+	struct bus_type *bus = get_bus(drv->bus);
+	struct device *dev;
+	int err = -ENODEV;
+
+	dev = bus_find_device(bus, NULL, (void *)buf, driver_helper);
+	if (dev && dev->driver == NULL) {
+		if (dev->parent)	/* Needed for USB */
+			down(&dev->parent->sem);
+		down(&dev->sem);
+		err = driver_probe_device(drv, dev);
+		up(&dev->sem);
+		if (dev->parent)
+			up(&dev->parent->sem);
+
+		if (err > 0) 		/* success */
+			err = count;
+		else if (err == 0)	/* driver didn't accept device */
+			err = -ENODEV;
+	}
+	put_device(dev);
+	put_bus(bus);
+	return err;
+}
+static DRIVER_ATTR(bind, S_IWUSR, NULL, driver_bind);
+
+#endif
+
+static struct device * next_device(struct klist_iter * i)
+{
+	struct klist_node * n = klist_next(i);
+	return n ? container_of(n, struct device, knode_bus) : NULL;
+}
+
+/**
+ *	bus_for_each_dev - device iterator.
+ *	@bus:	bus type.
+ *	@start:	device to start iterating from.
+ *	@data:	data for the callback.
+ *	@fn:	function to be called for each device.
+ *
+ *	Iterate over @bus's list of devices, and call @fn for each,
+ *	passing it @data. If @start is not NULL, we use that device to
+ *	begin iterating from.
+ *
+ *	We check the return of @fn each time. If it returns anything
+ *	other than 0, we break out and return that value.
+ *
+ *	NOTE: The device that returns a non-zero value is not retained
+ *	in any way, nor is its refcount incremented. If the caller needs
+ *	to retain this data, it should do, and increment the reference
+ *	count in the supplied callback.
+ */
+
+int bus_for_each_dev(struct bus_type * bus, struct device * start,
+		     void * data, int (*fn)(struct device *, void *))
+{
+	struct klist_iter i;
+	struct device * dev;
+	int error = 0;
+
+	if (!bus)
+		return -EINVAL;
+
+	klist_iter_init_node(&bus->klist_devices, &i,
+			     (start ? &start->knode_bus : NULL));
+	while ((dev = next_device(&i)) && !error)
+		error = fn(dev, data);
+	klist_iter_exit(&i);
+	return error;
+}
+
+/**
+ * bus_find_device - device iterator for locating a particular device.
+ * @bus: bus type
+ * @start: Device to begin with
+ * @data: Data to pass to match function
+ * @match: Callback function to check device
+ *
+ * This is similar to the bus_for_each_dev() function above, but it
+ * returns a reference to a device that is 'found' for later use, as
+ * determined by the @match callback.
+ *
+ * The callback should return 0 if the device doesn't match and non-zero
+ * if it does.  If the callback returns non-zero, this function will
+ * return to the caller and not iterate over any more devices.
+ */
+struct device * bus_find_device(struct bus_type *bus,
+				struct device *start, void *data,
+				int (*match)(struct device *, void *))
+{
+	struct klist_iter i;
+	struct device *dev;
+
+	if (!bus)
+		return NULL;
+
+	klist_iter_init_node(&bus->klist_devices, &i,
+			     (start ? &start->knode_bus : NULL));
+	while ((dev = next_device(&i)))
+		if (match(dev, data) && get_device(dev))
+			break;
+	klist_iter_exit(&i);
+	return dev;
+}
+
+
+static struct device_driver * next_driver(struct klist_iter * i)
+{
+	struct klist_node * n = klist_next(i);
+	return n ? container_of(n, struct device_driver, knode_bus) : NULL;
+}
+
+/**
+ *	bus_for_each_drv - driver iterator
+ *	@bus:	bus we're dealing with.
+ *	@start:	driver to start iterating on.
+ *	@data:	data to pass to the callback.
+ *	@fn:	function to call for each driver.
+ *
+ *	This is nearly identical to the device iterator above.
+ *	We iterate over each driver that belongs to @bus, and call
+ *	@fn for each. If @fn returns anything but 0, we break out
+ *	and return it. If @start is not NULL, we use it as the head
+ *	of the list.
+ *
+ *	NOTE: we don't return the driver that returns a non-zero
+ *	value, nor do we leave the reference count incremented for that
+ *	driver. If the caller needs to know that info, it must set it
+ *	in the callback. It must also be sure to increment the refcount
+ *	so it doesn't disappear before returning to the caller.
+ */
+
+int bus_for_each_drv(struct bus_type * bus, struct device_driver * start,
+		     void * data, int (*fn)(struct device_driver *, void *))
+{
+	struct klist_iter i;
+	struct device_driver * drv;
+	int error = 0;
+
+	if (!bus)
+		return -EINVAL;
+
+	klist_iter_init_node(&bus->klist_drivers, &i,
+			     start ? &start->knode_bus : NULL);
+	while ((drv = next_driver(&i)) && !error)
+		error = fn(drv, data);
+	klist_iter_exit(&i);
+	return error;
+}
+
+static int device_add_attrs(struct bus_type * bus, struct device * dev)
+{
+	int error = 0;
+	int i;
+
+	if (bus->dev_attrs) {
+		for (i = 0; attr_name(bus->dev_attrs[i]); i++) {
+			error = device_create_file(dev,&bus->dev_attrs[i]);
+			if (error)
+				goto Err;
+		}
+	}
+ Done:
+	return error;
+ Err:
+	while (--i >= 0)
+		device_remove_file(dev,&bus->dev_attrs[i]);
+	goto Done;
+}
+
+
+static void device_remove_attrs(struct bus_type * bus, struct device * dev)
+{
+	int i;
+
+	if (bus->dev_attrs) {
+		for (i = 0; attr_name(bus->dev_attrs[i]); i++)
+			device_remove_file(dev,&bus->dev_attrs[i]);
+	}
+}
+
+
+/**
+ *	bus_add_device - add device to bus
+ *	@dev:	device being added
+ *
+ *	- Add the device to its bus's list of devices.
+ *	- Create link to device's bus.
+ */
+int bus_add_device(struct device * dev)
+{
+	struct bus_type * bus = get_bus(dev->bus);
+	int error = 0;
+
+	if (bus) {
+		pr_debug("bus %s: add device %s\n", bus->name, dev->bus_id);
+		error = device_add_attrs(bus, dev);
+		if (error)
+			goto out_put;
+		error = sysfs_create_link(&bus->devices.kobj,
+						&dev->kobj, dev->bus_id);
+		if (error)
+			goto out_id;
+		error = sysfs_create_link(&dev->kobj,
+				&dev->bus->subsys.kset.kobj, "subsystem");
+		if (error)
+			goto out_subsys;
+		error = sysfs_create_link(&dev->kobj,
+				&dev->bus->subsys.kset.kobj, "bus");
+		if (error)
+			goto out_deprecated;
+	}
+	return 0;
+
+out_deprecated:
+	sysfs_remove_link(&dev->kobj, "subsystem");
+out_subsys:
+	sysfs_remove_link(&bus->devices.kobj, dev->bus_id);
+out_id:
+	device_remove_attrs(bus, dev);
+out_put:
+	put_bus(dev->bus);
+	return error;
+}
+
+/**
+ *	bus_attach_device - add device to bus
+ *	@dev:	device tried to attach to a driver
+ *
+ *	- Add device to bus's list of devices.
+ *	- Try to attach to driver.
+ */
+int bus_attach_device(struct device * dev)
+{
+	struct bus_type *bus = dev->bus;
+	int ret = 0;
+
+	if (bus) {
+		dev->is_registered = 1;
+		ret = device_attach(dev);
+		if (ret >= 0) {
+			klist_add_tail(&dev->knode_bus, &bus->klist_devices);
+			ret = 0;
+		} else
+			dev->is_registered = 0;
+	}
+	return ret;
+}
+
+/**
+ *	bus_remove_device - remove device from bus
+ *	@dev:	device to be removed
+ *
+ *	- Remove symlink from bus's directory.
+ *	- Delete device from bus's list.
+ *	- Detach from its driver.
+ *	- Drop reference taken in bus_add_device().
+ */
+void bus_remove_device(struct device * dev)
+{
+	if (dev->bus) {
+		sysfs_remove_link(&dev->kobj, "subsystem");
+		sysfs_remove_link(&dev->kobj, "bus");
+		sysfs_remove_link(&dev->bus->devices.kobj, dev->bus_id);
+		device_remove_attrs(dev->bus, dev);
+		if (dev->is_registered) {
+			dev->is_registered = 0;
+			klist_del(&dev->knode_bus);
+		}
+		pr_debug("bus %s: remove device %s\n", dev->bus->name, dev->bus_id);
+		device_release_driver(dev);
+		put_bus(dev->bus);
+	}
+}
+
+static int driver_add_attrs(struct bus_type * bus, struct device_driver * drv)
+{
+	int error = 0;
+	int i;
+
+	if (bus->drv_attrs) {
+		for (i = 0; attr_name(bus->drv_attrs[i]); i++) {
+			error = driver_create_file(drv, &bus->drv_attrs[i]);
+			if (error)
+				goto Err;
+		}
+	}
+ Done:
+	return error;
+ Err:
+	while (--i >= 0)
+		driver_remove_file(drv, &bus->drv_attrs[i]);
+	goto Done;
+}
+
+
+static void driver_remove_attrs(struct bus_type * bus, struct device_driver * drv)
+{
+	int i;
+
+	if (bus->drv_attrs) {
+		for (i = 0; attr_name(bus->drv_attrs[i]); i++)
+			driver_remove_file(drv, &bus->drv_attrs[i]);
+	}
+}
+
+#ifdef CONFIG_HOTPLUG
+/*
+ * Thanks to drivers making their tables __devinit, we can't allow manual
+ * bind and unbind from userspace unless CONFIG_HOTPLUG is enabled.
+ */
+static int __must_check add_bind_files(struct device_driver *drv)
+{
+	int ret;
+
+	ret = driver_create_file(drv, &driver_attr_unbind);
+	if (ret == 0) {
+		ret = driver_create_file(drv, &driver_attr_bind);
+		if (ret)
+			driver_remove_file(drv, &driver_attr_unbind);
+	}
+	return ret;
+}
+
+static void remove_bind_files(struct device_driver *drv)
+{
+	driver_remove_file(drv, &driver_attr_bind);
+	driver_remove_file(drv, &driver_attr_unbind);
+}
+#else
+static inline int add_bind_files(struct device_driver *drv) { return 0; }
+static inline void remove_bind_files(struct device_driver *drv) {}
+#endif
+
+/**
+ *	bus_add_driver - Add a driver to the bus.
+ *	@drv:	driver.
+ *
+ */
+int bus_add_driver(struct device_driver *drv)
+{
+	struct bus_type * bus = get_bus(drv->bus);
+	int error = 0;
+
+	if (!bus)
+		return 0;
+
+	pr_debug("bus %s: add driver %s\n", bus->name, drv->name);
+	error = kobject_set_name(&drv->kobj, "%s", drv->name);
+	if (error)
+		goto out_put_bus;
+	drv->kobj.kset = &bus->drivers;
+	if ((error = kobject_register(&drv->kobj)))
+		goto out_put_bus;
+
+	error = driver_attach(drv);
+	if (error)
+		goto out_unregister;
+	klist_add_tail(&drv->knode_bus, &bus->klist_drivers);
+	module_add_driver(drv->owner, drv);
+
+	error = driver_add_attrs(bus, drv);
+	if (error) {
+		/* How the hell do we get out of this pickle? Give up */
+		printk(KERN_ERR "%s: driver_add_attrs(%s) failed\n",
+			__FUNCTION__, drv->name);
+	}
+	error = add_bind_files(drv);
+	if (error) {
+		/* Ditto */
+		printk(KERN_ERR "%s: add_bind_files(%s) failed\n",
+			__FUNCTION__, drv->name);
+	}
+
+	return error;
+out_unregister:
+	kobject_unregister(&drv->kobj);
+out_put_bus:
+	put_bus(bus);
+	return error;
+}
+
+/**
+ *	bus_remove_driver - delete driver from bus's knowledge.
+ *	@drv:	driver.
+ *
+ *	Detach the driver from the devices it controls, and remove
+ *	it from its bus's list of drivers. Finally, we drop the reference
+ *	to the bus we took in bus_add_driver().
+ */
+
+void bus_remove_driver(struct device_driver * drv)
+{
+	if (!drv->bus)
+		return;
+
+	remove_bind_files(drv);
+	driver_remove_attrs(drv->bus, drv);
+	klist_remove(&drv->knode_bus);
+	pr_debug("bus %s: remove driver %s\n", drv->bus->name, drv->name);
+	driver_detach(drv);
+	module_remove_driver(drv);
+	kobject_unregister(&drv->kobj);
+	put_bus(drv->bus);
+}
+
+
+/* Helper for bus_rescan_devices's iter */
+static int __must_check bus_rescan_devices_helper(struct device *dev,
+						void *data)
+{
+	int ret = 0;
+
+	if (!dev->driver) {
+		if (dev->parent)	/* Needed for USB */
+			down(&dev->parent->sem);
+		ret = device_attach(dev);
+		if (dev->parent)
+			up(&dev->parent->sem);
+		if (ret > 0)
+			ret = 0;
+	}
+	return ret < 0 ? ret : 0;
+}
+
+/**
+ * bus_rescan_devices - rescan devices on the bus for possible drivers
+ * @bus: the bus to scan.
+ *
+ * This function will look for devices on the bus with no driver
+ * attached and rescan it against existing drivers to see if it matches
+ * any by calling device_attach() for the unbound devices.
+ */
+int bus_rescan_devices(struct bus_type * bus)
+{
+	return bus_for_each_dev(bus, NULL, NULL, bus_rescan_devices_helper);
+}
+
+/**
+ * device_reprobe - remove driver for a device and probe for a new driver
+ * @dev: the device to reprobe
+ *
+ * This function detaches the attached driver (if any) for the given
+ * device and restarts the driver probing process.  It is intended
+ * to use if probing criteria changed during a devices lifetime and
+ * driver attachment should change accordingly.
+ */
+int device_reprobe(struct device *dev)
+{
+	if (dev->driver) {
+		if (dev->parent)        /* Needed for USB */
+			down(&dev->parent->sem);
+		device_release_driver(dev);
+		if (dev->parent)
+			up(&dev->parent->sem);
+	}
+	return bus_rescan_devices_helper(dev, NULL);
+}
+EXPORT_SYMBOL_GPL(device_reprobe);
+
+struct bus_type *get_bus(struct bus_type *bus)
+{
+	return bus ? container_of(subsys_get(&bus->subsys),
+				struct bus_type, subsys) : NULL;
+}
+
+void put_bus(struct bus_type * bus)
+{
+	subsys_put(&bus->subsys);
+}
+
+
+/**
+ *	find_bus - locate bus by name.
+ *	@name:	name of bus.
+ *
+ *	Call kset_find_obj() to iterate over list of buses to
+ *	find a bus by name. Return bus if found.
+ *
+ *	Note that kset_find_obj increments bus' reference count.
+ */
+#if 0
+struct bus_type * find_bus(char * name)
+{
+	struct kobject * k = kset_find_obj(&bus_subsys.kset, name);
+	return k ? to_bus(k) : NULL;
+}
+#endif  /*  0  */
+
+
+/**
+ *	bus_add_attrs - Add default attributes for this bus.
+ *	@bus:	Bus that has just been registered.
+ */
+
+static int bus_add_attrs(struct bus_type * bus)
+{
+	int error = 0;
+	int i;
+
+	if (bus->bus_attrs) {
+		for (i = 0; attr_name(bus->bus_attrs[i]); i++) {
+			if ((error = bus_create_file(bus,&bus->bus_attrs[i])))
+				goto Err;
+		}
+	}
+ Done:
+	return error;
+ Err:
+	while (--i >= 0)
+		bus_remove_file(bus,&bus->bus_attrs[i]);
+	goto Done;
+}
+
+static void bus_remove_attrs(struct bus_type * bus)
+{
+	int i;
+
+	if (bus->bus_attrs) {
+		for (i = 0; attr_name(bus->bus_attrs[i]); i++)
+			bus_remove_file(bus,&bus->bus_attrs[i]);
+	}
+}
+
+static void klist_devices_get(struct klist_node *n)
+{
+	struct device *dev = container_of(n, struct device, knode_bus);
+
+	get_device(dev);
+}
+
+static void klist_devices_put(struct klist_node *n)
+{
+	struct device *dev = container_of(n, struct device, knode_bus);
+
+	put_device(dev);
+}
+
+/**
+ *	bus_register - register a bus with the system.
+ *	@bus:	bus.
+ *
+ *	Once we have that, we registered the bus with the kobject
+ *	infrastructure, then register the children subsystems it has:
+ *	the devices and drivers that belong to the bus.
+ */
+int bus_register(struct bus_type * bus)
+{
+	int retval;
+
+	retval = kobject_set_name(&bus->subsys.kset.kobj, "%s", bus->name);
+	if (retval)
+		goto out;
+
+	subsys_set_kset(bus, bus_subsys);
+	retval = subsystem_register(&bus->subsys);
+	if (retval)
+		goto out;
+
+	kobject_set_name(&bus->devices.kobj, "devices");
+	bus->devices.subsys = &bus->subsys;
+	retval = kset_register(&bus->devices);
+	if (retval)
+		goto bus_devices_fail;
+
+	kobject_set_name(&bus->drivers.kobj, "drivers");
+	bus->drivers.subsys = &bus->subsys;
+	bus->drivers.ktype = &ktype_driver;
+	retval = kset_register(&bus->drivers);
+	if (retval)
+		goto bus_drivers_fail;
+
+	klist_init(&bus->klist_devices, klist_devices_get, klist_devices_put);
+	klist_init(&bus->klist_drivers, NULL, NULL);
+	retval = bus_add_attrs(bus);
+	if (retval)
+		goto bus_attrs_fail;
+
+	pr_debug("bus type '%s' registered\n", bus->name);
+	return 0;
+
+bus_attrs_fail:
+	kset_unregister(&bus->drivers);
+bus_drivers_fail:
+	kset_unregister(&bus->devices);
+bus_devices_fail:
+	subsystem_unregister(&bus->subsys);
+out:
+	return retval;
+}
+
+
+/**
+ *	bus_unregister - remove a bus from the system
+ *	@bus:	bus.
+ *
+ *	Unregister the child subsystems and the bus itself.
+ *	Finally, we call put_bus() to release the refcount
+ */
+void bus_unregister(struct bus_type * bus)
+{
+	pr_debug("bus %s: unregistering\n", bus->name);
+	bus_remove_attrs(bus);
+	kset_unregister(&bus->drivers);
+	kset_unregister(&bus->devices);
+	subsystem_unregister(&bus->subsys);
+}
+
+int __init buses_init(void)
+{
+	return subsystem_register(&bus_subsys);
+}
+
+
+EXPORT_SYMBOL_GPL(bus_for_each_dev);
+EXPORT_SYMBOL_GPL(bus_find_device);
+EXPORT_SYMBOL_GPL(bus_for_each_drv);
+
+EXPORT_SYMBOL_GPL(bus_register);
+EXPORT_SYMBOL_GPL(bus_unregister);
+EXPORT_SYMBOL_GPL(bus_rescan_devices);
+
+EXPORT_SYMBOL_GPL(bus_create_file);
+EXPORT_SYMBOL_GPL(bus_remove_file);
diff -urNp linux-2.6.20/drivers/char/Kconfig linux-2.6.20-s1t/drivers/char/Kconfig
--- linux-2.6.20/drivers/char/Kconfig	2007-02-04 18:44:54.000000000 +0000
+++ linux-2.6.20-s1t/drivers/char/Kconfig	2007-02-07 16:29:14.000000000 +0000
@@ -1030,5 +1030,17 @@ config TELCLOCK
 	  sysfs directory, /sys/devices/platform/telco_clock, with a number of
 	  files for controlling the behavior of this hardware.
 
+config SIMTEC_LCD
+	tristate "Simtec Generic 8bit LCD port driver"
+	help
+	  The Simtec LCD driver provides access to the generic 8bit
+	  parallel LCD port on newer Simtec boards. This can be for
+	  devices such as an HD44870 LCD, or any other similarily
+	  interfaced device.
+
+	  The driver can be built as a module, which will be called
+	  simtec-lcd.
+
+
 endmenu
 
diff -urNp linux-2.6.20/drivers/char/Kconfig.orig linux-2.6.20-s1t/drivers/char/Kconfig.orig
--- linux-2.6.20/drivers/char/Kconfig.orig	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/drivers/char/Kconfig.orig	2007-02-04 18:44:54.000000000 +0000
@@ -0,0 +1,1034 @@
+#
+# Character device configuration
+#
+
+menu "Character devices"
+
+config VT
+	bool "Virtual terminal" if EMBEDDED
+	select INPUT
+	default y if !VIOCONS
+	---help---
+	  If you say Y here, you will get support for terminal devices with
+	  display and keyboard devices. These are called "virtual" because you
+	  can run several virtual terminals (also called virtual consoles) on
+	  one physical terminal. This is rather useful, for example one
+	  virtual terminal can collect system messages and warnings, another
+	  one can be used for a text-mode user session, and a third could run
+	  an X session, all in parallel. Switching between virtual terminals
+	  is done with certain key combinations, usually Alt-<function key>.
+
+	  The setterm command ("man setterm") can be used to change the
+	  properties (such as colors or beeping) of a virtual terminal. The
+	  man page console_codes(4) ("man console_codes") contains the special
+	  character sequences that can be used to change those properties
+	  directly. The fonts used on virtual terminals can be changed with
+	  the setfont ("man setfont") command and the key bindings are defined
+	  with the loadkeys ("man loadkeys") command.
+
+	  You need at least one virtual terminal device in order to make use
+	  of your keyboard and monitor. Therefore, only people configuring an
+	  embedded system would want to say N here in order to save some
+	  memory; the only way to log into such a system is then via a serial
+	  or network connection.
+
+	  If unsure, say Y, or else you won't be able to do much with your new
+	  shiny Linux system :-)
+
+config VT_CONSOLE
+	bool "Support for console on virtual terminal" if EMBEDDED
+	depends on VT
+	default y
+	---help---
+	  The system console is the device which receives all kernel messages
+	  and warnings and which allows logins in single user mode. If you
+	  answer Y here, a virtual terminal (the device used to interact with
+	  a physical terminal) can be used as system console. This is the most
+	  common mode of operations, so you should say Y here unless you want
+	  the kernel messages be output only to a serial port (in which case
+	  you should say Y to "Console on serial port", below).
+
+	  If you do say Y here, by default the currently visible virtual
+	  terminal (/dev/tty0) will be used as system console. You can change
+	  that with a kernel command line option such as "console=tty3" which
+	  would use the third virtual terminal as system console. (Try "man
+	  bootparam" or see the documentation of your boot loader (lilo or
+	  loadlin) about how to pass options to the kernel at boot time.)
+
+	  If unsure, say Y.
+
+config HW_CONSOLE
+	bool
+	depends on VT && !S390 && !UML
+	default y
+
+config VT_HW_CONSOLE_BINDING
+       bool "Support for binding and unbinding console drivers"
+       depends on HW_CONSOLE
+       default n
+       ---help---
+         The virtual terminal is the device that interacts with the physical
+         terminal through console drivers. On these systems, at least one
+         console driver is loaded. In other configurations, additional console
+         drivers may be enabled, such as the framebuffer console. If more than
+         1 console driver is enabled, setting this to 'y' will allow you to
+         select the console driver that will serve as the backend for the
+         virtual terminals.
+
+	 See <file:Documentation/console/console.txt> for more
+	 information. For framebuffer console users, please refer to
+	 <file:Documentation/fb/fbcon.txt>.
+
+config SERIAL_NONSTANDARD
+	bool "Non-standard serial port support"
+	---help---
+	  Say Y here if you have any non-standard serial boards -- boards
+	  which aren't supported using the standard "dumb" serial driver.
+	  This includes intelligent serial boards such as Cyclades,
+	  Digiboards, etc. These are usually used for systems that need many
+	  serial ports because they serve many terminals or dial-in
+	  connections.
+
+	  Note that the answer to this question won't directly affect the
+	  kernel: saying N will just cause the configurator to skip all
+	  the questions about non-standard serial boards.
+
+	  Most people can say N here.
+
+config COMPUTONE
+	tristate "Computone IntelliPort Plus serial support"
+	depends on SERIAL_NONSTANDARD && (ISA || EISA || PCI)
+	---help---
+	  This driver supports the entire family of Intelliport II/Plus
+	  controllers with the exception of the MicroChannel controllers and
+	  products previous to the Intelliport II. These are multiport cards,
+	  which give you many serial ports. You would need something like this
+	  to connect more than two modems to your Linux box, for instance in
+	  order to become a dial-in server. If you have a card like that, say
+	  Y here and read <file:Documentation/computone.txt>.
+
+	  To compile this driver as modules, choose M here: the
+	  modules will be called ip2 and ip2main.
+
+config ROCKETPORT
+	tristate "Comtrol RocketPort support"
+	depends on SERIAL_NONSTANDARD
+	help
+	  This driver supports Comtrol RocketPort and RocketModem PCI boards.   
+          These boards provide 2, 4, 8, 16, or 32 high-speed serial ports or
+          modems.  For information about the RocketPort/RocketModem  boards
+          and this driver read <file:Documentation/rocket.txt>.
+
+	  To compile this driver as a module, choose M here: the
+	  module will be called rocket.
+
+	  If you want to compile this driver into the kernel, say Y here.  If
+          you don't have a Comtrol RocketPort/RocketModem card installed, say N.
+
+config CYCLADES
+	tristate "Cyclades async mux support"
+	depends on SERIAL_NONSTANDARD
+	---help---
+	  This driver supports Cyclades Z and Y multiserial boards.
+	  You would need something like this to connect more than two modems to
+	  your Linux box, for instance in order to become a dial-in server.
+
+	  For information about the Cyclades-Z card, read
+	  <file:drivers/char/README.cycladesZ>.
+
+	  To compile this driver as a module, choose M here: the
+	  module will be called cyclades.
+
+	  If you haven't heard about it, it's safe to say N.
+
+config CYZ_INTR
+	bool "Cyclades-Z interrupt mode operation (EXPERIMENTAL)"
+	depends on EXPERIMENTAL && CYCLADES
+	help
+	  The Cyclades-Z family of multiport cards allows 2 (two) driver op
+	  modes: polling and interrupt. In polling mode, the driver will check
+	  the status of the Cyclades-Z ports every certain amount of time
+	  (which is called polling cycle and is configurable). In interrupt
+	  mode, it will use an interrupt line (IRQ) in order to check the
+	  status of the Cyclades-Z ports. The default op mode is polling. If
+	  unsure, say N.
+
+config DIGIEPCA
+	tristate "Digiboard Intelligent Async Support"
+	depends on SERIAL_NONSTANDARD
+	---help---
+	  This is a driver for Digi International's Xx, Xeve, and Xem series
+	  of cards which provide multiple serial ports. You would need
+	  something like this to connect more than two modems to your Linux
+	  box, for instance in order to become a dial-in server. This driver
+	  supports the original PC (ISA) boards as well as PCI, and EISA. If
+	  you have a card like this, say Y here and read the file
+	  <file:Documentation/digiepca.txt>.
+
+	  To compile this driver as a module, choose M here: the
+	  module will be called epca.
+
+config ESPSERIAL
+	tristate "Hayes ESP serial port support"
+	depends on SERIAL_NONSTANDARD && ISA && ISA_DMA_API
+	help
+	  This is a driver which supports Hayes ESP serial ports.  Both single
+	  port cards and multiport cards are supported.  Make sure to read
+	  <file:Documentation/hayes-esp.txt>.
+
+	  To compile this driver as a module, choose M here: the
+	  module will be called esp.
+
+	  If unsure, say N.
+
+config MOXA_INTELLIO
+	tristate "Moxa Intellio support"
+	depends on SERIAL_NONSTANDARD
+	help
+	  Say Y here if you have a Moxa Intellio multiport serial card.
+
+	  To compile this driver as a module, choose M here: the
+	  module will be called moxa.
+
+config MOXA_SMARTIO
+	tristate "Moxa SmartIO support"
+	depends on SERIAL_NONSTANDARD
+	help
+	  Say Y here if you have a Moxa SmartIO multiport serial card.
+
+	  This driver can also be built as a module ( = code which can be
+	  inserted in and removed from the running kernel whenever you want).
+	  The module will be called mxser. If you want to do that, say M
+	  here.
+
+config MOXA_SMARTIO_NEW
+	tristate "Moxa SmartIO support v. 2.0 (EXPERIMENTAL)"
+	depends on SERIAL_NONSTANDARD && (PCI || EISA || ISA)
+	help
+	  Say Y here if you have a Moxa SmartIO multiport serial card and/or
+	  want to help develop a new version of this driver.
+
+	  This is upgraded (1.9.1) driver from original Moxa drivers with
+	  changes finally resulting in PCI probing.
+
+	  Use at your own risk.
+
+	  This driver can also be built as a module. The module will be called
+	  mxser_new. If you want to do that, say M here.
+
+config ISI
+	tristate "Multi-Tech multiport card support (EXPERIMENTAL)"
+	depends on SERIAL_NONSTANDARD && PCI
+	select FW_LOADER
+	help
+	  This is a driver for the Multi-Tech cards which provide several
+	  serial ports.  The driver is experimental and can currently only be
+	  built as a module. The module will be called isicom.
+	  If you want to do that, choose M here.
+
+config SYNCLINK
+	tristate "Microgate SyncLink card support"
+	depends on SERIAL_NONSTANDARD && PCI && ISA_DMA_API
+	help
+	  Provides support for the SyncLink ISA and PCI multiprotocol serial
+	  adapters. These adapters support asynchronous and HDLC bit
+	  synchronous communication up to 10Mbps (PCI adapter).
+
+	  This driver can only be built as a module ( = code which can be
+	  inserted in and removed from the running kernel whenever you want).
+	  The module will be called synclink.  If you want to do that, say M
+	  here.
+
+config SYNCLINKMP
+	tristate "SyncLink Multiport support"
+	depends on SERIAL_NONSTANDARD
+	help
+	  Enable support for the SyncLink Multiport (2 or 4 ports)
+	  serial adapter, running asynchronous and HDLC communications up
+	  to 2.048Mbps. Each ports is independently selectable for
+	  RS-232, V.35, RS-449, RS-530, and X.21
+
+	  This driver may be built as a module ( = code which can be
+	  inserted in and removed from the running kernel whenever you want).
+	  The module will be called synclinkmp.  If you want to do that, say M
+	  here.
+
+config SYNCLINK_GT
+	tristate "SyncLink GT/AC support"
+	depends on SERIAL_NONSTANDARD && PCI
+	help
+	  Support for SyncLink GT and SyncLink AC families of
+	  synchronous and asynchronous serial adapters
+	  manufactured by Microgate Systems, Ltd. (www.microgate.com)
+
+config N_HDLC
+	tristate "HDLC line discipline support"
+	depends on SERIAL_NONSTANDARD
+	help
+	  Allows synchronous HDLC communications with tty device drivers that
+	  support synchronous HDLC such as the Microgate SyncLink adapter.
+
+	  This driver can only be built as a module ( = code which can be
+	  inserted in and removed from the running kernel whenever you want).
+	  The module will be called n_hdlc. If you want to do that, say M
+	  here.
+
+config RISCOM8
+	tristate "SDL RISCom/8 card support"
+	depends on SERIAL_NONSTANDARD && BROKEN_ON_SMP
+	help
+	  This is a driver for the SDL Communications RISCom/8 multiport card,
+	  which gives you many serial ports. You would need something like
+	  this to connect more than two modems to your Linux box, for instance
+	  in order to become a dial-in server. If you have a card like that,
+	  say Y here and read the file <file:Documentation/riscom8.txt>.
+
+	  Also it's possible to say M here and compile this driver as kernel
+	  loadable module; the module will be called riscom8.
+
+config SPECIALIX
+	tristate "Specialix IO8+ card support"
+	depends on SERIAL_NONSTANDARD
+	help
+	  This is a driver for the Specialix IO8+ multiport card (both the
+	  ISA and the PCI version) which gives you many serial ports. You
+	  would need something like this to connect more than two modems to
+	  your Linux box, for instance in order to become a dial-in server.
+
+	  If you have a card like that, say Y here and read the file
+	  <file:Documentation/specialix.txt>. Also it's possible to say M here
+	  and compile this driver as kernel loadable module which will be
+	  called specialix.
+
+config SPECIALIX_RTSCTS
+	bool "Specialix DTR/RTS pin is RTS"
+	depends on SPECIALIX
+	help
+	  The Specialix IO8+ card can only support either RTS or DTR. If you
+	  say N here, the driver will use the pin as "DTR" when the tty is in
+	  software handshake mode.  If you say Y here or hardware handshake is
+	  on, it will always be RTS.  Read the file
+	  <file:Documentation/specialix.txt> for more information.
+
+config SX
+	tristate "Specialix SX (and SI) card support"
+	depends on SERIAL_NONSTANDARD && (PCI || EISA || ISA)
+	help
+	  This is a driver for the SX and SI multiport serial cards.
+	  Please read the file <file:Documentation/sx.txt> for details.
+
+	  This driver can only be built as a module ( = code which can be
+	  inserted in and removed from the running kernel whenever you want).
+	  The module will be called sx. If you want to do that, say M here.
+
+config RIO
+	tristate "Specialix RIO system support"
+	depends on SERIAL_NONSTANDARD
+	help
+	  This is a driver for the Specialix RIO, a smart serial card which
+	  drives an outboard box that can support up to 128 ports.  Product
+	  information is at <http://www.perle.com/support/documentation.html#multiport>.
+	  There are both ISA and PCI versions.
+
+config RIO_OLDPCI
+	bool "Support really old RIO/PCI cards"
+	depends on RIO
+	help
+	  Older RIO PCI cards need some initialization-time configuration to
+	  determine the IRQ and some control addresses.  If you have a RIO and
+	  this doesn't seem to work, try setting this to Y.
+
+config STALDRV
+	bool "Stallion multiport serial support"
+	depends on SERIAL_NONSTANDARD
+	help
+	  Stallion cards give you many serial ports.  You would need something
+	  like this to connect more than two modems to your Linux box, for
+	  instance in order to become a dial-in server.  If you say Y here,
+	  you will be asked for your specific card model in the next
+	  questions.  Make sure to read <file:Documentation/stallion.txt> in
+	  this case.  If you have never heard about all this, it's safe to
+	  say N.
+
+config STALLION
+	tristate "Stallion EasyIO or EC8/32 support"
+	depends on STALDRV && BROKEN_ON_SMP
+	help
+	  If you have an EasyIO or EasyConnection 8/32 multiport Stallion
+	  card, then this is for you; say Y.  Make sure to read
+	  <file:Documentation/stallion.txt>.
+
+	  To compile this driver as a module, choose M here: the
+	  module will be called stallion.
+
+config ISTALLION
+	tristate "Stallion EC8/64, ONboard, Brumby support"
+	depends on STALDRV && BROKEN_ON_SMP
+	help
+	  If you have an EasyConnection 8/64, ONboard, Brumby or Stallion
+	  serial multiport card, say Y here. Make sure to read
+	  <file:Documentation/stallion.txt>.
+
+	  To compile this driver as a module, choose M here: the
+	  module will be called istallion.
+
+config AU1000_UART
+	bool "Enable Au1000 UART Support"
+	depends on SERIAL_NONSTANDARD && MIPS
+	help
+	  If you have an Alchemy AU1000 processor (MIPS based) and you want
+	  to use serial ports, say Y.  Otherwise, say N.
+
+config AU1000_SERIAL_CONSOLE
+	bool "Enable Au1000 serial console"
+	depends on AU1000_UART
+	help
+	  If you have an Alchemy AU1000 processor (MIPS based) and you want
+	  to use a console on a serial port, say Y.  Otherwise, say N.
+
+config A2232
+	tristate "Commodore A2232 serial support (EXPERIMENTAL)"
+	depends on EXPERIMENTAL && ZORRO && BROKEN_ON_SMP
+	---help---
+	  This option supports the 2232 7-port serial card shipped with the
+	  Amiga 2000 and other Zorro-bus machines, dating from 1989.  At
+	  a max of 19,200 bps, the ports are served by a 6551 ACIA UART chip
+	  each, plus a 8520 CIA, and a master 6502 CPU and buffer as well. The
+	  ports were connected with 8 pin DIN connectors on the card bracket,
+	  for which 8 pin to DB25 adapters were supplied. The card also had
+	  jumpers internally to toggle various pinning configurations.
+
+	  This driver can be built as a module; but then "generic_serial"
+	  will also be built as a module. This has to be loaded before
+	  "ser_a2232". If you want to do this, answer M here.
+
+config SGI_SNSC
+	bool "SGI Altix system controller communication support"
+	depends on (IA64_SGI_SN2 || IA64_GENERIC)
+	help
+	  If you have an SGI Altix and you want to enable system
+	  controller communication from user space (you want this!),
+	  say Y.  Otherwise, say N.
+
+config SGI_TIOCX
+       bool "SGI TIO CX driver support"
+       depends on (IA64_SGI_SN2 || IA64_GENERIC)
+       help
+         If you have an SGI Altix and you have fpga devices attached
+         to your TIO, say Y here, otherwise say N.
+
+config SGI_MBCS
+       tristate "SGI FPGA Core Services driver support"
+       depends on SGI_TIOCX
+       help
+         If you have an SGI Altix with an attached SABrick
+         say Y or M here, otherwise say N.
+
+source "drivers/serial/Kconfig"
+
+config UNIX98_PTYS
+	bool "Unix98 PTY support" if EMBEDDED
+	default y
+	---help---
+	  A pseudo terminal (PTY) is a software device consisting of two
+	  halves: a master and a slave. The slave device behaves identical to
+	  a physical terminal; the master device is used by a process to
+	  read data from and write data to the slave, thereby emulating a
+	  terminal. Typical programs for the master side are telnet servers
+	  and xterms.
+
+	  Linux has traditionally used the BSD-like names /dev/ptyxx for
+	  masters and /dev/ttyxx for slaves of pseudo terminals. This scheme
+	  has a number of problems. The GNU C library glibc 2.1 and later,
+	  however, supports the Unix98 naming standard: in order to acquire a
+	  pseudo terminal, a process opens /dev/ptmx; the number of the pseudo
+	  terminal is then made available to the process and the pseudo
+	  terminal slave can be accessed as /dev/pts/<number>. What was
+	  traditionally /dev/ttyp2 will then be /dev/pts/2, for example.
+
+	  All modern Linux systems use the Unix98 ptys.  Say Y unless
+	  you're on an embedded system and want to conserve memory.
+
+config LEGACY_PTYS
+	bool "Legacy (BSD) PTY support"
+	default y
+	---help---
+	  A pseudo terminal (PTY) is a software device consisting of two
+	  halves: a master and a slave. The slave device behaves identical to
+	  a physical terminal; the master device is used by a process to
+	  read data from and write data to the slave, thereby emulating a
+	  terminal. Typical programs for the master side are telnet servers
+	  and xterms.
+
+	  Linux has traditionally used the BSD-like names /dev/ptyxx
+	  for masters and /dev/ttyxx for slaves of pseudo
+	  terminals. This scheme has a number of problems, including
+	  security.  This option enables these legacy devices; on most
+	  systems, it is safe to say N.
+
+
+config LEGACY_PTY_COUNT
+	int "Maximum number of legacy PTY in use"
+	depends on LEGACY_PTYS
+	range 1 256
+	default "256"
+	---help---
+	  The maximum number of legacy PTYs that can be used at any one time.
+	  The default is 256, and should be more than enough.  Embedded
+	  systems may want to reduce this to save memory.
+
+	  When not in use, each legacy PTY occupies 12 bytes on 32-bit
+	  architectures and 24 bytes on 64-bit architectures.
+
+config BRIQ_PANEL
+	tristate 'Total Impact briQ front panel driver'
+	depends on PPC_CHRP
+	---help---
+	  The briQ is a small footprint CHRP computer with a frontpanel VFD, a
+	  tristate led and two switches. It is the size of a CDROM drive.
+
+	  If you have such one and want anything showing on the VFD then you
+	  must answer Y here.
+
+	  To compile this driver as a module, choose M here: the
+	  module will be called briq_panel.
+
+	  It's safe to say N here.
+
+config PRINTER
+	tristate "Parallel printer support"
+	depends on PARPORT
+	---help---
+	  If you intend to attach a printer to the parallel port of your Linux
+	  box (as opposed to using a serial printer; if the connector at the
+	  printer has 9 or 25 holes ["female"], then it's serial), say Y.
+	  Also read the Printing-HOWTO, available from
+	  <http://www.tldp.org/docs.html#howto>.
+
+	  It is possible to share one parallel port among several devices
+	  (e.g. printer and ZIP drive) and it is safe to compile the
+	  corresponding drivers into the kernel.
+
+	  To compile this driver as a module, choose M here and read
+	  <file:Documentation/parport.txt>.  The module will be called lp.
+
+	  If you have several parallel ports, you can specify which ports to
+	  use with the "lp" kernel command line option.  (Try "man bootparam"
+	  or see the documentation of your boot loader (lilo or loadlin) about
+	  how to pass options to the kernel at boot time.)  The syntax of the
+	  "lp" command line option can be found in <file:drivers/char/lp.c>.
+
+	  If you have more than 8 printers, you need to increase the LP_NO
+	  macro in lp.c and the PARPORT_MAX macro in parport.h.
+
+config LP_CONSOLE
+	bool "Support for console on line printer"
+	depends on PRINTER
+	---help---
+	  If you want kernel messages to be printed out as they occur, you
+	  can have a console on the printer. This option adds support for
+	  doing that; to actually get it to happen you need to pass the
+	  option "console=lp0" to the kernel at boot time.
+
+	  If the printer is out of paper (or off, or unplugged, or too
+	  busy..) the kernel will stall until the printer is ready again.
+	  By defining CONSOLE_LP_STRICT to 0 (at your own risk) you
+	  can make the kernel continue when this happens,
+	  but it'll lose the kernel messages.
+
+	  If unsure, say N.
+
+config PPDEV
+	tristate "Support for user-space parallel port device drivers"
+	depends on PARPORT
+	---help---
+	  Saying Y to this adds support for /dev/parport device nodes.  This
+	  is needed for programs that want portable access to the parallel
+	  port, for instance deviceid (which displays Plug-and-Play device
+	  IDs).
+
+	  This is the parallel port equivalent of SCSI generic support (sg).
+	  It is safe to say N to this -- it is not needed for normal printing
+	  or parallel port CD-ROM/disk support.
+
+	  To compile this driver as a module, choose M here: the
+	  module will be called ppdev.
+
+	  If unsure, say N.
+
+config TIPAR
+	tristate "Texas Instruments parallel link cable support"
+	depends on PARPORT
+	---help---
+	  If you own a Texas Instruments graphing calculator and use a
+	  parallel link cable, then you might be interested in this driver.
+
+	  If you enable this driver, you will be able to communicate with
+	  your calculator through a set of device nodes under /dev. The
+	  main advantage of this driver is that you don't have to be root
+	  to use this precise link cable (depending on the permissions on
+	  the device nodes, though).
+
+	  To compile this driver as a module, choose M here: the
+	  module will be called tipar.
+
+	  If you don't know what a parallel link cable is or what a Texas
+	  Instruments graphing calculator is, then you probably don't need this
+	  driver.
+
+	  If unsure, say N.
+
+config HVC_DRIVER
+	bool
+	help
+	  Users of pSeries machines that want to utilize the hvc console front-end
+	  module for their backend console driver should select this option.
+	  It will automatically be selected if one of the back-end console drivers
+	  is selected.
+
+
+config HVC_CONSOLE
+	bool "pSeries Hypervisor Virtual Console support"
+	depends on PPC_PSERIES
+	select HVC_DRIVER
+	help
+	  pSeries machines when partitioned support a hypervisor virtual
+	  console. This driver allows each pSeries partition to have a console
+	  which is accessed via the HMC.
+
+config HVC_ISERIES
+	bool "iSeries Hypervisor Virtual Console support"
+	depends on PPC_ISERIES && !VIOCONS
+	select HVC_DRIVER
+	help
+	  iSeries machines support a hypervisor virtual console.
+
+config HVC_RTAS
+	bool "IBM RTAS Console support"
+	depends on PPC_RTAS
+	select HVC_DRIVER
+	help
+	  IBM Console device driver which makes use of RTAS
+
+config HVCS
+	tristate "IBM Hypervisor Virtual Console Server support"
+	depends on PPC_PSERIES
+	help
+	  Partitionable IBM Power5 ppc64 machines allow hosting of
+	  firmware virtual consoles from one Linux partition by
+	  another Linux partition.  This driver allows console data
+	  from Linux partitions to be accessed through TTY device
+	  interfaces in the device tree of a Linux partition running
+	  this driver.
+
+	  To compile this driver as a module, choose M here: the
+	  module will be called hvcs.ko.  Additionally, this module
+	  will depend on arch specific APIs exported from hvcserver.ko
+	  which will also be compiled when this driver is built as a
+	  module.
+
+source "drivers/char/ipmi/Kconfig"
+
+source "drivers/char/watchdog/Kconfig"
+
+config DS1620
+	tristate "NetWinder thermometer support"
+	depends on ARCH_NETWINDER
+	help
+	  Say Y here to include support for the thermal management hardware
+	  found in the NetWinder. This driver allows the user to control the
+	  temperature set points and to read the current temperature.
+
+	  It is also possible to say M here to build it as a module (ds1620)
+	  It is recommended to be used on a NetWinder, but it is not a
+	  necessity.
+
+config NWBUTTON
+	tristate "NetWinder Button"
+	depends on ARCH_NETWINDER
+	---help---
+	  If you say Y here and create a character device node /dev/nwbutton
+	  with major and minor numbers 10 and 158 ("man mknod"), then every
+	  time the orange button is pressed a number of times, the number of
+	  times the button was pressed will be written to that device.
+
+	  This is most useful for applications, as yet unwritten, which
+	  perform actions based on how many times the button is pressed in a
+	  row.
+
+	  Do not hold the button down for too long, as the driver does not
+	  alter the behaviour of the hardware reset circuitry attached to the
+	  button; it will still execute a hard reset if the button is held
+	  down for longer than approximately five seconds.
+
+	  To compile this driver as a module, choose M here: the
+	  module will be called nwbutton.
+
+	  Most people will answer Y to this question and "Reboot Using Button"
+	  below to be able to initiate a system shutdown from the button.
+
+config NWBUTTON_REBOOT
+	bool "Reboot Using Button"
+	depends on NWBUTTON
+	help
+	  If you say Y here, then you will be able to initiate a system
+	  shutdown and reboot by pressing the orange button a number of times.
+	  The number of presses to initiate the shutdown is two by default,
+	  but this can be altered by modifying the value of NUM_PRESSES_REBOOT
+	  in nwbutton.h and recompiling the driver or, if you compile the
+	  driver as a module, you can specify the number of presses at load
+	  time with "insmod button reboot_count=<something>".
+
+config NWFLASH
+	tristate "NetWinder flash support"
+	depends on ARCH_NETWINDER
+	---help---
+	  If you say Y here and create a character device /dev/flash with
+	  major 10 and minor 160 you can manipulate the flash ROM containing
+	  the NetWinder firmware. Be careful as accidentally overwriting the
+	  flash contents can render your computer unbootable. On no account
+	  allow random users access to this device. :-)
+
+	  To compile this driver as a module, choose M here: the
+	  module will be called nwflash.
+
+	  If you're not sure, say N.
+
+source "drivers/char/hw_random/Kconfig"
+
+config NVRAM
+	tristate "/dev/nvram support"
+	depends on ATARI || X86 || ARM || GENERIC_NVRAM
+	---help---
+	  If you say Y here and create a character special file /dev/nvram
+	  with major number 10 and minor number 144 using mknod ("man mknod"),
+	  you get read and write access to the extra bytes of non-volatile
+	  memory in the real time clock (RTC), which is contained in every PC
+	  and most Ataris.  The actual number of bytes varies, depending on the
+	  nvram in the system, but is usually 114 (128-14 for the RTC).
+
+	  This memory is conventionally called "CMOS RAM" on PCs and "NVRAM"
+	  on Ataris. /dev/nvram may be used to view settings there, or to
+	  change them (with some utility). It could also be used to frequently
+	  save a few bits of very important data that may not be lost over
+	  power-off and for which writing to disk is too insecure. Note
+	  however that most NVRAM space in a PC belongs to the BIOS and you
+	  should NEVER idly tamper with it. See Ralf Brown's interrupt list
+	  for a guide to the use of CMOS bytes by your BIOS.
+
+	  On Atari machines, /dev/nvram is always configured and does not need
+	  to be selected.
+
+	  To compile this driver as a module, choose M here: the
+	  module will be called nvram.
+
+config RTC
+	tristate "Enhanced Real Time Clock Support"
+	depends on !PPC && !PARISC && !IA64 && !M68K && (!SPARC || PCI) && !FRV && !ARM && !SUPERH
+	---help---
+	  If you say Y here and create a character special file /dev/rtc with
+	  major number 10 and minor number 135 using mknod ("man mknod"), you
+	  will get access to the real time clock (or hardware clock) built
+	  into your computer.
+
+	  Every PC has such a clock built in. It can be used to generate
+	  signals from as low as 1Hz up to 8192Hz, and can also be used
+	  as a 24 hour alarm. It reports status information via the file
+	  /proc/driver/rtc and its behaviour is set by various ioctls on
+	  /dev/rtc.
+
+	  If you run Linux on a multiprocessor machine and said Y to
+	  "Symmetric Multi Processing" above, you should say Y here to read
+	  and set the RTC in an SMP compatible fashion.
+
+	  If you think you have a use for such a device (such as periodic data
+	  sampling), then say Y here, and read <file:Documentation/rtc.txt>
+	  for details.
+
+	  To compile this driver as a module, choose M here: the
+	  module will be called rtc.
+
+config SGI_DS1286
+	tristate "SGI DS1286 RTC support"
+	depends on SGI_IP22
+	help
+	  If you say Y here and create a character special file /dev/rtc with
+	  major number 10 and minor number 135 using mknod ("man mknod"), you
+	  will get access to the real time clock built into your computer.
+	  Every SGI has such a clock built in. It reports status information
+	  via the file /proc/rtc and its behaviour is set by various ioctls on
+	  /dev/rtc.
+
+config SGI_IP27_RTC
+	bool "SGI M48T35 RTC support"
+	depends on SGI_IP27
+	help
+	  If you say Y here and create a character special file /dev/rtc with
+	  major number 10 and minor number 135 using mknod ("man mknod"), you
+	  will get access to the real time clock built into your computer.
+	  Every SGI has such a clock built in. It reports status information
+	  via the file /proc/rtc and its behaviour is set by various ioctls on
+	  /dev/rtc.
+
+config GEN_RTC
+	tristate "Generic /dev/rtc emulation"
+	depends on RTC!=y && !IA64 && !ARM && !M32R && !SPARC && !FRV
+	---help---
+	  If you say Y here and create a character special file /dev/rtc with
+	  major number 10 and minor number 135 using mknod ("man mknod"), you
+	  will get access to the real time clock (or hardware clock) built
+	  into your computer.
+
+	  It reports status information via the file /proc/driver/rtc and its
+	  behaviour is set by various ioctls on /dev/rtc. If you enable the
+	  "extended RTC operation" below it will also provide an emulation
+	  for RTC_UIE which is required by some programs and may improve
+	  precision in some cases.
+
+	  To compile this driver as a module, choose M here: the
+	  module will be called genrtc.
+
+config GEN_RTC_X
+	bool "Extended RTC operation"
+	depends on GEN_RTC
+	help
+	  Provides an emulation for RTC_UIE which is required by some programs
+	  and may improve precision of the generic RTC support in some cases.
+
+config EFI_RTC
+	bool "EFI Real Time Clock Services"
+	depends on IA64
+
+config DS1302
+	tristate "DS1302 RTC support"
+	depends on M32R && (PLAT_M32700UT || PLAT_OPSPUT)
+	help
+	  If you say Y here and create a character special file /dev/rtc with
+	  major number 121 and minor number 0 using mknod ("man mknod"), you
+	  will get access to the real time clock (or hardware clock) built
+	  into your computer.
+
+config COBALT_LCD
+	bool "Support for Cobalt LCD"
+	depends on MIPS_COBALT
+	help
+	  This option enables support for the LCD display and buttons found
+	  on Cobalt systems through a misc device.
+
+config DTLK
+	tristate "Double Talk PC internal speech card support"
+	help
+	  This driver is for the DoubleTalk PC, a speech synthesizer
+	  manufactured by RC Systems (<http://www.rcsys.com/>).  It is also
+	  called the `internal DoubleTalk'.
+
+	  To compile this driver as a module, choose M here: the
+	  module will be called dtlk.
+
+config R3964
+	tristate "Siemens R3964 line discipline"
+	---help---
+	  This driver allows synchronous communication with devices using the
+	  Siemens R3964 packet protocol. Unless you are dealing with special
+	  hardware like PLCs, you are unlikely to need this.
+
+	  To compile this driver as a module, choose M here: the
+	  module will be called n_r3964.
+
+	  If unsure, say N.
+
+config APPLICOM
+	tristate "Applicom intelligent fieldbus card support"
+	depends on PCI
+	---help---
+	  This driver provides the kernel-side support for the intelligent
+	  fieldbus cards made by Applicom International. More information
+	  about these cards can be found on the WWW at the address
+	  <http://www.applicom-int.com/>, or by email from David Woodhouse
+	  <dwmw2@infradead.org>.
+
+	  To compile this driver as a module, choose M here: the
+	  module will be called applicom.
+
+	  If unsure, say N.
+
+config SONYPI
+	tristate "Sony Vaio Programmable I/O Control Device support (EXPERIMENTAL)"
+	depends on EXPERIMENTAL && X86 && PCI && INPUT && !64BIT
+	---help---
+	  This driver enables access to the Sony Programmable I/O Control
+	  Device which can be found in many (all ?) Sony Vaio laptops.
+
+	  If you have one of those laptops, read
+	  <file:Documentation/sonypi.txt>, and say Y or M here.
+
+	  To compile this driver as a module, choose M here: the
+	  module will be called sonypi.
+
+config TANBAC_TB0219
+	tristate "TANBAC TB0219 base board support"
+	depends on TANBAC_TB022X
+	select GPIO_VR41XX
+
+source "drivers/char/agp/Kconfig"
+
+source "drivers/char/drm/Kconfig"
+
+source "drivers/char/pcmcia/Kconfig"
+
+config MWAVE
+	tristate "ACP Modem (Mwave) support"
+	depends on X86
+	select SERIAL_8250
+	---help---
+	  The ACP modem (Mwave) for Linux is a WinModem. It is composed of a
+	  kernel driver and a user level application. Together these components
+	  support direct attachment to public switched telephone networks (PSTNs)
+	  and support selected world wide countries.
+
+	  This version of the ACP Modem driver supports the IBM Thinkpad 600E,
+	  600, and 770 that include on board ACP modem hardware.
+
+	  The modem also supports the standard communications port interface
+	  (ttySx) and is compatible with the Hayes AT Command Set.
+
+	  The user level application needed to use this driver can be found at
+	  the IBM Linux Technology Center (LTC) web site:
+	  <http://www.ibm.com/linux/ltc/>.
+
+	  If you own one of the above IBM Thinkpads which has the Mwave chipset
+	  in it, say Y.
+
+	  To compile this driver as a module, choose M here: the
+	  module will be called mwave.
+
+config SCx200_GPIO
+	tristate "NatSemi SCx200 GPIO Support"
+	depends on SCx200
+	select NSC_GPIO
+	help
+	  Give userspace access to the GPIO pins on the National
+	  Semiconductor SCx200 processors.
+
+	  If compiled as a module, it will be called scx200_gpio.
+
+config PC8736x_GPIO
+	tristate "NatSemi PC8736x GPIO Support"
+	depends on X86
+	default SCx200_GPIO	# mostly N
+	select NSC_GPIO		# needed for support routines
+	help
+	  Give userspace access to the GPIO pins on the National
+	  Semiconductor PC-8736x (x=[03456]) SuperIO chip.  The chip
+	  has multiple functional units, inc several managed by
+	  hwmon/pc87360 driver.  Tested with PC-87366
+
+	  If compiled as a module, it will be called pc8736x_gpio.
+
+config NSC_GPIO
+	tristate "NatSemi Base GPIO Support"
+	depends on X86_32
+	# selected by SCx200_GPIO and PC8736x_GPIO
+	# what about 2 selectors differing: m != y
+	help
+	  Common support used (and needed) by scx200_gpio and
+	  pc8736x_gpio drivers.  If those drivers are built as
+	  modules, this one will be too, named nsc_gpio
+
+config CS5535_GPIO
+	tristate "AMD CS5535/CS5536 GPIO (Geode Companion Device)"
+	depends on X86_32
+	help
+	  Give userspace access to the GPIO pins on the AMD CS5535 and
+	  CS5536 Geode companion devices.
+
+	  If compiled as a module, it will be called cs5535_gpio.
+
+config GPIO_VR41XX
+	tristate "NEC VR4100 series General-purpose I/O Unit support"
+	depends on CPU_VR41XX
+
+config RAW_DRIVER
+	tristate "RAW driver (/dev/raw/rawN) (OBSOLETE)"
+	depends on BLOCK
+	help
+	  The raw driver permits block devices to be bound to /dev/raw/rawN. 
+	  Once bound, I/O against /dev/raw/rawN uses efficient zero-copy I/O. 
+	  See the raw(8) manpage for more details.
+
+          The raw driver is deprecated and will be removed soon.
+          Applications should simply open the device (eg /dev/hda1)
+          with the O_DIRECT flag.
+
+config MAX_RAW_DEVS
+	int "Maximum number of RAW devices to support (1-8192)"
+	depends on RAW_DRIVER
+	default "256"
+	help
+	  The maximum number of RAW devices that are supported.
+	  Default is 256. Increase this number in case you need lots of
+	  raw devices.
+
+config HPET
+	bool "HPET - High Precision Event Timer" if (X86 || IA64)
+	default n
+	depends on ACPI
+	help
+	  If you say Y here, you will have a miscdevice named "/dev/hpet/".  Each
+	  open selects one of the timers supported by the HPET.  The timers are
+	  non-periodic and/or periodic.
+
+config HPET_RTC_IRQ
+	bool "HPET Control RTC IRQ" if !HPET_EMULATE_RTC
+	default n
+	depends on HPET
+	help
+	  If you say Y here, you will disable RTC_IRQ in drivers/char/rtc.c. It
+	  is assumed the platform called hpet_alloc with the RTC IRQ values for
+	  the HPET timers.
+
+config HPET_MMAP
+	bool "Allow mmap of HPET"
+	default y
+	depends on HPET
+	help
+	  If you say Y here, user applications will be able to mmap
+	  the HPET registers.
+
+	  In some hardware implementations, the page containing HPET
+	  registers may also contain other things that shouldn't be
+	  exposed to the user.  If this applies to your hardware,
+	  say N here.
+
+config HANGCHECK_TIMER
+	tristate "Hangcheck timer"
+	depends on X86 || IA64 || PPC64
+	help
+	  The hangcheck-timer module detects when the system has gone
+	  out to lunch past a certain margin.  It can reboot the system
+	  or merely print a warning.
+
+config MMTIMER
+	tristate "MMTIMER Memory mapped RTC for SGI Altix"
+	depends on IA64_GENERIC || IA64_SGI_SN2
+	default y
+	help
+	  The mmtimer device allows direct userspace access to the
+	  Altix system timer.
+
+source "drivers/char/tpm/Kconfig"
+
+config TELCLOCK
+	tristate "Telecom clock driver for MPBL0010 ATCA SBC"
+	depends on EXPERIMENTAL && X86
+	default n
+	help
+	  The telecom clock device is specific to the MPBL0010 ATCA computer and
+	  allows direct userspace access to the configuration of the telecom clock
+	  configuration settings.  This device is used for hardware synchronization
+	  across the ATCA backplane fabric.  Upon loading, the driver exports a
+	  sysfs directory, /sys/devices/platform/telco_clock, with a number of
+	  files for controlling the behavior of this hardware.
+
+endmenu
+
diff -urNp linux-2.6.20/drivers/char/Makefile linux-2.6.20-s1t/drivers/char/Makefile
--- linux-2.6.20/drivers/char/Makefile	2007-02-04 18:44:54.000000000 +0000
+++ linux-2.6.20-s1t/drivers/char/Makefile	2007-02-07 16:29:14.000000000 +0000
@@ -90,6 +90,7 @@ obj-$(CONFIG_CS5535_GPIO)	+= cs5535_gpio
 obj-$(CONFIG_GPIO_VR41XX)	+= vr41xx_giu.o
 obj-$(CONFIG_TANBAC_TB0219)	+= tb0219.o
 obj-$(CONFIG_TELCLOCK)		+= tlclk.o
+obj-$(CONFIG_SIMTEC_LCD)	+= simtec-lcd.o
 
 obj-$(CONFIG_WATCHDOG)		+= watchdog/
 obj-$(CONFIG_MWAVE)		+= mwave/
diff -urNp linux-2.6.20/drivers/char/simtec-lcd.c linux-2.6.20-s1t/drivers/char/simtec-lcd.c
--- linux-2.6.20/drivers/char/simtec-lcd.c	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/drivers/char/simtec-lcd.c	2007-02-07 16:29:14.000000000 +0000
@@ -0,0 +1,547 @@
+/* linux/drivers/char/simtec-lcd.c
+ *
+ * Copyright (C) 2005 Simtec Electronics
+ *	Ben Dooks <ben@simtec.co.uk>
+ *
+ * Simtec Generic 8bit Character LCD interface
+ *
+ * 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
+*/
+
+/* example, to initialise a 20x2 display
+ *
+ * echo 0x30 > /sysfs/devices/platform/simtec-lcd-char.0/cmd0
+ * echo 0x30 > /sysfs/devices/platform/simtec-lcd-char.0/cmd0
+ * echo 0x35 > /sysfs/devices/platform/simtec-lcd-char.0/cmd0  
+ * echo 0x0f > /sysfs/devices/platform/simtec-lcd-char.0/cmd0
+ * echo 0x01 > /sysfs/devices/platform/simtec-lcd-char.0/cmd0
+*/
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/delay.h>
+#include <linux/platform_device.h>
+
+#include <asm/io.h>
+
+#define SEL_AREA(ar)	((ar) << 2)
+#define SEL_RW(rw)	((rw) << 0)
+
+#define GET_BUSY(_v)	(((_v) >> 3) & 1)
+#define GET_AREA(_v)	(((_v) >> 2) & 1)
+#define GET_CMD(_v)	(((_v) >> 1) & 1)
+#define GET_RW(_v)	(((_v) & 1))
+
+#define CTRL_BUSY	(1<<3)
+#define CTRL_AREA1	(1<<2)
+#define CTRL_AREA0	(0<<2)
+#define CTRL_CMD	(0<<1)
+#define CTRL_DATA	(1<<1)
+#define CTRL_RD		(1)
+#define CTRL_WR		(0)
+
+/* state information */
+
+struct simtec_lcd_io {
+	struct resource		*claim;
+	void __iomem		*reg;
+};
+
+struct simtec_lcd_cfg {
+	unsigned int		setup;
+	unsigned int		active;
+	unsigned int		recover;	
+};
+
+struct simtec_lcd_data {
+	struct semaphore	lock;
+	struct simtec_lcd_io	ctrl;
+	struct simtec_lcd_io	data;
+	struct simtec_lcd_cfg	cfg_data[2];
+	struct simtec_lcd_cfg	cfg_cmd[2];
+};
+
+struct simtec_lcd_attr {
+	struct device_attribute	attr;
+	unsigned char		area;
+	unsigned char		cmd;
+};
+
+static ssize_t simtec_lcd_attr_show(struct device *dev,
+				    struct device_attribute *attr,
+				    char *buf);
+
+
+static ssize_t simtec_lcd_attr_store(struct device *dev,
+				     struct device_attribute *attr,
+				     const char *buf, size_t sz);
+
+static struct simtec_lcd_attr simtec_lcd_attrs[] = {
+	{
+		.attr		= __ATTR(data0, 0666, simtec_lcd_attr_show,
+					 simtec_lcd_attr_store),
+		.area		= 0,
+		.cmd		= CTRL_DATA,
+	}, {
+		.attr		= __ATTR(data1, 0666, simtec_lcd_attr_show,
+					 simtec_lcd_attr_store),
+		.area		= 1,
+		.cmd		= CTRL_DATA,
+	}, {
+		.attr		= __ATTR(cmd0, 0666, simtec_lcd_attr_show,
+					 simtec_lcd_attr_store),
+		.area		= 0,
+		.cmd		= CTRL_CMD,
+	}, {
+		.attr		= __ATTR(cmd1, 0666, simtec_lcd_attr_show,
+					 simtec_lcd_attr_store),
+		.area		= 1,
+		.cmd		= CTRL_CMD,
+	}
+};
+
+/* data conversions */
+
+static inline struct simtec_lcd_attr *to_lcd_attr(struct device_attribute *a)
+{
+	return container_of(a, struct simtec_lcd_attr, attr);
+}
+
+static inline struct simtec_lcd_data *to_simtec_lcd(struct device *dev)
+{
+	return dev_get_drvdata(dev);
+}
+
+static inline struct simtec_lcd_cfg *get_lcd_cfg(struct simtec_lcd_data *lcd,
+						 struct simtec_lcd_attr *sa)
+{
+	return (sa->cmd == CTRL_CMD) ? &lcd->cfg_cmd[sa->area] : &lcd->cfg_data[sa->area];
+}
+
+/* status utilities */
+
+static inline int simtec_lcd_isbusy(struct simtec_lcd_data *lcd)
+{
+	return GET_BUSY(readb(lcd->ctrl.reg));
+}
+
+/* device attributes */
+
+static ssize_t simtec_lcd_attr_show(struct device *dev,
+				    struct device_attribute *attr,
+				    char *buf)
+{
+	struct simtec_lcd_data *lcd = to_simtec_lcd(dev);
+	struct simtec_lcd_attr *sa  = to_lcd_attr(attr);
+	struct simtec_lcd_cfg  *cfg = get_lcd_cfg(lcd, sa);
+	unsigned int cmd;
+	unsigned int val;
+	int ret;
+
+	cmd = CTRL_RD | SEL_AREA(sa->area) | sa->cmd;
+
+	ret = down_interruptible(&lcd->lock);
+	if (ret)
+		return ret;
+
+	dev_dbg(dev, "attr=%p (%s), cmd=%02x\n", attr, attr->name, cmd);
+
+	if (simtec_lcd_isbusy(lcd)) {
+		dev_err(dev, "%s: LCD interface is busy?\n", __FUNCTION__);
+		ret = -EIO;
+		goto exit_err;
+	}
+	
+	writeb(cmd, lcd->ctrl.reg);
+	writeb(cmd, lcd->ctrl.reg);	/* second write to extend setup */
+
+	udelay(cfg->setup);
+	(void)readb(lcd->data.reg);
+	udelay(cfg->active);
+	val = readb(lcd->data.reg);
+	udelay(cfg->recover);
+	
+	up(&lcd->lock);
+	return snprintf(buf, PAGE_SIZE, "0x%02x\n", val);
+
+ exit_err:
+	up(&lcd->lock);
+	return ret;
+}
+
+
+static ssize_t simtec_lcd_attr_store(struct device *dev,
+				     struct device_attribute *attr,
+				     const char *buf, size_t sz)
+{
+	struct simtec_lcd_data *lcd = to_simtec_lcd(dev);
+	struct simtec_lcd_attr *sa  = to_lcd_attr(attr);
+	struct simtec_lcd_cfg  *cfg = get_lcd_cfg(lcd, sa);
+	unsigned int cmd;
+	unsigned int val;
+	char *end;
+	int ret = -EINVAL;
+
+	cmd = CTRL_WR | SEL_AREA(sa->area) | sa->cmd;
+
+	val = simple_strtoul(buf, &end, 0);
+	if (end == buf) {
+		/* looks like we're dealing with character stream */
+		return -EINVAL;
+	}
+
+	ret = down_interruptible(&lcd->lock);
+	if (ret)
+		return ret;
+	
+	if (simtec_lcd_isbusy(lcd)) {
+		dev_err(dev, "%s: LCD interface is busy?\n", __FUNCTION__);
+		ret = -EIO;
+		goto exit_err;
+	}
+
+	writeb(cmd, lcd->ctrl.reg);
+	writeb(cmd, lcd->ctrl.reg);	/* second write to extend setup */
+	
+	udelay(cfg->setup);
+	writeb(val, lcd->data.reg);
+	udelay(cfg->active);
+	writeb(val, lcd->data.reg);
+	udelay(cfg->recover);
+
+	ret = end - buf;
+	ret = strnlen(buf, PAGE_SIZE);
+
+	up(&lcd->lock);
+	return ret;
+
+ exit_err:
+	up(&lcd->lock);
+	return ret;
+}
+
+static ssize_t simtec_lcd_ctrl_store(const char *buf, size_t sz,
+				     unsigned int *ctrl)
+{
+	unsigned long val;
+	char *end = (char *)buf;
+	int ret;
+	
+	val = simple_strtoul(buf, &end, 0);
+	ret = end - buf;
+
+	*ctrl = val;
+	return ret;
+}
+
+static ssize_t simtec_lcd_ctrl_show(char *buf, unsigned int *ctrl)
+{
+	return snprintf(buf, PAGE_SIZE, "%d\n", *ctrl);
+}
+
+#define DEF_ATTR(name, _reg, _area, _val)				\
+static ssize_t simtec_lcd_attr_##name##_store(struct device *dev,	\
+					struct device_attribute *attr,	\
+					const char *buf, size_t sz)	\
+{									\
+	struct simtec_lcd_data *lcd = to_simtec_lcd(dev);		\
+	return simtec_lcd_ctrl_store(buf, sz, &lcd->cfg_##_reg[_area]._val); \
+}									\
+									\
+static ssize_t simtec_lcd_attr_##name##_show(struct device *dev,	\
+				       struct device_attribute *attr,	\
+				       char *buf)			\
+{									\
+	struct simtec_lcd_data *lcd = to_simtec_lcd(dev);		\
+	return simtec_lcd_ctrl_show(buf, &lcd->cfg_##_reg[_area]._val);	\
+}									\
+									\
+static DEVICE_ATTR(name, 0666, simtec_lcd_attr_##name##_show,		\
+			       simtec_lcd_attr_##name##_store)
+
+DEF_ATTR(cmd0_setup,   cmd,  0, setup);
+DEF_ATTR(cmd1_setup,   cmd,  1, setup);
+DEF_ATTR(data0_setup,  data, 0, setup);
+DEF_ATTR(data1_setup,  data, 1, setup);
+
+DEF_ATTR(cmd0_active,  cmd,  0, active);
+DEF_ATTR(cmd1_active,  cmd,  1, active);
+DEF_ATTR(data0_active, data, 0, active);
+DEF_ATTR(data1_active, data, 1, active);
+
+DEF_ATTR(cmd0_recover,  cmd,  0, recover);
+DEF_ATTR(cmd1_recover,  cmd,  1, recover);
+DEF_ATTR(data0_recover, data, 0, recover);
+DEF_ATTR(data1_recover, data, 1, recover);
+
+static struct device_attribute *simtec_lcd_ctrl_attrs[] = {
+	&dev_attr_cmd0_setup,
+	&dev_attr_cmd1_setup,
+	&dev_attr_data0_setup,
+	&dev_attr_data1_setup,
+	&dev_attr_cmd0_active,
+	&dev_attr_cmd1_active,
+	&dev_attr_data0_active,
+	&dev_attr_data1_active,
+	&dev_attr_cmd0_recover,
+	&dev_attr_cmd1_recover,
+	&dev_attr_data0_recover,
+	&dev_attr_data1_recover,
+};
+
+static int simtec_lcd_map_io(struct platform_device *pdev,
+			     struct simtec_lcd_io *io, int area)
+{
+	struct resource *res;
+	unsigned long size;
+
+	res = platform_get_resource(pdev, IORESOURCE_MEM, area);
+	if (res == NULL) {
+		dev_err(&pdev->dev, "cannot find resource %d\n", area);
+		return -ENOENT;
+	}
+
+	size = (res->end - res->start)+1;
+
+	io->claim = request_mem_region(res->start, size, pdev->name);
+
+	if (io->claim == NULL) {
+		dev_err(&pdev->dev, "cannot request IO\n");
+		return -ENXIO;
+	}
+
+	io->reg = ioremap(res->start, size);
+
+	if (io->reg == NULL) {
+		dev_err(&pdev->dev, "cannot map IO\n");
+		goto err_res;
+	}
+
+	return 0;
+
+ err_res:
+	release_resource(io->claim);
+	kfree(io->claim);
+
+	return -ENXIO;
+}
+
+static void simtec_lcd_complete(struct device *dev, struct simtec_lcd_data *pd)
+{
+	unsigned int cmd = readb(pd->ctrl.reg);
+	unsigned int rw = GET_RW(cmd);
+
+	dev_err(dev, "incomplete %s area %d's %s register\n",
+		(rw == CTRL_WR) ? "write to" : "read from",
+		GET_AREA(cmd),
+		(cmd & CTRL_DATA) ? "data" : "command");
+
+	if (rw == CTRL_WR)
+		writeb(0x00, pd->data.reg);
+	else
+		(void)readb(pd->data.reg);
+}
+
+static void simtec_lcd_io_unmap(struct simtec_lcd_io *io)
+{
+	if (io->claim) {
+		release_resource(io->claim);
+		kfree(io->claim);
+		io->claim = NULL;
+	}
+
+	if (io->reg) {
+		iounmap(io->reg);
+		io->reg = NULL;
+	}
+}
+
+static void simtec_lcd_remove_files(struct device *dev)
+{
+	unsigned int i;
+
+	for (i = 0; i < ARRAY_SIZE(simtec_lcd_attrs); i++)
+		device_remove_file(dev, &simtec_lcd_attrs[i].attr);
+
+	for (i = 0; i < ARRAY_SIZE(simtec_lcd_ctrl_attrs); i++)
+		device_remove_file(dev, simtec_lcd_ctrl_attrs[i]);
+}
+
+static int simtec_lcd_probe(struct device *dev)
+{
+	struct platform_device *pdev = to_platform_device(dev);
+	struct simtec_lcd_data *pd;
+	int ret;
+	int i;
+
+	pd = kzalloc(sizeof(struct simtec_lcd_data), GFP_KERNEL);
+	if (pd == NULL) {
+		dev_err(dev, "cannot allocate private data\n");
+		return -ENOMEM;
+	}
+
+	dev_set_drvdata(dev, pd);
+
+	/* map the two io-ports we are going to use */
+
+	ret = simtec_lcd_map_io(pdev, &pd->ctrl, 0);
+	if (ret != 0) {
+		dev_err(dev, "cannot initialise ctrl register\n");
+		goto exit_err;
+	}
+
+	ret = simtec_lcd_map_io(pdev, &pd->data, 1);
+	if (ret != 0) {
+		dev_err(dev, "cannot initialise data register\n");
+		goto exit_err_ctrl;
+	}	
+
+	/* setup the port access times */
+	
+	pd->cfg_cmd[0].setup   = 1;
+	pd->cfg_cmd[1].setup   = 1;
+	pd->cfg_cmd[0].active  = 5;
+	pd->cfg_cmd[1].active  = 5;
+	pd->cfg_cmd[0].recover = 1;
+	pd->cfg_cmd[1].recover = 1;
+
+	pd->cfg_data[0].setup   = 1;
+	pd->cfg_data[0].setup   = 1;
+	pd->cfg_data[0].active  = 5;
+	pd->cfg_data[1].active  = 5;
+	pd->cfg_data[0].recover = 1;
+	pd->cfg_data[1].recover = 1;
+
+	init_MUTEX(&pd->lock);
+
+	/* register the sysfs attributes for reading and writing */
+
+	for (i = 0; i < ARRAY_SIZE(simtec_lcd_attrs); i++) {
+		ret = device_create_file(dev, &simtec_lcd_attrs[i].attr);
+		if (ret) {
+			dev_err(dev, "failed to create device file\n");
+			goto exit_err_all;
+		}
+	}
+
+	/* register the sysfs attributes for controling the system */
+	
+	for (i = 0; i < ARRAY_SIZE(simtec_lcd_ctrl_attrs); i++) {
+		ret = device_create_file(dev, simtec_lcd_ctrl_attrs[i]);
+		if (ret) {
+			dev_err(dev, "failed to create device file\n");
+			goto exit_err_all;
+		}
+	}
+
+	/* check to see what state the controller was in */
+
+	if (simtec_lcd_isbusy(pd)) {
+		dev_warn(dev, "warning: controller was active at start\n");
+		simtec_lcd_complete(dev, pd);
+	}
+
+	if (simtec_lcd_isbusy(pd)) {
+		dev_err(dev, "error: controller is stuck active\n");
+		ret = -ENXIO;
+		goto exit_err_all;
+	}
+
+	return 0;
+
+ exit_err_all:
+	simtec_lcd_remove_files(dev);
+	simtec_lcd_io_unmap(&pd->data);
+
+ exit_err_ctrl:
+	simtec_lcd_io_unmap(&pd->ctrl);
+
+ exit_err:
+	kfree(pd);
+	return ret;
+}
+
+static int simtec_lcd_remove(struct device *dev)
+{
+	struct simtec_lcd_data *pd = dev_get_drvdata(dev);
+	
+	if (pd) {
+		down(&pd->lock);
+
+		simtec_lcd_remove_files(dev);
+		simtec_lcd_io_unmap(&pd->ctrl);
+		simtec_lcd_io_unmap(&pd->data);	
+		kfree(pd);
+	}
+
+	return 0;
+}
+
+#ifdef CONFIG_PM
+
+static int simtec_lcd_suspend(struct device *dev, pm_message_t state)
+{
+	struct simtec_lcd_data *pd = dev_get_drvdata(dev);
+	
+	if (!down_trylock(&pd->lock)) {
+		dev_err(dev, "interface is in-use\n");
+		return -EBUSY;
+	}
+
+	return 0;
+}
+
+static int simtec_lcd_resume(struct device *dev)
+{
+	struct simtec_lcd_data *pd = dev_get_drvdata(dev);
+
+	up(&pd->lock);
+	return 0;
+}
+
+#endif /* CONFIG_PM */
+
+/* device driver */
+
+static struct device_driver simtec_lcd_driver = {
+	.name		= "simtec-lcd-char",
+	.owner		= THIS_MODULE,
+	.bus		= &platform_bus_type,
+	.probe		= simtec_lcd_probe,
+	.remove		= simtec_lcd_remove,
+	.suspend	= simtec_lcd_suspend,
+	.resume		= simtec_lcd_resume,
+};
+
+static int __init lcd_simtec_init(void)
+{
+	return driver_register(&simtec_lcd_driver);
+}
+
+static void __exit lcd_simtec_exit(void)
+{
+	driver_unregister(&simtec_lcd_driver);
+}
+
+module_init(lcd_simtec_init);
+module_exit(lcd_simtec_exit);
+
+MODULE_DESCRIPTION("Simtec Generic 8bit Character LCD driver");
+MODULE_AUTHOR("Ben Dooks, <ben@simtec.co.uk>");
+MODULE_LICENSE("GPL");
+
+
+
diff -urNp linux-2.6.20/drivers/hwmon/Kconfig linux-2.6.20-s1t/drivers/hwmon/Kconfig
--- linux-2.6.20/drivers/hwmon/Kconfig	2007-02-04 18:44:54.000000000 +0000
+++ linux-2.6.20-s1t/drivers/hwmon/Kconfig	2007-02-07 16:29:14.000000000 +0000
@@ -392,6 +392,16 @@ config SENSORS_PC87427
 	  This driver can also be built as a module.  If so, the module
 	  will be called pc87427.
 
+config SENSORS_S3C_ADC
+	tristate "S3C2410/S3C2440 Inbuilt ADC"
+	depends on HWMON && ARCH_S3C2410
+	help
+	  If you say yes here you get support for the on-board ADCs of
+	  the S3C2410 and S3C2440 SoCs.
+
+	  This driver can also be built as a module. If so, the modul;e
+	  will be called s3c24xx-adc.
+
 config SENSORS_SIS5595
 	tristate "Silicon Integrated Systems Corp. SiS5595"
 	depends on HWMON && I2C && PCI && EXPERIMENTAL
diff -urNp linux-2.6.20/drivers/hwmon/Kconfig.orig linux-2.6.20-s1t/drivers/hwmon/Kconfig.orig
--- linux-2.6.20/drivers/hwmon/Kconfig.orig	1970-01-01 01:00:00.000000000 +0100
+++ linux-2.6.20-s1t/drivers/hwmon/Kconfig.orig	2007-02-04 18:44:54.000000000 +0000
@@ -0,0 +1,595 @@
+#
+# Hardware monitoring chip drivers configuration
+#
+
+menu "Hardware Monitoring support"
+
+config HWMON
+	tristate "Hardware Monitoring support"
+	default y
+	help
+	  Hardware monitoring devices let you monitor the hardware health
+	  of a system. Most modern motherboards include such a device. It
+	  can include temperature sensors, voltage sensors, fan speed
+	  sensors and various additional features such as the ability to
+	  control the speed of the fans.  If you want this support you
+	  should say Y here and also to the specific driver(s) for your
+	  sensors chip(s) below.
+
+	  To find out which specific driver(s) you need, use the
+	  sensors-detect script from the lm_sensors package.  Read
+	  <file:Documentation/hwmon/userspace-tools> for details.
+
+	  This support can also be built as a module.  If so, the module
+	  will be called hwmon.
+
+config HWMON_VID
+	tristate
+	default n
+
+config SENSORS_ABITUGURU
+	tristate "Abit uGuru"
+	depends on HWMON && EXPERIMENTAL
+	help
+	  If you say yes here you get support for the Abit uGuru chips
+	  sensor part. The voltage and frequency control parts of the Abit
+	  uGuru are not supported. The Abit uGuru chip can be found on Abit
+	  uGuru featuring motherboards (most modern Abit motherboards).
+
+	  This driver can also be built as a module.  If so, the module
+	  will be called abituguru.
+
+config SENSORS_ADM1021
+	tristate "Analog Devices ADM1021 and compatibles"
+	depends on HWMON && I2C
+	help
+	  If you say yes here you get support for Analog Devices ADM1021
+	  and ADM1023 sensor chips and clones: Maxim MAX1617 and MAX1617A,
+	  Genesys Logic GL523SM, National Semiconductor LM84, TI THMC10,
+	  and the XEON processor built-in sensor.
+
+	  This driver can also be built as a module.  If so, the module
+	  will be called adm1021.
+
+config SENSORS_ADM1025
+	tristate "Analog Devices ADM1025 and compatibles"
+	depends on HWMON && I2C
+	select HWMON_VID
+	help
+	  If you say yes here you get support for Analog Devices ADM1025
+	  and Philips NE1619 sensor chips.
+
+	  This driver can also be built as a module.  If so, the module
+	  will be called adm1025.
+
+config SENSORS_ADM1026
+	tristate "Analog Devices ADM1026 and compatibles"
+	depends on HWMON && I2C && EXPERIMENTAL
+	select HWMON_VID
+	help
+	  If you say yes here you get support for Analog Devices ADM1026
+	  sensor chip.
+
+	  This driver can also be built as a module.  If so, the module
+	  will be called adm1026.
+
+config SENSORS_ADM1031
+	tristate "Analog Devices ADM1031 and compatibles"
+	depends on HWMON && I2C && EXPERIMENTAL
+	help
+	  If you say yes here you get support for Analog Devices ADM1031
+	  and ADM1030 sensor chips.
+
+	  This driver can also be built as a module.  If so, the module
+	  will be called adm1031.
+
+config SENSORS_ADM9240
+	tristate "Analog Devices ADM9240 and compatibles"
+	depends on HWMON && I2C && EXPERIMENTAL
+	select HWMON_VID
+	help
+	  If you say yes here you get support for Analog Devices ADM9240,
+	  Dallas DS1780, National Semiconductor LM81 sensor chips.
+
+	  This driver can also be built as a module.  If so, the module
+	  will be called adm9240.
+
+config SENSORS_K8TEMP
+	tristate "AMD Athlon64/FX or Opteron temperature sensor"
+	depends on HWMON && X86 && PCI && EXPERIMENTAL
+	help
+	  If you say yes here you get support for the temperature
+	  sensor(s) inside your CPU. Supported is whole AMD K8
+	  microarchitecture. Please note that you will need at least
+	  lm-sensors 2.10.1 for proper userspace support.
+
+	  This driver can also be built as a module.  If so, the module
+	  will be called k8temp.
+
+config SENSORS_AMS
+	tristate "Apple Motion Sensor driver"
+	depends on HWMON && PPC_PMAC && !PPC64 && INPUT && ((ADB_PMU && I2C = y) || (ADB_PMU && !I2C) || I2C) && EXPERIMENTAL
+	help
+	  Support for the motion sensor included in PowerBooks. Includes
+	  implementations for PMU and I2C.
+
+	  This driver can also be built as a module. If so, the module
+	  will be called ams.
+
+config SENSORS_AMS_PMU
+	bool "PMU variant"
+	depends on SENSORS_AMS && ADB_PMU
+	default y
+	help
+	  PMU variant of motion sensor, found in late 2005 PowerBooks.
+
+config SENSORS_AMS_I2C
+	bool "I2C variant"
+	depends on SENSORS_AMS && I2C
+	default y
+	help
+	  I2C variant of motion sensor, found in early 2005 PowerBooks and
+	  iBooks.
+
+config SENSORS_ASB100
+	tristate "Asus ASB100 Bach"
+	depends on HWMON && I2C && EXPERIMENTAL
+	select HWMON_VID
+	help
+	  If you say yes here you get support for the ASB100 Bach sensor
+	  chip found on some Asus mainboards.
+
+	  This driver can also be built as a module.  If so, the module
+	  will be called asb100.
+
+config SENSORS_ATXP1
+	tristate "Attansic ATXP1 VID controller"
+	depends on HWMON && I2C && EXPERIMENTAL
+	select HWMON_VID
+	help
+	  If you say yes here you get support for the Attansic ATXP1 VID
+	  controller.
+
+	  If your board have such a chip, you are able to control your CPU
+	  core and other voltages.
+
+	  This driver can also be built as a module.  If so, the module
+	  will be called atxp1.
+
+config SENSORS_DS1621
+	tristate "Dallas Semiconductor DS1621 and DS1625"
+	depends on HWMON && I2C
+	help
+	  If you say yes here you get support for Dallas Semiconductor
+	  DS1621 and DS1625 sensor chips.
+
+	  This driver can also be built as a module.  If so, the module
+	  will be called ds1621.
+
+config SENSORS_F71805F
+	tristate "Fintek F71805F/FG and F71872F/FG"
+	depends on HWMON && EXPERIMENTAL
+	help
+	  If you say yes here you get support for hardware monitoring
+	  features of the Fintek F71805F/FG and F71872F/FG Super-I/O
+	  chips.
+
+	  This driver can also be built as a module.  If so, the module
+	  will be called f71805f.
+
+config SENSORS_FSCHER
+	tristate "FSC Hermes"
+	depends on HWMON && I2C
+	help
+	  If you say yes here you get support for Fujitsu Siemens
+	  Computers Hermes sensor chips.
+
+	  This driver can also be built as a module.  If so, the module
+	  will be called fscher.
+
+config SENSORS_FSCPOS
+	tristate "FSC Poseidon"
+	depends on HWMON && I2C
+	help
+	  If you say yes here you get support for Fujitsu Siemens
+	  Computers Poseidon sensor chips.
+
+	  This driver can also be built as a module.  If so, the module
+	  will be called fscpos.
+
+config SENSORS_GL518SM
+	tristate "Genesys Logic GL518SM"
+	depends on HWMON && I2C
+	help
+	  If you say yes here you get support for Genesys Logic GL518SM
+	  sensor chips.
+
+	  This driver can also be built as a module.  If so, the module
+	  will be called gl518sm.
+
+config SENSORS_GL520SM
+	tristate "Genesys Logic GL520SM"
+	depends on HWMON && I2C
+	select HWMON_VID
+	help
+	  If you say yes here you get support for Genesys Logic GL520SM
+	  sensor chips.
+
+	  This driver can also be built as a module.  If so, the module
+	  will be called gl520sm.
+
+config SENSORS_IT87
+	tristate "ITE IT87xx and compatibles"
+	depends on HWMON && I2C
+	select I2C_ISA
+	select HWMON_VID
+	help
+	  If you say yes here you get support for ITE IT8705F, IT8712F,
+	  IT8716F and IT8718F sensor chips, and the SiS960 clone.
+
+	  This driver can also be built as a module.  If so, the module
+	  will be called it87.
+
+config SENSORS_LM63
+	tristate "National Semiconductor LM63"
+	depends on HWMON && I2C
+	help
+	  If you say yes here you get support for the National Semiconductor
+	  LM63 remote diode digital temperature sensor with integrated fan
+	  control.  Such chips are found on the Tyan S4882 (Thunder K8QS Pro)
+	  motherboard, among others.
+
+	  This driver can also be built as a module.  If so, the module
+	  will be called lm63.
+
+config SENSORS_LM70
+	tristate "National Semiconductor LM70"
+	depends on HWMON && SPI_MASTER && EXPERIMENTAL
+	help
+	  If you say yes here you get support for the National Semiconductor
+	  LM70 digital temperature sensor chip.
+
+	  This driver can also be built as a module.  If so, the module
+	  will be called lm70.
+
+config SENSORS_LM75
+	tristate "National Semiconductor LM75 and compatibles"
+	depends on HWMON && I2C
+	help
+	  If you say yes here you get support for National Semiconductor LM75
+	  sensor chips and clones: Dallas Semiconductor DS75 and DS1775 (in
+	  9-bit precision mode), and TelCom (now Microchip) TCN75.
+
+	  The DS75 and DS1775 in 10- to 12-bit precision modes will require
+	  a force module parameter. The driver will not handle the extra
+	  precision anyhow.
+
+	  This driver can also be built as a module.  If so, the module
+	  will be called lm75.
+
+config SENSORS_LM77
+	tristate "National Semiconductor LM77"
+	depends on HWMON && I2C
+	help
+	  If you say yes here you get support for National Semiconductor LM77
+	  sensor chips.
+
+	  This driver can also be built as a module.  If so, the module
+	  will be called lm77.
+
+config SENSORS_LM78
+	tristate "National Semiconductor LM78 and compatibles"
+	depends on HWMON && I2C
+	select I2C_ISA
+	select HWMON_VID
+	help
+	  If you say yes here you get support for National Semiconductor LM78,
+	  LM78-J and LM79.
+
+	  This driver can also be built as a module.  If so, the module
+	  will be called lm78.
+
+config SENSORS_LM80
+	tristate "National Semiconductor LM80"
+	depends on HWMON && I2C && EXPERIMENTAL
+	help
+	  If you say yes here you get support for National Semiconductor
+	  LM80 sensor chips.
+
+	  This driver can also be built as a module.  If so, the module
+	  will be called lm80.
+
+config SENSORS_LM83
+	tristate "National Semiconductor LM83 and compatibles"
+	depends on HWMON && I2C
+	help
+	  If you say yes here you get support for National Semiconductor
+	  LM82 and LM83 sensor chips.
+
+	  This driver can also be built as a module.  If so, the module
+	  will be called lm83.
+
+config SENSORS_LM85
+	tristate "National Semiconductor LM85 and compatibles"
+	depends on HWMON && I2C && EXPERIMENTAL
+	select HWMON_VID
+	help
+	  If you say yes here you get support for National Semiconductor LM85
+	  sensor chips and clones: ADT7463, EMC6D100, EMC6D102 and ADM1027.
+
+	  This driver can also be built as a module.  If so, the module
+	  will be called lm85.
+
+config SENSORS_LM87
+	tristate "National Semiconductor LM87"
+	depends on HWMON && I2C
+	select HWMON_VID
+	help
+	  If you say yes here you get support for National Semiconductor LM87
+	  sensor chips.
+
+	  This driver can also be built as a module.  If so, the module
+	  will be called lm87.
+
+config SENSORS_LM90
+	tristate "National Semiconductor LM90 and compatibles"
+	depends on HWMON && I2C
+	help
+	  If you say yes here you get support for National Semiconductor LM90,
+	  LM86, LM89 and LM99, Analog Devices ADM1032 and Maxim MAX6657 and
+	  MAX6658 sensor chips.
+
+	  The Analog Devices ADT7461 sensor chip is also supported, but only
+	  if found in ADM1032 compatibility mode.
+
+	  This driver can also be built as a module.  If so, the module
+	  will be called lm90.
+
+config SENSORS_LM92
+	tristate "National Semiconductor LM92 and compatibles"
+	depends on HWMON && I2C
+	help
+	  If you say yes here you get support for National Semiconductor LM92
+	  and Maxim MAX6635 sensor chips.
+
+	  This driver can also be built as a module.  If so, the module
+	  will be called lm92.
+
+config SENSORS_MAX1619
+	tristate "Maxim MAX1619 sensor chip"
+	depends on HWMON && I2C
+	help
+	  If you say yes here you get support for MAX1619 sensor chip.
+
+	  This driver can also be built as a module.  If so, the module
+	  will be called max1619.
+
+config SENSORS_PC87360
+	tristate "National Semiconductor PC87360 family"
+	depends on HWMON && I2C && EXPERIMENTAL
+	select I2C_ISA
+	select HWMON_VID
+	help
+	  If you say yes here you get access to the hardware monitoring
+	  functions of the National Semiconductor PC8736x Super-I/O chips.
+	  The PC87360, PC87363 and PC87364 only have fan monitoring and
+	  control.  The PC87365 and PC87366 additionally have voltage and
+	  temperature monitoring.
+
+	  This driver can also be built as a module.  If so, the module
+	  will be called pc87360.
+
+config SENSORS_PC87427
+	tristate "National Semiconductor PC87427"
+	depends on HWMON && EXPERIMENTAL
+	help
+	  If you say yes here you get access to the hardware monitoring
+	  functions of the National Semiconductor PC87427 Super-I/O chip.
+	  The chip has two distinct logical devices, one for fan speed
+	  monitoring and control, and one for voltage and temperature
+	  monitoring. Only fan speed monitoring is supported right now.
+
+	  This driver can also be built as a module.  If so, the module
+	  will be called pc87427.
+
+config SENSORS_SIS5595
+	tristate "Silicon Integrated Systems Corp. SiS5595"
+	depends on HWMON && I2C && PCI && EXPERIMENTAL
+	select I2C_ISA
+	help
+	  If you say yes here you get support for the integrated sensors in
+	  SiS5595 South Bridges.
+
+	  This driver can also be built as a module.  If so, the module
+	  will be called sis5595.
+
+config SENSORS_SMSC47M1
+	tristate "SMSC LPC47M10x and compatibles"
+	depends on HWMON && I2C
+	select I2C_ISA
+	help
+	  If you say yes here you get support for the integrated fan
+	  monitoring and control capabilities of the SMSC LPC47B27x,
+	  LPC47M10x, LPC47M112, LPC47M13x, LPC47M14x, LPC47M15x,
+	  LPC47M192 and LPC47M997 chips.
+
+	  The temperature and voltage sensor features of the LPC47M192
+	  and LPC47M997 are supported by another driver, select also
+	  "SMSC LPC47M192 and compatibles" below for those.
+
+	  This driver can also be built as a module.  If so, the module
+	  will be called smsc47m1.
+
+config SENSORS_SMSC47M192
+	tristate "SMSC LPC47M192 and compatibles"
+	depends on HWMON && I2C && EXPERIMENTAL
+	select HWMON_VID
+	help
+	  If you say yes here you get support for the temperature and
+	  voltage sensors of the SMSC LPC47M192 and LPC47M997 chips.
+
+	  The fan monitoring and control capabilities of these chips
+	  are supported by another driver, select
+	  "SMSC LPC47M10x and compatibles" above. You need both drivers
+	  if you want fan control and voltage/temperature sensor support.
+
+	  This driver can also be built as a module.  If so, the module
+	  will be called smsc47m192.
+
+config SENSORS_SMSC47B397
+	tristate "SMSC LPC47B397-NC"
+	depends on HWMON && I2C && EXPERIMENTAL
+	select I2C_ISA
+	help
+	  If you say yes here you get support for the SMSC LPC47B397-NC
+	  sensor chip.
+
+	  This driver can also be built as a module.  If so, the module
+	  will be called smsc47b397.
+
+config SENSORS_VIA686A
+	tristate "VIA686A"
+	depends on HWMON && I2C && PCI
+	select I2C_ISA
+	help
+	  If you say yes here you get support for the integrated sensors in
+	  Via 686A/B South Bridges.
+
+	  This driver can also be built as a module.  If so, the module
+	  will be called via686a.
+
+config SENSORS_VT1211
+	tristate "VIA VT1211"
+	depends on HWMON && EXPERIMENTAL
+	select HWMON_VID
+	help
+	  If you say yes here then you get support for hardware monitoring
+	  features of the VIA VT1211 Super-I/O chip.
+
+	  This driver can also be built as a module.  If so, the module
+	  will be called vt1211.
+
+config SENSORS_VT8231
+	tristate "VIA VT8231"
+	depends on HWMON && I2C && PCI && EXPERIMENTAL
+	select HWMON_VID
+	select I2C_ISA
+	help
+	  If you say yes here then you get support for the integrated sensors
+	  in the VIA VT8231 device.
+
+	  This driver can also be built as a module.  If so, the module
+	  will be called vt8231.
+
+config SENSORS_W83781D
+	tristate "Winbond W83781D, W83782D, W83783S, W83627HF, Asus AS99127F"
+	depends on HWMON && I2C
+	select I2C_ISA
+	select HWMON_VID
+	help
+	  If you say yes here you get support for the Winbond W8378x series
+	  of sensor chips: the W83781D, W83782D, W83783S and W83627HF,
+	  and the similar Asus AS99127F.
+
+	  This driver can also be built as a module.  If so, the module
+	  will be called w83781d.
+
+config SENSORS_W83791D
+	tristate "Winbond W83791D"
+	depends on HWMON && I2C && EXPERIMENTAL
+	select HWMON_VID
+	help
+	  If you say yes here you get support for the Winbond W83791D chip.
+
+	  This driver can also be built as a module.  If so, the module
+	  will be called w83791d.
+
+config SENSORS_W83792D
+	tristate "Winbond W83792D"
+	depends on HWMON && I2C && EXPERIMENTAL
+	help
+	  If you say yes here you get support for the Winbond W83792D chip.
+
+	  This driver can also be built as a module.  If so, the module
+	  will be called w83792d.
+
+config SENSORS_W83793
+	tristate "Winbond W83793"
+	depends on HWMON && I2C && EXPERIMENTAL
+	help
+	  If you say yes here you get support for the Winbond W83793
+	  
